ZeroPathAI/autogpt-CVE-2026-30950-poc
GitHub: ZeroPathAI/autogpt-CVE-2026-30950-poc
这是一个针对AutoGPT平台CVE-2026-30950会话劫持漏洞的概念验证工具。
Stars: 0 | Forks: 0
# AutoGPT CVE-2026-30950 概念验证
CVE-2026-30950 概念验证演示,这是一个 AutoGPT 平台中的已认证 IDOR(缺少授权)漏洞,允许任何已登录用户通过一个单独的 PATCH 请求,无需事先访问该会话,即可重新分配(从而劫持)任何其他用户的聊天会话。
- GHSA: [GHSA-q58p-v9r9-7gqj](https://github.com/Significant-Gravitas/AutoGPT/security/advisories/GHSA-q58p-v9r9-7gqj)
- CVE: [CVE-2026-30950](https://nvd.nist.gov/vuln/detail/CVE-2026-30950)
- CVSS 3.1: **7.1 / 高** (`AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:L`)
- 受影响版本: `autogpt-platform-backend >= 0.6.36`
- 修复版本: 0.6.51
- 由 ZeroPath 发现。我们的[技术博客](https://zeropath.com/blog/autogpt-cve-2026-30950-session-hijack)包含带有更多细节的完整报告!
## 漏洞描述
### 会话分配端点缺少所有权检查 (CVE-2026-30950, CWE-862)
该漏洞有三层,绕过机制在每一层都得以建立:
```
# autogpt_platform/backend/backend/api/features/chat/routes.py:753-776 聊天 API 路由
@router.patch(
"/sessions/{session_id}/assign-user",
dependencies=[Security(auth.requires_user)],
status_code=200,
)
async def session_assign_user(
session_id: str,
user_id: Annotated[str, Security(auth.get_user_id)],
) -> dict:
await chat_service.assign_user_to_session(session_id, user_id)
return {"status": "ok"}
```
该路由接受任何已认证的调用者。它将任务交给服务层:
```
# autogpt_platform/backend/backend/copilot/service.py:291-303 Copilot 服务
async def assign_user_to_session(session_id: str, user_id: str) -> ChatSessionInfo:
session = await get_chat_session(session_id, None) # ← user_id=None
if not session:
raise NotFoundError(f"Session {session_id} not found")
session.user_id = user_id
session = await upsert_chat_session(session)
return session
```
服务层故意将 `user_id=None` 传递给数据访问器,而不是转发调用者的用户 ID。然后数据访问器将 `None` 视为管理员模式并跳过所有权过滤器:
```
# autogpt_platform/backend/backend/copilot/model.py:355-366 Copilot 模型
session = await _get_session_from_cache(session_id)
if session:
if user_id is not None and session.user_id != user_id:
logger.warning(f"Session {session_id} user id mismatch")
return None
return session
```
### 服务器何时可被利用?
任何运行 `autogpt-platform-backend` 且版本在 **`>= 0.6.36` 至 `< 0.6.51`** 之间,并启用了聊天(copilot)功能的 AutoGPT 平台实例都可被利用。该利用需要:
1. **一个已认证的会话。** 攻击者必须持有任何有效的 Supabase JWT —— 一个标准的已注册用户账户即可。
2. **一个目标会话 ID。** 会话 ID 是 UUID,但它们会出现在 URL 和日志中;任何泄露 —— 来源请求头、共享链接、屏幕分享、服务器日志、支持工单 —— 都足以获取。
### 攻击者能做什么?
按会话影响,随着每个被劫持的会话而升级:
- **读取被劫持会话中的所有消息。** AutoGPT 中的聊天会话包含与代理的对话历史,包括工具调用、文件引用以及用户粘贴到聊天中的任何敏感数据。
- **将合法所有者锁定在外。** 重新分配后,Redis 缓存保存攻击者的 user_id;受害者后续的读取操作会因所有权检查失败而返回 404。
- **通过会话进行横向移动。** 无论该会话被授权为受害者做什么,攻击者现在都可以做 —— 提交后续消息、触发代理操作、窃取附加到该会话的工作区内容。
CVSS 评分(C:H / I:N / A:L)反映了每个会话范围的影响:对被劫持会话的高机密性影响,对已有消息内容无完整性损害,以及对合法所有者的可用性影响(锁定)。
### 概念验证范围
本仓库提供**一个**概念验证,涵盖直接触发:攻击者使用其 JWT 针对一个已知 `session_id` 发送一个单独的 PATCH 请求。设置脚本会在新启动的 AutoGPT 栈中创建两个用户(攻击者和受害者),并在宣告就绪之前验证前置条件。
## 仓库内容
- **`setup/`** — Docker Compose 环境。
- `setup.sh` 在最后一个易受攻击的标签(`autogpt-platform-beta-v0.6.50`)下克隆 AutoGPT 到 `setup/AutoGPT-src/`,从上游的 `docker-compose.yml` 启动最小服务(`rest_server`, `copilot_executor`, `database_manager`, `migrate`,以及它们的传递依赖:Postgres, Redis, RabbitMQ, Supabase Kong + GoTrue),创建两个测试用户,并验证易受攻击的端点已被路由。
- `teardown.sh` 关闭栈并清除卷。
- **`pocs/session_hijack.py`** — 自包含的利用工具。以受害者和攻击者身份登录,以受害者身份创建一个会话,确认攻击者在利用前没有读取权限,发出单个 PATCH 请求,然后证明所有权已转移且受害者已被锁定。
## 操作说明
前置条件:Docker, Git, Python 3.10+,以及 [uv](https://docs.astral.sh/uv/getting-started/installation/)。
```
cd setup
./setup.sh
```
首次运行将在易受攻击的标签下克隆 AutoGPT 并构建后端镜像(约 3-5 分钟)。后续运行会很快。当设置完成后,它会打印出可直接粘贴执行的概念验证调用命令。
运行概念验证:
```
uv run --no-project --with requests \
pocs/session_hijack.py \
--api-url http://localhost:58006 \
--auth-url http://localhost:58000 \
--attacker-email attacker@autogpt-poc.local \
--attacker-password 'Attacker123!' \
--victim-email victim@autogpt-poc.local \
--victim-password 'Victim123!'
```
预期输出的结尾为:
```
[PASS] AUTHENTICATED SESSION HIJACK CONFIRMED
```
清理:
```
cd setup
./teardown.sh
```
克隆的 AutoGPT 源代码 `setup/AutoGPT-src/` 会在清理后保留,以便重新运行时无需重新下载。要完全清除它,请删除 `setup/AutoGPT-src/`。
标签:威胁模拟, 字符串匹配, 请求拦截, 逆向工具