我正在尝试将 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 正常工作:
- 以读写方式重新挂载 rootfs
- 在没有 noexec 的情况下重新挂载 tmpfs
- 在没有 noexec 的情况下重新挂载 /dev/shm
知道是什么原因造成的吗?现在,我已经在没有 noexec 的情况下挂载了 /dev/shm,并且只将它限制在尽可能少的用户中。