kratex-security/kratex
GitHub: kratex-security/kratex
Kratex 通过在安装和运行时强制执行基于行为的策略,弥补传统静态扫描器无法拦截未知 npm 供应链攻击的零日缺口。
Stars: 1 | Forks: 0
Node.js 供应链在安装和运行时的强制执行机制。开源,Apache 2.0。
```
npm i -g @kratex/cli
```
要求 Node.js 18.17+。策略是您仓库中的一个本地 JSON 文件。

[](https://github.com/kratex-security/kratex/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/@kratex/cli)
[](LICENSE)
[](https://scorecard.dev/viewer/?uri=github.com/kratex-security/kratex)
[](https://badge.socket.dev/npm/package/@kratex/cli)
## 每次执行 `npm install` 都会运行您未曾编写的代码
一次安装就会引入数十到数百个传递依赖,而在您 `import` 任何一行代码之前,它们中的任何一个都可能在您的机器上执行代码。最明显的入口点是生命周期脚本(`preinstall`、`install`、`postinstall`),但关闭它们并不能彻底关门:
- **仅凭一个 `binding.gyp` 文件就够了。** 一个仅包含 `binding.gyp` 且_没有_安装脚本的 package,在安装时依然会运行 `node-gyp rebuild`,并且 gyp 的 `` 会在相同的完整生命周期保护下获取并运行一次性 package:对其脚本进行安装阶段的拦截,并对其 bin 进行运行时防护。它绝不会拒绝运行命令;它只是限制了该 package 能做什么。
当 Kratex 拦截操作时,它会向您展示被阻止的内容:负责的 package、操作及其目标、严重程度以及触发的规则。外泄拦截还会指出引发该拦截的敏感读取操作,并且每次拦截都会为误报情况打印出可直接粘贴的允许(allow)规则。在审计模式下不会阻止任何操作,但依然会报告相同的事件,因此您可以在开启强制执行之前了解它会拦截哪些行为。
```
block
sketchy-loader fs:read ~/.npmrc {credentials} [kratex.builtin.third-party-credential-read]
block sketchy-loader network:connect 45.91.92.10:443 {secrets} [kratex.builtin.third-party-exposed-outflow-network]
blocked because: sketchy-loader previously read ~/.env (secrets)
```
## 内置针对可疑行为的防御
这些规则并非已知恶意 package 的黑名单。它们会监控供应链攻击必须执行的动作,并在 package 尝试攻击的那一刻将其阻止,无论以前是否有人见过该 package。在不存在配置文件的情况下,Kratex 默认会对第三方代码强制执行其中的六条规则,每一条规则都涵盖了自 2018 年以来真实发生的一类 npm 攻击事件,同时允许其他所有操作:
- **凭证读取:** `~/.npmrc`、AWS、SSH、浏览器配置文件目录。
- **生命周期网络:** 来自 `preinstall`/`install`/`postinstall` 的外部调用。
- **生命周期子进程逃逸:** 生命周期脚本生成的任何非 Node 进程。
- **钱包读取:** 加密货币钱包目录。
- **自我传播:** 写入另一个 package 的 `package.json`,或在生命周期脚本中执行 `npm publish`。
- **暴露外流:** 下文详述。
这些模式并非理论推演。Kratex 的测试套件会重放一系列真实且已公开披露的 npm 供应链攻击语料库(ua-parser-js、shai-hulud、Phantom Gyp 等),并断言内置规则能拦截所有这些攻击。参见 [`cli/test-e2e/registry/@kratex-corpus/`](cli/test-e2e/registry/@kratex-corpus/README.md)。
在您的项目根目录中放置一个 `kratex.policy.json`,即可收紧或放宽这些规则中的任何一项。
## 了解 package 接触过什么的外泄拦截机制
这就是静态扫描器在结构上根本无法做到的部分。
Kratex 会追踪**暴露状态**。当第三方 package 读取凭证或机密类数据(您的 `.env`、`~/.npmrc`、AWS 密钥)的那一刻,该 package 调用链中的每一帧都会被标记为_已暴露_。从那时起,其对外通道将被视为潜在的外泄路径,并且只要暴露状态持续,该 package 的**网络调用和进程创建**都会被拦截。
这种拦截是极其精准的。从未触碰机密的 package 可保留完全的网络和子进程访问权限。只有实际处理过敏感数据的 package 才会丧失向外发送任何内容的能力,因此它刚刚读取的凭证根本无法外泄,无论它是尝试通过 `fetch` 还是通过调用 `curl` 命令。
扫描器读取的只是清单文件。它无法看到_这个_依赖刚刚读取了您的 `.env`,_然后_又打开了一个 socket。Kratex 会在运行时,在单个 package 的执行过程中监控这种因果联系,并将其切断。
## 快速开始
```
kratex install # policy-gated npm install
kratex run node app.js # run any command under runtime enforcement
kratex run dev # shorthand for `kratex run npm run dev`
kratex npx some-tool --flag # fetch + run a package under full-lifecycle protection
```
有关策略参考,请参见 [`cli/README.md`](cli/README.md)。
## 组件
- [`@kratex/cli`](cli/):命令行工具,发布为 `@kratex/cli`。使用 `npm i -g @kratex/cli` 安装。
- [`@kratex/shared`](shared/):策略 schema、规则类型和标准化工具,已发布至 npm,可用作独立的策略 schema 库。
- `@kratex/runtime`([源码](runtime/)):进程内钩子,在构建时打包进 CLI。未单独发布。
## 贡献
请参见 [`CONTRIBUTING.md`](CONTRIBUTING.md)。
## 许可证
Apache License 2.0。请参见 [LICENSE](LICENSE)。 标签:DNS 反向解析, GNU通用公共许可证, Homebrew安装, IP 地址批量处理, MITM代理, Node.js, TLS, 依赖管理, 安全策略, 提示词设计, 文档结构分析, 暗色界面, 网络信息收集, 自动化攻击, 防御工具