Чи не допустить глобальне випромінення вилкової бомби її виконання?


15

Якби ви були глобально налаштовані

alias ':(){ :|:& };:'='echo fork bomb averted'

це може бути ефективною стратегією безпеки, щоб уникнути виконання бомби вилкової бомби, чи все ще знайдеться спосіб її виконання?

Я припускаю, що питання зникає: чи є спосіб виконати команду, коли вона відчужена для чогось іншого?


1
@ user1717828 "fork bomb" - це програма, яка просто запускає нові копії себе назавжди. Експонентне зростання кількості запущених програм, як правило, призводить до того, що в короткому порядку щось порушиться.
Марк

1
Навіть якби це спрацювало - це не захистить програму, яка викликає fork (), що не проходить через bash?
UKMonkey

2
: () {: |: &: |: &} ;:
Джошуа

3
Просто запустітьa(){ a|a& };a
user253751

1
Ви б уникали загальної форми (якщо ви змусите її працювати взагалі), але можлива майже нескінченна кількість варіантів.
Щогли

Відповіді:


52

Два , немає, три , ... Серед основних перешкод на шляху , які є:

  1. Це неправдиве ім’я для псевдоніма. Інтернет-посібник Баша :

    Символи ... та будь-які метахарактеристики оболонки або цитуючі символи, перелічені вище, не можуть відображатися в імені псевдоніму.

    (, ), &, |І прогалини можуть в Bash 4.4.

  2. Цей конкретний рядок - не єдиний спосіб написати вилкову бомбу в оболонці, просто відомий тим, що виглядає неясним. Наприклад, не потрібно викликати функцію :замість чогось насправді складається з літер.

  3. Якщо ви можете встановити псевдонім, користувач може скасувати псевдонім, обміняти його, уникаючи імені псевдоніма в командному рядку або взагалі відключати псевдоніми, можливо, запустивши функцію в сценарії (Bash не розширює псевдоніми в неінтерактивних оболонках) .

  4. Навіть якщо оболонку достатньо обмежено, щоб зупинити всі версії вилкової бомби, система загального призначення матиме інші програмовані утиліти, які можуть повторюватись та відключати підпроцеси. Отримав Perl чи компілятор C? Досить просто. Навіть awk міг би це зробити. Навіть якщо у вас немає встановлених програм, вам також потрібно буде зупинити користувач /bin/shне вводити складені бінарні файли з-за меж системи або запускати, які, ймовірно, повинні бути повністю функціональною оболонкою для роботи решти системи.

Просто використовуйте ulimit -u(тобто RLIMIT_NPROC) або еквівалент, щоб обмежити кількість процесів, які користувач може запустити. У більшості систем Linux є pam_limitsможливість встановити обмеження кількості процесів перед тим, як запускати будь-які команди, обрані користувачем.

Щось подібне до цього /etc/security/limits.confпоставило б жорсткий ліміт 50 процесів для всіх користувачів:

*        hard    nproc           50

(Стівен Кітт вже згадував пункт 1, Джефф Шаллер згадував 2 і 3.)


Чи можна написати вилкову бомбу без &?
Стівен Кітт

4
@StephenKitt Я не впевнений на 100%, але я гадаю, що баш завершується. Якщо так, то ймовірно безмежні можливості. Наприклад, ви можете розібрати ascii char-код 38 та виконати його.
Марі

@Marie в цьому конкретному контексті вам також доведеться уникати будь-яких інших заборонених символів, працюючи навколо &обмеження.
Стівен Кітт

15
Моя думка в основному полягала в тому, що намагання в чорний список поганої функціональності є поганою ідеєю. Практично завжди існують шляхи.
Марі

2
@Marie: Bash цілком точно Turing завершений.
Призупинено до подальшого повідомлення.

18

Ні. Існує надто багато способів написання вилкової бомби.

Злий автор вилки-бомби просто спробує ще раз з іншою назвою функції. Або інші зміни, поки його вилка-бомба не вдається.

Ненавмисний автор вилки-бомби в першу чергу не створить канонічну вилку-бомбу.

Насправді досить легко стати самим ненавмисним автором вилки-бомби. Наприклад, ви можете просто використовувати рекурсивну makeіз зовнішнім, неперевіреним cd, поєднуючи її з -jопцією та неіснуючими підкаталогами - справжній приклад, про який я натрапив одного разу.

Ви не можете захиститись від усіх можливостей, і, звичайно, не від рішучого нападника. Все, чого ви досягнете, - це підвищити складність вашої системи.


14

Ви не можете створити псевдонім бомби-вилки, оскільки це неправдиве псевдонім :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

Символи '/', '$', '' ',' = 'та будь-які метахарактеристики оболонки або цитуючі символи, перелічені вище, не можуть відображатися в псевдонімі.

Деякі оболонки не перевіряють імена псевдонімів, коли вони оголошені, але при інтерпретації команд, а потім пропускають недійсне ім'я. Вилка бомба завжди буде містити &, яка не може бути включена у дійсне ім’я псевдоніма, тому захистити себе таким чином неможливо.


Чи дозволяє оболонка налаштовувати цей псевдонім чи ні, значення не має. Важливо те, що навіть якщо такий псевдонім існує, він не розширюється під час інтерпретації команд, оскільки ім'я псевдоніма не відповідає дозволеному шаблону. dashі, boshнаприклад, обидва мовчки ігнорують це.
schily

10

Двічі, ні.

Це не єдиний спосіб написати вилку-бомбу.

Існує також кілька способів виконання "команди", коли є псевдонім:

command the-command
\the-command

Приклад:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png

Не пов'язано з головною темою, але чому він \lsпоказав, output.pngале command lsне став
nxnev

Добре помічений! Це, справді, не пов’язано з основною темою. Це класична помилка PEBCAK, коли я копіюю / неправильно вставляю (або очищаю output.png між ними). Я виправлю це, щоб мінімізувати відволікання. Дякую, @nxnev!
Джефф Шаллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.