Kimdir01/curldrop-multi-vuln-cve
GitHub: Kimdir01/curldrop-multi-vuln-cve
该项目是针对 Curldrop v1.0.5 文件共享服务的多个高危漏洞(无认证、UUID Oracle、DoS)的概念验证与安全公告。
Stars: 0 | Forks: 0
# GitHub 安全公告:Curldrop v1.0.5 — 缺失身份验证、UUID Oracle、DoS
## 公告信息
| 字段 | 值 |
|-------|-------|
| **严重性** | 严重 / 高危 / 中危 |
| **CWE** | CWE-306 (缺失身份验证) / CWE-400 (资源耗尽) / CWE-203 (Oracle) |
| **CVSS v3.1** | CVE-001: 9.1 (无身份验证) / CVE-002: 5.3 (UUID Oracle) / CVE-003: 7.5 (DoS) |
| **CVSS 向量** | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| **Commit Hash (已审计)** | `dd29abf8118e72a7f737d2d7ea00bd555379ed6a` |
## 概述
Curldrop v1.0.5(Flask 文件上传/下载 Web 服务)包含三个新漏洞:(1) 文件上传/下载 endpoint 完全缺失身份验证,导致未授权的文件访问和存储滥用;( (2) UUID 文件存在性 Oracle 允许暴力枚举所有存储的文件;(3) 不限制上传大小,导致资源耗尽 / 拒绝服务。此外,该应用程序使用了严重过时的依赖项(Werkzeug 0.14.1、Flask 1.0.2、Gunicorn 19.9.0),且这些依赖项存在已知的 CVE —— 此处仅作为修复建议指出,不作为新 CVE 申请。
## 漏洞详情
### 受影响的 Package/Repository
- **Repository:** Curldrop
- **受影响版本:** v1.0.5 及以下版本 (commit `dd29abf`)
- **修复版本:** 无 (0-day)
## CVE-REQUEST-001:文件上传/下载无身份验证 (CVSS 9.1)
**文件:** `app.py`,第 17-36 行
```
@app.route("/", methods=["PUT"])
def upload(file):
savepath = os.path.join(app.config['UPLOAD_DIR'], secure_filename(file))
with open(savepath, "wb") as f:
f.write(request.data) # NO AUTH CHECK
@app.route("/", methods=["GET"])
def download(uuid):
for file in os.listdir(app.config["UPLOAD_DIR"]):
if file.startswith(uuid): # PREFIX MATCH — ORACLE
return send_file(...)
return abort(404)
```
没有 API key、没有 token、没有 IP allowlist、没有 rate limiting。任何具有网络访问权限的方都可以:
- 上传任意文件(导致存储耗尽)
- 通过 UUID 前缀下载任何文件(借助 Oracle 进行暴力破解)
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = **9.1 严重**
## CVE-REQUEST-002:UUID 文件存在性 Oracle (CVSS 5.3)
**文件:** `app.py`,第 28-36 行
```
for file in os.listdir(app.config['UPLOAD_DIR']):
if file.startswith(uuid):
return send_file(...) # 200 — FILE FOUND
return abort(404) # 404 — NO MATCH
```
从 UUID4 中仅使用了 8 个十六进制字符(32 位熵)。前缀匹配实现了二分查找 Oracle —— 可以在约 64 次请求内找到任何 UUID。
**PoC:**
```
curl http://target/a # 404 — no files starting with 'a'
curl http://target/f # 200 — file starting with 'f' exists!
curl http://target/fa # 404
curl http://target/ff # 200 — now 2 chars known
# 继续恢复完整 8 字符 UUID
```
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N = **5.3 中危**
## CVE-REQUEST-003:通过无限制上传大小引发的 DoS (CVSS 7.5)
**文件:** `app.py`,第 22-23 行
```
with open(savepath, "wb") as f:
f.write(request.data) # NO MAX_CONTENT_LENGTH — unlimited!
```
没有大小限制。攻击者可以发送任意大的 payload,从而耗尽服务器内存。上传目录没有磁盘配额限制 —— 反复上传会填满磁盘。
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H = **7.5 高危**
## 其他发现(不作为新 CVE 申请):
| # | 漏洞 | CVSS | 类型 | 备注 |
|---|--------------|------|------|------|
| 4 | 过时的依赖项:Werkzeug 0.14.1、Flask 1.0.2、Gunicorn 19.9.0 | — | 已知 CVE | 已有:CVE-2024-34069、CVE-2024-1135、CVE-2023-30861。修复:升级到最新版本。 |
| 5 | 默认绑定到 0.0.0.0:8000 | 5.3 | 安全配置不当 | 结合无身份验证,将服务暴露给网络 |
| 6 | 上传目录默认为 CWD | 3.7 | 不安全的默认设置 | `os.getcwd()` 在导入时进行评估 |
| 7 | send_file 中未净化的路径 | 3.3 | 路径遍历 | `os.listdir()` 仅返回 basenames —— 风险已缓解 |
| 8 | 无限制 split() 导致崩溃 | 3.7 | DoS | `file.split("-", 1)[1]` 没有边界检查 |
| 9 | 弱 UUID 熵(32 位) | — | 弱随机性 | 来自 UUID4 的 8 个十六进制字符 = 2^32 空间 |
## 影响
- **任意文件读取** —— 无需身份验证即可下载所有上传的文件 (CVE-001 + CVE-002)
- **存储耗尽** —— 通过无限制上传填满磁盘 (CVE-003)
- 通过 UUID Oracle 进行**文件枚举** (CVE-002)
- **依赖项中存在的已知 CVE** —— Werkzeug RCE、Gunicorn 走私(非新发现)
## 补丁 / 修复
1. 在所有 endpoint 上添加 API key 身份验证(header 或 query param)
2. 升级:`flask>=3.1`、`werkzeug>=3.1.6`、`gunicorn>=25.1.0`
3. 设置 `MAX_CONTENT_LENGTH`(例如 100 MB)
4. 修复 UUID Oracle:对于匹配和不匹配的情况,同样地返回 404(恒定时间)
5. 使用完整的 32 字符 UUID4 十六进制字符串(128 位熵)
6. 验证 `file.split("-", 1)[1]`,处理缺失连字符的情况
7. 使用 `send_from_directory()` 替代手动构造路径
## 披露时间线
- **2026-06-28:** Fatullayev Asadbek (Kimdir01) 发现了所有漏洞
- **待定:** 报告给维护者
- **待定:** 通过 GitHub 申请 CVE
- **待定:** 发布公告
## 致谢
- 发现者:Fatullayev Asadbek | GitHub: Kimdir01
- 独立安全研究员
## 参考
- CWE-306:关键功能缺失身份验证
- CWE-400:不受控的资源消耗
- CWE-203:可观察的差异 (Oracle)
标签:CISA项目, Flask, PoC, Web安全, 文件传输, 暴力破解, 网络安全审计, 蓝队分析, 逆向工具, 配置错误