Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-38360 — Advisory: CVE-2026-38360 path traversal (CWE-22) in dash-uploader (Python/PyPI) | Kitploit
工具/GitHubGitHub/a1ohadance/cve-2026-38360
Vulnerability AnalysisCode AnalysisExploitationWeb SecurityPenetration TestingLearning & Education
GitHuba1ohadance/cve-2026-38360

CVE-2026-38360

Advisory: CVE-2026-38360 path traversal (CWE-22) in dash-uploader (Python/PyPI)

查看仓库
23个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-38360:dash-uploader 中的路径遍历

CVE NVD CWE Severity Patch Auth Version PyPI Downloads Total Downloads License

未经身份验证的路径遍历影响 fohrloop/dash-uploader(Python,PyPI),可导致任意文件写入,进而(但不限于)实现 远程代码执行(RCE)、应用程序源代码覆盖、存储型 XSS 以及持久后门安装。

⚠️ 无补丁可用,且永远不会发布

该仓库已于 2025 年 7 月 19 日归档,没有活跃维护者。所有已发布版本(0.1.0 至 0.7.0a2)均受影响且将一直如此。该包每月仍有大约 28,000 次下载。

任何在生产环境中运行 dash-uploader 的人都必须自行应用缓解措施。推荐的修复方案是迁移到 Plotly Dash 内置的 dcc.Upload 组件。完整选项请参见缓解措施。

描述

dash_uploader/httprequesthandler.py 中 request.form.get() 的三个用户可控参数直接传入 os.path.join() 和 os.makedirs(),未经任何清理或验证:

  1. upload_id(第 57 行→第 161 行,BaseHttpRequestHandler.get_temp_root):控制目标目录。攻击者可发送 upload_id=../../../../usr/local/lib/python3.10/site-packages,文件将被写入 Python 的包目录。

  2. resumableFilename(第 51 行→第 108 行,BaseHttpRequestHandler._post):控制最终文件名。攻击者即使使用合法的 upload_id,也可通过文件名遍历出上传目录。

  3. resumableIdentifier(第 54 行→第 64 行,BaseHttpRequestHandler._post):用于通过 os.makedirs() 创建临时目录。攻击者可在文件系统的任何位置创建任意目录。

上传端点(默认为 /API/dash-uploader)无需认证。v0.5.0 中添加的 http_request_handler 钩子允许通过 post_before() 进行请求前检查,但有漏洞的 _post() 方法在钩子返回后直接从 request.form 读取所有参数。钩子无法在库处理之前清理参数。通过钩子添加认证的开发者仍然容易受到来自已认证用户的路径遍历攻击。

漏洞代码

root@kitploit:~
# dash_uploader/httprequesthandler.py
def _post(self):
    resumableFilename = request.form.get("resumableFilename", default="error", type=str)
    resumableIdentifier = request.form.get("resumableIdentifier", default="error", type=str)
    upload_id = request.form.get("upload_id", default="", type=str)
    ...
    temp_root = self.get_temp_root(upload_id)                          # upload_id flows in here
    temp_dir = os.path.join(temp_root, resumableIdentifier)            # raw user input -> os.path.join
    if not os.path.isdir(temp_dir):
        os.makedirs(temp_dir)                                          # raw user input -> os.makedirs

def get_temp_root(self, upload_id):
    return os.path.join(self.upload_folder, upload_id)                 # no sanitization: ../../ escapes upload_folder

三个独立的遍历汇点共享同一个根本原因:表单值未经任何验证即进入 os.path.join 和 os.makedirs。

攻击向量

未认证的远程攻击者向上传端点发送 HTTP POST 多部分请求。通过向 upload_id 表单参数中注入路径遍历序列(../),攻击者控制上传文件的目标目录。例如,upload_id=../../../../usr/local/lib/python3.10/site-packages 将文件写入 Python 的包目录,从而通过 .pth 自动执行在下次解释器启动时实现 RCE。

无需认证、会话令牌或 CSRF 令牌。另外两个参数(resumableFilename 和 resumableIdentifier)通过同一端点提供独立的遍历向量。官方快速入门文档中显示的默认库配置可通过单个 curl 命令被利用。

影响

任意文件写入到服务器进程可写的任意目录。这通过几种众所周知的基元可转化为 远程代码执行(RCE)。

RCE 基元

  • 将 Python .pth 文件放入 site-packages。在下次解释器启动时执行攻击者提供的代码。
  • 注入 sitecustomize.py 或 usercustomize.py。每次 Python 启动时执行。
  • 覆盖应用程序包目录中的可导入 Python 模块。在下次导入或工作进程回收时执行。
  • 覆盖 WSGI/ASGI 入口点(例如 app.wsgi、wsgi.py)。在下次工作进程重载时执行。
  • Cron 配置文件(/etc/cron.d/、/etc/cron.hourly/、用户 crontab 假脱机)——当进程拥有必要权限时。定时执行。
  • Systemd 服务单元或用户单元(/etc/systemd/system/、~/.config/systemd/user/)。在下次服务启动或重启时执行。
  • 当进程以 root 运行时注入 /etc/ld.so.preload。预加载攻击者代码到后续每个二进制执行中。
  • Shell 启动文件覆盖(~/.bashrc、~/.profile、)。在应用用户下次交互登录时执行。

