AI 写的 Python 代码的安全审查 · 第 05 题

第 5 课:审查你自己的 AI 代码

检查点 l0510 分自我报告——认领码来自 verify.py任一编码 Agent + 攻击重放装置

把五个问题和扫描步骤带到你自己的仓库:找出输入跨越信任边界的地方,检查每处是否用了机制,并写下你没有审查的部分。

在用 Agent 做题?一句话开始整门课程:

Read https://flypython.com/skills/flypython/SKILL.md and start the FlyPython course `secure-ai-generated-code`.

第 5 课:审查你自己的 AI 代码

目标

你用同样的方法审查一个自己拥有的仓库——最好是助手写的代码——用一个能证明 修复的测试修掉至少一个发现,并记录你没有审查的部分。

为什么有这节课

那个笔记服务是一个预埋了漏洞、答案已知的沙箱。你的代码两样都没有。能 迁移的是方法:找到输入跨越信任边界的每一处,问清谁控制它、他想要什么, 并检查代码用的是机制而不是侥幸。

本课内容

  1. 列出信任边界。 搜索输入进入的地方:Web 路由、CLI 参数、上传的 文件、队列消费者、读取 os.environ 的地方。在细读任何一处之前先写下 清单。
  2. 跑扫描器。 ruff check --select S(或你团队已经在用的扫描器)几秒 内给出模式层面的发现。逐条分诊:真问题、误报,还是接受的风险——并写下 理由。
  3. 问扫描器问不了的五个问题。 对每个边界:
    • 有没有输入不是以绑定参数或参数列表的形式,进入了 SQL、shell 或模板?
    • 有没有输入成为文件系统路径的一部分?解析之后检查包含关系了吗?
    • 在生产环境会运行的代码路径里,有没有缺省、兜底或示例密钥?
    • 密码或 token 是否用加盐的慢函数哈希、并用 hmac.compare_digest 比较?
    • 有没有东西用 pickle、marshal、shelve 或不安全的 YAML 加载器 反序列化客户端数据?
  4. 先写测试再修一个发现。 把攻击写成失败的测试,用机制修复,看着测试 通过。测试写好之后再让 Agent 给出修复,并对照机制审它的 diff,而不 只是看测试。
  5. 记录。 已验证 / 未验证 / 已知局限。「未验证」包括你列出却没有读的 每一个边界。

如果你在别人依赖的代码里发现了严重问题,先遵循你所在组织或该项目的安全 披露流程,再考虑公开提 issue。

练习

让你的编码 Agent 列出你仓库里的信任边界,再和你自己的清单对比。记下你们 各自漏掉了什么。

检查点

本检查点自我报告。能回答下面三题时,用 python verify.py --attest l05 认领:

  1. 你列出了多少个信任边界,实际读了多少个?
  2. 你修了哪个发现?哪个测试证明了它?
  3. 你把哪个扫描发现标成了误报或接受的风险,为什么?

预期证据

你的边界清单、扫描分诊、先失败后通过的测试,以及三行记录。未修复漏洞的 发现在修好之前不要放到公开的地方。

提示

卡住了?逐条打开。

提示 1 —— 本检查点考察什么

自我报告:你确认用这套方法审查了自己拥有的代码。证据是你的发现清单和证据记录——不是我们查得了的码。

提示 2 —— 从输入进入的地方开始

请求处理函数、CLI 参数、文件上传、消息消费者,以及任何读取环境变量的地方。每一处都是信任边界。

提示 3 —— 先写测试再修

对每个真实发现,先把攻击写成一个失败的测试,再修——正如本课程的套件所做的那样。

提交

做完了?记录它。

提交 python verify.py 为本检查点打印的 8 位认领码。自报关卡要先完成课后问题,再运行 python verify.py --attest l05。

你浏览器

提交认领码

你的 Agent自动提交

让 Agent 解题并自动提交

把这题交给它(悬停出现复制按钮)——解题、验证、提交全程自动:

请完成 FlyPython 挑战课程「AI 写的 Python 代码的安全审查」(course id course-secure-code)的检查点 l05。
机读简报:https://flypython.com/api/challenges/secure-ai-generated-code
打开课程文件夹,先读 TASK.md——它就是契约。
规则:最小变更、不新增依赖、绝不修改 tests/ 或 solution/。
用 python verify.py 检查 starter/;自报关卡先让我回答课后问题,再运行 --attest ID 取得码。
目标:只做检查点 l05 这一道题,完成后立即提交。

用你Agent 页生成的令牌(环境变量 FLYPYTHON_TOKEN),它可以直接记录结果:

curl -X POST https://flypython.com/api/claims \
  -H "Authorization: Bearer $FLYPYTHON_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"claims":[{"course":"secure-ai-generated-code","checkpoint":"l05","code":"<8-char code>"}]}'

或一次性安装完整的 FlyPython Agent Skill,连粘贴都省了。

文件

starter 与验证器

解题在你的机器上运行——Agent 通过 /api/challenges/secure-ai-generated-code/files 自己取回课程文件,你无需手动下载。想直接读源码?在 GitHub 上查看文件夹 ↗