Я работаю над проектом, в котором буду запускать потенциально вредоносный код. Его основная организация заключается в том, что есть ведущий и подчиненный процессы. Подчиненный процесс запускает потенциально вредоносный код и включает seccomp.
import prctl
prctl.set_seccomp(True)
Вот как включается seccomp. Я могу нормально общаться ОТ ведомого к ведущему, но не наоборот. Когда я не включаю seccomp, я могу использовать:
import sys
lines = sys.stdin.read()
Или что-то вдоль этих линий. Я нашел это довольно странным, у меня должен быть доступ для чтения и записи, учитывая параметры seccomp по умолчанию, особенно для stdin/out. Я даже пытался открыть стандартный ввод до того, как включу seccomp. Например.
stdinFile = sys.stdin
prctl.set_seccomp(True)
lines = stdinFile.read()
Но все равно безрезультатно. Я также пробовал readlines(), который не работает. Друг предложил мне попробовать сокеты домена Unix, открыв его перед запуском seccomp, а затем просто используя вызов write(). Это тоже не сработало. Если у кого-то есть предложения по борьбе с этой проблемой, пишите! Я видел некоторый код на C для чего-то вроде
seccomp_add_rule(stuff)
Но мне не удалось использовать это в Python с модулем cffi.
sys.stdin.read()
, почему бы просто не сделать это перед вызовомset_seccomp(True)
? - person abarnert   schedule 11.08.2014stdinFile = sys.stdin
не открывает стандартный ввод, он просто делаетstdinFile
еще одну ссылку на тот же самый стандартный ввод, который уже открыт. Использованиеreadlines
вместоread
ничему не поможет. (Кроме того,read()
все это в одну гигантскую строку может ввести в заблуждение, но назовите эту строкуlines
.) - person abarnert   schedule 11.08.2014stdin
передset_setcomp
); Я не знаю, работает ли это для вашего варианта использования или нет, но может. - person abarnert   schedule 11.08.2014seccomp
. Или если вы можете получить доступ к общей памяти. Я понятия не имею, сработает ли что-нибудь из этого, но попробовать не помешает, верно? Надеюсь, у кого-то будет реальное решение, но пока это не так, лучше иметь запасной обходной путь, чем нет… - person abarnert   schedule 12.08.2014sys.stdin.read
может делать больше, чем простоread
на системном уровне, либо на уровне Python, либо на уровне stdio; может быть, получить fd сsys.stdin.fileno()
, а затем использоватьos.read
для этого сработает? (Если вы используете 3.x, вы можете попробовать получитьsys.stdin.buffer.raw
и вызватьread
вместо самогоstdin
, но это вряд ли будет проблемой.) - person abarnert   schedule 12.08.2014cat file.txt | ./script.py
, мой скрипт может читать из этогоstdin
и печатать эти сообщения. Но это невозможно, когда я открываю его в подпроцессе.self.p = Popen([sys.executable, "script.py"], stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False)
вот как я его открываю. - person KosherBacon   schedule 13.08.2014cat
использует обычный буферизованный stdio, точно так же, как объекты Python 2.7file
, так что это исключает множество возможностей, когда родительская сторона делает что-то неправильно при написании. Поэтому лучше всего предположить, что разница между тем, что делаетsubprocess
, и тем, что делает оболочка. Вы можете проверить это, изменив свой скрипт Python, чтобы он просто печатал материал, а затем передал его в другой скрипт; если это все еще работает, это, вероятно,subprocess
трубопровод… - person abarnert   schedule 13.08.2014subprocess
до Python 3.2 имеют некоторые ошибки, которые могут привести к блокировке в некоторых странных обстоятельствах. Я не знаю, может ли то же самое привести к тому, что ваш ребенок нарушит правилаseccomp
, но… не могли бы вы попробовать установить - person abarnert   schedule 13.08.2014subprocess
в порядке, а ваши файловые объекты вообще не используютstdio
; любая буферизация в чистом Python. Что оставляет нам еще меньше возможностей. Я думаю, мы устранили невозможное, но ничего невероятного не осталось, а это значит… что я не такой умный, как Шерлок Холмс, наверное… - person abarnert   schedule 13.08.2014/proc/pid/fd/0
(гдеpid
- это pid подпроцесса) или в любом другом месте файла. Мне также нужно найти номер файлового дескриптора для sys.stdin. Если бы я мог писать в этот файл с мастера, может быть, это сработало бы? - person KosherBacon   schedule 13.08.2014seccomp
, по крайней мере, не читая больше? Кроме того, если вы запускаете процесс, я думаю, вы можете просто убедиться, что егоstdin
равен fd 0 (это означает, что не нужно делать ничего странного, чтобы сломать то, что делаетsubprocess
), вместо того, чтобы пытаться понять это. Если нет, вы упомянули, что можете писать в другом направлении, так что ребенок всегда может начать сsys.stdout.write('{}\n'.format(sys.stdin.fileno()))
, я полагаю. - person abarnert   schedule 13.08.2014