两行代码打穿1591星国产悟空HRM:未授权看遍全员工资条(CVE-2026-108707/108708·附PoC)"

admin 2026-10-15 17:17:24 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

两行代码打穿 1591星 国产悟空HRM:未授权看遍全员工资条(CVE-2026-108707/108708·附PoC)

原创

赤霄攻防实验室
赤霄攻防实验室

赤霄攻防实验室

2026年10月12日 11:30
中国香港

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

▲ 封面|漏洞情报(制图:赤霄攻防实验室)

TL;DR

是什么:国产开源人事系统「悟空HRM」被披露双 CVE——认证切面判空失效(CVE-2026-108707,9.8)+ HR 管理员角色硬编码(CVE-2026-108708,8.8),未授权即可调用全部业务接口

影响:≤ commit 186115e 全系受影响,披露时上游尚无修复 commit;工资条、薪资历史、员工 PII、附件均可被未授权读取或下载

怎么办:自建用户立即把 HRM 端口撤出公网,并在网关层拦截无认证令牌的业务请求

看点:本号完成源码级验证——「判空死代码」+「硬编码角色」两处致命写法;同款模式还出现在 2446★ 的悟空CRM 源码中

▲ 漏洞档案卡(制图:赤霄攻防实验室)

悟空HRM:中小企业里最常见的那类系统

悟空HRM(Wukong\_HRM)是悟空开源家族旗下的人事管理模块,GitHub 上 1591 颗星、纯 Java 技术栈,和同家族的悟空CRM(11.0 版 2446 颗星)、OA、PSA 等一起,构成一套国内中小企业里相当常见的开源管理软件全家桶。组织架构、入职转正、薪酬考勤——HRM 里存的东西,恰恰是一家公司最敏感的那部分数据:每个人的身份证号、合同、银行卡,以及每个月的工资条。

这类系统的典型部署方式是自建:一台服务器、一个 44311 端口,直接挂在机房或办公室出口上。很多团队甚至会做端口映射让它公网可达,方便员工手机填单。2026 年 10 月 11 日,NVD 收录了针对它的两个 CVE——攻击者不需要账号、不需要交互,就有机会把这些数据全部拿走。

根因一(9.8):判空失效,认证切面形同虚设

悟空系框架用一个 Spring AOP 切面(ParamAspect)给所有业务控制器统一注入登录用户。正常逻辑应该是:请求头里没有令牌或令牌无效,就抛出未登录异常。但源码里的写法是——先 new 了一个空的用户对象,再用它去做判空。

这就把「判空」变成了死代码:变量永远不为 null,无令牌的请求带着这个空用户对象一路放行,直接进入业务方法。VulnCheck 将其评为 CRITICAL(9.3),CVE 矢量评分 9.8,攻击复杂度为零——一句「不带认证头」就是全部利用条件。该文件位于框架公共包中,属于整个悟空系的共用代码基线。

▲ 根因对照:两处致命写法(制图:赤霄攻防实验室)

根因二(8.8):硬编码角色,人人都是 HR 管理员

第二个缺陷在 HRM 模块自己的切面里。每个进入人事模块的请求都会经过 EmployeeAspect:它取出当前用户的手机号去查员工档案——在第一个漏洞的加持下,这一步拿到的是空值——查不到就新建一个空档案,然后写死一行:把角色标签设为 91,也就是 HR 管理员。

换句话说,任何请求进入 HRM 模块,都会被自动授予 HR 管理员视角;数据范围工具类再把「可见范围」返回成全员。VulnCheck 的公告与研究者 Yaqi Chao 的验证直接点名了后果:任意工资条读取、员工 PII 导出、附件下载(IDOR),以及薪资历史的全量浏览。对一个人事系统来说,这几乎是「全部家底」。

组合拳:从无 token 到全员工资条

两个缺陷单独看都只是「实现瑕疵」,组合起来就是完整攻击链:无令牌请求业务接口 → 认证切面放行 → HRM 切面授予管理员角色 → 数据范围放开 → 工资条、员工档案、附件任取。整个过程不发送任何恶意载荷、不需要任何凭据,用一条只读查询即可完成验证。

▲ 攻击链时间线(制图:赤霄攻防实验室,据源码级分析整理)

