Пітонних пісочниць важко . Python за своєю суттю є інтроспективним, на різних рівнях.
Це також означає, що ви можете знайти заводські методи для конкретних типів із самих цих типів та сконструювати нові низькорівневі об'єкти, які будуть запускатись безпосередньо інтерпретатором без обмежень.
Ось кілька прикладів пошуку творчих способів вирватися з пісочниць Python:
Основна ідея - завжди знайти спосіб створити базові типи Python; функції та класи та вириваються з оболонки, отримуючи інтерпретатор Python для виконання довільного (неперевіреного!) байтового коду.
Те саме і більше стосується exec
твердження ( exec()
функція в Python 3).
Отже, ви хочете:
Суворо контролюйте компіляцію байтів коду Python або принаймні післяобробляйте байт-код, щоб видалити будь-який доступ до імен, починаючи з підкреслення.
Для цього потрібні глибокі знання про те, як працює інтерпретатор Python та як структурований байт-код Python. Об'єкти коду вкладені; байт-код модуля охоплює лише вищий рівень висловлювань, кожна функція та клас складаються з власної послідовності байтових кодів плюс метаданих, що містять, наприклад, інші об'єкти байт-кодів для вкладених функцій та класів.
Потрібно використовувати білі списки модулів, якими можна користуватися. Обережно.
Модуль python містить посилання на інші модулі. Якщо ви імпортуєте os
, os
у просторі імен вашого модуля є локальне ім'я, яке посилається на os
модуль. Це може призвести рішучого зловмисника до модулів, які можуть допомогти їм вирватися з пісочної скриньки. Наприклад, pickle
модуль дозволяє завантажувати довільні кодові об'єкти, наприклад, якщо будь-який шлях через білі модулі веде до pickle
модуля, у вас все ще виникає проблема.
Потрібно суворо обмежити часові квоти. Навіть найнейтралізований код все одно може намагатися запуститись назавжди, пов'язуючи свої ресурси.
Погляньте на RestrictedPython , який намагається надати вам суворий контроль над байт-кодом. RestrictedPython
перетворює код Python в те, що дозволяє контролювати, які імена, модулі та об'єкти допустимі в Python 2.3 до 2.7.
Якщо RestrictedPython
ця безпека є достатньою для ваших цілей, залежить від політики, яку ви здійснюєте. Не допускати доступу до імен, що починаються з підкреслення і суворо білими модулями, буде початком.
На мою думку, єдиний справді надійний варіант - це використовувати окрему Віртуальну машину, без доступу до мережі до зовнішнього світу, яку ви знищуєте після кожного запуску. Кожному новому сценарію замість нього надається новий VM. Таким чином, навіть якщо коду вдасться вирватися з вашої пісочної скриньки Python (що малоймовірно), весь зловмисник отримує доступ до нетривалого та без значення.