# GuardDog 路径遍历漏洞导致任意文件覆盖和RCE
## 概述
GuardDog 是一款用于检测恶意 PyPI 包的命令行工具。在 2.7.1 之前版本中,`safe_extract()` 函数存在路径遍历漏洞,可导致任意文件被写入目标解压目录之外的位置。
## 影响版本
2.7.1 之前的所有版本。
## 细节
`safe_extract()` 函数未能正确校验归档文件中的文件路径,攻击者可构造包含 `../` 的恶意路径,使文件被释放到解压目录以外的任意位置,实现任意文件覆盖。
## 影响
攻击者可利用此漏洞覆盖系统关键文件,导致任意文件覆盖和远程代码执行(RCE),危及运行 GuardDog 的系统安全。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: Path Traversal Vulnerability Leads to Arbitrary File Overwrite and RCE · Advisory · DataDog/guarddog · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
## 关键信息
### 漏洞概述
- **描述**: GuardDog的safe_extract()函数存在路径遍历漏洞,允许恶意PyPI包在GuardDog运行的系统上触发任意文件覆盖和远程代码执行。
- **CVE-ID**: CVE-2026-22871
- **分类**: CWE-22 (路径名到受限目录的不当限制)
- **等级**: 高
### 影响版本和修复版本
- **受影响版本**: 2.7.0及以下
- **修复版本**: 2.7.1
### 漏洞代码
**文件**: guarddog/utils/archives.py
```python
elif zipfile.is_zipfile(source_archive):
with zipfile.ZipFile(source_archive, "r") as zip:
for file in zip.namelist():
# 注:zip.extract可清理恶意文件名
# 如目录遍历尝试 这不是
# zip提取的情况
zip.extract(file, path=os.path.join(target_directory, file)) # ✗ 易受攻击的
```
### 根因
- 评论关于 zip.extract() 在最初时误导了我;然后我注意到了 os.path.join() 的调用。
- 漏洞源于Python的 zipfile.ZipFile.extract() API的不正确使用:
- path参数应该是目标目录,而不是完整的文件路径
- extract() 自动将成员名附加到路径
- 通过传递 os.path.join(target_directory, file),GuardDog导致成员名被附加两次
- 这破坏了Zipfile内置的路径遍历清理
### 攻击载体
1. 攻击者创建路径遍历文件名的恶意wheel
2. 上传到PyPI或直接分发:
3. 包扫描:guarddog pypi scan malicious-pkg
4. GuardDog下载解压包
5. 恶意文件写入任意位置
6. 可以实现代码执行
### 影响
影响取决于GuardDog的运行方式和环境。
### 关键场景
1. **即时代码执行**
- 写入 ~/.bashrc → 在下次shell中执行
- 写入 ~/.profile → 登录时执行
2. **持久后门**
- 写入 ~/.ssh/authorized_keys → SSH访问
- 写入 /etc/cron.d/malicious → 定时执行(如果root)
- 写入systemd用户服务 → 持续执行
### 时间线
- **2026-01-05**: 发现
- **2026-01-05**: 报告
- **建议披露**: 30天
### 记录
- **已报告**: Charbel (dwbruijn)
标题: Merge pull request #644 from ejortega/zip-duplicate-path · DataDog/guarddog@9aa6a72 · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
从这个网页截图中可以获取到以下关于漏洞的关键信息:
- **Commit**:
- `Commit 9aa6a72` 修复了与 zip 文件提取路径重复相关的问题。
- **Pull Request**:
- `Merge pull request #644` 从 `ejortega/zip-duplicate-path` 分支合并。
- 修复内容描述: `fix: duplicate path in zip extraction`
- **Code Change**:
- 文件路径: `guarddog/utils/archives.py`
- 改动部分:
```python
# 原代码:
zip.extract(file, path=os.path.join(target_directory, file))
# 新代码:
zip.extract(file, path=target_directory)
```
- **Vulnerability Description**:
- 注释部分说明了修复的目的: `zip.extract` 会在文件名中包含恶意路径的情况下清理掉,以防止目录遍历攻击。
总结来看,这个 Commit 修复了一个可能允许攻击者通过恶意构造的 zip 文件进行目录遍历的漏洞。
暂无评论