时间线上还有一个值得注意的细节:维护者在 9 月 11 日刚为仓库添加了「协同披露政策」文档,10 月 10 日 VulnCheck 发布公告、10 月 11 日 NVD 收录两个 CVE——但截至发稿,仓库 HEAD 仍停留在 186115e,没有出现修复 commit。也就是说,这是一次「披露即未修复」的公开披露:所有自建实例在补丁落地前都处于理论可打状态。

本号基于公开信息完成了源码级验证,并按「非破坏性、三态结论(VULNERABLE / PATCHED / UNKNOWN)」标准编写了验证脚本(只读探测、目标参数化、默认指向本机),已发布至本号 PoC 仓库,见文末参考区。注意:这是源码级验证而非全栈实测复现——悟空HRM 的完整部署依赖 Redis 等多个组件,本篇未搭建完整运行环境。

▲ VulnCheck 官方公告:CRITICAL / CVSS 9.3(来源:vulncheck.com)

▲ 漏洞代码 ParamAspect.java 第 35-55 行(来源:GitHub,本号加注高亮)

同源风险:悟空CRM 里的同款模式

查源码时我们还确认了一个更大的影响面候选:在 2446 颗星的悟空CRM(WukongCRM-11.0-JAVA)中,存在同名同路径的 ParamAspect,且逻辑更显式——代码里留着一行注释「TODO 未登录时有个空的user对象」,随后构造空用户并继续放行业务调用。也就是说,「未登录给个空用户往下走」在这个框架里某种程度上是被有意保留的设计。

需要严谨说明的是:CRM 各业务接口的下游校验情况我们尚未逐一验证,不能直接等同「CRM 可被同样打穿」;但认证切面这一层的形态与 HRM 高度一致,用悟空CRM / OA 等同家族产品的读者,建议按同样的思路(无令牌请求业务接口,观察是否返回业务数据)尽快自查一遍。

防御视角:三步处置

1. 立即确认暴露面

先回答一个问题:HRM 的 44311 端口现在公网可达吗?在公网能打开,就等同于把全员工资表挂在门口。自建系统优先内网化,确需远程访问的走 VPN 或带认证的反向代理。

2. 网关层临时拦截

补丁落地前,可在 Nginx / WAF 层加一条规则:对业务路径的无认证令牌请求直接返回 401。这个绕过的本质是「空令牌放行」,网关侧校验认证头的存在性即可挡住绝大部分利用路径。

3. 跟进修复与数据盘点

关注上游仓库的修复 commit(或自行修改:把空对象初始化改为真正的 null 判断,并移除硬编码的角色标签)。同时按「工资数据可能已泄露」的口径做一次影响评估——人事数据的泄露,往往要按《个人信息保护法》的节奏来处理,而不是修完漏洞就算结束。

参考来源

  1. NVD:CVE-2026-108707 / CVE-2026-108708
  2. VulnCheck 公告:Wukong\_HRM through commit 186115e Authentication Bypass via ParamAspect
  3. 漏洞代码:github.com/WuKongOpenSource/Wukong\_HRM ParamAspect.java / EmployeeAspect.java(commit 186115e)
  4. 研究者 PoC:github.com/AnkesKasty/cve-request-poc(Yaqi Chao)
  5. 本号验证脚本(非破坏性三态验证):https://github.com/Rubby2001/CVE-POCS/tree/main/CVE-2026-108707

觉得有用就点个「在看」,转发给还在用开源 HRM/CRM 的朋友;关注赤霄攻防实验室,每晚一篇高价值安全深度。

免责声明:本文仅用于安全研究与防御交流,不构成任何投资或法律建议;文中技术细节以官方仓库与公告为准,PoC 仅限授权测试使用。


对于ARTEX的吃瓜与思考及小白AI挖洞吐槽" 网络安全文章

对于ARTEX的吃瓜与思考及小白AI挖洞吐槽"

本文作者分享ARTEX工具部署体验,指出其UI全面适合小白但个人使用感觉一般,配置LLM耗时且对实现功能不了解不敢使用。文章强调安全边界问题,出厂配置虽限制gov和edu站点但门禁不够严格,建议多做限制避免AI瞎搞造成重大损失。同时吐槽AI挖洞降低门槛吸引小白加入,建议先学好基础再提交漏洞,避免影响审核效率。
评论:0   参与:  0