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:
- Ponowny montaż głównego systemu plików do odczytu i zapisu
- Ponowny montaż tmpfs bez noexec
- 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.
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
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
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. –