kratex-security/kratex

GitHub: kratex-security/kratex

Kratex 通过在安装和运行时强制执行基于行为的策略,弥补传统静态扫描器无法拦截未知 npm 供应链攻击的零日缺口。

Stars: 1 | Forks: 0

Kratex Node.js 供应链在安装和运行时的强制执行机制。开源,Apache 2.0。 ``` npm i -g @kratex/cli ``` 要求 Node.js 18.17+。策略是您仓库中的一个本地 JSON 文件。 ![Kratex 安装时拦截了读取 ~/.npmrc 并试图将其外泄的依赖](https://static.pigsec.cn/wp-content/uploads/repos/cas/ca/ca3be563ec39631a6e25c855f8690e64e8c606f6df1383ef852aefa66b9e3b75.gif) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/kratex-security/kratex/actions/workflows/ci.yml) [![npm](https://img.shields.io/npm/v/@kratex/cli)](https://www.npmjs.com/package/@kratex/cli) [![License](https://raw.githubusercontent.com/kratex-security/kratex/main/assets/badge-license.svg)](LICENSE) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/kratex-security/kratex/badge)](https://scorecard.dev/viewer/?uri=github.com/kratex-security/kratex) [![Socket Badge](https://badge.socket.dev/npm/package/@kratex/cli)](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, 依赖管理, 安全策略, 提示词设计, 文档结构分析, 暗色界面, 网络信息收集, 自动化攻击, 防御工具