花 1500 美元让 LLM 黑自己的应用:一场真实漏洞挖掘实验

2026-06-04 27 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:10 分钟

安全研究员 Kasra 做了一件多数人只会想想的事——他掏出约 1500 美元,让多款主流大模型去攻击自己亲手写的应用,看它们能不能找到真正的安全漏洞。结果既让人意外,又让人清醒。

实验设计:不是做题,是实战

大多数 LLM 安全评测用的是人造题目:给模型一段有明显漏洞的代码,问它"这里有什么问题?"这就像把答案写在考卷旁边再问考生能不能看见。

Kasra 的做法完全不同。他构建了一个叫 BookNook 的书评应用,漏洞藏在 Firebase 配置里——不是 API 逻辑缺陷,而是部署层面的配置错误。这种漏洞在真实项目中极为常见:开发者为了方便调试,把安全规则设成全开放,上线后忘了收紧。

关键设计点:

  • 漏洞类型是配置错误而非代码缺陷——测试的是模型对真实运维场景的理解力
  • 模型需要自己发现漏洞,而不是被告知"去找某个问题"
  • 攻击路径涉及多步推理:发现配置问题 → 构造利用方式 → 执行攻击

这更像是一场渗透测试,而不是代码审计练习。

Firebase 配置错误:最常见的"隐形门"

Firebase 安全规则是这类实验的理想靶点。来看一个典型的错误配置和正确配置对比:

❌ 危险配置——BookNook 中的漏洞原型

// firestore.rules — 全开放,任何人可读写所有集合
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;  // ← 上线后忘了改
    }
  }
}

这段规则的意思是:任何人、任何条件下都可以读写整个数据库的所有文档。开发阶段为了方便测试这么写很常见,但一旦部署到生产环境,用户数据、评论、甚至管理员配置全部裸奔。

✅ 正确配置——按集合和角色收紧

// firestore.rules — 按集合细分,仅认证用户可写
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // 书评:认证用户可读,仅作者可修改自己的评论
    match /reviews/{reviewId} {
      allow read: if request.auth != null;
      allow create: if request.auth != null
                    && request.auth.uid == request.resource.data.authorUid;
      allow update, delete: if request.auth != null
                    && request.auth.uid == resource.data.authorUid;
    }

    // 用户配置:仅本人可读写
    match /users/{userId} {
      allow read, write: if request.auth != null
                    && request.auth.uid == userId;
    }

    // 其他集合:默认拒绝
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

部署前可以用 Firebase 本地模拟器验证规则:

# 安装模拟器并测试规则
firebase emulators:start --only firestore
# 运行规则测试脚本
firebase emulators:exec --only firestore "node test-rules.js"

BookNook 的漏洞正是第一种配置——模型能不能从应用行为和公开信息中推断出这一点,才是实验的核心问题。

LLM 的攻击表现:能推理,但不会"嗅探"

Kasra 让多款主流模型(具体型号在原文中有详细列表)对 BookNook 发起攻击,观察它们的策略和成功率。

几个值得注意的现象:

模型擅长已知模式的推理。 当模型接触到 Firebase 相关线索时,它能迅速联想到"安全规则可能全开放"这一常见错误,并构造出合理的利用路径——比如直接写入恶意评论、读取其他用户数据。这说明模型对常见漏洞模式的"知识储备"是扎实的。

模型不擅长主动侦察。 真实渗透测试的第一步是信息收集:端口扫描、目录遍历、配置文件探测。LLM 缺乏这种主动"嗅探"能力——它不会像人类黑客那样先跑一遍 nmap 或翻遍 /robots.txt/.env,再决定攻击方向。模型的推理是被动的,需要你把线索喂到它面前。

多步攻击链是薄弱环节。 从发现配置错误到完成数据窃取,中间可能需要 3-5 步操作(枚举集合名 → 构造请求 → 绕过前端校验 → 写入/读取数据)。模型在单步推理上表现不错,但在串联多步时容易丢失上下文或跳过关键步骤。

用 LLM 辅助安全测试:可复制的实践

虽然 LLM 还不能独立完成渗透测试,但作为辅助工具它已经很有价值。下面是一个可运行的 Python 脚本,用 OpenAI API 对自己的 Firebase 项目做规则审计:

"""
firebase_rule_auditor.py
用 LLM 审计 Firebase 安全规则,找出过度宽松的配置。

使用前:
1. pip install openai
2. export OPENAI_API_KEY="sk-..."
3. 把你的 firestore.rules 内容粘贴到 RULES 变量
"""

from openai import OpenAI

client = OpenAI()

# ← 替换为你自己的规则内容
RULES = """
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
"""

PROMPT = f"""你是一名 Firebase 安全审计员。分析以下 Firestore 安全规则,
找出所有过度宽松的配置,并给出修复建议。

规则内容:
{RULES}

请按以下格式输出:
1. 漏洞位置(具体 match 路径)
2. 风险等级(高/中/低)
3. 攻击场景描述
4. 修复后的规则片段
"""

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": PROMPT}],
    temperature=0.2,  # 低温度,减少幻觉
)

print(response.choices[0].message.content)

运行方式:

export OPENAI_API_KEY="sk-your-key-here"
python firebase_rule_auditor.py

这个脚本做的是静态规则审计——把配置喂给模型让它分析。这比让模型自己去"发现"配置问题要可靠得多,因为线索是你主动提供的。

更完整的用法是结合 Firebase CLI 导出当前规则再审计:

# 导出当前项目的 Firestore 规则
firebase firestore:rules > current_rules.txt
# 把文件内容填入脚本中的 RULES 变量,然后运行审计

开发者该怎么做

Kasra 的实验揭示了一个现实:LLM 对已知漏洞模式的识别能力已经相当强,但它还不是一个能独立完成渗透测试的"AI 黑客"。对于开发者来说,这意味着:

收紧配置是第一防线。 模型能找到的漏洞,人类黑客更容易找到。Firebase 安全规则、AWS IAM 策略、Nginx 配置——这些部署层面的设置应该在上线前逐条审查,而不是依赖事后检测。

用 LLM 做静态审计,而不是动态攻击。 把配置文件、安全规则、权限模型喂给 LLM 分析,效果远好于让模型自己去"探索"你的系统。前者是模型擅长的模式匹配,后者是它目前做不好的主动侦察。

建立部署前检查清单:

  • [ ] Firestore 安全规则是否包含 allow read/write: if true
  • [ ] IAM 策略是否使用了 *:* 通配权限
  • [ ] .env 文件是否暴露在公网可访问路径
  • [ ] API 端点是否有未鉴权的管理操作
  • [ ] CORS 配置是否允许任意 Origin
  • [ ] 上述检查是否纳入 CI/CD 流程自动化

1500 美元的实验告诉我们:LLM 已经能读懂你的配置错误,但它还不会自己敲门。等它学会嗅探的那天,全开放的 Firebase 规则就不再是"忘了改"的小问题,而是已经被利用的大事故。现在就收紧规则,比等模型进化要便宜得多。


相关推荐