На самом деле можно сделать.
То есть практически то, что вы описываете, может быть выполнено в Linux, в отличие от других ответов здесь.Таким образом, вы можете выполнить настройку, при которой у вас может быть exec
-подобный вызов, который запускает ненадежный код в режиме безопасности, в который довольно сложно проникнуть, и который позволяет выводить результат.Ненадежному коду вообще не разрешен доступ к файловой системе, кроме чтения специально разрешенных частей Python vm и стандартной библиотеки.
Если это достаточно близко к тому, что вы хотели, читайте дальше.
IЯ представляю себе систему, в которой ваша exec-подобная функция порождает подпроцесс под очень строгим профилем AppArmor, например, используемый Straitjacket (см. здесь и здесь ).Это ограничит доступ ко всей файловой системе на уровне ядра, кроме файлов, специально разрешенных для чтения.Это также ограничит размер стека процесса, максимальный размер сегмента данных, максимальный размер резидентного набора, время ЦП, количество сигналов, которые могут быть поставлены в очередь, и размер адресного пространства.У процесса будут заблокированы память, ядра, блокировки flock / fcntl, очереди сообщений POSIX и т. Д.Если вы хотите разрешить использование временных файлов с ограниченным размером в пустой области, вы можете mkstemp
сделать это и сделать его доступным для подпроцесса, а также разрешить запись туда при определенных условиях (убедитесь, что жесткие ссылки абсолютно запрещены).Вы должны быть уверены, что удалили что-нибудь интересное из среды подпроцесса и поместили его в новую сессию и группу процессов и закрыли все FD в подпроцессе, кроме stdin / stdout / stderr, если вы хотите разрешить связь сте.
Если вы хотите иметь возможность получить объект Python обратно из ненадежного кода, вы можете обернуть его во что-то, что выводит repr
результата в стандартный вывод, и после проверки его размера выоцените это с ast.literal_eval()
.Это довольно сильно ограничивает возможные типы объектов, которые могут быть возвращены, но на самом деле, что-либо более сложное, чем эти базовые типы, вероятно, несет в себе возможность злонамеренного секрита, предназначенного для запуска в вашем процессе.Ни при каких обстоятельствах вы не должны использовать pickle
для протокола связи между процессами.