IPBUF安全漏洞报告
English
CVE-2026-32148 CVSS 5.9 中危

CVE-2026-32148 hexpm hex数据真实性验证不足漏洞

披露日期: 2026-04-30
来源: 6b3ad84c-e1a6-4bf7-a703-f496b71e49db

漏洞信息

漏洞编号
CVE-2026-32148
漏洞类型
完整性验证绕过
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
hexpm hex

相关标签

完整性验证绕过供应链安全ElixirHexCVE-2026-32148

漏洞概述

hexpm hex 包中的 Hex.RemoteConverger 模块存在数据真实性验证不足漏洞。由于依赖字符串名称与原子名称的类型不匹配,导致 mix.lock 文件中的校验和验证被跳过。攻击者若能影响缓存包或破坏注册表,可提供修改后的依赖内容,导致完整性校验绕过。

技术细节

该漏洞的根本原因在于 Hex.RemoteConverger.verify_resolved/2 函数中的逻辑缺陷。Hex 旨在通过 mix.lock 文件存储依赖校验和以保障构建完整性,但该验证过程实际上从未被执行。具体而言,Hex.Utils.lock/1 返回的锁数据使用基于字符串的依赖名称,而验证逻辑却将它们与基于原子(Atom)的名称进行比较。这种类型不匹配导致验证代码路径被静默跳过。尽管在初始下载时校验和会被验证,但锁文件与已解析依赖项之间的不匹配无法被检测到。攻击者如果能够影响本地缓存(例如通过本地缓存投毒)或攻破注册表,就可以提供被修改的依赖内容,且不会触发警报。此时,mix.lock 文件会被静默重写,覆盖了篡改的证据。

攻击链分析

STEP 1
步骤1
攻击者通过本地缓存投毒或破坏注册表,修改依赖包的内容。
STEP 2
步骤2
开发者执行构建命令(如 mix deps.get),Hex 从受影响的缓存或注册表下载依赖。
STEP 3
步骤3
Hex.RemoteConverger.verify_resolved/2 尝试验证 mix.lock 中的校验和。
STEP 4
步骤4
由于锁数据使用字符串键而验证逻辑使用原子键,类型不匹配导致验证代码被跳过。
STEP 5
步骤5
恶意的依赖包被系统接受,mix.lock 文件被静默更新以匹配恶意哈希,掩盖攻击痕迹。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Conceptual PoC demonstrating the type mismatch issue in CVE-2026-32148 # The vulnerability occurs because Hex.Utils.lock/1 returns string keys, # but the verification logic expects atom keys. defmodule MockHexVuln do # Simulates the lock data returned by Hex.Utils.lock/1 (Strings) def get_lock_data_strings do %{"package_name" => "some_checksum"} end # Simulates the resolved dependencies (Atoms) def get_resolved_deps_atoms do %{package_name: "some_checksum"} end # Simulates the vulnerable verification logic def verify_resolved_vulnerable(lock_data, resolved_deps) do # The logic iterates over resolved_deps (atoms) Enum.each(resolved_deps, fn {dep_name_atom, _checksum} -> # But tries to look up in lock_data (strings) # This lookup fails because :package_name != "package_name" case Map.get(lock_data, dep_name_atom) do nil -> # Verification path skipped silently IO.puts("[VULNERABLE] Verification skipped for: #{dep_name_atom}") _ -> IO.puts("Verification passed") end end) end end # Execution lock = MockHexVuln.get_lock_data_strings() deps = MockHexVuln.get_resolved_deps_atoms() MockHexVuln.verify_resolved_vulnerable(lock, deps)

影响范围

hexpm hex >= 0.16.0, < 2.4.2

防御指南

临时缓解措施
建议用户检查本地 Hex 缓存目录的完整性,并在升级前避免使用不可信的来源。如果无法立即升级,应手动验证 mix.lock 文件中的依赖哈希值是否与可信源一致。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表