You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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更深的子目录,举个实际场景例子:

  1. 初始状态:你处于chroot jail中,进程的root指针指向真实文件系统的/home/jail目录,cwd也在/home/jail目录下,此时调用chdir("..")会被拦截,停在jail根。
  2. 你在当前目录创建临时目录./tmp,调用chroot("./tmp"),此时进程的root指针被修改为指向真实文件系统的/home/jail/tmp,但进程的cwd还是停留在/home/jail目录,也就是cwd现在位于新root目录的上层。
  3. 此时你调用chdir("..")不会触发拦截,会直接跳转到/home,继续调用就能一路跳到真实文件系统的/根目录。
  4. 跳到真实根后调用chroot(".")即可把进程的root指针更新为真实根,完成逃逸。

内容的提问来源于stack exchange,提问作者juneyangdata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:45:03