Официальная страница / Official page
Web Code - это среда безопасного выполнения алгоритмической части PHP-кода, для PHP4.
Требования: PHP4, разрешенный tokenizer
Лицензия: GPL v.3
Скачать: Web Code v.0.22
Чтобы понять, что это такое, приведу сообщение, которое я разместил в 2006 году на ряде сайтов, посвященных компьтерной безопасности.
-----8<-----
Страшный сон администратора уже реальность.
Представьте, что вам необходимо разрешить любому человеку выполнить на вашем сайте произвольный PHP код. Дикость? Конечно. Но примем за основу то, что есть некий проект, в котором необходимо обеспечить безопасное выполнение произвольного PHP-кода на строне сервера.
То есть, задача - позволить выполнять на сайте произвольный PHP код, который может добавить и выполнить любой пользователь интернета.
Насколько вы понимаете, такой веб-сервис - потенциальная дыра в системе безопасности. Причем, сделать все нужно не через экзотическую систему виртуальной машины PHP5 из расширения PECL, а более простыми средствами, доступными в PHP4.
Есть одно облегчающее обстоятельство. В выполняемом PHP-коде нужно разрешить выполнять только:
- алгоритмическую часть (без ООП),
- математические функции,
- функции вывода типа echo или print.
Обсуждение реализации такого сервиса, можно почитать здесь:
http://phpclub.ru/talk/showthread.php?s=&threadid=81551&perpage=20&pagenumber=1
В результате, сервис был сделан, и теперь, в целях проверки, я приглашаю всех желающих попробовать взломать эту чудо-разработку. Думаю, не перевелись еще на Руси люди, которым это будет интересно. Все запущено на FreeBSD, Apache, PHP 4, SAFE MODE не включен.
Страничка сервиса находится здесь http://xi.net.ru/sandbox/webcode.php
На страничке расположены поле для кода и кнопка "Выполнить". Вы можете добавлять любой PHP-код, и если система посчитает его безопасным, он будет запущен на выполнение на сервере, а в окно браузера будет выдан результат.
Если система посчитает код опасным, будет выдано предупреждение с указанием опасной строки и конструкции в ней.
Скопируйте, например, такой код, и запустите его на выполнение
$i=3;
$j=5;
echo $i+$j;
В ответ будет выдано 8, т.е. система работает. Теперь нужно выяснить, насколько эта система безопасна.
Соглашения
- PHP код не нужно оформлять тегами начала-конца php-кода (<?, <?php, ?> и тому подобные), система сама их добавит.
- В PHP коде разрешено использовать только алгоритмические конструкции языка, математические функции, команды echo и print.
- Вы можете описывать свои функции и использовать их.
- Для задания строк используйте апостроф. Использование двойных кавычек и обратного апострофа запрещено.
- Использование переменных переменных ($$) запрещено.
- Использование объектно-ориентированной части языка PHP запрещено.
- После проверки, введеный код выполняется через функцию eval().
- Код не проверяется на ошибки в синтаксисе PHP.
- Код не проверяется на зацикленность.
- Код не проверяется на возможность выделения достаточной памяти
В данный момент проверяется именно валидатор кода. Поэтому других мер безопасности - защита от флуда и прочее, пока не реализовано. Пожалуйста, не нарушайте работу сервера тупым JavaScript флудом и другими нагружающими поделками.
Проверка валидатора
(то, ради чего все и затевалось)
В данный момент нужно выяснить главную вещь - действительно ли валидатор выявляет все опасные конструкции. Для этого, в тот же каталог, где расположен скрипт webcode.php, помещен файл msg.txt. Права на него назначены как 600, его содержимое могут читать php-скрипты, а непосредственно из интернета он не виден.
В файле msg.txt находится сообщение, которое необходимо каким-либо образом попытаться прочитать. Вы можете использовать любые технические методы взлома. Но обратите внимание, социальный хак хостера - это не круто . Взлом через сниффинг пароля на админку - за взлом webcode.php не считается.
Если вам удасться прочитать содержимое файла msg.txt, пожалуйста, пришлите мне текст этого файла, и последовательность ваших действий. При нахождении дырки просьба сильно не резвиться на сервере, файлы не уничтожать. Если охота порезвиться, ограничтесь пожалуйста дефейсом.
Ваши замечания или отчеты об обнаруженных дырках присылайте пожалуйста на e-mail xintrea@gmail.com.
Информация так же размещена на PhpClub.ru, BugTraq.ru, SecurityLab.ru.
-----8<-----
Проверка кода на допустимось сделана через функции PHP-подсистемы tokenizer. Полученные в результате лексического анализа токены проверялись на недопустимые последовательности. Если обнаружена хоть одна недопустимая последовательность, код отклонялся от выполнения на сервере. Кроме того, было несколько дополнительных более простых проверок.
После запуска сервиса Web Code, было сделано три взлома в течении первой недели. После каждого взлома код исправлялся. После первой недели и трех исправлений, сервис проработал восемь месяцев, в течении которого взломов больше небыло. За всё время работы было допущено на выполнение чуть более 1500 скриптов. Затем, в связи с закрытием хостинга, сервис был отключен.
История взломов
Сервис включен 07.06.2006.
Взлом №1
Дата: 08.06.2006
Автор: Valyala
Код:
$a = 'file_get_contents';
echo ${'a'}('msg.txt');
Причина взлома: недокументированный синтаксис PHP. Предполагалось, что переменные переменных запрещены. Но выяснилось, что доступ к переменной переменной $$a можно получить с помощью синтаксической конструкции $('a').
Взлом №2
Дата: 09.06.2006
Автор: Paganoid
Код:
$lol = 'file_get_contents';
$mamba = 'lol';
echo $/*bad*/$mamba/*bad*/('msg.txt');
Причина взлома: проверяющая функция, перед проверкой токенов, удаляет незначащие токены-разделители. Токены-разделители - это пробелы, табуляции, переводы строк. Но небыло учтено то, что комментарии тоже являются незначащими токенами-разделителями.
Взлом №3
Дата: 14.06.2006
Автор: Paganoid
Код: Взлом через URL со специально искаженным кодом (использование символа 0Dh)
http://xi.net.ru/sandbox/webcode.php?httpcodetext=//$%0Decho%20file_get_contents(%27msg.txt%27);
Причина взлома: нарушение главного правила безопасности - что проверяем,
то и запускаем. Проверка кода запускалась как:
checkcode(fileemulator($httpcodetext));
Выполнение кода запускалось как:
runcode($httpcodetext);
То есть, при выполнении, переменная $httpcodetext не обрабатывалась функцией fileemulator().
Сервис провисел на сайте еще несколько месяцев, больше взломов не было. Когда код стал неактуальным, он был открыт под свободной лицензией.