2014-09-05 2 views
4

Я включил seccomp через python-prctl в проекте. Я не могу понять, как выйти чисто - результат всегда убит.Как вы можете выйти из окна после включения seccomp в Python?

Я видел несколько примеров, которые используют ctypes или ffi, чтобы попытаться ссылаться на libc, но если я ожидаю их с WIFEXITED, у них тоже будет такая же проблема.

Пример кода ниже. Результат всегда «Мы были убиты до смерти».

def main(): 
    pid = os.fork() 
    if not pid: 
    prctl.set_seccomp(True) 
    os.write(0, 'Hi\n') 

# os._exit(0) 
# _exit(0) 
# sys._exit(0) 
# return 
# [email protected]#(*! What do? 

    endpid, status = os.waitpid(pid, 0) 
    print 'Child forked as %d and returned with %d' % (endpid, status) 
    if not os.WIFEXITED(status): 
    print 'Exitted abnormally' 
    if os.WIFSIGNALED: 
     if os.WTERMSIG(status) == signal.SIGKILL: 
     print 'We were killed to death' 
    else: 
    print 'Returned with %d' % (os.WEXITSTATUS(status)) 

Быстрое обновление, так как я забыл LibC материал:

Определение _Exit() выше ни с одной из них до сих пор в результате убийства.

# FFI Method 
ffi = cffi.FFI() 
# Use _exit, which avoids atexit(), etc 
ffi.cdef('void _exit(int);') 
libc = ffi.dlopen(None) 
_exit = libc._exit 

.... или ....

# ctypes method 
libc = cdll.LoadLibrary('libc-2.18.so') 
_exit = libc._exit 

ответ

3

Кто-то помог мне найти этот ответ:

In glibc up to version 2.3, the _exit() wrapper function invoked the kernel system 
call of the same name. Since glibc 2.3, the wrapper function invokes 
exit_group(2), in order to terminate all of the threads in a process. 

Поскольку _exit обертывания exit_group и exit_group не в Seccomp фильтре .... он убит. strace выполнения python показывает вызов exit_group.

+0

Спасибо за обмен знаниями tamarintech! Как объяснено [здесь] (http://stackoverflow.com/questions/33150281/seccomp-how-to-exit-success), ваш ответ подтвержден как правильный. – gsamaras