前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9355
  • SDK包应为AI Coding Agent设计专用接口规范
  • 云GPU上的「吵闹邻居」:共享GPU性能波动根因分析
  • NVIDIA开源VoiceChat 11B:端到端语音对话,448ms打断响应
  • Harvey开源法律Agent评测基准LAB:真实法律任务+量化评分
  • Claude Code Agent 调试指南:读转录、追踪工具调用、定位错误
  • 使用 AI 生成代码不丢失代码库理解的实践策略
  • Docker Sandboxes:面向AI Agent的临时隔离沙箱
  • 使用AI而不被AI淘汰:desirable difficulties原则
  • 字节Seed发布全双工音视频大模型:看听说三位一体
  • Claude Code 5天后默认自动模式,费用由Anthropic承担
  • LLM与强化学习全栈指南:从RLHF到推理模型
  • Claude Code 自动执行模式 8 月 14 日起默认开启
  • Visual QA Agent:在 AI 生成的代码发布前捕获 UI 回归
  • 代码里三种永远不会失败的检查——以及它们为何危险
  • 实测有效的AI编程提示词:调试时间减半的工作流
  • AI写测试的真相:能加速脚手架,但会漏掉真实Bug
  • 企业级Claude Code最佳实践:后台分析而非全权委托
  • 50+ Skills实战总结:AI编程Agent技能设计的5条核心规则
  • 确定性AI:何时使用及其实践方法
  • Claude Code自动模式升级为默认模式
  • Claude -p命令意外读取项目CLAUDE.md的发现
  • MCP协议安全漏洞:工具服务器无权限隔离
  • AI Agent生产失败的真实原因:不是模型问题
  • 自反思 Agent 架构:研究任务自动循环补全
  • LLM 学习法:不是提问而是测验,HN 257 条评论验证有效
  • 实时网页数据喂给LLM Agent的实战方法
  • RAG评估实战:从黄金数据集到LLM-as-Judge
  • 用Claude Code把芯片制造变成模拟经营游戏
  • 我用免费API让AI代理直接查询产品数据库
  • 接入LLM API一年的3条血泪教训:token计量、多模型抽象与生产防护
  • 小鹏要求员工AI工具API日志保留两年、季度审计
  • 健身房预约系统 API 未鉴权,可任意取消他人订单
  • 2026 向量数据库选型指南:按规模决策
  • Node.js 文档机器人的检索架构:混合搜索 + Rerank + Evidence Gate
  • RTS游戏AI新思路:用优先级列表替代寻路算法
  • OpenAI Agent突破测试环境:安全边界值得警惕
  • 双 AI 终端交叉验证调试法
  • 3B参数端侧VLX模型:超越英伟达谷歌,实现精准物理世界感知
  • Claude 共享对话被谷歌搜索收录
  • Vercel开源安全审查工具deepsec支持一键启动
  • Meta开源Muse Glimmer:本地运行、多模态、Agent化
  • 放弃向量数据库:用Git+Markdown做AI记忆存储
  • AI Agent落地失败根因: prompt知识冻结问题
  • Agent Trust Card 规范 ATC/1.0 发布:让 Agent 身份验证有据可查
  • Anthropic Fable/Mythos 5曾因出口管制被暂停,后已恢复
  • AI Agent本质是分布式系统:生产级架构与数学原理
  • AI Agent开发陷阱:单步85%可靠率下端到端仅27%
  • OpenAI取消免费版文字对话限制,推GPT-5.6 Luna
  • AI 编程 Agent 真正需要的是结构化上下文,而非像素上下文
  • 零依赖浏览器扩展:一键向 Claude/Cursor 发送网页结构化上下文
  • Agent Skill 安全威胁模型与防御框架:description 注入攻击实测
  • 已加载 51 / 9355
8.0
热点
AI SCORE
编程提效2026-08-10 11:38

Claude -p命令意外读取项目CLAUDE.md的发现

dev.to · AI#Claude#安全#工程实践
Editor brief · 编辑速览

作者在使用claude -p生成commit信息时发现AI会读取项目CLAUDE.md中的指令,揭示了AI编程工具的隐式上下文注入风险。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

我的 git_commit.py 只有 20 行脚本,读取 git diff --staged 然后调用 claude -p 生成符合 Conventional Commits 规范的提交信息。这是一个再窄不过的 LLM 调用场景:输入一个 diff,输出一行内容。不涉及文件探索、没有工具调用、不需要知道项目上下文。

raw = subprocess.check_output(
    ["claude", "-p", SYSTEM + "\n\n" + diff],
    text=True,
    timeout=20,
    stderr=subprocess.PIPE,
).strip()

我之所以深究下去,是因为有次我在检查仓库的 CLAUDE.md(原本是去看别的东西),注意到文件开头有一段叫做 "MANDATORY routing rules" 的内容——规定 shell 输出要经过沙箱工具、阻止 curl、读取网页前先建立索引之类的规则。这些跟一个"输入 diff、输出提交信息"的脚本八竿子打不着。所以我以为:无所谓,git_commit.py 调用 claude -p 时带的是完全自包含的 system prompt 和 diff 字符串,凭什么要去加载项目指令文件?

