首页 网络安全 正文

Suna通过消息队列API破坏访问控制CVE-2026-66027

摘要

栋科技漏洞库关注到0.9.102 版本之前的Suna消息队列接口存在访问控制失效漏洞,现已追踪为CVE-2026-66027,CVSS 4.0评分 8.7。

Suna 是Kortix团队开发、Apache2.0协议开源通用自主 AI Agent,主打替代闭源工具 Manus AI,俗称“AI 员工”,支持私有化本地部署。

一、基本情况

Suna 依靠自然语言自主完成多步骤复杂任务,适用于市场竞品调研、批量文档处理、自动化爬虫、代码批量开发运维、学术文献整理。

Microweber CMS路径穿越漏洞CVE-2026-65694

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

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接