Granola:一个简单的漏洞如何导致账号被接管并调用摄像头
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产品为了跑通工作流,往往在安全细节上打折扣。对于用户来说,定期检查应用的权限授予情况依然是最基础的自我保护手段。
事件追踪 · 相关报道
IT故障导致全美航班停飞:从AA这次宕机看大型系统高可用架构的脆弱性
8分钟前
苹果市值冲破5万亿美金,反倒是AI板块在集体回调
8分钟前
员工联名要求政府监管,这事儿在AI圈其实挺耐人寻味的。
53分钟前
HAWK-256 密钥恢复攻击
53分钟前
NoClick实操:用现有AI订阅快速搭建全天候自动化Agent
1小时前
Mazu:用AI气象大模型把预警能力推向全球南方
2小时前