注意
- PTRACE_O_EXITKILL:退出时终止所有子进程(计划在版本3.8中引入)
- 非根用户的命名空间(计划在版本3.8中引入)
- overlayfs(计划在版本3.10周期中引入)
- 白出前缀似乎比维护“已删除”映射更好
- 它们还涵盖了 readdir() 问题(请参阅 overlayfs.txt)
- copy_up() 也涵盖了 symlink() 问题
- Docker:http://docker.io/
- 于3月26日发布
用例(高级别)
运行未知二进制文件
- 在互联网上下载 “convert”,说是 epub -> mobi 转换器
- $ sandbox —no-network —no-ipc convert in.epub out.mobi
- 只提交 out.mobi?还是检查 convert 所做的事情
XXX
- $ sandbox bash
- $ apt-get install A
- 运行 A(试一试)
- 不喜欢 A,然后一起销毁(或提交)
XXX
- $ sudo sandbox bash
- $ vim /etc/apache.conf
- $ vim /etc/my.conf
- 同时提交
XXX: Python 沙盒?
- $ netcat -l -e “sandbox python -i” -p 8080
软件包管理器本身(作为事务)
虚拟环境(python-virtualenv,cabal-dev 等)
- $ sandbox -r ~/devenv bash
- $ apt-get install A-lib B-lib ….
- 开发
- $ sandbox -r ~/devenv bash
make/configure/install
- 假的根
特性(概要)
- 网络配置文件
- 文件系统配置文件
- —no-home-directory(除当前外的其他)
- —as-fake-root
- SELinux
- IPC?
贡献
- 用户友好性
- 总结副作用(文件系统/网络)
- 最后提交它们(或选择性提交)
- 系统调用重写技术
- 路径名重写(fd-relative 技巧,只读打开)
- 技巧
- 与恶意线程竞争:将参数重写到只读区域
- 限制/模拟 /proc
- 重新思考沙盒(对用户而言什么重要?)
- 限制网络(基于应用程序的配置文件,类似 apparmor)
- 将软件包安装到 /bin/usr
- 限制文件系统(sandboxfs 配置文件)
(例如)修剪 /home/taesoo
/home/taesoo/download/pkg/...
XXX 请勿阅读
XXX: 旧设计
内核内存中的键值存储
- unlink:跟踪个别文件
- rmdir:在 rmdir 系统调用上合并(rm -rf /)
- write:在 fs-sandbox 上的内存写入
- read:如果丢失,则进入主
{task}+ -> {fs-sandbox}
如何拦截?新的 vfs?还是硬编码? CLONE_NEW_FS?
在实践中,也可能有用的 ptrace 等效(用户空间)
XXX: 旧步骤(主要列在此处)
- chroot /tmp/xx 进程
- clone(CLONE_SANDBOX)
- 创建 PWD
- ls?
- 在主机上允许读取
- 在本地上允许写入
最后转储
open(R):
- 如果 pn 在 [sandboxfs] 中
- 如果已删除(inode 标志):返回 ENOENT
- 否则,返回 inode
- 否则:在 [hostfs] 上打开(R)
- 如果 pn 在 [sandboxfs] 中
open(W):
- 如果 pn 在 [sandboxfs] 中
- 清除已删除标志
- 返回 inode
- 如果 pn 在 [sandboxfs] 中
XXX. open(RW):
- 如果 pn 在 [sandboxfs] 中;返回 inode
- 否则:
- 复制到 sandboxfs
- 返回 inode [sandboxfs]
open(R: 目录):
- 如果 pn 在 [sandboxfs] 中
- 从 [sandboxfs] 获取 dentries()
- XXX. 从 [hostfs] 获取 dentries()
- 从 [sandboxfs] 中删除已删除的文件
否则
- 从 [hostfs] 获取 deleted()
unlink
- 如果 pn 在 [sandboxfs] 或 pn 在 [hostfs] 中;
- inode.flag |= DELETED
- 如果 pn 在 [sandboxfs] 或 pn 在 [hostfs] 中;
- 如果 pn 在 [sandboxfs] 中
注意
- XXX. 线程在重写系统调用参数时修改堆栈
- 追踪器可以写入被追踪进程的只读内存!
- mmap RW/RO 追踪器/被追踪进程
参考
- 很久以前的 altroot:7f2da1e7d0330395e5e9e350b879b98a1ea495df
- codespeed:https://github.com/tobami/codespeed/
- pypy:http://speed.pypy.org/
- minijail:https://gerrit.chromium.org/gerrit/gitweb?p=chromiumos/platform/minijail.git