当rootfs为只读并且/tmp为noexec时,Python ctypes分段错误



我正试图在运行Linux的Arm处理器上使用Python作为嵌入式应用程序(CPython 2.7.3从X86/Linux交叉编译而来)。它运行得非常好,直到我开始保护设备以防止篡改。首先,我将rootfs设为只读,以防止rootfs在突然断电时损坏,并防止未经授权的用户修改我们的主代码。尽管如此,python和我们的ctypes库仍然正常工作。/tmp目录被映射到tmpfs(ramdrive)。另一个强化步骤是在tmpfs分区上设置noexec标志,以防止用户以某种方式上传任何可能导致本地root漏洞的代码。设置了这两个选项后,导入ctypes会立即生成segfault:

root@ATX4:~# 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

有趣的是,以下任何更改都可以使ctypes正确工作:

  1. 以读写方式重新安装rootfs
  2. 在没有noexec的情况下重新安装tmpfs
  3. 在没有noexec的情况下重新安装/dev/shm

知道是什么原因吗?目前,我已经在没有noexec的情况下挂载了/dev/shm,并将其限制在尽可能少的用户范围内。

我无法用Python 2.7.6重现这一点;

我怀疑这可能是一个有效的错误。

考虑一下ctypes可能需要创建一个唯一的回调(一个可执行的C级函数)。它将mmap某个匿名(正常)或共享文件(不正常),并设置执行位。

内存错误处理总是很困难的,而且很容易逃脱开发人员的追捕。

最新更新