Неприятные вещи, которые пользователь может предоставить на сервере ruby-код - PullRequest
2 голосов
/ 17 мая 2010

Я бы хотел запустить предоставленный пользователем код ruby ​​на сервере. Какие потенциально неприятные вещи могут произойти? Я имею в виду такие вещи, как удаление файлов и т.д. Можете ли вы дать мне больше примеров?

Заранее спасибо!

Ответы [ 3 ]

8 голосов
/ 17 мая 2010

Ruby позволяет вам установить глобальную переменную $SAFE, которая будет точно определять, что разрешено делать испорченному коду. Подробнее об этом читайте в Блокировка Ruby в сейфе .

Если перефразировать, вот таблица эффектов $SAFE:

$ БЕЗОПАСНЫЕ Ограничения

0 Проверка использования предоставленных извне (испорченных) данных не производится. Это режим по умолчанию в Ruby.

> = 1 Ruby запрещает использование испорченных данных в потенциально опасных операциях.

> = 2 Ruby запрещает загрузку программных файлов из глобально доступных для записи мест.

> = 3 Все вновь созданные объекты считаются испорченными.

> = 4 Ruby эффективно разбивает работающую программу на две части. Необработанные объекты не могут быть изменены. Обычно это используется для создания «песочницы»: программа устанавливает среду, используя более низкий уровень $SAFE, затем сбрасывает $SAFE до 4, чтобы предотвратить последующие изменения в этой среде.

Это содержимое таблицы в нижней части связанной страницы, которая объясняет, что могут делать испорченные объекты на каждом уровне $SAFE. Исходя из этого, вы можете легко понять, какие плохие вещи может сделать код Ruby.

Определение безопасных уровней

$ SAFE> = 1

  • Переменные среды RUBYLIB и RUBYOPT не обрабатываются, и текущий каталог не добавляется в путь.
  • Параметры командной строки -e, -i, -I, -r, -s, -S и -x не допускаются.
  • Невозможно запустить процессы из $ PATH, если любой каталог в нем доступен для записи во всем мире.
  • Невозможно манипулировать каталогом, имя которого является испорченной строкой, или выполнять поиск в нем.
  • Не может связать испорченные строки.
  • Не может оценить испорченные строки.
  • Невозможно загрузить или запросить файл, имя которого является испорченной строкой.
  • Невозможно манипулировать или запрашивать состояние файла или канала, имя которого является испорченной строкой.
  • Невозможно выполнить системную команду или выполнить программу из испорченной строки.
  • Нельзя передать ловушку испорченной нити.

$ SAFE> = 2

  • Невозможно изменить, создать или удалить каталоги или использовать chroot.
  • Не удается загрузить файл из общедоступного каталога.
  • Невозможно загрузить файл с испорченным именем файла, начинающимся с ~.
  • Невозможно использовать File # chmod, File # chown, File # lstat, File.stat, File # truncate, File.umask, File # flock, IO # ioctl, IO # stat, Kernel # fork, Kernel # syscall Ядро # ловушка. Process :: setpgid, Process :: setsid, Process :: setpriority или Process :: egid =.
  • Не удается обработать сигналы с использованием ловушки.

$ SAFE> = 3

  • Все объекты созданы испорченными.
  • Невозможно удалить объекты.

$ SAFE> = 4

  • Невозможно изменить необработанный массив, хэш или строку.
  • Невозможно изменить глобальную переменную.
  • Невозможно получить доступ к переменным экземпляра незапятнанных объектов.
  • Невозможно изменить переменную среды.
  • Невозможно закрыть или открыть незапрошенные файлы.
  • Не может заморозить незапятнанные объекты.
  • Невозможно изменить видимость методов (приватных / общедоступных / защищенных).
  • Невозможно создать псевдоним в незапятнанном классе или модуле.
  • Не удается получить метаинформацию (например, списки методов или переменных).
  • Невозможно определить, переопределить, удалить или отменить определение метода в незаполненном классе или модуле.
  • Невозможно изменить объект.
  • Невозможно удалить переменные или константы экземпляра из необработанных объектов.
  • Невозможно манипулировать потоками, завершить поток, отличный от текущего, или установить abort_on_exception.
  • Не может быть локальных переменных потока.
  • Невозможно вызвать исключение в потоке с более низким значением $ SAFE.
  • Невозможно перемещать темы между группами нитей.
  • Невозможно вызвать выход, выход !, или прервать.
  • Может загружать только обернутые файлы и не может включать модули в классы и модули, не содержащие данных.
  • Невозможно преобразовать идентификаторы символов в ссылки на объекты.
  • Невозможно записать в файлы или каналы.
  • Невозможно использовать автозагрузку.
  • Не может испортить объекты.
1 голос
/ 17 мая 2010

Если вы работаете в обычном Ruby, то почти все, что могут делать ваши текущие пользовательские привилегии - так что в значительной степени пишите, удаляйте и переписывайте большинство файлов и т. Д.

1 голос
/ 17 мая 2010

Вся ваша база принадлежит пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...