Sto cercando di utilizzare Python per un app incorporato in un processore ARM con Linux (CPython 2.7.3 cross-compilato da X86/Linux). Ha funzionato molto bene fino a quando ho iniziato a fissare il dispositivo per evitare manomissioni. Per prima cosa ho fatto il rootfs di sola lettura, sia per prevenire la corruzione del rootfs in caso di improvvisa perdita di potenza sia per impedire modifiche al nostro codice principale da parte di utenti non autorizzati. Ancora, Python e le nostre librerie di ctypes hanno continuato a funzionare normalmente. La directory/tmp viene mappata su un tmpfs (ramdrive). Un altro passo è quello di impostare il flag noexec sulla partizione tmpfs per impedire agli utenti di caricare in qualche modo qualsiasi codice che potrebbe portare a un exploit root locale. Con entrambe le opzioni impostate, importando ctypes produce un segfault immediata:Python ctypes segmentation fault quando rootfs è di sola lettura e/tmp è 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
È interessante notare che nessuna delle modifiche di seguito permette ctypes per funzionare correttamente:
- Rimontare i rootfs come lettura-scrittura
- Rimontare i tmpfs senza noexec
- Montare/dev/shm senza noexec
Qualche idea di cosa sta causando questo? Per ora, ho reso/dev/shm mount senza noexec, e lo limito solo ai meno utenti possibili.
Importazione chiamate ctypes ['_reset_cache'] (http://hg.python.org/cpython/file/70274d53c1dd/Lib/ctypes/__init__.py#l265), che crea un callback. Saltando, ['_ctypes_alloc_callback'] (http://hg.python.org/cpython/file/70274d53c1dd/Modules/_ctypes/callbacks.c#l408) chiama libffi' ffi_closure_alloc'. Guarda [Modules/_ctypes/libffi/src/closures.c] (http://hg.python.org/cpython/file/70274d53c1dd/Modules/_ctypes/libffi/src/closures.c). – eryksun
Hai impostato un breakpoint su 'ffi_closure_alloc',' dlmmap' e 'dlmmap_locked'? Credo che tu stia finendo in quest'ultimo, che itera attraverso la gamma di opzioni [ 'open_temp_exec_file_opts'] (http://hg.python.org/cpython/file/70274d53c1dd/Modules/_ctypes/libffi/src/closures. C# L313). – eryksun
Puoi ancora riprodurre il problema? In tal caso, puoi pubblicare il contenuto di ''/proc/mounts'' sul tuo dispositivo nella configurazione in cui si verifica l'arresto anomalo? ctypes/libffi analizza quel file, quindi forse si blocca lì. –