Binwalk路径遍历漏洞:将固件分析转化为代码执行

admin 2026-06-17 04:55:49 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: Binwalkv2.4.3的WinCEROM提取插件存在路径遍历漏洞CVE-2026-7179,攻击者可通过恶意固件在用户系统任意位置写入文件,结合自动加载插件机制可实现远程代码执行。该漏洞影响KaliLinux默认安装的binwalk版本,维护者已确认不会为已归档的Python版本提供补丁。建议用户升级至Rust重写的binwalkv3.x或手动应用路径净化修复。 综合评分: 85 文章分类: 漏洞分析,二进制安全,安全工具,WEB安全,渗透测试


cover_image

Binwalk 路径遍历漏洞:将固件分析转化为代码执行

原创

骨哥说事 骨哥说事

骨哥说事

2026年6月11日 08:34 上海

在小说阅读器读本章

去阅读

| | | — | | 声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 |

#

#

防走失:https://gugesay.com/

令安全工具反噬研究者的漏洞

国外安全研究员在binwalk中发现了一个漏洞,允许攻击者在你计算机上的任意位置写入文件。如果你是一名安全研究员,很可能使用过binwalk来拆解固件文件,它预装在Kali Linux中,每天有数十万人在使用它。

这个漏洞很简单。当binwalk从Windows CE固件镜像中提取文件时,它会直接从二进制数据中读取文件名,并用它在磁盘上创建文件。它从不检查该文件名是否包含类似”../../”的路径遍历序列来逃脱文件夹限制。因此,一个特制的固件镜像可以将文件写入用户有权访问的任何位置。

更糟糕的是,binwalk有一个插件系统。它会自动运行放置在 ~/.config/binwalk/plugins/ 目录下的任何Python文件。因此,攻击者可以利用这个路径遍历漏洞将一个恶意Python脚本放置到该文件夹中。下次受害者在任何文件上运行binwalk时,该脚本就会以其特权执行。这就是一个简单的文件写入漏洞如何转变为远程代码执行(RCE)的过程。

漏洞摘要与影响

该漏洞被追踪为 CVE-2026-7179 。这是binwalk的WinCE ROM提取插件中的一个路径遍历漏洞(CWE-22)。以下是关键细节:

  • 产品: binwalk (Python版本)
  • 受影响版本: 2.4.3及所有包含WinCE插件的更早版本
  • 易受攻击的文件: winceextract.py (第61、64行) 和 winceextractor.py (第580行)
  • 漏洞类型: CWE-22: 路径遍历
  • 影响: 任意文件写入,可升级为远程代码执行
  • NVD CVSS v3.1 评分: 5.3 中危 (AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L)

这个问题很重要,因为binwalk v2.4.3仍然是每个Kali Linux安装中的默认binwalk。安全研究员、CTF选手和固件分析管线都依赖它。具有讽刺意味的是,这个本用于分析固件的工具,却可以通过一个恶意固件镜像被武器化。

自2024年11月起,binwalk代码库已被归档,维护者已确认不会为Python版本发布进一步的补丁。尽管如此,它仍然是世界上最广泛使用的渗透测试发行版之一的默认固件分析工具。没有手动安装binwalk v3 (Rust重写版) 的用户将面临风险。

这个漏洞是如何被发现的

只是在一个周末有一些空闲时间,出于好奇翻阅旧的CVE公告,实际上安全研究员自己从未用过binwalk,但他不断从安全社区的朋友那里听到它,每当有人谈论固件分析或CTF挑战时,它似乎都会出现。一个如此流行、被这么多研究者使用的工具,他觉得值得更好地理解它,哪怕只是阅读它的源代码。

在阅读旧的公告时,他遇到了 CVE-2022-4510 ,这是ONEKEY团队在binwalk的PFS提取插件 (unpfs.py) 中发现的路径遍历漏洞。他们的 分析报告 写得很好。漏洞模式很简单:从固件二进制文件中读取的文件名未经任何净化就直接传递给了文件操作。他们应用的修复也很直接:添加了一个 os.path.basename() 调用和一个 startswith() 边界检查。

