观看pwn.college中sandboxing模块的讲解视频所做的笔记

Modern Technologies about Sandboxing

Seccomp

通过设置系统调用的禁用和允许规则来达到目的

Namespace

创建一个类似于docker的独立命名空间

unshare命令:Run a program with some namespaces unshared from the parent
其创建了一个新的命名空间,其与父进程独立。(注:fork系统调用为完全共享,clone系统调用可以指定共享内容)

unshare后创建的新进程仍然可以访问原本的目录(如/),因为还没有mount和unmount。(附:使用mount将根目录下的目录,例如/bin等重新mount到新进程下,就可以在新进程下看到,这就是docker container使用的技巧。注意,在外部系统中是看不到mount的目录的,因为unshare不共享mount namespace)

mount命令:挂载文件或设备到指定的文件系统
其中/dev代表挂载的设备文件,/sys代表内核相关的内容

unshare -m -p -n –mount-proc –fork /bin/bash
此命令可以类似于docker创建一个新的进程,进程在一个新的命名空间中,但是仍然可以查看外部文件系统

创建独立的文件系统

使用mount将/bin等目录挂载到当前目录,并且chroot。
但是chroot不安全,因此应该有更安全的方法:使用命名空间pivot_root

使用pivot_root,先创建一个old文件夹存放根目录,然后unmount,rmdir。即可实现容器化。

docker额外实现的机制:

  • docker还另外实现了对资源的限制,例如内存用量,使用ulimit命令
  • 对用户的限制,使在容器内为root,但在容器外为普通用户
  • seccomp限制特定命令,例如unshare,避免其逃逸

可以使用nsenter从外部进入已有命名空间eg:nsenter –mount=/proc/xxxx/ns/mnt [file]
(与setns系统调用有关)