返回首页

CVE-2026-10520: Ivanti Sentry OS Command Injection Root RCE

-2026-10520: Sentry OS命令注入漏洞——未认证攻击者直接获取root权限

hero

CVE-2026-10520是Ivanti Sentry(前身为MobileIron Sentry)中的一个操作系统命令注入漏洞,CVSS评分9.8。未经认证的远程攻击者可以通过该漏洞直接获取root级别的远程代码执行权限。于2026年6月11日将其加入已知被利用漏洞目录,CrowdSec已观测到大规模的在野利用活动。

漏洞概述

section

CVE-2026-10520是一个存在于Ivanti Sentry中的操作系统命令注入漏洞(CWE-78)。Ivanti Sentry是企业移动管理(EMM)解决方案中的安全移动网关组件,负责管理移动设备对企业资源的访问。

该漏洞的关键特征:

  • 无需认证:攻击者不需要任何凭据即可触发漏洞
  • 直接root权限:成功利用后直接获得root级别的系统访问
  • 远程可利用:通过网络即可攻击,不需要本地访问
  • 低利用复杂度:攻击不需要特殊配置或用户交互

Ivanti Sentry在企业环境中通常部署在DMZ(非军事区)中,直接面向互联网,这使得它成为攻击者的理想目标。根据Shodan的扫描数据,全球有超过8,000个Ivanti Sentry实例暴露在公网上。

NVD的官方描述为:"An OS Command Injection in Ivanti Sentry before the R10.5.2, R10.6.2 and R10.7.1 versions allows a remote unauthenticated user to achieve root-level remote code execution."

技术原理:命令注入的实现路径

section

OS命令注入(CWE-78)是一种常见的安全漏洞,当应用程序将用户输入直接传递给系统shell执行而未进行适当的过滤和转义时就会产生此类漏洞。

在CVE-2026-10520中,Ivanti Sentry的某个Web接口端点接受用户输入的参数,并将这些参数拼接到系统命令中执行。由于缺少输入验证和命令注入防护,攻击者可以在正常参数中注入额外的操作系统命令。

攻击向量分析:

正常请求:
POST /api/v1/some-endpoint
{"param": "normal_value"}

注入请求:
POST /api/v1/some-endpoint
{"param": "normal_value; id; whoami; cat /etc/shadow"}

或者使用反引号:
{"param": "`id`"}

或者使用$()语法:
{"param": "$(whoami)"}

CrowdSec在其分析中指出,他们检测到了针对CVE-2026-10520的大规模利用浪潮。攻击活动从2026年6月初开始显著增加,攻击者主要来自东欧和东亚的IP地址段。

利用难度评估:

因素 评级 说明
攻击向量 网络 通过HTTP/HTTPS远程利用
攻击复杂度 不需要特殊条件或用户交互
所需权限 无需任何认证凭据
用户交互 不需要受害者配合
利用代码可用性 公开 上已有PoC代码
在野利用 活跃 CrowdSec确认的大规模利用

受影响版本与修复方案

section

产品 受影响版本 修复版本 发布日期
Ivanti Sentry R10.5.x (低于R10.5.2) R10.5.2 2026-06
Ivanti Sentry R10.6.x (低于R10.6.2) R10.6.2 2026-06
Ivanti Sentry R10.7.x (低于R10.7.1) R10.7.1 2026-06
Ivanti Sentry 所有更早版本 升级到最新版 -

Ivanti已发布安全公告并提供补丁。根据CISA的BOD 22-01指令,联邦机构必须在2026年7月11日前完成修复。

漏洞检测方法

section

安全团队可以通过以下方式检测是否受到CVE-2026-10520的影响:

# 检查Ivanti Sentry版本
curl -sk https://<sentry-host>/api/v1/system/version \
  -H "Accept: application/json"

# 检查是否有利用痕迹(异常进程)
ps aux | grep -E "(nc|ncat|bash -i|.*socket|perl.*socket)" | grep -v grep

# 检查最近的异常文件创建
find / -newer /etc/hostname -name "*.sh" -mtime -3 2>/dev/null
find /var -newer /etc/hostname -type f -mtime -1 2>/dev/null

# 检查网络连接(反向Shell)
netstat -tlnp | grep -E ":(4444|5555|6666|7777|8888|9999)"
ss -tlnp | grep -E ":(4444|5555|6666|7777|8888|9999)"
#!/usr/bin/env python3
"""CVE-2026-10520 Ivanti Sentry Exposure Scanner"""
import requests
import sys
import urllib3
urllib3.disable_warnings()

