chroot逃逸漏洞中多次调用chdir("..")跳出根目录的原理是什么
chroot逃逸中多次
chdir("..")跳转真实根目录的底层原理 核心前置认知
chroot从来不是设计为安全隔离机制,只是用于修改进程视角下根目录路径的轻量化工具,其在内核层面的实现非常简单,仅修改进程对应结构体的两个路径指针,并没有做全链路的目录访问限制:
root指针:指向进程视角下/目录对应的真实文件系统目录项(dentry)cwd指针:指向进程当前工作目录对应的真实文件系统目录项
chdir("..")的内核拦截逻辑
你提到的「在chroot根目录下执行chdir("..")会停留在当前根」是有前提的:只有当进程的cwd目录项和root指针指向的目录项完全相同时,内核处理..路径解析的follow_dotdot函数才会直接返回当前目录,拦截向上跳转的请求。
如果cwd本身就在root指针指向目录的上层(更靠近真实文件系统根),内核的拦截逻辑完全不会触发,每次调用chdir("..")都会正常访问目录项的d_parent父节点指针,向上跳转一层。
逃逸步骤中跳转生效的原因
你看到的逃逸流程中,多次chdir("..")生效的前置操作是你已经在chroot环境中以root权限(持有CAP_SYS_CHROOT能力)执行了第二次chroot调用,把进程的root指针移动到了比当前cwd更深的子目录,举个实际场景例子:
- 初始状态:你处于chroot jail中,进程的
root指针指向真实文件系统的/home/jail目录,cwd也在/home/jail目录下,此时调用chdir("..")会被拦截,停在jail根。 - 你在当前目录创建临时目录
./tmp,调用chroot("./tmp"),此时进程的root指针被修改为指向真实文件系统的/home/jail/tmp,但进程的cwd还是停留在/home/jail目录,也就是cwd现在位于新root目录的上层。 - 此时你调用
chdir("..")不会触发拦截,会直接跳转到/home,继续调用就能一路跳到真实文件系统的/根目录。 - 跳到真实根后调用
chroot(".")即可把进程的root指针更新为真实根,完成逃逸。
内容的提问来源于stack exchange,提问作者juneyangdata
相关产品推荐
相关产品推荐

