В поставляемом в составе тестового выпуска Red Hat Enterprise Linux 6.7 скрипте инициализации прокси сервера Squid выявлена (https://bugzilla.redhat.com/show_bug.cgi?id=1202858) проблема, которая приводит к удалению всех файлов в системе при перезапуске squid. По своей сути ошибка напоминает недавний инцидент (http://www.opennet.ru/opennews/art.shtml?num=41469) с удалением всех файлов пользователя в клиенте Steam и также приводит к выполнению команды "rm -rf /*" в случае незаполнения формирующей путь переменной.Pavel Šimerda, мэйнтейнер пакета squid из компании Red Hat, смог повторить эксперимент в виртуальной машине с тестовой веткой RHEL 6.7 и установленным пакетом squid-3.1.23-4.el6. Достаточно запустить squid командой "service squid start", после чего инициировать его перезапуск командой "service squid restart", в результате чего начнётся удаления всех файлов на диске.
В пакете squid-3.1.23-5.el6 проблема отмечена как решённая и связанная с регрессивным изменением кода.
Судя по всему, проблема вызвана патчем на основе предложенного (https://bugzilla.redhat.com/show_bug.cgi?id=1102343) ранее кода для контроля за полным завершением ранее работающего экземпляра squid в процессе перезапуска. В предоставляемом разработчиками Squid скрипте инициализации squid.init (https://github.com/mozilla-services/squid-rpm/blob/master/SO...) операция "rm -rf $SQUID_PIDFILE_DIR/*" используется дважды - в блоках stop и restart, при этом в restart удаление выполняется сразу после выполнения блока stop:
<font color="#461b7e">
stop
rm -rf $SQUID_PIDFILE_DIR/*
start
</font>
Т.е. при запуске "service squid restart" команда "rm -rf $SQUID_PIDFILE_DIR/*" запускается два раза. Переменная SQUID_PIDFILE_DIR определяется статически вначале файла и, кроме вышеотмеченных команд rm, в дальнейшем используется только в проверках. Подобная чистка содержимого директории $SQUID_PIDFILE_DIR убрана из скрипта инициализации RHEL из-за потенциальных проблем. Патч для решения проблемы (https://bugzilla.redhat.com/show_bug.cgi?id=1102343) с дублированием был подготовлен на основе оригинального скрипта инициализации squid и содержал типовую строку для чистки ("rm -rf $SQUID_PIDFILE_DIR/*"). С учётом отсутствия переменной SQUID_PIDFILE_DIR в варианте скрипта из состава RHEL 6, подобная чистка приводила выполнению команды "rm -rf /*".
URL: https://news.ycombinator.com/item?id=9254876
Новость: http://www.opennet.ru/opennews/art.shtml?num=41897