Copenhagen0x/solana-security-standard
GitHub: Copenhagen0x/solana-security-standard
Solana安全标准,实时检测Solana代码漏洞。
Stars: 7 | Forks: 1
# Solana 安全标准

[](https://github.com/Copenhagen0x/solana-security-standard/actions/workflows/validate.yml)
[](LICENSE)
[](CHANGELOG.md)
[-orange)](https://jelleo.com/cycles)
在编码时,相同的 SOL-0XX 规则会标记 Solana 特定的漏洞——调用者控制的时钟值、跨市场状态不对称、偏离引擎逻辑的包装处理程序、缺失的 Anchor 约束,以及总共 **31 个漏洞类别**,这些类别来自真实的审计。
**适用范围:** Claude Code · Codex · Copilot · Cursor · Windsurf · Cline · Aider · 任何 MCP 客户端 · VS Code 扩展(Open VSX)· CLI · Semgrep · GitHub Actions。以下是你选择的表面。
## 在 Claude Code 中使用它(30 秒)
```
mkdir -p .claude && \
curl -sL https://raw.githubusercontent.com/Copenhagen0x/solana-security-standard/main/claude-security-guidance.md \
-o .claude/claude-security-guidance.md && \
curl -sL https://raw.githubusercontent.com/Copenhagen0x/solana-security-standard/main/security-patterns.yaml \
-o .claude/security-patterns.yaml
```
然后确保你已经安装了 Anthropic 的安全指导插件:
```
/plugin install security-guidance@claude-plugins-official
/reload-plugins
```
完成。在 Claude Code 中打开 Solana 程序文件,插件将在你编写时捕获问题。
*(这从 `main` 中提取,没有完整性检查。对于供应链敏感的使用,请参阅下方的 **验证安装**。)*
## 验证安装(固定 + 校验和)
对于 CI 或供应链敏感的设置,**固定到发布标签并验证下载**,而不是提取 `main`,与发布的 `CHECKSUMS.txt` 进行校验:
```
TAG=v1.10.0
BASE="https://raw.githubusercontent.com/Copenhagen0x/solana-security-standard/$TAG"
tmp=$(mktemp -d) && cd "$tmp" && mkdir -p semgrep
curl -fsSL "$BASE/CHECKSUMS.txt" -o CHECKSUMS.txt
curl -fsSL "$BASE/claude-security-guidance.md" -o claude-security-guidance.md
curl -fsSL "$BASE/security-patterns.yaml" -o security-patterns.yaml
curl -fsSL "$BASE/semgrep/solana-security-standard.yaml" -o semgrep/solana-security-standard.yaml
sha256sum -c CHECKSUMS.txt # Linux — all three must print "OK"; aborts on any mismatch
# macOS(无sha256sum):shasum -a 256 -c CHECKSUMS.txt
mkdir -p "$OLDPWD/.claude" && cp claude-security-guidance.md security-patterns.yaml "$OLDPWD/.claude/"
# 已验证的 semgrep 规则集位于 $tmp/semgrep/ — 将 `semgrep --config` 指向它或复制到所需位置
```
固定到标签会将你锁定到已知的发布版本(篡改的 `main` 无法到达你这里);校验和确认在传输过程中没有更改。(哈希值是 GitHub 提供的 LF 字节——验证下载的文件,而不是 CRLF 本地签出。)从 `v1.9.1` 开始的标签都是 SSH 签名的——使用 `git verify-tag v1.10.0` 验证来源(密钥 + 步骤在 [`SECURITY.md`](SECURITY.md)中)。*(校验和和存储库中的允许签名者无法防御完全账户妥协的情况,该妥协重写了两者——签名的标签,在带外验证,是该来源的原始校验。)*
## 在 CI 中运行它——GitHub Action
在标准上设置每个拉取请求。相同的 SOL-0XX 模式作为检查运行,并在差异上提供内联注释:
```
# .github/workflows/solana-security.yml
name: Solana Security Standard
on: [pull_request]
permissions:
contents: read
security-events: write # optional — enables inline PR annotations
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Copenhagen0x/solana-security-standard@v1
with:
paths: ./programs # what to scan (default: .)
# fail-on-findings: true # red X on findings (default)
# upload-sarif: true # GitHub code scanning (default)
```
然后向世界展示你采用了它——将此徽章放入你的 README:
```
[](https://github.com/Copenhagen0x/solana-security-standard)
```
[](https://github.com/Copenhagen0x/solana-security-standard)
## 从 CLI 运行它
```
npx @jelleo/solana-security-standard scan ./programs
```
人类、JSON 或 SARIF 输出;在发现问题时退出非零(因此它阻止了任何 CI)。零依赖。详细信息在 [`cli/`](cli/)。
## 在你的编辑器中运行它——VS Code / Cursor / Windsurf
[VS Code 扩展](extensions/vscode) 在你键入时将 SOL-0XX 发现显示为内联警告波浪线,在 Rust **和 TypeScript/JS** 文件中。与 CLI 相同的引擎,100% 本地(无遥测)。从 **[Open VSX](https://open-vsx.org/extension/jelleo/solana-security-standard)** 安装它——在 Cursor、Windsurf 和 VSCodium 中工作;在标准 VS Code 上,从 `extensions/vscode/`(extensions/vscode/)侧载 `.vsix`(Microsoft Marketplace 列表正在等待发布者验证)。详细信息在 [`extensions/vscode/`](extensions/vscode/)。
## 使用 Semgrep 运行它
已经有一个 Semgrep 管道?将其指向 [移植的规则集](semgrep):
```
semgrep --config https://raw.githubusercontent.com/Copenhagen0x/solana-security-standard/main/semgrep/solana-security-standard.yaml ./programs
```
与 `pattern-regex` 规则相同的 SOL-0XX 规则。详细信息在 [`semgrep/`](semgrep/)。
## 在你的 AI 编码代理中使用它——Codex · Copilot · Cursor · Windsurf · Cline · Aider
大多数 AI 编码工具读取规则/指令文件。[`integrations/`](integrations/) 为每个工具的本地格式提供 SOL-0XX 标准——所有都是从同一个源生成的——因此你的助手将根据规则编写和审查 Solana/Anchor 代码。为你的工具复制文件(完整矩阵在 [`integrations/README.md`](integrations/README.md)):
| 工具 | 复制到你的仓库 |
| --- | --- |
| Codex / 任何 `AGENTS.md` 代理 | `integrations/codex/AGENTS.md` |
| GitHub Copilot | `integrations/copilot/.github/copilot-instructions.md` |
| Cursor | `integrations/cursor/.cursor/` |
| Windsurf | `integrations/windsurf/.windsurf/` |
| Cline | `integrations/cline/.clinerules` |
| Aider | `integrations/aider/`(可选的扫描器 lint 命令)|
## 通过 MCP 使用它——任何 MCP 客户端
更喜欢 [模型上下文协议](mcp/)?[MCP 服务器](mcp/) 为任何 MCP 客户端(Cline、Copilot、Cursor、Claude、Windsurf)提供了一个 `scan_solana_code` 工具以及完整的规则集——无需复制文件:
```
{ "mcpServers": { "solana-security-standard": { "command": "npx", "args": ["-y", "@jelleo/solana-security-mcp"] } } }
```
100% 本地,与 CLI 相同的扫描器。详细信息在 [`mcp/`](mcp/)。
## 从 Solana 漏洞数据库中学习——真实的攻击
[`hacks/`](hacks/) 将真实的、公开的 Solana 漏洞映射到每个漏洞所属的 SOL-0XX 规则类别——Wormhole、Mango Markets、Cashio、Crema、Nirvana、Cypher、Loopscale 等(**514M+** 的记录损失)。每个条目都有引用,并且无法通过代码规则防止的事件(如被盗密钥、链外钱包)被标记为如此,而不是错误地归因——与这个存储库中其他部分相同的诚实。
浏览 [数据库 →](hacks/README.md)。
## 每个规则,都有解释——[`content/`](content/)
[`content/`](content/) 是所有 31 个规则的独立解释:每个规则捕获什么,修复方法,是否可由机器检查或仅审查,该类别的真实漏洞(与漏洞数据库交叉链接),以及存在的情况下一个代码示例。每个规则一个页面——所有都是从标准、模式、漏洞和示例生成的,因此没有任何东西会漂移。
## 让它成长——[`disclosures/`](disclosures/) 源
标准是一个活着的标准。[`disclosures/`](disclosures/) 消费新的 Solana 溢露——GitHub 安全咨询、Immunefi 报告或安全修复 PR——并提出一个候选 Hacks-Database 条目,其中包含建议的 SOL-0XX 映射供人类验证。它永远不会自动编写(引用的 DB 只接受已审查的条目)。作为内部一致性检查,关键字分类器在已编目每个漏洞的排名建议中显示标记的规则——在我们的根原因文本上的自我一致性,而不是盲准确度或 top-1 声称。
## 你能得到什么
31 个规则:**28 个链上** Solana 程序漏洞类别,加上 **3 个集成器/客户端规则(SOL-029–031)**,用于构建和发送事务的 TypeScript/web3.js(机器人、keeper、集成器)。**SOL-001 涵盖了两个已确认的可利用的奖金获胜(相同的调用者控制的 `now_slot` 类在 percolator 的 ACTIVATE 和 RETIRE 分支中都得到了修复)。**其余的大部分都来自记录的 Solana 审计模式——一些来自我们发布的溢露(在源列中注明了维护者分类),一些来自公共漏洞类别分类法;集成器三人组来自一个实时回购工人报告。
| 规则 | 捕获 | 来源 |
|---|---|---|
| [SOL-001](claude-security-guidance.md#sol-001--unauthenticated-now_slot) | 未认证的 `now_slot` / 时钟欺骗 | **奖金获胜(2):** [percolator-prog#107](https://github.com/aeyakovenko/percolator-prog/issues/107) ACTIVATE + [percolator-cli#78](https://github.com/aeyakovenko/percolator-cli/issues/78) F33 RETIRE |
| [SOL-002](claude-security-guidance.md#sol-002--cross-market-state-asymmetry) | 跨市场状态不对称 → 反通胀 | 记录的公共类别 ([percolator-prog#104](https://github.com/aeyakovenko/percolator-prog/issues/104)) — 不是我们的奖金 |
| [SOL-003](claude-security-guidance.md#sol-003--wrapper-re-implements-engine) | 包装处理程序重新实现引擎逻辑 | 来自我们的 [#78](https://github.com/aeyakovenko/percolator-cli/issues/78) F1 的模式——维护者在飞行中修复,未获得奖金 |
| [SOL-004](claude-security-guidance.md#sol-004--penaltyhealth-terms-omitted) | 从计算中省略健康/惩罚条款 | 来自我们的 [#78](https://github.com/aeyakovenko/percolator-cli/issues/78) F2 的模式——引擎端,单独的溢露正在等待在 `aeyakovenko/percolator` |
| [SOL-005](claude-security-guidance.md#sol-005--anchor-resize-without-checks) | Anchor `realloc()` 没有保护 | 来自我们的 [#78](https://github.com/aeyakovenko/percolator-cli/issues/78) F12 的潜在模式——当 14 资产上限提升时可达 |
| [SOL-006](claude-security-guidance.md#sol-006--missing-signer-check) | 在特权处理程序上缺少签名者检查 | 通用 Solana |
| [SOL-007](claude-security-guidance.md#sol-007--missing-owner-verification) | 缺少 `account.owner == program_id` | 通用 Solana |
| [SOL-008](claude-security-guidance.md#sol-008--unverified-pda) | 未验证的 PDA 推导 | 通用 Solana |
| [SOL-009](claude-security-guidance.md#sol-009--cpi-without-authority-check) | CPI 没有权限检查 | 通用 Solana |
| [SOL-010](claude-security-guidance.md#sol-010--reinit-attack) | 通过 `init_if_needed` 进行重新初始化攻击 | 通用 Solana |
| [SOL-011](claude-security-guidance.md#sol-011--lamport-drain-via-close) | 通过账户关闭进行 Lamport 耗尽 | 通用 Solana |
| [SOL-012](claude-security-guidance.md#sol-012--rent-exemption-check-missing) | 缺少租金豁免检查 | 通用 Solana |
| [SOL-013](claude-security-guidance.md#sol-013--token-program-id-confusion) | Token Program ID 混淆(Token 与 Token-2022) | 通用 Solana |
| [SOL-014](claude-security-guidance.md#sol-014--unchecked-integer-arithmetic) | 未检查的整数算术 | 通用 Solana |
| [SOL-015](claude-security-guidance.md#sol-015--anchor-constraints-missing) | Anchor `has_one`/`constraint=` 缺失 | 通用 Anchor |
| [SOL-016](claude-security-guidance.md#sol-016--bump-seed-unvalidated) | Bump seed 未验证与规范 bump 一致 | 通用 Solana |
| [SOL-017](claude-security-guidance.md#sol-017--raw-accountinfo-without-typed-deserialize) | 未进行类型化反序列化的原始 `AccountInfo` | 通用 Solana |
| [SOL-018](claude-security-guidance.md#sol-018--hardcoded-system-program-id) | 硬编码的系统程序 ID 文字 | 通用 Solana |
| [SOL-019](claude-security-guidance.md#sol-019--missing-discriminator-check) | 在反序列化时缺少判别符检查 | 通用 Solana |
| [SOL-020](claude-security-guidance.md#sol-020--setauthority-without-verification) | 在没有先前验证的情况下 `SetAuthority` | 通用 Solana |
| [SOL-021](claude-security-guidance.md#sol-021--terminal-op-gated-on-a-live-only-condition) | 终端/关闭操作仅对实时条件进行门控 → 资金锁定 | **Jelleo v16 审计 F1** — 维护者将其修复为“发现 C” |
| [SOL-022](claude-security-guidance.md#sol-022--write-only-impaired-counter) | 只写“受损”计数器从未递减 → 资金受限 | **Jelleo v16 审计 F2** — [percolator#74](https://github.com/aeyakovenko/percolator/issues/74),代码已确认 |
| [SOL-023](claude-security-guidance.md#sol-023--feepenalty-rounds-toward-the-user) | 费用/惩罚四舍五入到用户 → 避免和泄漏 | **Jelleo v16 审计 F3**(低)|
| [SOL-024](claude-security-guidance.md#sol-024--stale--unchecked-oracle-price) | Pyth/Switchboard 预报价格过时/未检查 | 通用 Solana DeFi |
| [SOL-025](claude-security-guidance.md#sol-025--sysvar-read-by-raw-deserialize) | 通过原始反序列化读取 Sysvar(而不是 `Clock::get()`) | 通用 Solana |
| [SOL-026](claude-security-guidance.md#sol-026--duplicate-mutable-account-native-programs) | 未检查的重复可变账户(本地 + Anchor `AccountLoader`/`remaining_accounts`) | 通用 Solana |
| [SOL-027](claude-security-guidance.md#sol-027--unvalidated-remaining_accounts) | 未验证的 `remaining_accounts` | 通用 Solana |
| [SOL-028](claude-security-guidance.md#sol-028--missing-slippage--min-out-bound) | 缺少滑点/最小输出界限 | 通用 Solana DeFi |
| [SOL-029](claude-security-guidance.md#sol-029--preflight-simulation-disabled) | 在主网发送上禁用了预飞 (`skipPreflight: true`) | **集成器** — 实时回购工人报告(TS/web3.js) |
| [SOL-030](claude-security-guidance.md#sol-030--static-priority-fee) | 硬编码的优先级费用——没有拥塞意识 | **集成器** — 实时回购工人报告(TS/web3.js) |
| [SOL-031](claude-security-guidance.md#sol-031--stale-jupiter-quote) | Jupiter 报价在未 `contextSlot` 新鲜的情况下消耗 | **集成器** — 实时回购工人报告(TS/web3.js) |
## 为什么这些规则——诚实的来源
我们确切地披露了每个规则来自哪里。其中一些是已确认的可利用的奖金获胜;一些是我们公开的文档模式,但在分类中维护者有不同的分类。我们列出这两种类型,因为所有这些都是值得标记的真实 Solana 攻击面——但我们不声称我们没有获得的奖金。
- **SOL-001 — 两个已确认的可利用的奖金获胜(相同的类别,两个代码路径)。** ACTIVATE 分支:[percolator-prog#107](https://github.com/aeyakovenko/percolator-prog/issues/107),在 `6512fa1` 中修复。RETIRE 分支:[percolator-cli#78 F33](https://github.com/aeyakovenko/percolator-cli/issues/78),在 `3fd9b1d` 中修复。两者都通过 Lean 理论证明模型得到维护者的认可。我们建议的 `authenticated_slot_or_fallback` 补丁直接发货。
- **SOL-002 — 公共类别,不是我们的奖金。** 跨市场的 `pnl_pos_bound_tot` 通胀类别在 [percolator-prog#104](https://github.com/aeyakovenko/percolator-prog/issues/104) 由另一位研究人员公开披露。包括在内,因为该模式可以在 perp-DEX 程序中重复。
- **SOL-003、SOL-004、SOL-005 — 来自我们的奖金 5 溢露的模式。** 所有三个都包含在我们的 [#78](https://github.com/aeyakovenko/percolator-cli/issues/78) 提交中(总共 36 个发现)。维护者分类结果:F1 在分类之前已在 `0925ed4` 中修复;F2 引擎端(单独的溢露正在等待在 `aeyakovenko/percolator`);F12 潜在的(当 14 资产上限提升时可达)。值得在未来代码中标记的真实 Solana 模式,没有作为新的奖金获得。
- **SOL-021、SOL-022、SOL-023 — 来自我们的 percolator v16 引擎审计的模式。** F1(终端/关闭死锁)由维护者修复为“发现 C”。F2(只写受损保险计数器)在 [percolator#74](https://github.com/aeyakovenko/percolator/issues/74) 中公开披露——代码已确认,尚未在链上重现。F3(费用四舍五入)是低。代码分析模式,未作为付费奖金获得。
其余规则(SOL-006 至 SOL-020,以及 SOL-024 至 SOL-028)涵盖了记录的 Solana / DeFi 审计模式——签名者/所有者/PDA 验证、Anchor 约束、CPI 权限、lamport 耗尽、Token 程序 ID 混淆、整数溢出、预言机过时、滑点界限等。标准审计员清单领域。
所有发布的周期报告:[jelleo.com/cycles](https://jelleo.com/cycles)
## 它是如何工作的
该标准是两个源文件——一个确定性的模式 YAML 和一个 Markdown 威胁模型 + 规则目录——以及一个自包含的扫描器。**每个表面都运行相同的规则:** CLI、GitHub Action、编辑器扩展、MCP 服务器和 Semgrep 直接应用它们。在 **Claude Code** 中特别,Anthropic 的 [安全指导插件](https://code.claude.com/docs/en/security-guidance) 读取这两个文件并在三个层面上审查编辑:
1. **在每次文件编辑时**——快速模式匹配(没有模型调用)。读取 `.claude/security-patterns.yaml` 以获取正则表达式/子字符串规则。**我们的文件提供了 20 个确定性的模式。**
2. **在每个回合结束时**——对完整差异的背景模型审查。读取 `.claude/claude-security-guidance.md` 以获取语义指导。**我们的文件提供了 Solana 威胁模型 + 31 个规则目录 + 审查清单。**
3. **在 Claude 每次提交时**——更深入的代理审查,它读取周围的代码。使用相同的指导文件。
每次规则触发时,提醒文本包括规则 ID(例如 `Jelleo SOL-001:`)以及一个链接回此存储库,以便您可以查看底层奖金案例研究。
## 示例
`examples/` 目录包含 **22 对易受攻击/修复片段——每个可机器检查的规则一个**(Rust 链上;
标签:SQL查询, 文档结构分析, 自定义脚本