2013-07-17 10 views
6

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:

  1. Rimontare i rootfs come lettura-scrittura
  2. Rimontare i tmpfs senza noexec
  3. 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.

+0

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

+0

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

+0

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ì. –

risposta

0

non riesco a riprodurre questo con Python 2.7.6;

Sospetto che possa essere stato un bug valido.

Si consideri che ctypes possono avere bisogno di creare un callback unico (una funzione di livello C eseguibile). Sarebbe mmap un file anonimo (ok) o condiviso (non ok) con bit bit di esecuzione.

la gestione degli errori di memoria è sempre difficile, e avrebbe potuto facilmente sfuggito sviluppatori.

+0

Ranellato in questo problema (o qualcosa di molto simile) con Python 2.7.7 –