引起安全研究员注意的是该修复的范围。它只修补了一个插件。binwalk有几个提取插件,每个插件都以自己的方式从二进制数据中读取文件名。问题很直接:有没有人检查过其他插件是否存在相同的漏洞?如果开发人员在一个解析器中遗漏了路径净化,那么他们很可能在其他解析器中也遗漏了。

安全研究员克隆了binwalk代码库并开始查看。感觉要么花五分钟就能确认漏洞已经被修复,要么花五分钟就能确认漏洞仍然存在。

通过源代码审查发现漏洞

安全研究员没有使用模糊测试。漏洞类型已经从CVE-2022-4510中获知,只需要追踪文件名如何从其他插件的二进制解析器流向文件系统操作。

他在plugins目录中搜索了 os.path.join 调用,其中第二个参数来自解析后的二进制数据。 winceextract.py 立即引起了安全研究员的注意。以下是整个提取函数 (第44到65行):

第61行和第64行是问题所在。两者都接受一个文件名 (module.file_name 或 file_e.file_name) ,并将其与提取目录 (indir) 连接起来以构建输出路径。没有对文件名包含的内容进行检查。

这个文件名是从哪里来的呢?追溯到 winceextractor.py 的第580行,它在那里被一个名为 read_null_terminated_string() 的函数设置:

而这就是 read_null_terminated_string() 的功能 (第454行):

它只是从ROM二进制文件中读取原始字节,直到遇到空字节,然后将它们解码为ASCII。没有过滤,没有验证,什么都没有。如果攻击者在ROM中把”../../../some/path”作为文件名,这个字符串会原封不动地传递下去。

完整的数据流是:

从攻击者控制的输入到在磁盘任意位置写入文件,只需三步。没有 os.path.basename() ,没有 startswith() 边界检查,没有任何形式的净化。这正是CVE-2022-4510在 unpfs.py 中修复的相同模式,只是在一个没被检查的不同插件中。

构建PoC所面临的挑战

找到漏洞花了一个下午。构建一个可工作的概念验证花了更长的时间。

WinCE ROM格式没有很好的文档记录,安全研究员不得不通过阅读WinCEExtractor解析器代码,并将每个 struct.unpack 调用匹配到其在二进制文件中的位置,来逆向工程结构体偏移量。ROM格式在偏移量64处有一个签名 (0x43454345) ,然后是一个ROMHDR结构,告诉解析器存在多少个模块和文件,接着是文件条目,每个条目指向一个文件名字符串和文件数据。

前三次ROM构建都无声地失败了。解析器运行没有错误,但找不到任何文件。问题在于加载偏移量、ROMHDR指针和文件条目指针都是相互依赖的。解析器使用加载偏移量重新计算所有其他地址。即使一个值出错,也会导致解析器读取错误的文件计数或完全错过文件名。

披露过程也很棘手。 binwalk代码库2.4.3 已于2024年11月归档。无法提交问题、拉取请求或安全公告。也不存在SECURITY.md文件,安全研究员在维护者的GitHub个人资料中找到了他们的公开邮箱,并发送了一份详细的报告。他们承认了这个漏洞,但确认不会发布补丁,因为Python版本已经终止支持。

漏洞利用的工作原理

一旦弄对了ROM结构,漏洞利用就变得很简单了。你可以构建一个最小的有效WinCE ROM,其中嵌入的文件名包含目录遍历序列。当有人在上面运行 binwalk -e 时,文件就会被写入文件名所指向的任何地方。

关键是使 load_offset 等于零。解析器通过减去ROM头部存储的两个数字来计算这个值。通过将两者设置为相同的值,减法结果为零,ROM中的所有指针都变成了直接的字节位置。这使得构建二进制文件比处理非零偏移量简单得多,因为在非零偏移量下,每个指针都需要手动调整。

例如,将文件名设置为:

  • ../../../../../../etc/cron.d/backdoor 可以写入一个cron任务
  • ../../../home/user/.ssh/authorized_keys 可以注入SSH密钥
  • ../../../home/user/.bashrc 可以修改shell启动文件

RCE部分之所以能工作,是因为binwalk会自动加载 ~/.config/binwalk/plugins/ 下的每个 .py 文件。通过将文件名设置为 ../../../home/user/.config/binwalk/plugins/malicious.py ,你可以放置一个像这样的插件:

