Suna通过消息队列API破坏访问控制CVE-2026-66027
Suna 是Kortix团队开发、Apache2.0协议开源通用自主 AI Agent,主打替代闭源工具 Manus AI,俗称“AI 员工”,支持私有化本地部署。
一、基本情况
Suna 依靠自然语言自主完成多步骤复杂任务,适用于市场竞品调研、批量文档处理、自动化爬虫、代码批量开发运维、学术文献整理。

Suna实现安全隔离,每个任务独立 Docker 沙箱运行,避免文件、系统权限风险。业务报表自动生成,自动拆解复杂需求,串联搜索。
栋科技漏洞库关注到0.9.102 版本之前的Suna消息队列接口存在访问控制失效漏洞,现已追踪为CVE-2026-66027,CVSS 4.0评分 8.7。
二、漏洞分析
CVE-2026-66027是Suna消息队列接口(/v1/queue/*)中跨租户垂直越权访问漏洞,源于仅做登录校验,未校验资源归属与租户隔离。
由于程序缺少归属权校验与账号隔离校验,这导致已登录攻击者能够访问、篡改其他用户的队列资源,并且可全局拉取全部队列数据。
攻击者可读取全部用户待处理提示队列,查看或删除任意会话,还能向其他用户的会话队列注入恶意提示内容。
后台消费程序会转发这些恶意消息至受害者正在运行的 AI 代理,且执行权限与凭证均为受害者自身账号权限。
使得任意已认证用户均可读取、注入、删除同部署环境下其他所有用户的 AI 代理待执行提示队列。
GET /v1/queue/all 接口一次请求即可返回多租户实例内全部用户的队列消息,无租户隔离限制。
详情队列相关路由定义文件路径:
apps/api/src/index.ts
app.use('/v1/queue/*', combinedAuth);
app.route('/v1/queue', queueApp);
combinedAuth 中间件仅校验调用方持有合法Supabase JWT令牌或Kortix接口密钥,仅在上下文存入用户ID,无其他隔离信息。
apps/api/src/queue/routes.ts 内的路由处理函数完全未读取该用户ID,也未执行资源归属校验:
// GET /v1/queue/sessions/:sessionId
queueApp.get('/sessions/:sessionId', (c) => {
const sessionId = c.req.param('sessionId');
const messages = storage.getSessionQueue(sessionId); // no auth check
return c.json({ messages });
});
// POST /v1/queue/sessions/:sessionId
queueApp.post('/sessions/:sessionId', async (c) => {
const sessionId = c.req.param('sessionId');
const body = await c.req.json<{ text: string; id?: string }>();
const msg = storage.enqueue(sessionId, body.text.trim(), body.id); // no auth check
return c.json({ message: msg }, 201);
});
// GET /v1/queue/all -- returns ALL sessions' queued messages across all accounts
queueApp.get('/all', (c) => {
const messages = storage.getAllQueues(); // no per-account filter
return c.json({ messages });
});
// DELETE /v1/queue/sessions/:sessionId
queueApp.delete('/sessions/:sessionId', (c) => {
const sessionId = c.req.param('sessionId');
storage.clearSession(sessionId); // no auth check
return c.json({ ok: true });
});
底层存储(apps/api/src/queue/storage.ts)基于文件系统实现;会话队列文件存放路径为/queue/.json。
消息存储时不会附带账号、用户标识字段,执行所有增删改查操作前,
也不会查询project\_sessions数据表(该表记录了账号ID与创建人信息)做权限校验。
队列内存储的消息是用户待执行提示词,即用户在后台面板输入、准备发送给自身AI代理的文本,
后台消费程序(apps/api/src/queue/drainer.ts)会将这些消息转发至代理进程。
消息内可能包含敏感指令、明文密钥,或是用户计划自动执行的业务逻辑。
三、POC概念验证
1、前置条件
一套已部署运行的Suna私有化实例,两个注册账号(用户A、用户B),以及二者对应的Supabase JWT令牌。
管理员已设置登录后刷新可查看全部五步利用流程均在提交号 80738c31 的本地部署环境实测通过,测试使用分属两个独立测试账号的 Supabase JWT 令牌。
2、危害影响
任意已登录用户可实现以下操作:
(1)读取平台内所有其他用户的队列提示词,消息中可能包含明文凭证、内部系统操作指令及各类商业机密信息;
(2)仅调用一次 GET /v1/queue/all 接口即可拉取全局全部队列数据,泄露所有租户待处理提示内容;
(3)向其他用户的会话队列注入恶意提示词,后台消费程序会将该内容转发至受害者正在运行的 AI 代理,
实现模型执行层面的跨租户提示注入攻击;
(4)删除任意用户的待处理队列,无提示中断对方正在运行的 AI 工作流程。
注入攻击路径大幅提升漏洞风险等级:恶意用户能够操控受害者的 AI 代理,以受害者账号凭证与权限执行攻击者自定义指令。
四、影响范围
Suna < 0.9.102
五、修复建议
Suna ≥ 0.9.102
六、参考链接
管理员已设置登录后刷新可查看