RECTOR-LABS/solana-cpi-safety-skill

GitHub: RECTOR-LABS/solana-cpi-safety-skill

这是一个 Claude Code 安全审计技能包,专门用于检测和修复 Solana 区块链智能合约中的四类跨程序调用(CPI)安全漏洞。

Stars: 0 | Forks: 0

# solana-cpi-safety-skill 适用于 Claude Code 的 Solana CPI 安全技能 —— 检测并防范四类跨程序调用漏洞,并提供对 CPI return-data 伪造的顶级覆盖。 ## 这是什么 跨程序调用 (CPI) 是 Solana 上严重且可被利用的漏洞的最常见来源。本技能旨在教 Claude Code 识别、解释并修复在高级 (High) 和严重 (Critical) 审计发现中占绝大多数的四类漏洞: ### 四类 CPI 漏洞 | 类别 | 风险 | 问题所在 | |-------|------|-----------------| | **CPI return-data 伪造** | 严重 | 在未验证生成程序的情况下信任 `get_return_data()`。任何程序都可以写入 return-data 插槽 —— 恶意调用者会在您的程序读取之前替换预言机价格。 | | **任意 CPI** | 高 | 调用由调用者提供的 program id —— 这会导致虚假的 SPL Token 程序以及攻击者控制的代码在受害者金库中执行。 | | **CPI 后账户过期** | 高 | 在未从账本重新加载的情况下,读取被调用者已修改的账户状态。 | | **PDA CPI 签名** | 中高 | 使用非规范 bump 或泄露的签名者种子执行 `invoke_signed` —— 这会导致未经授权的签名。 | ### 核心创新:CPI return-data 伪造 最核心的覆盖重点是 CPI return-data 伪造。它是这四类漏洞中文档最少的,也是在代码审查中最难发现的。其攻击面在于 `set_return_data` / `get_return_data` 系统调用对:在您的程序之前(或由您的程序)调用的任何程序都可以覆盖该插槽。如果 DeFi 程序调用了预言机 CPI,随后在未检查 `program_id == ORACLE_PROGRAM_ID` 的情况下读取 `get_return_data()`,则该程序完全可被利用。 本技能基于一个已在上游修复的真实发现:Anchor CPI return-data 伪造,CVSS 7.5,已在上游修复,在一次涉及 14 个协议的审计的 116 个发现中排名第 1。 同时涵盖了 Anchor 和原生/Pinocchio 模式。 ## 包含内容 ### 技能包 ``` skills/ solana-cpi-safety/ SKILL.md # Routing entry point cpi-return-data-spoofing.md # Crown jewel sub-skill arbitrary-cpi.md # Arbitrary CPI sub-skill account-reload.md # Stale account sub-skill pda-cpi-signing.md # PDA signing sub-skill poc-harness.md # PoC test harness guide cpi-checklist.md # Pre-audit CPI checklist rules/ rust.md # Rust code rule (Cursor .mdc) agents/ cpi-auditor.md # Autonomous CPI audit agent commands/ audit-cpi.md # /audit-cpi command poc/ return-data-spoofing/ # Runnable LiteSVM + TypeScript PoC (incl. Variant B) pinocchio-return-data/ # Runnable LiteSVM PoC (Pinocchio crown-jewel variant) arbitrary-cpi/ # Runnable LiteSVM + TypeScript PoC account-reload/ # Runnable LiteSVM + TypeScript PoC pda-cpi-signing/ # Runnable LiteSVM + TypeScript PoC ``` ### /audit-cpi 命令 在任何 Claude Code 会话中调用 `/audit-cpi`,扫描 Solana 代码库以查找所有四类 CPI 漏洞,并生成包含修复步骤的结构化发现报告。 ### cpi-auditor 代理 一个专用的子代理,执行系统性的 CPI 审计。它将任务路由到针对每种漏洞类别的相应子技能,编写漏洞 PoC 草案,并提出符合 Anchor 或原生/Pinocchio 习惯的修复建议。 ### rust.md 规则 采用 Cursor `.mdc` 格式(包含 `globs:` frontmatter)的 Rust 代码规则。在 Cursor 中,它会在编辑 Rust 文件时自动加载,并将涉及 CPI 的更改路由到相关的子技能和 `cpi-checklist.md`。Claude Code 没有编辑时自动触发规则的机制,因此在那里它是技能引用的参考资料 —— 或者将其放入项目的 `.claude/rules/` 目录中(带有 `paths:` frontmatter)以实现路径范围内的上下文加载。 ### 可运行的 PoC 五个可运行的 PoC 涵盖了四类漏洞 —— 核心类别(return-data 伪造)提供了 Anchor 和 Pinocchio 的双重验证。每个 PoC 都将链上程序(攻击者 + 受害者)与运行 EXPLOIT / DEFENSE / POSITIVE CONTROL(攻击 / 防御 / 阳性对照)用例的 TypeScript LiteSVM 测试套件配对。除非另有说明,程序均为 Anchor 编写: **poc/return-data-spoofing/**(核心内容;6 个用例) - EXPLOIT(攻击):受害者采用了攻击者程序写入的伪造价格 - DEFENSE(防御):在生产者检查失败时抛出 `UntrustedProducer` 错误 - POSITIVE CONTROL(阳性对照):接受来自真实预言机程序的返回数据 - 变体 B(深层堆栈泄露):一个良性中继程序使更深层次程序的返回数据浮出水面 —— EXPLOIT 采用了深层攻击者的伪造数据,DEFENSE 通过生产者检查拒绝该数据,POSITIVE 则接受真实的预言机数据 **poc/pinocchio-return-data/**(核心内容,Pinocchio;3 个用例) - 与 Anchor return-data PoC 具有相同的漏洞利用和修复方式,基于原始 Pinocchio(`pinocchio::cpi`、`AccountView`、`Address`)编写,并使用 `cargo-build-sbf` 构建 - 一个 `consumer` 程序通过单字节指令鉴别符(0 = 存在漏洞,1 = 已修复)来选择未检查路径或已检查路径 - EXPLOIT 采用攻击者伪造的 `1`;DEFENSE 以 `UntrustedProducer` 拒绝;POSITIVE 接受受信任预言机的 `50_000` **poc/arbitrary-cpi/** - EXPLOIT(攻击):攻击者替换为虚假的 SPL Token 程序;攻击者控制的代码在金库的 CPI 内部执行 - DEFENSE(防御):显式的 program_id 检查在任何 CPI 开启之前拒绝替换 - POSITIVE CONTROL(阳性对照):真实的 SPL Token 程序成功执行 **poc/account-reload/** - EXPLOIT(攻击):存在漏洞的消费者检查 CPI 之前的余额快照,因此被 CPI 耗尽的金库可以通过偿付能力检查 - DEFENSE(防御):修复后的消费者在 CPI 之后重新读取数据(即 `reload()` 教训)并拒绝已耗尽的金库 - POSITIVE CONTROL(阳性对照):保持有偿付能力的部分提款被接受 **poc/pda-cpi-signing/** - EXPLOIT(攻击):金库 PDA 使用种子 `[b"vault", authority]` 进行签名 (`invoke_signed`),但从未要求该 authority 签名 —— 攻击者通过在未签名的情况下传递受害者的 pubkey 来抽干受害者的金库 - DEFENSE(防御):修复后的程序要求 authority 必须签名,从而拒绝未签名的抽干行为 - POSITIVE CONTROL(阳性对照):真正的 authority 从其自有金库中提款 - 第二个测试文件 (`non-canonical-bump.test.ts`) 涵盖了非规范 bump 面:存在漏洞的程序通过 `invoke_signed` 使用调用者提供的 bump 创建了一个“每用户一个”的注册表 PDA,因此攻击者可以将同一用户注册两次(先规范 bump 然后非规范 bump)以铸造重复账户;修复后的程序通过 `find_program_address` 固定了规范 bump ## 快速开始 ### 安装 一行命令安装(推荐) —— 完整捆绑包(技能 + `/audit-cpi` 命令 + `cpi-auditor` 代理),全局安装(`~/.claude`): ``` npx @rector-labs/solana-cpi-safety-skill # 改为项目本地使用: npx @rector-labs/solana-cpi-safety-skill --project ``` 仅技能安装,通过开放的 agent-skills 生态系统: ``` npx skills add RECTOR-LABS/solana-cpi-safety-skill ``` 作为原生 Claude Code 插件(完整捆绑包),通过 RECTOR-LABS 市场安装: ``` /plugin marketplace add RECTOR-LABS/claude-plugins /plugin install solana-cpi-safety@rector-labs ``` 从克隆安装(无需 Node): ``` git clone https://github.com/RECTOR-LABS/solana-cpi-safety-skill.git cd solana-cpi-safety-skill && ./install.sh # or ./install-custom.sh ``` 然后重启 Claude Code。注意:作为插件安装时,命令带有命名空间 `/solana-cpi-safety:audit-cpi`;通过 npx 或 `install.sh` 安装时为 `/audit-cpi`。 ### 运行 PoC 编译后的程序及其密钥对已提交,因此仅使用 Node 即可运行 PoC —— 无需 Solana/Anchor 工具链。 ``` # Return-data 伪造 PoC cd poc/return-data-spoofing npm install npm test ``` 运行 6 个测试,6 个通过(变体 A + 变体 B 深层堆栈): - EXPLOIT(攻击):“存在漏洞的消费者信任伪造的返回数据” —— 交易成功,消费者 采用攻击者设定的价格 1(伪造值已在返回数据中确认) - DEFENSE(防御):“修复后的消费者拒绝攻击者预言机” —— 交易失败并报错 UntrustedProducer - POSITIVE CONTROL(阳性对照):“修复后的消费者接受合法预言机” —— 交易成功,消费者 读取真实预言机价格 50000 - 变体 B(深层堆栈泄露):EXPLOIT 通过良性中继程序采用深层攻击者的伪造数据;DEFENSE 通过生产者检查拒绝它;POSITIVE 接受真实的预言机 ``` # 任意 CPI PoC cd poc/arbitrary-cpi npm install npm test ``` 运行 3 个测试,3 个通过: - EXPLOIT(攻击):“vault_vulnerable 接受 fake_token 程序替换” —— 交易成功, 返回数据字节 0 = 1,证明 fake_token(攻击者程序)已执行 - DEFENSE(防御):“vault_fixed 拒绝 fake_token 程序替换” —— 交易失败并报错 WrongTokenProgram - POSITIVE CONTROL(阳性对照):“vault_fixed 接受 real_token” —— 交易成功,返回数据字节 0 = 0 ``` # account-reload (stale-account-after-CPI) PoC cd poc/account-reload && npm install && npm test # pda-cpi-signing (invoke_signed) PoC cd poc/pda-cpi-signing && npm install && npm test # pinocchio-return-data (Pinocchio crown-jewel 变体) PoC cd poc/pinocchio-return-data && npm install && npm test ``` 这些运行具有相同的 EXPLOIT / DEFENSE / POSITIVE CONTROL 结构(每个 3 个测试)。 #### 从源码重建程序(可选) 如果已安装 Anchor 1.0.2 和 Solana 工具链,请在 Anchor `poc//` 目录中运行 `anchor build`。`pinocchio-return-data` PoC 改为使用 `cargo-build-sbf` 构建(有关工具链说明,请参见 CLAUDE.md)。提交的程序密钥对可确保程序 ID 在重新构建后保持稳定。 ### 在 Claude Code 中使用 安装后,在 Solana 项目中打开任何 Claude Code 会话并提问: ``` Audit this program for CPI vulnerabilities /audit-cpi Are there any return-data spoofing risks in programs/my-program/src/lib.rs? Review this CPI call for arbitrary-program substitution ``` ## 添加到 Solana AI Kit 该工具包 (solanabr/solana-ai-kit) 将外部技能注册为 `.claude/skills/ext/` 下的 git 子模块。要添加此技能: ``` git submodule add https://github.com/RECTOR-LABS/solana-cpi-safety-skill.git .claude/skills/ext/solana-cpi-safety ``` 生成的 `.gitmodules` 块(可直接粘贴): ``` [submodule ".claude/skills/ext/solana-cpi-safety"] path = .claude/skills/ext/solana-cpi-safety url = https://github.com/RECTOR-LABS/solana-cpi-safety-skill.git ``` ## 要求(针对 PoC) 运行 PoC 的要求(主要路径 —— 程序已预编译): | 工具 | 版本 | |------|---------| | Node.js | >= 20 | 从源代码重建程序(可选): | 工具 | 版本 | |------|---------| | Anchor | 1.0.2 | | Solana / Agave CLI | 3.x | | Rust | 1.85+ | | Node.js | >= 20 | 技能包(skills/solana-cpi-safety/、commands/、agents/)没有运行时要求 —— 它是纯 Markdown。 ## 仓库结构 ``` solana-cpi-safety-skill/ README.md # This file CLAUDE.md # Contributor guidance LICENSE # MIT install.sh # Standard installer install-custom.sh # Custom-path installer package.json # npm package (@rector-labs/solana-cpi-safety-skill) bin/cli.mjs # Zero-dependency Node installer (npx) test/ # node:test suites (installer + manifest) .claude-plugin/ plugin.json # Claude Code plugin manifest skills/ solana-cpi-safety/ SKILL.md cpi-return-data-spoofing.md arbitrary-cpi.md account-reload.md pda-cpi-signing.md poc-harness.md cpi-checklist.md rules/ rust.md agents/ cpi-auditor.md commands/ audit-cpi.md poc/ return-data-spoofing/ programs/ # Anchor victim + attacker + relay programs tests/ # LiteSVM TypeScript test suite (Variant A + B) pinocchio-return-data/ programs/ # Pinocchio oracle + attacker + consumer programs tests/ # LiteSVM TypeScript test suite arbitrary-cpi/ programs/ # Anchor victim + attacker programs tests/ # LiteSVM TypeScript test suite account-reload/ programs/ # Anchor ledger + consumer programs tests/ # LiteSVM TypeScript test suite pda-cpi-signing/ programs/ # Anchor vault programs tests/ # LiteSVM TypeScript test suite ``` ## RECTOR-LABS Solana 安全套件 此技能是 RECTOR-LABS 三部分 Solana 安全工作流的第一部分 —— 查找漏洞、证明漏洞、响应事件: | 技能 | 阶段 | 状态 | |-------|-------|--------| | **solana-cpi-safety**(此仓库) | 查找 —— 检测并防范 CPI 漏洞类别 | 可用 | | **solana-poc-forge** | 证明 —— 打造可运行的 PoC 和漏洞利用 | 计划中 | | **solana-incident-response** | 响应 —— 分类、控制和披露实时事件 | 计划中 | 这三者均通过共享的 `rector-labs` 市场安装: ``` /plugin marketplace add RECTOR-LABS/claude-plugins /plugin install solana-cpi-safety@rector-labs ``` ## 许可证 MIT —— 详情请参见 [许可证](LICENSE)。 由 [RECTOR-LABS](https://github.com/RECTOR-LABS) 维护。 为 Superteam x Solana AI Kit 赏金而构建。
标签:AI编程辅助, Claude Code, CPI安全, MITM代理, Solana, 区块链安全, 可视化界面, 智能合约审计, 自动化攻击, 防御加固