我没有想当然,而是实际验证了一下。从仓库根目录执行和 git_commit.py 同样形式的调用,只是问模型是否看到了那些规则:

$ claude -p "Reply with exactly one line: either 'YES-SAW-CTX-RULES' if your \
context includes instructions mentioning ctx_fetch_and_index or context-mode \
MANDATORY routing rules, or 'NO-CTX-RULES' if it does not. Nothing else."
YES-SAW-CTX-RULES

它加载了。一次裸的 claude -p 调用(没有任何 flag)和交互式会话一样,会自动从当前目录发现并加载 CLAUDE.md,不管你的 prompt 和项目有没有关系。git_commit.py 没有给 subprocess.check_output 传 cwd,所以它继承了调用者的当前目录——而这个脚本本来就是在仓库内部运行的,cwd 恰好就是仓库根目录。

那个 CLAUDE.md 文件是 4404 字节、79 行。大约一千个 token 的路由规则、输出格式约束,还有一个项目记忆系统协议块,这些东西对这个"一次性的 diff → 提交信息"任务来说一点用都没有。倒不是说结果错了——返回的提交信息本身没问题——只是每次调用都要平白多付这笔开销,而且任务根本用不上那些内容。

真正让我担心的不只是 token 成本,而是耦合。git_commit.py 的行为表面上完全由文件顶部硬编码的 SYSTEM 字符串定义:

SYSTEM = (
    "You are a git commit message generator. "
    "Output ONLY the commit message — one line, no explanation, no markdown, no quotes, "
    ...
)

但实际上并非如此。无论何时,只要当前工作目录碰巧有 CLAUDE.md,它就会不声不响地跟着一起加载进来,而且同样能轻易改变输出结果。如果将来有人修改了项目的 CLAUDE.md,加上"提交信息一律用 Title Case"或者"主题行偏好句子式表达",git_commit.py 就会开始这样做——代码没改、prompt 没改,但因为从哪个目录运行脚本,结果就不一样了。

于是我去找解决方案。claude --help 文档里恰好记录了这种场景:

--bare    Minimal mode: skip hooks, LSP, plugin sync, attribution,
          auto-memory, background prefetches, keychain reads, and
          CLAUDE.md auto-discovery. Sets CLAUDE_CODE_SIMPLE=1. Anthropic
          auth is strictly ANTHROPIC_API_KEY or apiKeyHelper via
          --settings (OAuth and keychain are never read).

但第二句话是陷阱。这个项目的 key_facts.md 里明确说了:"没有 ANTHROPIC_API_KEY——Claude 调用走的是 claude -p 子进程(OAuth 会话)。" --bare 明确拒绝读取 OAuth 会话,只接受 API key。用 --bare 来解决上下文加载问题,反而会破坏脚本实际依赖的认证方式——文档看起来对,实际上跑起来就挂。

真正我要的那个 flag 是 --safe-mode:

--safe-mode   Start with all customizations (CLAUDE.md, skills, plugins,
              hooks, MCP servers, custom commands and agents, output
              styles, workflows, custom themes, keybindings, and more)
              disabled ... Auth, model selection, built-in tools, and
              permissions work normally.

关键是"Auth ... works normally"这句——它禁用了 CLAUDE.md 发现机制,但不影响进程的认证方式。用同样的方式验证了一下:

$ claude -p --safe-mode "Reply with exactly one line: either 'YES-SAW-CTX-RULES' ... or 'NO-CTX-RULES' ..."
NO-CTX-RULES

这就是我最终采用的修复方案,在仓库里两处做同样调用的地方都改了——git_commit.py 的 subprocess 调用,以及 server.py 里为 generate_commit_message MCP 工具服务的 _claude() 辅助函数:

raw = subprocess.check_output(
    ["claude", "-p", "--safe-mode", SYSTEM + "\n\n" + diff],
    text=True,
    timeout=20,
    stderr=subprocess.PIPE,
).strip()

得到的教训不是"到处加 --safe-mode"。而是:headless CLI 调用会像 shell 继承环境变量一样悄无声息地继承所在目录的上下文——默认行为,作用域就是调用时所在的目录。解决这个问题用的 flag 往往不是名字听起来最像答案的那一个。--bare 看起来就是"停止自动加载项目文件"的正确答案,对于用 API key 认证的场景也确实是对的。但对于通过 OAuth 认证的设置,它是列表里唯一一个会悄悄破坏你本来要修的东西的 flag。我能发现这一点,唯一的原因是我两个 flag 都试了、实际运行了并检查了结果,而不是看了 flag 名字就以为没问题。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
Claude Code自动模式升级为默认模式
下一篇
MCP协议安全漏洞:工具服务器无权限隔离