你正在大声对Claude Code说:“添加Stripe checkout,连接数据库,发布它。”三分钟后,应用运行起来了,而你一份文件都没打开。
正是这种速度让人们喜爱vibe coding。这也是vibe coding安全风险开始的地方。当你在说话时,AI选择了软件包,将密码写入文件,并构建了Docker镜像。你 在未阅读的情况下同意了所有内容.
AI 依据您的权限工作,且无人检查其工作
当您使用 AI 编码工具时,它会以您的身份运行命令。它可以安装软件包、读取您的文件、编辑您的配置并使用您的云登录。普通代码在发布前会经过审核。Vibe-coded 代码通常跳过这一步,因为应用程序运行正常且没有异常。
有些人甚至会移除最后一道安全防线。Claude Code 有一个标志可以跳过所有权限提示:
# 跳过所有权限提示。代理选择的每个命令现在都会运行。
claude --dangerously-skip-permissions
在一次性沙箱中,这没问题。在充满令牌和密钥的工作笔记本上,这是真正的风险。
假冒软件包,以及通过真实软件包传播的蠕虫
AI 助手有时会建议不存在的软件包。攻击者会监视这些虚构的名称,注册它们,然后等待有人运行安装。这种行为称为 slopsquatting。以下是一个乍看之下没问题的依赖列表:
{
"name": "my-saas-app",
"dependencies": {
"express": "^4.19.2",
"stripe": "^16.0.0",
"react-auth-helper-pro": "^1.0.3"
},
"scripts": {
"postinstall": "node scripts/setup.js"
}
}
你知道前两个。第三个听起来合理,但你的团队没人选它。postinstall 行会在你安装时自动运行,使用你的权限。在接受新软件包之前,打开其页面,检查发布时间、下载人数以及是否链接到真实的仓库。上周出现且下载量很少的软件包值得再次关注。
现在添加这个蠕虫。2025年9月,一个名为Shai-Hulud的蠕虫通过npm传播。它在安装软件包时运行,从开发者的机器窃取令牌和云密钥,并使用这些令牌发布受感染的受害者自有软件包版本。所有安装这些软件包的人都遭受了同样的待遇。
vibe编码的笔记本电脑是此类攻击的容易目标。令牌存放在明文文件中,用户拥有本地管理员权限,安装程序未经审查即获批准。
机密最终出现在您的代码中
当你让助手“连接到 Stripe 和 Postgres”时,你经常会得到这样的回答:
// config.js
export const config = {
stripeKey: "sk_live_EXAMPLE_do_not_use",
databaseUrl: "postgres://admin:Summer2024!@prod-db.example.com:5432/app",
jwtSecret: "supersecret"
};
它能正常工作,所以你继续。然后是第一次提交:
$ git add .
$ git commit -m "initial commit"
# No .gitignore, so .env went along too
Git 会记住所有内容。如果密钥出现在提交中,后来你删除了文件,它仍然存在于历史记录中。机器人会不断扫描公共仓库中的密钥,因此泄露的密钥可能在你发现之前就已被使用。如果你已经推送了密钥,请将其视为被盗并进行轮换。将密钥粘贴到提示符时也会泄露,因为它们会出现在代理的上下文和日志中。
被盗的秘密是上述蠕虫运行的动力。泄露文件中的令牌是以您的名义发布软件包的一种方式。如果您不确定公司中敏感数据的位置,sensitive data discovery是一个不错的起点。
构建正常但仍然泄漏的Docker文件
请求一个Dockerfile,你会得到一个可以构建的文件。对大多数人来说,这就是唯一的测试。
FROM node:latest
WORKDIR /app
COPY . .
ENV STRIPE_KEY=sk_live_EXAMPLE_do_not_use
RUN npm install
EXPOSE 3000 9229
CMD ["node", "server.js"]
这七行中存在五个问题。latest标签会无预警更改,因此明天的构建可能与今天不同。COPY . . 会将你的.env文件和.git文件夹拉入镜像。ENV行将秘密写入镜像层,任何能拉取镜像的人都能读取。容器以root身份运行。端口9229向网络开放Node.js调试器。
这是一个您可以放心发布的版本:
FROM node:20.17-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --ignore-scripts
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
添加包含 .env、.git 和 node_modules 的 .dockerignore 文件,并在容器启动时从 vault 或密钥管理器传递 Stripe 密钥。
vibe coding 威胁模型通俗解释
每个vibe编码项目中有三件事同时存在:代理拥有您的权限,没有人审查代码,也没人检查依赖项。每一项单独看都是小风险。它们并排连锁。一个泄露的令牌变成以您名义发布的软件包,该软件包成为蠕虫的下一站。安全人员称之为威胁模型。您可以将其视为某人可能入侵的方式及其入侵后能达到的范围的列表。
您今天可以设置的Vibe编码护栏
你可以保持编程氛围。添加一些不依赖于任何人阅读每一行的检查。
Problem | What to do | Example |
|---|---|---|
|
Unchecked packages |
Read every new dependency before installing, commit your lockfile, and turn off install scripts by default |
|
|
Secrets in code |
Keep secrets in a vault, load them at startup, and ignore .env before the first commit |
|
|
Risky Docker files |
Pin the image version, run as a non-root user, and exclude .env and .git |
|
|
Too many permissions |
Work as a standard user and keep permission prompts on |
Skip |
|
Changes nobody approved |
Watch files and configs after deploy and flag anything unexpected |
File integrity monitoring |
您也可以为代理设置固定规则。Claude Code 会读取您项目中的 CLAUDE.md 文件,因此请将您的防护措施放在那里:
# CLAUDE.md
- Never put secrets, keys, or passwords in code. Read them from environment variables.
- Ask me before adding any new dependency, and tell me why it's needed.
- Never use the latest tag for Docker base images. Run containers as a non-root user.
代理仍可能出错,因此请继续检查差异。规则只是减少你需要发现问题的频率。
Netwrix 的帮助方式
Netwrix Password Secure 为您的凭据提供了一个不在config.js中的存放位置。它是一个加密保险库,具有基于角色的访问权限和完整的密码使用记录,应用程序可以通过SDK在运行时提取凭据。
Netwrix Change Tracker通过文件完整性监控监视容器、服务器和端点,并将每次更改与批准的内容进行比较。例如,某个软件包在凌晨2点编辑系统文件,或容器偏离其基线。Change Tracker 会标记此情况,您的团队当天即可看到。
观看 Netwrix Change Tracker 实时演示。
了解更多Vibe编码安全常见问题
分享到
了解更多
关于作者
Dan Piazza
产品管理经理
Dan Piazza 是 Netwrix 的产品管理经理,负责多种 Endpoint、DSPM 和 Directory 产品。他自 2013 年起从事技术岗位工作,热衷于网络安全、数据保护、自动化和代码。在担任现职之前,他在一家数据存储软件公司担任产品经理和系统工程师,管理并落地了软件与硬件的 B2B 解决方案。