Предварительная фильтрация PHP кода - как разрешить только алгоритмические команды?

xintrea

Новичок
Отвечу сразу всем

> Ноги, видимо, растут отсюда - language.types.string#language.types.string.substr

Спасибо, не знал. Запрещу-ка я от греха и такие конструкции :)

PHP:
// Получение первого символа строки
$str = 'Это тест.';
$first = $str{0};

> То что ты так долго описывал, называет Безопасный интерпретатор. Для пхп не существует и врядли будет создан.

Вроде, для интерпретируемого языка, это сделать несложно.
А вот, как подсказывает master_x, и он - http://php.rinet.ru/manual/ru/runkit.sandbox.php


> а как насчет runkit? или я чего-то недопонял?
> там же есть sandbox... с настройками.

Эх, было бы это устоявшимся стандартом.. Не каждый хостер пока предлагает PHP 5.1 да еще и с runkit, ибо "This PECL extension is not bundled with PHP". А тот хостер, который предложит такой сервис, просит не 2 грина в месяц, а гораздо больше, что, например, мне неприемлемо.


Я понимаю, что то, что я делаю - это шаг назад в свете существования sandbox. Но как говорится - не все новое - благо, например, до сих пор использование MySQL не дает нужной стабильности работы. Практика показывает, что если ты сам не обрушишь собственную SQL-базу, то за тебя это сделает хостер, потом будет извиняться, восстановит из бекапа а через неделю опять обрушит :).

-~{}~ 30.05.06 15:23:

Господа, по ходу дела что-то получается. :)

Скоро выложу сюда ссылку, по которой вы можете проверить
и пощупать PHP с ограничениями "только алгоритмическая
часть".

Выполнялка PHP кода и ее WEB-интерфейс будет запущен
на обычном сервере FreeBSD с PHP 4.3. Можете попробовать
взломать и обойти ограничения. Если у вас реально
что-нибудь получится, просьба особенно не глумится и
если будет желание, сообщить как вы это сделали. :)
 

fixxxer

К.О.
Партнер клуба
о, какие велосипеды, однако. а не проще положить самосборный php в cgi-bin?

просит не 2 грина в месяц, а гораздо больше, что, например, мне неприемлемо.
восстановит из бекапа а через неделю опять обрушит
ну ты понял, ага :)
 

xintrea

Новичок
Автор оригинала: fixxxer
о, какие велосипеды, однако. а не проще положить самосборный php в cgi-bin?
Мне не проще - я ФрюБздю не знаю, а тем более не знаю как собрать php так, чтоб на всем пространстве сайта он работал полнофункционально, а вот в конкретном каталоге - как Безопасный Интерпретатор.

В любом случае нужно писать еще и рапорт-систему, показывающую пользователю запрещенные вещи, которые он пытается использовать, и еще желательнее - на русском. А рапорт-система о запрещенных конструкциях - это как раз валидатор и есть, который можно на PHP написать... Так зачем огород городить, если средствами PHP можно обойтись?

Вообще надо смотреть в действии как себя PHP-валидатор проявит, может, действительно придеца свой php собирать, вот тока еще с хостером надо договорица, чтоб он согласился левый бинарник себе положить.


ну ты понял, ага :)
Понял, понял :) Вот сделаю проект, который будет хотя бы 500 грин в месяц давать, тогда и в жызни это понятие буду применять :).

-~{}~ 08.06.06 01:48:

Итак, господа, даю обещанную ссылку.
http://xi.net.ru/sandbox/webcode.php

На страничке находится поле для кода и кнопочка "Выполнить". Вы можете добавлять любой PHP-код, и если система посчитает его безопасным, он будет запущен на выполнение на сервере, а в окно браузера будет выдан результат.

Если система посчитает код опасным, будет выдано предупреждение с указанием опасной строки и конструкции в ней.

Соглашения.

- PHP код не нужно оформлять тегами начала-конца php-кода ("<?", "<?php", "?>" и тому подобные), система сама их добавит.

- В PHP коде разрешено использовать только алгоритмические конструкции языка, математические функции, команды echo и print.