现实的攻击场景:某人下载一个固件镜像进行分析,运行 binwalk -e ,然后WinCE插件悄悄地将一个Python文件放入插件文件夹。下次他们在任何文件上运行binwalk时,恶意插件就会执行。受害者永远不会看到任何异常。

下面是概念验证 在沙盒中运行的例子:

步骤1-3:创建沙盒,构建恶意ROM,并运行提取器

步骤4:确认路径遍历。文件被写到了提取目录之外。

步骤5:确认RCE。一个恶意的.py文件被植入到了binwalk插件目录。

步骤6:清理沙盒。路径遍历和RCE均已确认。

披露时间线

  • 2020-11-13: winceextract.py 插件被添加到binwalk
  • 2026-04-09: 发现漏洞
  • 2026-04-10: 通过电子邮件向维护者报告
  • 2026-04-27: 分配CVE-2026-7179

维护者承认了这个漏洞,但表示不会发布补丁,因为Python版本已终止支持。代码库已归档,无法提交问题或拉取请求,安全研究员决定公开披露,因为binwalk v2.x仍然随Kali发行版一起提供,人们需要知道它存在这个风险。

建议的修复方法与用于CVE-2022-4510的方法相同。使用 os.path.basename() 将文件名剥离到只剩下文件部分,然后检查它是否保持在提取目录内:

你应该采取的措施

如果你使用binwalk v2.x,请切换到binwalk v3.x (Rust重写版) 。Rust版本使用Chroot架构在一个中心位置处理路径净化,因此单个插件不可能出现这类漏洞。这不仅仅是对这一个CVE的修复;它通过设计消除了整个漏洞类别。

如果你不能立即迁移,可以考虑将上述建议的修复作为本地补丁应用。只需修改 winceextract.py 中的几行代码。话虽如此,WinCE插件并不是唯一值得审计的插件。

安全研究员只查看了 winceextract.py,因为它是最明显的候选,但同一代码库中的其他提取插件可能存在类似问题,任何仍在维护分支的人都应该审查所有从二进制数据读取文件名的插件。

如果你在自动化管线或CI/CD中运行binwalk,请将固件提取视为运行不受信任的代码。使用容器,限制文件系统访问,并注意是否有文件被写入预期的提取目录之外。

对于检测,请监控 ~/.config/binwalk/plugins/ 目录中是否有新的 .py 文件。在binwalk提取操作之后,用户没有放置在该目录的任何Python文件,都是这种攻击的强烈信号。你可以在该目录上设置 inotifywait 或类似的文件监控工具来触发警报。

更广泛地说,当在一个工具的某个组件中发现并修复了路径遍历漏洞时,请检查执行类似工作的所有其他组件。CVE-2022-4510于2022年在 unpfs.py 中被修复。而 winceextract.py 中完全相同的漏洞却在那里又存在了四年。对一个解析器的修复,总应触发对其他解析器的审查。

最终思考

这并不是一个复杂的漏洞。一个插件中缺失了 os.path.basename() 调用,该插件从固件二进制文件中读取文件名,再加上一个自动加载的插件系统,就将一个简单的文件写入操作变成了代码执行,最有可能遭遇这种攻击的人正是分析固件的安全研究者,这使其成为一个尤其恶劣的攻击向量。

原文:https://payatu.com/blog/binwalk-path-traversal-vulnerability-turning-firmware-analysis-into-code-execution/

参考资料

  • CVE-2026-7179: https://nvd.nist.gov/vuln/detail/CVE-2026-7179

  • 完整POC: github.com/dhabaleshwar/Open-Source-Vulnerabilities

  • binwalk代码库: https://github.com/OSPG/binwalk

  • VulDB: https://vuldb.com/vuln/359781

  • CWE-22: https://cwe.mitre.org/data/definitions/22.html

  • 相关漏洞: CVE-2022-4510 (binwalk的unpfs.py中相同类别的漏洞,于2022年修复)

  • END –

感谢阅读,如果觉得还不错的话,动动手指给个三连吧~


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:骨哥说事 骨哥说事 骨哥说事《Binwalk 路径遍历漏洞:将固件分析转化为代码执行》

    评论:0   参与:  0