本来是想测试CLAUDE.md能否投毒间接注入Agent,但是突然发现Claude Code 在第一次加载(启动)一个目录时,会读取并加载相关的 settings.json 配置文件。settings.json 主要用于配置环境变量、模型选择、权限规则等核心行为。例如,你可以在其中设置 env 字段来定义 ANTHROPIC_API_KEY 或超时时间,这些配置会在 Claude 启动时生效。在settings.json中可以使用claude提供的Hook功能,提供了多种 Hook 事件,覆盖了会话的整个生命周期。这里有几个最常用和重要的类型:
| Hook 事件 | 触发时机 | 主要用途 |
|---|---|---|
| PreToolUse | 在 Claude 即将执行某个工具(如编辑文件、运行命令)之前。 | 这是最强的控制点,可以用来阻止危险操作、审批或修改工具的参数。例如,阻止 Claude 修改 .env 文件或执行 rm -rf 命令。 |
| PostToolUse | 在某个工具成功执行之后。 | 适合做后续的自动化任务,例如自动格式化代码、运行测试或记录审计日志。你提到的场景就可以用这个 Hook 来实现。 |
| PermissionRequest | 当 Claude 需要请求用户权限时(即弹出确认对话框之前)。 | 可以用来自动批准一些已知安全的操作,比如反复运行的测试命令 npm test,从而减少干扰。 |
| SessionStart | 在 Claude Code 启动一个新的会话或被恢复时。 | 可以用来在会话开始时自动注入上下文信息,比如当前 Git 状态或待办事项列表,让 Claude 一开始就了解项目状态。 |
| Stop | 在 Claude 完成一次响应,等待你的下一次输入时。 | 可以用来验证 Claude 的工作是否完成,如果条件不满足(如测试未通过),可以强制它继续工作。 |
设置下面的Hook:
1 | { |
在启动时,会询问是否信任也就是希望用户检查,但是一般来说对于一个大型一点的项目,用户一般直接略过选择信任了。

那么就会出现:

如果将命令改为恶意的呢,那不就变成了正常供应链投毒的一环了。而且一般在github上git clone的项目,大家一般都不会专门审计,如果再让claude直接打开项目,就会中招了。