- Вы можете описывать свои функции и использовать их.

- Для задания строк используйте апостроф. Использование двойных кавычек и обратного апострофа запрещено.

- Использование переменных переменных ($$) запрещено.

- Использование объектно-ориентированной части языка PHP запрещено.

- После проверки, введеный код выполняется через функцию eval().

- Код не проверяется на ошибки в синтаксисе PHP

- Код не проверяется на зацикленность

- Код не проверяется на возможность выделения достаточной памяти


Все запущено на FreeBSD + Apache, PHP ветки 4, SAFE MODE не включен.

В данный момент проверяется именно валидатор кода. Поэтому других мер безопасности - защита от флуда и прочее, пока не реализовано. Пожалуйста, не нарушайте работу сервера тупым JavaScript флудом и другими "нагружающими" поделками.


Проверка валидатора.
(то, ради чего все и затевалось)

В данный момент нужно выяснить главную вещь - действительно ли валидатор выявляет все опасные конструкции. Для этого, в тот же каталог, где расположен скрипт webcode.php, помещен файл msg.txt. Права на него назначены как 600, его содержимое могут читать php-скрипты, а непосредственно из интернета он не виден.

В файле msg.txt находится сообщение, которое необходимо каким-либо образом попытаться прочитать. Вы можете использовать любые технические методы взлома. Но обратите внимание, социальный хак хостера - это не круто . Взлом через сниффинг пароля на админку - за взлом webcode.php не считается )

Если вам удасться прочитать содержимое файла msg.txt, пожалуйста, пришлите мне текст этого файла, и по настроению - последовательность ваших действий. При нахождении дырки просьба сильно не резвиться на сервере, файлы не уничтожать. Если охота порезвиться, ограничтесь пожалуйста дефейсом.

Ваши замечания или отчеты об обнаруженных дырках присылайте пожалуйста на мой любимый e-mail [email protected] или размещайте в этой теме.

Спасибо.
 

McSimm

Новичок
вероятно есть смысл запретить и чтение/запись в $GLOBALS
 

valyala

Новичок
PHP:
$a = 'file_get_contents';
echo ${'a'}('msg.txt');
Выводит содержимое файла msg.txt
 

xintrea

Новичок
Блин не могу проверить, хост не пингуется :)
Проверю через пару часов.

-~{}~ 08.06.06 14:50:

Автор оригинала: valyala
PHP:
$a = 'file_get_contents';
echo ${'a'}('msg.txt');
Выводит содержимое файла msg.txt
Ага, проверил, реально выводит.
Велик и ужасен синтаксис PHP! :)

Сейчас скрипт заблокирован, думаю как выявить и ограничить этот класс
конструкций. Как только выложу новую версию, сообщу сюда.

-~{}~ 08.06.06 15:01:

${'a'} - оказывается один из вариантов написания $$a.

Вот думаю какие ещо варианты имеются... Чуствую, что для этого надо понять, как разгребается PHP код сишным кодом.

Переменные переменных - удобный механизм, но в данном случае сильно портит жизнь!

-~{}~ 08.06.06 16:09:

Пожелания учтены, сервис снова в эфире.

Пробуем ломать дальше.

-~{}~ 09.06.06 12:20:

Сервис был взломан 09 Июн 2006 10:57:24 товарищем Paganoid.

Конструкция для взлома

PHP:
$lol = 'file_get_contents';
$mamba = 'lol';
echo $/*bad*/$mamba/*bad*/('msg.txt');
Подозревал, подозревал я что переменные переменных жизнь то попортят.
Учел, что в "приведенный" код для облегчения срабатывания regexp
не нужно вносить разделители. Да вот забыл что комментарий тоже может
являться разделителем.

Буду блокировать функции через ini_set (директива disable_function), чтоб таких сюрпризов больше небыло.

Сервис пока что остановлен.
 

xintrea

