Granola:一个简单的漏洞如何导致账号被接管并调用摄像头

PromptCube 专家 1小时前 143 浏览 6 点赞 约 2 分钟

1次点击就能接管账号并远程开启摄像头,这种漏洞在如今的AI应用里其实并不罕见,但出现在像Granola这种笔记工具上确实让人心惊。我仔细研究了这个漏洞的逻辑,说白了就是权限校验在某个关键环节掉链子了。

这种漏洞在实战中通常是由不安全的IDOR(不安全直接对象引用)或者Session管理不当引起的。攻击者只要拿到一个目标用户的标识符,通过构造一个特殊的请求,就能在不需要密码的情况下直接跳过认证流程,直接进入对方的后台。最离谱的是,由于Granola集成了多媒体录制功能,一旦账号被接管,攻击者可以通过API指令直接触发设备的硬件权限,从而在用户毫无察觉的情况下开启摄像头。

如果你也在开发类似的AI Agent或者大模型应用,建议在以下几个维度重点排查,避免踩坑:

  • 身份校验机制: 绝对不能信任前端传回的User ID,每一个涉及敏感操作的API请求必须在服务端重新验证Token的归属权。
  • 权限最小化原则: 摄像头、麦克风这种高敏感权限,应该在触发时有明确的UI提示,且不能由一个简单的API调用在后台静默开启。
  • Session生命周期: 检查Token是否在注销后依然有效,是否存在可以通过特定路径绕过登录页直接访问内部接口的情况。

这里分享一个简单的权限校验伪代码逻辑,大家可以对照自己的项目看看是否做到了:

// 错误示例:直接信任请求参数中的userId
async function getUserData(req, res) {
  const { userId } = req.query; 
  const data = await db.users.find({ id: userId });
  res.send(data);
}

// 改进示例:从加密的Session/JWT中提取身份
async function getUserData(req, res) {
  const authenticatedUser = req.user; // 从经过校验的JWT中获取
  const { userId } = req.query;
  
  if (authenticatedUser.id !== userId) {
    return res.status(403).send("权限不足");
  }
  
  const data = await db.users.find({ id: userId });
  res.send(data);
}

这种漏洞的修复其实很简单,但很多追求快速迭代的AI产品为了跑通工作流,往往在安全细节上打折扣。对于用户来说,定期检查应用的权限授予情况依然是最基础的自我保护手段。

行业动态AI新闻

全部回复 (3)

小阿伟的日常 初级 9小时前
文档里对数据脱敏的细节写得太笼统了,没看到具体的加密算法和密钥管理方案,这种Security Disclosure 只能算是个概览。
0 回复
小Ray在路上 中级 9小时前
我也遇到过类似的,检查下接口有没有做鉴权最稳妥。
0 回复
老阿凯 中级 9小时前
之前做项目就踩过这种坑,接口没写死权限真的太容易被绕过了。
0 回复

发表回复

支持 Markdown 格式