Scratchappy/CVE-2025-68937

GitHub: Scratchappy/CVE-2025-68937

针对 Gitea/Forgejo 模板符号链接 RCE 漏洞(CVE-2025-68937)的自动化概念验证利用工具。

Stars: 0 | Forks: 0

# CVE-2025-68937 - Gitea/Forgejo 模板软链接 RCE 针对 **CVE-2025-68937** 的自动化概念验证:Gitea 和 Forgejo 在处理模板仓库时,因解引用软链接导致目录遍历,最终引发远程代码执行。 **任何经过身份验证的用户**(无需管理员权限)都可以获取 `git` 服务用户的 shell。 ## 漏洞详情 从模板生成新仓库时,Gitea/Forgejo 会复制模板文件,并对 `.gitea/template` 中列出的文件展开类似 `${REPO_DESCRIPTION}` 的变量。此过程在**未经验证的情况下跟踪符号链接**,允许攻击者读取和写入服务器上的任意文件。 | 详情 | 值 | |--------|-------| | **CVE** | [CVE-2025-68937](https://nvd.nist.gov/vuln/detail/CVE-2025-68937) | | **CVSS 4.0** | 9.5 严重 | | **CWE** | CWE-61 (UNIX 符号链接跟进) | | **需要身份验证** | 是(任意用户) | | **需要管理员权限** | 否 | ### 受影响版本 | 软件 | 受影响版本 | 已修复版本 | |----------|----------|-------| | Gitea | >= 1.11.0-rc1, <= 1.24.6 | 1.24.7 | | Forgejo | <= 11.0.6 | 11.0.7 | | Forgejo | >= 12.0.0, <= 13.0.1 | 13.0.2 | ## 工作原理 ``` Gitea Server +---------------------+ 1. Register SSH | authorized_keys: | key with | command="gitea | ${REPO_DESC} | serv..." ssh-ed... | as comment | ${REPO_DESCRIPTION}| +---------------------+ | 2. Template repo | symlink authorized_keys --------->+ follows -> /data/git/.ssh/ | authorized_keys | v 3. Create child +---------------------+ repo with | authorized_keys: | attacker key | command="gitea | in description | serv..." ssh-ed... | | | <-- injected! +---------------------+ | 4. SSH as git $ ssh -i key git@host (unrestricted) uid=0(git) ... ``` 1. **注册一个恶意的 SSH key** 到 Gitea —— key 的注释中包含 `${REPO_DESCRIPTION}`,这是一个会被 Gitea 展开的模板变量 2. **创建一个模板仓库**,包含以下内容: - `.gitea/template`,其中列出了 `authorized_keys` 以便进行变量展开 - 一个 git 符号链接 `authorized_keys`,指向 git 用户的真实 `authorized_keys` 文件 3. **从模板生成子仓库**,在描述字段中填入攻击者不受限制的 SSH 公钥 4. **模板展开过程会跟踪符号链接**,读取真实的 `authorized_keys` 文件(其中包含我们注册的、注释中带有 `${REPO_DESCRIPTION}` 的 key),将变量展开为子仓库的描述(即我们的 SSH key),并**通过符号链接将结果写回** 5. **使用注入的 key 通过 SSH 登录 `git` 用户**(没有 `command=` 限制) ## 用法 ``` pip install requests ``` ``` # 针对 Docker Gitea (git 主目录默认为 /data/git) python3 exploit.py -u http://localhost:3000 -U myuser -P mypassword --ssh-port 2222 # 针对 package/binary 安装 (git 主目录为 /home/git) python3 exploit.py -u http://gitea.example.com:3000 -U user -P pass --git-home /home/git # 获取 shell 后执行命令 python3 exploit.py -u http://target:3000 -U user -P pass --command "cat /etc/shadow" # 清理 (移除 repos 和注入的 SSH keys) python3 exploit.py -u http://target:3000 -U user -P pass --cleanup ``` ### 选项 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `-u, --url` | *必填* | Gitea/Forgejo 的基础 URL | | `-U, --user` | *必填* | 用户名 | | `-P, --password` | *必填* | 密码 | | `--git-home` | `/data/git` | 目标机器上 git 用户的主目录 | | `--ssh-host` | 取自 `--url` | 要连接的 SSH 主机 | | `--ssh-port` | `22` | Gitea 的 SSH 端口 | | `--timeout` | `30` | 等待 SSH 的超时秒数 | | `--command` | 交互式 | 获取 shell 后执行的命令 | | `--cleanup` | - | 移除利用工具生成的痕迹 | ## 测试环境 启动一个包含漏洞的实例: ``` docker run -d --name gitea-vuln \ -p 3000:3000 -p 2222:22 \ -e USER_UID=1000 -e USER_GID=1000 \ gitea/gitea:1.24.6 ``` 1. 打开 `http://localhost:3000`,完成安装向导(使用 SQLite 即可) 2. 注册一个用户账号 3. 运行: ``` python3 exploit.py -u http://localhost:3000 -U youruser -P yourpass --ssh-port 2222 ``` ## 依赖要求 - Python 3.8+ - `requests` - PATH 中存在 `git` 和 `ssh-keygen` ## 修复方案 - **Gitea**:升级至 1.24.7 或更高版本 - **Forgejo**:升级至 11.0.7 (LTS) 或 13.0.2+ ## 参考资料 - [NVD: CVE-2025-68937](https://nvd.nist.gov/vuln/detail/CVE-2025-68937) - [GitHub 安全公告: GHSA-7mhf-6fhv-c83c](https://github.com/advisories/GHSA-7mhf-6fhv-c83c) - [Gitea 安全修复分析 (PR #36734 & #36746)](https://abanoubhanna.com/posts/gitea-securing-repo-templates/) - [Gitea 1.24.7 发布说明](https://blog.gitea.com/release-of-1.24.7/) ## 免责声明 本工具仅供**授权的安全测试和教育目的使用**。请仅对您拥有或已获得明确书面测试许可的系统使用本工具。未经授权访问计算机系统是违法行为。作者对任何滥用行为不承担任何责任。
标签:CISA项目, Forgejo, Gitea, PoC, RCE, 内存分配, 暴力破解, 网络安全研究, 请求拦截, 逆向工具