Компьютерная группа реагирования на чрезвычайные ситуации (CERT) опубликовала [3] уведомление об утечке информации о критической уязвимости в PHP, которая позволяет запустить произвольный код на сервере или просмотреть исходный код любого PHP-скрипта, выполняемого в CGI-режиме (используется некоторыми хостинг-провайдерами). Cкрипты, выполняемые с использованием mod_php и FastCGI (например, связки nginx с php-fpm), не подвержены проблеме.
Опасность уязвимости усугубляет тот факт, что несмотря на то, что разработчики PHP были уведомлены о проблеме ещё 17 января, а 23 февраля был отправлен дополнительный запрос от имени CERT, уязвимость остаётся неисправленной. Проблема вызвана ошибкой, допущенной в 2004 году. Интересно также то, что утечка информации возникла [4] из-за оплошности разработчиков PHP, поместивших [5] информацию о проблеме в публичный трекер ошибок, до момента выхода исправления с устранением уязвимости.
Эксплуатация проблемы тривиальна [6] - достаточно передать опцию командной строки, поддерживаемую интерпретатором, в качестве аргумента при выполнении запроса. Например, для показа исходного кода текущего скрипта достаточно указать "http://localhost/index.php?-s". Также можно поступить и с другими опциями и, проявив немного эрудиции, организовать выполнение кода на сервере. Всем пользователям PHP, использующим скрипты в режиме CGI, следует незамедлительно установить патч [7].
Дополнение 1: В экстренном порядке подготовлены [8] корректирующие выпуски PHP 5.3.12 и PHP 5.4.2, в которых предпринята попытка устранения указанной узявимости. В качестве дополнительного пути блокирования проблемы, в Apache предлагается использовать правила mod_rewrite:
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC] RewriteRule ^(.*) $1? [L]
Ещё один способ защиты - во враппере добавить "--". Например:
exec /usr/bin/php-cgi -- "$@"
Дополнение 2: Изучение выпущенных обновлений PHP 5.3.12 и PHP 5.4.2 показало [6], что они устраняют лишь частный случай эксплуатации и не исключают применения обходных путей совершения атаки. Дополнительные обновления PHP, полностью устраняющие уязвимость, будут выпущены в ближайшее время.
Дополнение 3: В публичном доступе появился эксплоит [9], позволяющий выполнить на сервере произвольный PHP-код, манипулируя директивами php.ini [10] через опцию "-d" (примерно так: "http://localhost/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://адрес").
Ссылки:
[1] http://htfl.ru/cat-news-php
[2] http://htfl.ru/cat-news-uyazvimosti
[3] /out.php?link=http://www.kb.cert.org/vuls/id/520827
[4] /out.php?link=http://www.reddit.com/r/PHP/comments/t3pr8/how_serious_is_this/
[5] /out.php?link=http://ompldr.org/vZGxxaQ
[6] /out.php?link=http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
[7] /out.php?link=https://bugs.php.net/patch-display.php?bug_id=61910&patch=cgi.diff-fix-check.patch&revision=latest
[8] /out.php?link=http://www.php.net/archive/2012.php#id2012-05-03-1
[9] /out.php?link=http://www.metasploitminute.com/2012/05/cve-2012-1823-php-cgi-bug.html
[10] /out.php?link=http://php.net/manual/en/ini.core.php