2013-07-17 6 views
6

Próbuję użyć Pythona do osadzonej aplikacji na procesorze Router z systemem Linux (CPython 2.7.3 skompilowany krzyżowo z X86/Linux). To działało naprawdę dobrze, dopóki nie zacząłem zabezpieczać urządzenia, aby zapobiec manipulacjom. Najpierw zrobiłem rootfs tylko do odczytu, zarówno w celu zapobieżenia uszkodzeniu rootfs w wyniku nagłej utraty mocy i zapobieżenia modyfikacji naszego głównego kodu przez nieautoryzowanych użytkowników. Mimo to, Python i nasze biblioteki ctypes nadal działały normalnie. Katalog/tmp zostaje zmapowany na tmpfs (ramdrive). Kolejnym etapem hartowania jest ustawienie flagi noexec na partycji tmpfs, aby uniemożliwić użytkownikom przesyłanie jakiegokolwiek kodu, który mógłby doprowadzić do lokalnego exploita root. Z obu tych opcji ustawionych, importowanie ctypes wywołuje natychmiastowy segfault:Python ctypuje błąd segmentacji, gdy rootfs jest tylko do odczytu i/tmp jest noexec.

[email protected]:~# python         
Python 2.7.3 (default, Jul 16 2013, 17:15:57) 
[GCC 4.3.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ctypes 
Segmentation fault 

Co ciekawe, każdy z tych zmian poniżej pozwala ctypes działać poprawnie:

  1. Ponowny montaż głównego systemu plików do odczytu i zapisu
  2. Ponowny montaż tmpfs bez noexec
  3. Ponowny montaż/dev/shm bez noexec

Każdy pomysł, co to powoduje? Na razie stworzyłem/dev/shm mount bez noexec, i po prostu ogranicz to do najmniejszych użytkowników.

+0

Importowanie wywołań ctypes ['_reset_cache'] (http://hg.python.org/cpython/file/70274d53c1dd/Lib/ctypes/__init__.py#l265), który tworzy wywołanie zwrotne. Pomijanie, ['_ctypes_alloc_callback'] (http://hg.python.org/cpython/file/70274d53c1dd/Modules/_ctypes/callbacks.c#l408) wywołuje libffi 'ffi_closure_alloc'. Zobacz [Modules/_ctypes/libffi/src/closures.c] (http://hg.python.org/cpython/file/70274d53c1dd/Modules/_ctypes/libffi/src/closures.c). – eryksun

+0

Czy ustawiłeś punkt przerwania na 'ffi_closure_alloc',' dlmmap' i 'dlmmap_locked'? Wydaje mi się, że kończysz na tym ostatnim, który jest iterowany przez szereg opcji ['open_temp_exec_file_opts'] (http://hg.python.org/cpython/file/70274d53c1dd/Modules/_ctypes/libffi/src/closures. C# l313). – eryksun

+0

Czy nadal możesz odtworzyć problem? Jeśli tak, czy możesz opublikować zawartość ''/proc/mounts' na swoim urządzeniu w konfiguracji, w której wystąpi awaria? ctypes/libffi analizuje ten plik, więc może się zawiesi. –

Odpowiedz

0

Nie mogę tego odtworzyć w Pythonie 2.7.6;

Podejrzewam, że mógł to być prawidłowy błąd.

Należy wziąć pod uwagę, że ctypes może wymagać utworzenia unikalnego wywołania zwrotnego (wykonywalna funkcja poziomu C). Byłby to jakiś anonimowy (ok) lub udostępniony plik (nie jest OK) z ustawionym bitem wykonania.

Obsługa błędów w pamięci jest zawsze trudna i mogła łatwo ominąć programistów.

+0

Zaskoczyło ten problem (lub coś bardzo podobnego) z Pythonem 2.7.7 –

Powiązane problemy