hafizhpratama/stryx
GitHub: hafizhpratama/stryx
面向 JavaScript/TypeScript 后端的跨文件污点流安全扫描器,基于 Rust+oxc 引擎实现确定性分析,可检测注入类漏洞、敏感信息泄露及不安全的 LLM prompt 等问题。
Stars: 1 | Forks: 0
# Stryx
Stryx 是一个针对 JavaScript 和 TypeScript 后端的感知技术栈的安全扫描器。
它能检测你的 runtime、framework、database、validation、auth 以及 LLM SDK 的使用面,
随后追踪跨文件的数据流,以捕获缺失的输入验证、泄露的密钥、弱身份验证、
不安全的重定向、SSRF、SQL 注入、命令注入、路径遍历以及不安全的 LLM prompt
处理。
[](LICENSE)
[](https://github.com/hafizhpratama/stryx/releases/latest)
[](https://github.com/hafizhpratama/stryx/actions/workflows/ci.yml)
## 为什么选择 Stryx
现代的 JavaScript 和 TypeScript 后端由许多移动部件组装而成:runtime、router、
ORM、validator、auth 库、部署目标以及 LLM SDK。真正的风险极少存在于孤立的单行代码中。
它通常是一个跨越多个文件的流程:请求数据进入一个 route,
穿过一个 helper,最终到达 database、shell、filesystem、
redirect、外部 fetch、response body 或 LLM 调用,而沿途没有任何正确的
安全边界。
最难捕获的模式是跨越多个文件的流程——例如 `app/api/.../route.ts` 中的
route handler 直接将 `req.json()`
传入 helper 模块的 database 写入操作,而整条路径上
完全没有 validator。单文件 linter 无法看到这种脱节。
代码审查者可能会漏掉它。测试也很少覆盖恶意 payload 的情况。
Stryx 正是专为这些跨文件的后端流程而构建的。其
引擎能在几毫秒内运行完毕(基于 Rust + oxc),在 AST 和项目索引阶段产生确定性的分析结果,
并且仅将极少数真正模糊的区域升级到带有缓存的 LLM 检查中。
## 安装说明
从源码安装——目前可用:
```
git clone https://github.com/hafizhpratama/stryx
cd stryx
cargo install --path crates/stryx_cli
```
预编译二进制文件——附带于
[最新的 GitHub Release](https://github.com/hafizhpratama/stryx/releases/latest)
中,覆盖五个目标平台(Linux x64/arm64,macOS x64/arm64,Windows x64)。
npm —— `npm install @hafizhpratama/stryx` 或
`npx @hafizhpratama/stryx@latest
`(从 v0.4.1 开始支持直接使用路径的形式;
依然支持 `npx @hafizhpratama/stryx scan ./src`)。
Cargo(`cargo install stryx-cli`)将在该 crate 发布到
crates.io 后提供。
## 首次扫描
```
cd your-typescript-project
stryx scan
```
你将得到如下结果:
```
✗ flow: app/api/users/route.ts → lib/users.ts:4:3
[high] flow/unvalidated-body-to-db
Untrusted body reaches db.user.create unsanitized; flow crosses 2 files.
→ Validate the body with zod/valibot/yup at the entry handler before
passing it to lib/users.ts:createUser
Read more: https://stryx.dev/rules/flow-unvalidated-body-to-db
```
当输出达到或超过配置的严重性阈值的结果时,CLI 将以非零状态码退出,
因此它可以作为 CI 的把关机制。
规则页面是修复指南,而不是含糊的最佳实践页面。每份规则文档
都明确说明了需要修改的内容以及 Stryx 如何确认其已被修复。
## Stryx 能捕获什么
目前在规则库中共有 11 条规则 —— 包含 3 条稳定的跨文件数据流规则、4 条
额外的跨文件安全流规则、3 条实验性的单文件流
规则,以及 1 条单文件通用规则。
请参阅 [`docs/rules/`](docs/rules/) 获取完整的契约。
**稳定版 (v0.1):**
- **`flow/unvalidated-body-to-db`** —— 请求数据体在流向 database
写入时,沿途即使跨越了文件,也缺少 zod、valibot、ajv、joi 或 yup。
- **`flow/auth-bypass-via-wrapper`** —— route handler 被项目本地模块的
`withAuth(...)`(或类似函数)包裹,但其
实现实际上并未验证 session。
- **`flow/secret-to-response`** —— `process.env.X` 的值(或
硬编码的凭据形状字符串)未经脱敏处理就流向了 response body。
- **`generic/hardcoded-secret`** —— 内联在
源码中的凭据形状字符串。
**实验性 (跨文件, v0.2):**
- **`flow/ssrf-via-fetch`** —— 数据体污点作为 URL 流向 `fetch` /
`axios.` / `got`,包含 route → helper → sink
链,识别 URL-allow-list 守卫。
- **`flow/redirect-open`** —— 与 SSRF 相同,但针对的是 redirect sink
(`NextResponse.redirect`、`next/navigation` `redirect`、
`res.redirect`、`Response.redirect`)。
**实验性 (单文件, v0.2):**
- **`flow/path-traversal`** —— 数据体污点作为路径参数流向 `fs.` /
`fsPromises.`。
- **`flow/prompt-injection`** —— 数据体污点流向 LLM 调用的
prompt 内容(`openai.chat.completions.create`、
`openai.responses.create`、`anthropic.messages.create`)。
- **`flow/xss-via-dangerously-set-inner-html`** —— 数据体污点在没有
DOMPurify / sanitize-html 包裹的情况下,流向了 React 的
`dangerouslySetInnerHTML={{ __html: ... }}` JSX 属性。
- **`flow/sql-injection`** —— 数据体污点流向 raw-SQL 逃生舱(Prisma
`$queryRawUnsafe` / `$executeRawUnsafe`,Drizzle
`sql.raw`,node-postgres / mysql2 `.query`)。严重级别。
- **`flow/command-injection-via-exec`** —— 数据体污点流向
Node.js `child_process` 的 `exec` / `execSync` / `execFile` /
`execFileSync` / `spawn` / `spawnSync`。严重级别。
## Stryx 的工作原理
```
JavaScript / TypeScript source
↓
Project profile: runtime / framework / data / auth / LLM evidence
↓
Layer 1: oxc parser → arena AST (per file, parallel)
↓
Layer 2: project semantic index + stack adapters + AST rules + taint engine
↓
Layer 3 (optional): LLM escalation on flagged uncertain zones, cached
↓
Findings (JSON, SARIF, GitHub annotations, human text)
```
大多数问题会被确定性的 Rust 分析(Layer 2)瞬间捕获。
真正模糊的区域——例如,位于 source 和 sink 之间且引擎无法静态
判断其意图的自定义 helper——将会升级到 Layer 3 LLM,并配以
聚焦的、针对特定规则的 prompt。判定结果将通过内容哈希进行缓存,
因此重复扫描未更改的代码是零成本的。
Layer 3 是可选的:带上你自己的 LLM API key 来启用它,或者使用
`--no-llm` 运行以进行完全本地的确定性扫描(默认方式)。
[架构深度解析 →](ARCHITECTURE.md)
下一个产品方向是感知技术栈的扫描:Stryx 检测
TypeScript 的后端/平台技术栈(例如 Bun + Hono + Drizzle +
Zod + Better Auth),启用匹配的 adapter,并保持规则
通用性。请参阅 [ADR 0013](docs/decisions/0013-stack-aware-project-profiles.md)
和 [感知技术栈的路线图](docs/roadmap/stack-aware-scanning.md)。
## 状态
**v0.5.0 —— 跨文件数据流 + 精度校准 + 2 条新的 auth 规则 + DX shell。**
针对 v0.4.0 的三条规则(eval / nosql /
insecure-deserialize)引入了跨文件数据流,发布了两条新的、范围更窄的 auth-secret 规则
(`auth/jwt-hardcoded-secret`、`auth/session-hardcoded-secret`),并且多轮
真实世界精度测试通过了在 OSS BE 代码库中观察到的主要误报 (FP) 类型——
payload 27 → 0 个 hardcoded-secret 误报,formbricks 3+5 → 0,fastify/bullmq/typeorm 正确保持静默。新的
生态系统集成:一个官方的 [GitHub Action](docs/integrations/github-action.md)
,带有持久的 PR 评论 + annotations,以及一个 `stryx install`
子命令,它可以为 Claude Code、Cursor、Codex、OpenCode 以及 AGENTS.md 规范编写针对各个 Agent 的后端安全规则文件。
包含每个结果验证状态的内部测试评分卡维护在
[`docs/calibration/index.html`](docs/calibration/index.html)。
请参阅 [CHANGELOG](CHANGELOG.md#050--2026-05-22) 获取完整的
功能列表。
**v0.4.0 —— adapter 底层架构 + DX shell + 内部测试闭环规则。**
来自 v0.3.0 的 `ProjectProfile` 现在驱动着 22 个已注册的 stack
adapter,它们为规则提供 source、sink、sanitiser、guard 和
propagator 模式。规则库从 11 条增长到 14 条——包含三个新的类别(eval / NoSQL / deserialize)以及通过对 OWASP NodeGoat、DVNA、Documenso 和官方
Prisma 示例进行内部测试而发现的、现有规则上更广泛的 sink/source 覆盖。CLI 增加了默认的扫描子命令、带有代表性位置的分组输出、带有
严重性上限的 0–100 Stryx Score、用于仅在 PR 中运行 CI 的 `--diff `,以及通过
`stryx.toml` 实现的逐规则 surface 路由。请参阅 [CHANGELOG](CHANGELOG.md#040--2026-05-21)
获取完整的功能列表。
- ✅ 架构、ADR、规则规范
- ✅ 基础 crate `stryx_index` 和 `stryx_taint`
- ✅ 跨文件规则:
- `flow/unvalidated-body-to-db`
- `flow/auth-bypass-via-wrapper`
- `flow/secret-to-response`
- `flow/ssrf-via-fetch` (v0.4.0 中添加了 needle/request/superagent/http(s)
支持)
- `flow/redirect-open`
- `flow/sql-injection` (严重级别; Prisma `$queryRawUnsafe` /
Drizzle `sql.raw` / node-postgres 原始查询 / Sequelize
`db.sequelize.query` 在 v0.4.0 中添加)
- `flow/command-injection-via-exec` (严重级别; Node.js
`child_process` exec / spawn / execFile)
- ✅ 单文件规则:
- `flow/path-traversal`
- `flow/prompt-injection` (OpenAI + Anthropic)
- `flow/xss-via-dangerously-set-inner-html` (DOMPurify +
sanitize-html sanitisers)
- `flow/eval-injection` —— v0.4.0 中新增 (严重级别; eval /
Function / setTimeout-with-string)
- `flow/nosql-injection` —— v0.4.0 中新增 (高危险级别; MongoDB
operator-injection 形状)
- `flow/insecure-deserialize` —— v0.4.0 中新增 (严重级别;
node-serialize, yaml.load unsafe, vm.runInX)
- ✅ 通用规则: `generic/hardcoded-secret` (从 v0.4.0 开始支持 provider-prefix
严重模式 + credential-named-binding 高危模式;
从 v0.5.0 开始支持 Shannon-entropy + identifier-shape 门控 + i18n / translations /
locales 路径过滤)
- ✅ Auth-secret 规则 (v0.5.0 中新增):
- `auth/jwt-hardcoded-secret` —— 严重级别;
`jwt.sign(_, "literal")` / `jwt.verify(_, "literal")` /
`expressJwt({ secret: "literal" })`
- `auth/session-hardcoded-secret` —— 严重级别;
`session({ secret: "literal" })` /
`cookieSession({ secret: "literal" })` /
`cookieSession({ keys: ["literal", ...] })`
- ✅ `ProjectProfile` 低成本通过检测 (v0.3.0)
- ✅ 将 22 个 stack adapter 接入规则 (v0.4.0)
- ✅ 为每个模板的 profile 证据遍历 Monorepo workspaces
(v0.4.0)
- ✅ Stryx Score (0–100, 带有严重性上限), `[surfaces]` 逐规则
路由, `--diff ` 仅 PR 模式 (v0.4.0)
- ✅ 将 App Router 的 `searchParams.X` 识别为数据体 source
- ✅ CLI 二进制文件 (`cargo install --path crates/stryx_cli`)
- ✅ 在 [GitHub Releases](https://github.com/hafizhpratama/stryx/releases) 上提供预编译二进制文件
- ✅ npm 分发 (`@hafizhpratama/stryx`)
- ✅ 带有持久的 PR 评论 + annotations 的 GitHub Action (v0.5.0)
- ✅ 针对 `flow/eval-injection` / `flow/nosql-injection`
/ `flow/insecure-deserialize` 的跨文件流 (v0.5.0)
- ✅ 用于 Claude Code / Cursor / Codex /
OpenCode / AGENTS.md 的 `stryx install` 子命令 (v0.5.0)
- 📋 P2 adapter 后续任务 (Elysia, mongoose, kysely, lucia,
vercel-ai-sdk 等),将根据用户需求推进
- 📋 类型感知分析,自定义污点配置 (未来计划)
## 文档
- [快速入门](docs/getting-started.md)
- [架构](ARCHITECTURE.md)
- [感知技术栈的 目标](docs/product/stack-aware-cli.md)
- [项目 profile 架构](docs/architecture/project-profile.md)
- [Stack adapter 架构](docs/architecture/stack-adapters.md)
- [Stack 目录](docs/stacks/)
- [感知技术栈的路线图](docs/roadmap/stack-aware-scanning.md)
- [规则库](docs/rules/)
- [常见问题解答](docs/faq.md)
- [词汇表](docs/glossary.md)
- [贡献指南](CONTRIBUTING.md)
- [安全政策](SECURITY.md)
- [Agent 指南](AGENTS.md)
## 许可证
[Apache 2.0](LICENSE)。宽松许可,暂无更改计划。
## 致谢
构建基础:
- [oxc](https://github.com/oxc-project/oxc) —— Rust 编写的 JS/TS parser。
- OWASP 和 CWE 目录 —— 模式描述与参考。
Stryx 与以上任何项目均无附属关系。标签:CISA项目, CMS安全, DOE合作, JavaScript, Rust, SAST, StruQ, TypeScript, 可视化界面, 安全插件, 数据可视化, 暗色界面, 盲注攻击, 网络流量审计, 通知系统, 静态应用安全测试