Это основано на этом обманном вопросе здесь. Описанная проблема заключается в использовании bash-скрипта, который содержит что-то вроде:
rm -rf {pattern1}/{pattern2}
... который, если оба шаблона включают в себя один или несколько пустых элементов, будет расширен по крайней мере до одного экземпляра rm -rf /
, при условии, что исходная команда была расшифрована правильно, и OP выполнял расширение фигурных скобок, а не расширение параметров .
В объяснении ОП об обмане он заявляет:
Команда [...] безвредна, но кажется, что почти никто не заметил.
Инструмент Ansible предотвращает эти ошибки, [...] но, похоже, никто не знал об этом, иначе они бы знали, что описанное мной не могло произойти.
Итак, предположим, что у вас есть сценарий оболочки, который выдает rm -rf /
команду через расширение скобок или расширение параметров, верно ли использование Ansible предотвратит выполнение этой команды, и если да, то как он это сделает?
Действительно ли выполнение rm -rf /
с привилегиями root действительно «безвредно», если вы используете Ansible для этого?
rm
источнике, который я проанализировал ниже.Ответы:
У меня есть виртуальные машины, давайте взорвать их кучу! Для науки.
Первая попытка:
Итак
command
просто передаем литералы, и ничего не происходит.Как насчет нашего любимого обхода безопасности
raw
?Не ходи снова! Насколько сложно это может быть удалить все ваши файлы?
О, но что, если они были неопределенными переменными или чем-то еще?
Ну, это не сработало.
Но что, если переменные определены, но пусты?
Наконец, некоторый прогресс! Но это все еще жалуется, что я не использовал
--no-preserve-root
.Конечно, он также предупреждает меня , что я должен попытаться использовать в
file
модуль иstate=absent
. Посмотрим, сработает ли это.Хорошие новости, все! Он начал пытаться удалить все мои файлы! Но, к сожалению, это привело к ошибке. Я оставлю исправление и заставлю игровую книгу уничтожить все, используя
file
модуль в качестве упражнения для читателя.ЗАПРЕЩАЕТСЯ запускать любые пьесы, которые вы видите за этой точкой! Вы поймете, почему через мгновение.
Наконец, для государственного переворота ...
Эта виртуальная машина - бывший попугай !
Интересно, что выше не удалось ничего сделать
command
вместоraw
. Это просто напечатало то же самое предупреждение об использованииfile
сstate=absent
.Я собираюсь сказать, что кажется, что если вы не используете
raw
это, то есть некоторая защита отrm
беснования. Вы не должны полагаться на это, хотя. Я быстро просмотрел код Ansible и, обнаружив предупреждение, не нашел ничего, что могло бы фактически остановить выполнениеrm
команды.источник
/boot
.boot
это первая запись в каталоге/
. Таким образом, файлы не были потеряны.rm -rf {{x}}/{{y}}
когдаy
установлено"*"
.--no-preserve-root
Проверка полезна для того, что он есть, но он не будет получать вас из любой возможной ситуации; это достаточно легко обойти. Вот почему этот вопрос не был сразу воспринят как обман: принимая во внимание плохой английский и очевидные синтаксические ошибки, это правдоподобно .raw
, плохойcron
может быть еще один способ разрушить систему.Будет ли Ansible предотвращать казнь
rm -rf /
сценария оболочки?Я проверил источник coreutils rm , который имеет следующее:
Единственный способ стереть с корня - пройти через этот блок кода. Из этого источника :
Я понимаю, что это означает, что функция
get_root_dev_ino
возвращает ноль/
, и, следовательно, rm завершается ошибкой.Единственный способ обойти первый блок кода (с рекурсией) - это иметь
--no-preserve-root
и не использовать переменную окружения для переопределения, поэтому он должен быть явно передан в rm.Я считаю, что это доказывает, что если Ansible явно проходит
--no-preserve-root
rm
не перейдет к , он не сделает этого.Вывод
Я не верю, что Ansible явно предотвращает,
rm -rf /
потому чтоrm
сам предотвращает это.источник