информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / web building
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Предварительная фильтрация PHP кода - как разрешить только алгоритмические команды? 03.03.06 18:08  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Здравствуйте.

Вот у меня тут есть такой вопрос, не совсем обычный...

Можно ли (и если можно, то каким образом) сделать так, чтобы на сайте с языком PHP
существовал раздел, который бы позволял любому пользователю добавлять PHP-код
и сразувыполнятьего. Причем от языка PHP нужно разрешить только "алгоритмическую"
часть, то есть разрешить в коде использовать только

- работу с переменными
- работу с массивами
- функции, определенные в текущем коде
- вывод print или echo
- (опционально) математические функции

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

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

Из возможных путей я пока вижу несколько -

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

- Проанализировать код на наличие описания функций (Это более-менее просто).
Просканировать код и определить все места вызова функций (кстати, как правильно
это сделать?). Если вызывается неописанная функция, не разрешать код к запуску...

- Комплексный подход средствами UNIX и PHP. Выделить директорию, выход из которой
для php скриптов невозможен (это вообще реально сделать?). Назначить права для
предотвращения записи внутри директории с такими скриптами. Это ограничит файловые
функции скриптов пользователей. Обрезать опции по самые яйца в php.ini (а что там можно
реально обрезать?).

(Дополнительные условия - все должно работать на обычном UNIX хостинге без
экзотических конфигураций.. То есть, иметь два транслятора php или два файла
php.ini -для обыной части сайта и для "защищенной" - ни один админ не будет с
этим ковыряться.)


У кого есть какие соображения по этому поводу? В каком направлении копать?
опции memory_limit и max_execution_time спасут. 04.03.06 20:26  
Автор: paganoid Статус: Member
<"чистая" ссылка>
> Здравствуйте.
>
> Вот у меня тут есть такой вопрос, не совсем обычный...
>
> Можно ли (и если можно, то каким образом) сделать так,
> чтобы на сайте с языком PHP
> существовал раздел, который бы позволял любому пользователю
> добавлять PHP-код
> и сразувыполнятьего. Причем от языка PHP нужно
> разрешить только "алгоритмическую"
> часть, то есть разрешить в коде использовать только
>
> - работу с переменными
> - работу с массивами
> - функции, определенные в текущем коде
> - вывод print или echo
> - (опционально) математические функции
>
> Возможные проблеммы зацикливания чужого кода, проблеммы
> потенциально возможных
> больших массивов можно пока не рассматривать.

опции memory_limit и max_execution_time спасут.

>
> Так вот сам вопрос - можно ли такую вещь как-нибудь
> сделать?
> Конечно, понятно, что такой раздел на сайте - огромнейшая
> дыра и потенциальная угроза,
> причем ещо какая. Но вот может быть всеже есть возможность
> сделать такую вещь
> без сильного нарушения безопасности?
>
> Из возможных путей я пока вижу несколько -
>
> - Предварительно фильтровать PHP код на наличие
> недопустимых функций
> и не позволять его запускать. Список недопустимых функций
> будет весьма большой,
> и будет зависеть от подключенных модулей... Так что все
> учесть сложно...

Есть какая-то "виртуальная машина" для PHP, посмотри на их сайте. Внутри этой машины
можно попробовать установить ограниченный список модулей, требуемый safe mode.

>
> - Проанализировать код на наличие описания функций (Это
> более-менее просто).
> Просканировать код и определить все места вызова функций
> (кстати, как правильно
> это сделать?). Если вызывается неописанная функция, не
> разрешать код к запуску...

В этом варианте навскидку видится только декомпилятор. В качестве другого более менее приемлемого решения - сделать на код highlight с помощью встроенной PHP функции, т.о. найти фрагменты именно кода, а там уже preg-ом. Кстати все равно preg будет хватать лишнее (названия ф-й внутри переменных и комментариев).

>
> - Комплексный подход средствами UNIX и PHP. Выделить
> директорию, выход из которой
> для php скриптов невозможен (это вообще реально сделать?).
> Назначить права для
> предотвращения записи внутри директории с такими скриптами.
> Это ограничит файловые
> функции скриптов пользователей. Обрезать опции по самые
> яйца в php.ini (а что там можно
> реально обрезать?).

См. php safe mode - в нем можно задать опцию open_base_dir - откуда php может читать файлы. Там же можно обрезать список разрешенных функций. Сам список достаточно просто получить через get_defined_function или что-то вроде там такое есть.

>
> (Дополнительные условия - все должно работать на обычном
> UNIX хостинге без
> экзотических конфигураций.. То есть, иметь два транслятора
> php или два файла
> php.ini -для обыной части сайта и для "защищенной" - ни
> один админ не будет с
> этим ковыряться.)

Версия - обычный PHP - в виде модуля, а "песочница" - через интерпретатор, урезанный с помощью php.ini. И выполнять чужие скрипты только через этот через интерпретатор. Кстати, приблизительно так иногда делают для crontab скриптов.

>
> У кого есть какие соображения по этому поводу? В каком
> направлении копать?
Ага, это обязательно. 06.03.06 15:33  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> опции memory_limit и max_execution_time спасут.

Ага, это обязательно.


> - Проанализировать код на наличие описания функций
> (Это более-менее просто). Просканировать код и определить все места вызова
> функций (кстати, как правильно это сделать?). Если вызывается неописанная функция, не
> разрешать код к запуску...
>
> В этом варианте навскидку видится только декомпилятор. В
> качестве другого более менее приемлемого решения - сделать
> на код highlight с помощью встроенной PHP функции, т.о.
> найти фрагменты именно кода, а там уже preg-ом. Кстати все
> равно preg будет хватать лишнее (названия ф-й внутри
> переменных и комментариев).

Для этого мне посоветовали использовать токенайзер http://www.php.net/tokenizer,
это оказывается встроенный лексический анализатор PHP-кода, доступный
по умолчанию в PHP, начиная с версии 4.3.0


> См. php safe mode - в нем можно задать опцию open_base_dir
> - откуда php может читать файлы. Там же можно обрезать
> список разрешенных функций. Сам список достаточно просто
> получить через get_defined_function или что-то вроде там
> такое есть.

Спасибо, работа пошла.
Круто, век живи, век учись (это я про tokenizer). 06.03.06 18:09  
Автор: paganoid Статус: Member
Отредактировано 06.03.06 18:23  Количество правок: 1
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach