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

标签 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. 在没有 noexec 的情况下重新挂载/dev/shm

知道是什么原因造成的吗?现在,我已经在不使用 noexec 的情况下挂载/dev/shm,并将它限制在尽可能少的用户范围内。

最佳答案

我无法用 Python 2.7.6 重现它;

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

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

内存错误处理总是很困难,开发人员很容易逃过一劫。

关于当 rootfs 为只读且/tmp 为 noexec 时,Python ctypes 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17702932/

相关文章:

Python SocketServer 收不到所有数据

Python——sympysolve()返回另一个方程而不是值

c - 释放链表时堆栈溢出 : Segmentation fault after 100k nodes successfully freed

python - 如何使用 Python 从现有列表中重命名已抓取的文件

python - 堆垛和卸垛

javascript - URL更改后附加内容消失

C++ 段错误问题

python - 对数据进行排序以在 python 中从最高到最低呈现条形图

python-2.7 - 如何更改 PySide 窗口中的内容?

c - 使用来自 char 的良好数据时出现段错误