注意

  • 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
      1. /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)
  • open(W):

    • 如果 pn 在 [sandboxfs] 中
      • 清除已删除标志
      • 返回 inode
  • 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

注意

  • XXX. 线程在重写系统调用参数时修改堆栈
    • 追踪器可以写入被追踪进程的只读内存!
    • mmap RW/RO 追踪器/被追踪进程

参考