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安全, 文件传输, 暴力破解, 网络安全审计, 蓝队分析, 逆向工具, 配置错误