Работя върху проект, в който ще изпълнявам потенциално зловреден код. Основната организация е, че има главен и подчинен процес. Подчиненият процес изпълнява потенциално злонамерения код и има активиран seccomp.
import prctl
prctl.set_seccomp(True)
Ето как се включва seccomp. Мога да комуникирам добре ОТ подчинения КЪМ главния, но не и обратното. Когато не включа seccomp, мога да използвам:
import sys
lines = sys.stdin.read()
Или нещо в тази насока. Намерих това за доста странно, трябва да имам достъп за четене и запис, като се имат предвид параметрите по подразбиране на seccomp, особено за stdin/out. Дори се опитах да отворя stdin, преди да включа seccomp. Например.
stdinFile = sys.stdin
prctl.set_seccomp(True)
lines = stdinFile.read()
Но пак без резултат. Опитах също readlines(), който не работи. Един приятел ми предложи да опитам Unix Domain Sockets, като го отворя преди seccomp да започне и след това просто да използвам извикването write(). Това също не проработи. Ако някой има някакви предложения как да се борим с този проблем, моля да ги публикува! Виждал съм някакъв код в C за нещо подобно
seccomp_add_rule(stuff)
Но не успях да използвам това в Python с модула cffi.
sys.stdin.read()
, защо просто не го направите, преди да извикатеset_seccomp(True)
? - person abarnert   schedule 11.08.2014stdinFile = sys.stdin
не отваря stdin, той просто правиstdinFile
друга препратка към същия stdin, който вече е отворен. Използването на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
от детето ви, но… можете ли да опитате да инсталиратеsubprocess32
да изключите PyPI и да го използвате вместо това, за да видите дали има значение? - 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