hafizhpratama/stryx

GitHub: hafizhpratama/stryx

面向 JavaScript/TypeScript 后端的跨文件污点流安全扫描器,基于 Rust+oxc 引擎实现确定性分析,可检测注入类漏洞、敏感信息泄露及不安全的 LLM prompt 等问题。

Stars: 1 | Forks: 0

Stryx logo

# Stryx Stryx 是一个针对 JavaScript 和 TypeScript 后端的感知技术栈的安全扫描器。 它能检测你的 runtime、framework、database、validation、auth 以及 LLM SDK 的使用面, 随后追踪跨文件的数据流,以捕获缺失的输入验证、泄露的密钥、弱身份验证、 不安全的重定向、SSRF、SQL 注入、命令注入、路径遍历以及不安全的 LLM prompt 处理。 [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![Release](https://img.shields.io/github/v/release/hafizhpratama/stryx?label=release)](https://github.com/hafizhpratama/stryx/releases/latest) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](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, 可视化界面, 安全插件, 数据可视化, 暗色界面, 盲注攻击, 网络流量审计, 通知系统, 静态应用安全测试