该仓库包含一个自包含的演示环境,用于我们研究中描述的 GitLab notebook-diff RCE 漏洞链。它会启动一个全新的 GitLab 18.11.3 容器,通过公开的 HTTP 接口创建一个普通用户,并针对该实例运行 PoC。
技术细节:Going depthfirst:通过两个 Ruby 内存破坏漏洞实现 GitLab RCE
amd64)架构的 Linux首先,构建全新的 GitLab 环境:
./setup_env.sh
该脚本会删除之前的演示容器及其卷,启动 GitLab,等待其就绪,并配置一个普通用户。全新启动 GitLab 可能需要几分钟时间。
打开两个终端。在第一个终端中启动回调监听器:
./run_poc.sh listen 4555
在第二个终端中运行漏洞利用:
./run_poc.sh exploit 4555
当回调到达时,切换到监听终端并运行 id 或 whoami 等命令。ASLR 搜索时间因运行而异。

GitLab 在渲染 Jupyter notebook 差异时,会将仓库控制的 JSON 传递给原生 Ruby JSON 解析器 Oj。该漏洞链结合了两个解析器漏洞:一个用于破坏解析器状态并最终控制回调指针,另一个用于泄露用于缩小 ASLR 搜索范围的堆指针。PoC 加载预计算的查找表,通过正常的 GitLab HTTP 请求找到匹配的库布局,并让 Puma worker 以 git 用户身份回连到监听器。
请仅在附带的本地实验室环境中使用此演示。