Новичок
Автор оригинала: SiMM
> Буду блокировать функции через ini_set (директива disable_function), чтоб таких сюрпризов больше небыло.
Не получится. http://ru.php.net/manual/ru/ini.php#ini.list
Как все грустно. Хотел перенести проблему обнаружение вызовов запрещенных
функций из области синтаксического анализа в область среды исполнения -
например переименовать запрещенные функции (дать рандомные имена)
через rename_functions(), так оказалось что эта функция PECL расширения,
к условиям нашей задачи не подходит.

Так или иначе, в сервис внесены коррективы и он снова запущен.
Для интереса, сервис теперь снабжен историей взломов.


Напоминаю адрес нашего уникального сервиса
http://xi.net.ru/sandbox/webcode.php

-~{}~ 17.06.06 14:05:

Последние новости.

Сервис все еще в полете. С начала первого запуска сервиса он был взломан три раза, три раза вносились исправления в проверяющий код.

Жду четвертый взлом, но пока никто ниасилил.

На текущий момент к выполнению был допущен 941 скрипт.


История взломов

Взлом N1

Время: 08.06.06 12:22
Автор: Valyala
Код:

$a = 'file_get_contents';
echo ${'a'}('msg.txt');


Взлом N2

Время: 09.06.06 10:57
Автор: Paganoid
Код:

$lol = 'file_get_contents';
$mamba = 'lol';
echo $/*bad*/$mamba/*bad*/('msg.txt');


Взлом N3

Время: 14.06.06 10:09
Автор: Paganoid
Код: Взлом через URL со специально искаженным кодом (использование символа 0Dh).

http://xi.net.ru/sandbox/webcode.php?httpcodetext=//$%0Decho%20file_get_contents(%27msg.txt%27);
 

xVoLAnD

Новичок
Позакрывали все функции... в реально жизни, с такими ограничения жить - НЕ БУДЕТ!!!
 

xintrea

Новичок
А в реальной жизни и нужно чтобы все функции были закрыты.
Нужно только

- Алгоритмическая часть классического процедурного программирования
- Математические функции
- Ну и может быть открою (для реальной жизни) несколько строковых функций

Относитесь к этой поделке как к бейсику в мегакомпьютере Spectrum.
В нем тоже всего-то была алгоритмизация, матфункции, строковые функции,
функции работы с магнитофоном и низкоуровневые функции. Два последних
пункта нам ненужны :).
 

SiMM

Новичок
> - Ну и может быть открою (для реальной жизни) несколько строковых функций
А в строковых функциях какая засада? Исключая preg_replace_callbcak и preg_replace с ключём e? Вообще конечно ограничение на использование двойных кавычек (") довольно существенно, ИМХО.
 

xVoLAnD

Новичок
@ xintrea

Ты тогда напиши, чего открыто.... чего закрыто....
а то получается, как в лесу, захотел посрать, а там белка :)


P.S> Смысл такого тестирования сводится к поиску дыр в самом PHP (обработке ф-ций),
а когда их найдут, то ничего не поможет....

P.S.S> Ищем негра в чёрной комнате... Про негра нам ничего не известно...
есть он в комнате или нет - история умалчивает :) Мы только знаем, что негры похожи на людей и у них есть глаза, рот и уши...
пользуются они только глазами, а остальное им не нужно...
 

xintrea

Новичок
2 xVoLAnD

> Ты тогда напиши, чего открыто.... чего закрыто....
> а то получается, как в лесу, захотел посрать, а там белка

Смотри сообщение об открытии сервиса от 30.05.06 22:16, раздел Соглашения. Там написано что

- PHP код не нужно оформлять тегами начала-конца php-кода ("<?", "<?php", "?>" и тому подобные), система сама их добавит.
- В PHP коде разрешено использовать только алгоритмические конструкции языка, математические функции, команды echo и print.
- Вы можете описывать свои функции и использовать их.
- Для задания строк используйте апостроф. Использование двойных кавычек и обратного апострофа запрещено.
- Использование переменных переменных ($$) запрещено.
- Использование объектно-ориентированной части языка PHP запрещено.
- После проверки, введеный код выполняется через функцию eval().
- Код не проверяется на ошибки в синтаксисе PHP
- Код не проверяется на зацикленность
- Код не проверяется на возможность выделения достаточной памяти


