n0n4m3x41/CVE-2026-22738-POC

GitHub: n0n4m3x41/CVE-2026-22738-POC

针对 Spring AI SimpleVectorStore 中 SpEL 注入漏洞(CVE-2026-22738)的概念验证工具,实现未经身份验证的远程代码执行。

Stars: 7 | Forks: 1

# CVE-2026-22738 — Spring AI SimpleVectorStore 中的 SpEL 注入 RCE ![CVSS](https://img.shields.io/badge/CVSS-9.8%20CRITICAL-red) ![CWE](https://img.shields.io/badge/CWE-94%20%2F%20917-orange) ![Status](https://img.shields.io/badge/Status-Fixed-green) 通过 `SimpleVectorStore.similaritySearch()` 中的 Spring Expression Language (SpEL) 注入实现未经身份验证的远程代码执行。 ## 受影响版本 | 构件 | 受漏洞影响 | 已修复 | |---|---|---| | `org.springframework.ai:spring-ai-core` | 1.0.0 – 1.0.4 | **1.0.5** | | `org.springframework.ai:spring-ai-core` | 1.1.0-M1 – 1.1.3 | **1.1.4** | **修复提交:** `ba9220b22383e430d5f801ce8e4fa01cf9e75f29` ## 漏洞详情 `SimpleVectorStore.similaritySearch()` 将调用者提供的过滤键名原样传递到由 `StandardEvaluationContext` 评估的 SpEL 模板中。由于 `StandardEvaluationContext` 暴露了完整的 JVM 反射 API,攻击者可以注入: ``` T(java.lang.Runtime).getRuntime().exec(...) ``` 到过滤键中,从而实现未经身份验证的操作系统命令执行。 ### 绕过细节 简单的注入无法直接奏效 —— 必须处理两个解析器的特殊行为: 1. **单引号去除** —— 以 `'` 开头的键被视为引用字符串;外部引号会被去除,从而破坏载荷。 2. **双引号包装** —— 用 `"..."` 包装载荷会导致解析器去除外部双引号,将内部的 SpEL 表达式保留为传递给 `#metadata['']` 的键值。 3. **空元数据键** —— 在注入表达式的两侧使用 `#metadata['']`(而不是未定义的变量)可以避免 `unknown variable` SpEL 错误,同时仍能触发 `exec()`。 最终评估的表达式形式如下: ``` #metadata[''] + T(java.lang.Runtime).getRuntime().exec(new String[]{'/bin/bash','-c',''}) + #metadata[''] == 'x' ``` ### 成功指标 HTTP 响应正文将包含 `EL1030E` —— 即 SpEL 运行时错误: ``` operator ADD not supported between null and java.lang.ProcessImpl ``` 此错误在 `exec()` 返回**之后**抛出,证实了操作系统级别的命令执行,且无需带外回调。 ## 用法 **前置条件:** ``` pip install requests ``` **运行漏洞利用程序:** ``` python3 exploit.py [--target http://localhost:8082] [--wait] ``` image | Flag | Default | Description | |---|---|---| | `--target` | `http://localhost:8082` | Base URL of the vulnerable application | | `--wait` | off | Poll until the target is ready (useful after `docker compose up`) | **Docker Desktop (macOS/Windows):** 对于回调载荷,请使用 `host.docker.internal` 代替 `127.0.0.1`。 ## 漏洞利用步骤 该 PoC 按顺序运行五个步骤: | 步骤 | 描述 | |---|---| | 1 | 基线检查 —— 确认端点可达并返回种子数据 | | 2 | 盲注 SpEL 探测 —— 通过 `T(java.lang.System)` 读取 `java.version` 以确认注入点 | | 3 | RCE:在容器内执行 `touch /tmp/pwned_cve_2026_22738` | | 4 | RCE:将 `id` / `uname` / `hostname` 输出写入 `/tmp/rce_proof.txt` | | 5 | 通过 `docker exec` 验证 —— 打印证明文件内容 | ## 免责声明 此概念验证仅用于教育和授权安全测试目的。请勿对您不拥有或未获得明确书面测试许可的系统使用。
标签:Adversarial AI, AI安全, Chat Copilot, CISA项目, CVE-2026-22738, CVSS 9.8, GHAS, Java安全, Maven, PoC, RCE, SimpleVectorStore, SpEL注入, Spring AI, Spring生态, 向量数据库, 威胁模拟, 暴力破解, 未授权访问, 漏洞验证, 编程工具, 表达式注入, 请求拦截, 远程代码执行, 逆向工具, 零日漏洞, 高危漏洞