JeecgBoot添加访问控制CVE-2026-9581
JeecgBoot 是一款开源免费、企业级AI低代码开发平台,基于 Java(SpringBoot+Vue)前后端分离架构,主打低代码+零代码双模式。
一、基本情况
JeecgBoot 适合快速开发后台管理系统、OA、CRM、ERP、报表大屏等企业级应用,适合 Java 团队提效、中小企业低成本搭建系统。

JeecgBoot 采用 Apache2.0 协议,使得业务人员可在线拖拽设计表单、流程、报表、大屏,不用写代码,帮开发者快速搭建管理系统。
栋科技漏洞库关注到在 JeecgBoot 3.9.1 及以下版本中存在的安全漏洞,该漏洞现已经被追踪为CVE-2026-9581,CVSS4.0 评分5.3。
二、漏洞分析
CVE-2026-9581漏洞是 JeecgBoot 相关版本中的漏洞,漏洞位于文件 /sys/comment/add 中的未知函数,升级至 3.9.2 版本即可修复。
由于评论和检查规则端点存在Mass Assignment漏洞,攻击者可注入用户标识字段(fromUserId、toUserId、createBy)实现身份伪造。
三个端点的共同特征:无 @RequiresPermissions 注解,任何已认证用户均可调用;服务端未覆盖用户标识字段为当前登录用户。
攻击者利用该问题可绕过访问控制,此漏洞支持远程攻击,相关利用代码已公开且可被实际利用。
(一)漏洞调用链
1、评论发布 — SysCommentController.add
文件: jeecg-module-system/jeecg-system-biz/.../controller/SysCommentController.java
@RequestMapping(value = "/add", method = RequestMethod.POST)
// ☆ 无 @RequiresPermissions ☆
public Result<SysComment> add(@RequestBody SysComment sysComment) { // [1] 完整 Entity
// ...
sysCommentService.save(sysComment); // [2] 直接 save
return Result.ok("添加成功!");
}
问题:
无权限检查——任何登录用户可调用
fromUserId(评论发布者)和 toUserId(评论接收者)未从 SecurityContext 获取当前用户并强制覆盖
save() 直接持久化请求体中的所有字段
2、评论修改 — SysCommentController.edit
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
// ☆ 无 @RequiresPermissions ☆
public Result<SysComment> edit(@RequestBody SysComment sysComment) {
// ...
sysCommentService.updateById(sysComment); // 直接 updateById
return Result.ok("编辑成功!");
}
问题:
updateById() 会更新所有非null字段,包括 fromUserId 和 toUserId。攻击者先发布一条评论,再将其 fromUserId 修改为 admin 的 ID。
3、检查规则创建 — SysCheckRuleController.add
@RequestMapping(value = "/add", method = RequestMethod.POST)
// ☆ 无 @RequiresPermissions ☆
public Result<SysCheckRule> add(@RequestBody SysCheckRule sysCheckRule) {
// ...
sysCheckRuleService.save(sysCheckRule); // 直接 save
return Result.ok("添加成功!");
}
问题:
无权限检查
createBy 字段未从 SecurityContext 获取当前用户并强制覆盖
updateBy 受 MyBatis MetaObjectHandler 保护(会自动填充当前用户),但 createBy 不受保护
4、createBy 的差异化保护 — updateBy 安全但 createBy 不安全
文件:jeecg-module-system/jeecg-system-biz/.../service/impl/SysUserServiceImpl.java
对于 SysUser 实体,updateBy 通过 MetaObjectHandler 自动填充为当前用户。
但 SysCheckRule 等非用户实体没有相同的保护,
且 createBy 在 save 时不会被自动填充(MetaObjectHandler 仅处理 insertFill 中显式配置的字段)。
三、POC概念验证
使用 testonly 用户(仅 test 角色,系统默认用户,权限最小)
1、评论冒充 PoC
管理员已设置登录后刷新可查看DB 验证:
SELECT id, table_name, from_user_id, to_user_id, content
FROM sys_comment WHERE from_user_id='IMPERSONATED_ADMIN';
-- 2049785859449991169 | x | IMPERSONATED_ADMIN | IMPERSONATED_ADMIN | ...
from_user_id 直接使用了注入值 IMPERSONATED_ADMIN,而非当前登录用户 testonly。
2、审计伪造 PoC
管理员已设置登录后刷新可查看DB 验证:
SELECT id, rule_code, create_by FROM sys_check_rule WHERE rule_code='pwned_rules';
-- 2049785860129468417 | pwned_rules | FAKE_ADMIN
create_by 使用了注入值 FAKE_ADMIN。
3、角色权限验证
以上 PoC 使用仅拥有 test 角色的用户完成。test 角色仅持有 2 个权限码:
管理员已设置登录后刷新可查看评论和检查规则端点缺少双重保护,既没有权限注解限制谁能调用,
也没有在服务端将用户标识字段覆盖为当前登录用户的值,仅需认证即可访问。
updateBy 是存在保护机制的,但保护不完整(createBy 遗漏)。
建议您更新当前系统或软件至最新版,完成漏洞的修复。
四、影响范围
JeecgBoot ≤ 3.9.1
五、修复建议
JeecgBoot ≥ 3.9.2
六、参考链接
管理员已设置登录后刷新可查看