Sandboxing
观看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系统调用有关)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Small Utopia!
评论