【问题标题】:Python ctypes segmentation fault when rootfs is read-only and /tmp is noexec当 rootfs 为只读且 /tmp 为 noexec 时,Python ctypes 分段错误
【发布时间】:2013-07-16 04:36:01
【问题描述】:

我正在尝试将 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,并将其限制为尽可能少的用户。

【问题讨论】:

  • 导入 ctypes 调用 _reset_cache,这会创建一个回调。跳过,_ctypes_alloc_callback 调用 libffi ffi_closure_alloc。看Modules/_ctypes/libffi/src/closures.c
  • 您是否在ffi_closure_allocdlmmapdlmmap_locked 上设置了断点?我认为您最终会选择后者,它会遍历选项数组open_temp_exec_file_opts
  • 你还能重现这个问题吗?如果是这样,您能否将/proc/mounts的内容发布到您的设备上发生崩溃的配置中? ctypes/libffi 解析那个文件,所以它可能会在那里崩溃。
  • 很遗憾,我不再参与该项目,也无法访问硬件来获取该信息。
  • 这在bugs.python.org/issue11048中被跟踪(并且似乎已解决)

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


【解决方案1】:

我无法用 Python 2.7.6 重现这个;

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

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

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

【讨论】:

  • 在 Python 2.7.7 中遇到了这个问题(或非常相似的问题)
猜你喜欢
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多