> Смысл такого тестирования сводится к поиску дыр в самом PHP (обработке ф-ций), а когда их найдут, то ничего не поможет....

А дыры в обработке функций PHP и так известны, смотри на php.net багтрекер.


> Ищем негра в чёрной комнате... Про негра нам ничего не известно... есть он в комнате или нет - история умалчивает Мы только знаем, что негры похожи на людей и у них есть глаза, рот и уши... пользуются они только глазами, а остальное им не нужно...

Ну а разве при взломе какого-нить сайта тебе все известно о используемых скриптах? Тут же задачка не для киндер скриптеров которые форумы ломают готовыми эксплойтами. Кроме того, система сама тебе рассказыват, что она позволяет делать а что нет.
 

xintrea

Новичок
Автор оригинала: SiMM
А в строковых функциях какая засада? Исключая preg_replace_callbcak и preg_replace с ключём e? Вообще конечно ограничение на использование двойных кавычек (") довольно существенно, ИМХО.
К строковым функциям у меня предвзятое отношение :)
С тех времен, когда были ugly-баги в самих GCC реализациях строковых функций, например в strlen(). Обычно на них срабатывают всякие переполнения.

А про кавычки...
Вообще то я бы с радостью открыл использование двойных кавычек.
Только кто-нибудь пусть расскажет как гарантировано выделять вызовы взятия значений в таких строках. Например
PHP:
$var='file_get_contents("msg.txt")';
echo "А вот содержимое файла $$var";
В таких строках можно хорошо поизвращаться. Токенайзером их не возьмешь, остаются тока регулярные выражения. А учесть в них все возможные хитрые или замаскированые вызовы (например через переменные переменных) - по ходу дела нереально.
 

SiMM

Новичок
> Только кто-нибудь пусть расскажет как гарантировано выделять вызовы взятия значений в таких строках.
PHP:
$var='file_get_contents("msg.txt")'; 
echo "А вот содержимое файла $$var";
Честно говоря, не понял проблемы - результат выполнения кода:
Код:
А вот содержимое файла $file_get_contents("msg.txt")
что соответствует документации - [m]language.types.string#language.types.string.parsing[/m]
 

xintrea

Новичок
Кстати, почитал тута

http://ru.php.net/manual/ru/language.types.string.php

и подумал, а что если разрешить строки с двойными кавычками с парой оговорок. В таких строках

- вообще запрещены символы $
- вообще запрещены символы фигурных скобок {}

Вот... Теперь думаю - достаточно ли будет таких ограничений? Или остается какая-нибудь лазейка?

-~{}~ 21.06.06 16:05:

Автор оригинала: SiMM
> Только кто-нибудь пусть расскажет как гарантировано выделять вызовы взятия значений в таких строках.
PHP:
$var='file_get_contents("msg.txt")'; 
echo "А вот содержимое файла $$var";
Честно говоря, не понял проблемы - результат выполнения кода:
Код:
А вот содержимое файла $file_get_contents("msg.txt")
что соответствует документации - [m]language.types.string#language.types.string.parsing[/m]
Да, пример неудачный, точнее нерабочий. :)
Просто "Обработка переменных" все же сильно смущает.
Жопой чуствую что есть в этом лазейка.
А мозгом увидеть эту лазейку не могу.
 

SiMM

Новичок
> Жопой чуствую что есть в этом лазейка.
Как найдёшь - сообщи. А то я что-то не чувствую ;)
 

Angerslave

Новичок
Поднимку-ка тему...
Вариант - заменять все функции в коде на функции с тем же именем, но, например, префиксом sandbox_, то есть функция fopen станет sandbox_fopen и т.д. Ну а в управляющем скрипте просто определяем доступные функции.
 

Alexandre

PHPПенсионер
я бы все пропустил через фильтр а потом eval()
фильтр отсеивает все тексты, как запрещенные где есть строки с любыми функциями, кроме имен, указанных в хешмассиве.
Думаю, их перечень автор уже определил

да и еще отслеживание строк $$var ,eval и $_var
 
Сверху