На форумах Reddit опубликовали копию закрытого обсуждения критической уязвимости CVE-2012-1823 в конфигурациях PHP-CGI, которая была обнаружена в январе 2012 года, а нормальный патч для неё ещё не готов. По чистой случайности обсуждение этой уязвимости пометили как открытое — и его сразу скопировали на Reddit, так что информация о баге стала достоянием общественности.
В январе 2012 года уязвимость обнаружили специалисты компании Eindbazen. Причиной бага является то, что в 2004 году разработчики PHP зачем-то убрали из кода проверку на знак ‘=’ в строке запроса. Согласно CGI RFC, в случае отсутствия знака ‘=’ в строке запроса, сервер обязан воспринимать эту строку как набор символов, а не как команду.
search-string = search-word *( "+" search-word )
search-word = 1*schar
schar = xunreserved | escape | xreserved
xunreserved = alpha | digit | xsafe | extra
xsafe = "$" | "-" | "_" | "."
xreserved = ";" | "/" | "?" | ":" | "@" | "&"Однако, с 2004 года в PHP убрали эту проверку, так что теперь в некоторых конфигурациях сервера и обработчика запросов аргумент вроде ?-s в URL любого php-документа воспринимается как прямая команда -s к бинарнику php-cgi. Более того, таким способом можно направить к PHP любое количество параметров, приводящие к показу исходников скриптов, исполнению произвольного кода и т.д. От такой атаки не спасают ни safe_mode, ни allow_url_include, ни какие-то другие защитные опции ini.
PHP Group выпустила обновленные версии PHP 5.3.12 и PHP 5.4.2, которые должны закрывать уязвимость, но обе содержат баг, позволяющий легко обойти сделанный патч. Новый фикс выйдет в самое ближайшее время.
Источники: www
.php
.net и www
.xakep
.ru