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

时间:2013-07-17 14:44:52

标签: python python-2.7 segmentation-fault ctypes cpython

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

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. 重新安装/ dev / shm no noexec
  4. 知道是什么导致了这个吗?现在,我已经在没有noexec的情况下安装了/ dev / shm,只是将其限制为尽可能少的用户。

1 个答案:

答案 0 :(得分:0)

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

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

考虑到ctypes可能需要创建一个唯一的回调(可执行的C级函数)。执行位设置会mmap一些匿名(ok)或共享文件(不行)。

内存错误处理总是很难,并且很容易让开发人员逃脱。