Web 层级影响

  • 通过覆盖所服务的 JavaScript(例如 site-packages 中的 Dash 框架 JS)在主域上实现存储型跨站脚本,影响每个用户的每次页面加载,直到应用程序重启
  • 应用程序源代码覆盖(一种静默、持久的后门,当部署机制未完全覆盖受影响路径时,可存活于正常部署)

文件系统影响

  • 通过未清理的 resumableIdentifier 参数使用 os.makedirs() 在进程可到达的任何位置创建任意目录(可用于 inode 耗尽,或为写入不存在的目录树做准备)
  • 在共享上传目录中替换跨用户文件,导致同一应用程序的不同租户之间的数据投毒

受影响组件

  • dash_uploader/httprequesthandler.py
  • BaseHttpRequestHandler.get_temp_root()
  • BaseHttpRequestHandler._post()

缓解措施

⚠️ 无补丁可用,且项目已归档

针对当前已部署用户,按优先顺序排列的选项:

  1. 迁移到 dcc.Upload,即 Plotly Dash 随附的官方上传组件。文件以 base64 字符串形式到达回调;不暴露任何写入文件系统的处理程序,也不存在客户端控制的目标路径,因此此处提到的 bug 类别不适用。最适合中小型文件。对于超大文件,请参见选项 2。
  2. 使用 werkzeug.utils.secure_filename() 和硬编码的服务器端目标目录,自行编写一个小型 Flask 上传处理程序。切勿接受客户端提供的 upload_id、文件名或标识符值作为路径组件。
  3. 如果继续使用 dash-uploader,将上传端点置于认证之后,并针对 upload_id、resumableFilename 和 resumableIdentifier 使用严格的白名单(例如仅允许 UUID)进行验证,在请求到达库处理程序之前进行重写或拒绝的层级。库的 http_request_handler 钩子不能阻止遍历,因为参数在钩子返回后从 request.form 读取;清理必须在库之上进行。
  4. 在反向代理或 WAF 层级,拒绝任何上传端点的请求,其中表单字段包含 ..、编码变体(%2e%2e、..%2f、%2e%2e%2f)或绝对路径。

披露时间线

包背景信息

  • PyPI 上每月约 28,000 次下载(截至 2026 年 5 月 7 日前 30 天为 27,756 次,尽管仓库已归档,每日下载量仍持续)。来源:pypistats.org。
  • 最新发布版本:0.6.1(稳定线)。预发布版本扩展至 0.7.0a2。
  • 必需依赖:dash。可选依赖:pyyaml。许可证:MIT。
  • 11 个依赖包,6 个依赖仓库。
  • 153 个 GitHub 星标。
  • 仓库于 2025 年 7 月 19 日归档(问题 #153)。
  • 无此前 CVE(已于 2026 年 3 月 19 日对照 NVD、GitHub 安全公告、Snyk、OSV 验证)。

参考

  • https://www.cve.org/CVERecord?id=CVE-2026-38360
  • https://nvd.nist.gov/vuln/detail/CVE-2026-38360
  • https://github.com/fohrloop/dash-uploader
  • https://pypi.org/project/dash-uploader/
  • https://pypistats.org/packages/dash-uploader
  • https://github.com/fohrloop/dash-uploader/blob/stable/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/blob/dev/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/issues/153
  • https://cwe.mitre.org/data/definitions/22.html

发现者

Muhammad Fitri Bin Mohd Sultan

下载工具
CVE 编号CVE-2026-38360(NVD)
漏洞类型路径遍历(CWE-22)
CVSS 3.19.8 / 严重(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
产品dash-uploader
受影响版本0.1.0 至 0.7.0a2(全部 18 个版本)
修复版本无(项目已于 2025 年 7 月 19 日归档)
攻击向量远程,未认证
发现者Muhammad Fitri Bin Mohd Sultan
分配方MITRE,2026 年 5 月 7 日
相关CVE-2026-38361(同一库中的拒绝服务)
~/.bash_profile
  • 附加到 ~/.ssh/authorized_keys。以应用用户身份授予对主机的持久 SSH 访问。
  • 日期事件
    2026-03-17在生产部署的安全研究期间发现该漏洞。
    2026-03-19向 MITRE 提交 CVE 请求。
    2026-05-07MITRE 分配 CVE-2026-38360。
    2026-05-07发布公开通告。
    2026-05-09CVE 记录发布于 MITRE CVE 数据库 和 NVD。