def check_sentry(host, port=443):
    """Check if Ivanti Sentry is exposed and potentially vulnerable"""
    base = f"https://{host}:{port}"
    
    # Check version endpoint
    try:
        r = requests.get(f"{base}/api/v1/system/version", 
            verify=False, timeout=10, 
            headers={"Accept": "application/json"})
        if r.status_code == 200:
            try:
                 = r.json()
                version = data.get("version", "unknown")
                print(f"[INFO] Sentry version: {version}")
                
                # Parse version and check vulnerability
                if version.startswith("R10.5") and version < "R10.5.2":
                    print(f"[VULN] Version {version} is vulnerable!")
                elif version.startswith("R10.6") and version < "R10.6.2":
                    print(f"[VULN] Version {version} is vulnerable!")
                elif version.startswith("R10.7") and version < "R10.7.1":
                    print(f"[VULN] Version {version} is vulnerable!")
                else:
                    print(f"[OK] Version {version} appears patched")
            except:
                print(f"[INFO] Version endpoint responded but format unknown")
        else:
            print(f"[INFO] Version endpoint returned HTTP {r.status_code}")
    except Exception as e:
        print(f"[ERR] Cannot reach {base}: {e}")
    
    # Check for signs of 
    try:
        r2 = requests.get(f"{base}/api/v1/system/status",
            verify=False, timeout=10)
        if r2.status_code == 200:
            print(f"[INFO]  status endpoint accessible")
    except:
        pass

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python3 check_ivanti.py <host> [port]")
        sys.exit(1)
    host = sys.argv[1]
    port = int(sys.argv[2]) if len(sys.argv) > 2 else 443
    check_sentry(host, port)

紧急缓解措施

section

第一优先级:立即打补丁 升级到Ivanti Sentry R10.5.2、R10.6.2或R10.7.1(取决于当前版本分支)。

如果暂时无法打补丁:

# 1. 限制对Sentry管理接口的网络访问
iptables -A INPUT -p tcp --dport 443 -s <trusted_management_ip> -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j DROP

# 2. 如果使用反向代理,在代理层添加WAF规则
# 示例:阻止包含shell元字符的请求
# if ($request_uri ~* "[;&|`$]") { return 403; }

# 3. 监控Sentry服务器的异常活动
tail -f /var/log/ivanti/sentry/*.log | grep -iE "(error|exception|inject|exec)"

Ivanti产品线安全历史

Ivanti(前身为MobileIron、Pulse Secure、Ivanti合并而成)的产品近年来频繁出现高危漏洞:

CVE编号 产品 漏洞类型 CVSS 年份
CVE-2026-10520 Sentry OS命令注入 9.8 2026
CVE-2025-0282 Connect Secure 缓冲区溢出 9.0 2025
CVE-2024-21887 Connect Secure 命令注入 9.1 2024
CVE-2023-46805 Connect Secure 认证绕过 8.2 2023

这种反复出现的安全问题表明Ivanti的产品在安全开发生命周期(SDL)方面存在系统性缺陷。企业在选择移动设备管理(MDM)和安全网关产品时,应该将厂商的安全记录作为重要评估因素。

企业影响与响应建议

Ivanti Sentry在企业架构中的位置使其成为高价值攻击目标:

  1. 网络位置敏感:通常部署在DMZ,可直接从互联网访问
  2. 权限级别高:拥有对企业内部资源的代理访问权限
  3. 数据价值大:管理着所有移动设备的认证凭据和访问策略
  4. 横向移动便利:攻陷Sentry后可以访问其管理的所有企业资源

事件响应检查清单:

  • 确认Ivanti Sentry版本并应用补丁
  • 审计Sentry日志中的异常调用
  • 检查Sentry服务器上的异常文件和进程
  • 轮换Sentry使用的所有服务账户凭据
  • 审查Sentry管理的移动设备访问日志
  • 评估是否有敏感数据通过Sentry被访问
  • 更新WAF规则以阻止命令注入攻击模式

数据来源与参考文献:

  1. NVD. "CVE-2026-10520 Detail." nvd.nist.gov, 2026.
  2. Catalog. "CVE-2026-10520." cisa.gov, 2026-06-11.
  3. CrowdSec. "CVE-2026-10520: Ivanti Sentry OS Command Injection Actively Exploited." crowdsec.net, 2026-06-15.
  4. Halo . "CVE-2026-10520: Ivanti Sentry Root ." blog.halosecurity.com, 2026.
  5. OpenCVE. "CVE-2026-10520 Vulnerability Details." app.opencve.io, 2026.
  6. GitHub/ogenich. "CVE-2026-10520 Detection Scanner." github.com, 2026.

评论