Nanle-code/clarus
GitHub: Nanle-code/clarus
Clarus 是针对 Stacks 区块链 Clarity 智能合约的静态安全分析工具,可在部署前自动检测重入攻击、权限控制和整数溢出等常见漏洞。
Stars: 2 | Forks: 0
# Clarus
Clarus 可在部署前检测 `.clar` 文件中的常见漏洞模式 —— 为开发者提供快速、可操作的反馈,而无需进行全面审计。
## 为什么选择 Clarus?
Clarity 的设计初衷是安全的 —— 但安全设计并不意味着没有漏洞。随着 Stacks 生态系统的发展和 sBTC 将真实的比特币流动性带入 DeFi,单个漏洞的风险急剧上升。
Clarus 填补了一个空白:**目前还没有专门针对 Clarity 的静态分析工具**。Clarus 旨在成为 Stacks 生态系统中的 Slither。
## 检测器
| ID | 严重程度 | 描述 |
|----|----------|-------------|
| `reentrancy` | 🔴 严重 | 在 `stx-transfer?`、`contract-call?` 或其他外部交互之后发生的状态更改 |
| `access-control` | 🔴 高 | 修改状态但未检查 `tx-sender` 或 `contract-caller` 的 Public 函数 |
| `integer-underflow` | 🟠 高 | 在没有前置边界检查的情况下对 `uint` 进行减法运算 |
| `integer-overflow` | 🔵 低 | 没有上限验证的加法运算 |
| `unchecked-returns` | 🟡 中 | 未使用 `try!` 或 `unwrap!` 包装返回值的外部调用 |
## 安装
### 从源码安装
```
git clone https://github.com/Nanle-code/clarus.git
cd clarus
cargo build --release
```
二进制文件将位于 `./target/release/clarus`。
(可选)全局安装,以便您可以从机器上的任何位置运行 `clarus`:
```
cargo install --path .
```
## 使用方法
```
# 分析当前目录中的合约
clarus mycontract.clar
# 分析系统上任意位置的合约
clarus /path/to/contract.clar
# 输出为 JSON(用于 CI/CD pipelines)
clarus mycontract.clar --json
# 如果发现问题则以代码 1 退出(用于 CI/CD gates)
clarus mycontract.clar --strict
```
## 测试外部合约
Clarus 适用于您系统上任何位置的任何 `.clar` 文件 —— 不仅仅是 Clarus 项目文件夹中的合约。
**在开发期间(全局安装之前):**
```
# 使用 cargo run 分析任意合约
cargo run -- ~/Desktop/mycontract.clar
cargo run -- ~/projects/my-stacks-app/contracts/vault.clar
# 使用 flags
cargo run -- ~/Desktop/mycontract.clar --json
cargo run -- ~/Desktop/mycontract.clar --strict
```
**直接使用 release 二进制文件:**
```
# 首先构建 optimized binary
cargo build --release
# 然后将其指向任意合约
./target/release/clarus ~/Desktop/mycontract.clar
./target/release/clarus ~/projects/stacks-defi/contracts/pool.clar
```
**全局安装后:**
```
# 从机器上的任意目录运行 clarus
clarus ~/Desktop/mycontract.clar
clarus ~/projects/stacks-defi/contracts/pool.clar
clarus ~/projects/stacks-defi/contracts/pool.clar --json
```
## 示例输出
```
Clarus — Clarity Smart Contract Analyzer
Analyzing: vault.clar
────────────────────────────────────────────────────────────
[1] [CRITICAL] Reentrancy
Function : withdraw
Location : Line 8
Issue : 'map-set' called after external interaction on line 6
Fix : Move 'map-set' to before the external call on line 6
────────────────────────────────────────────────────────────
[2] [HIGH] Missing Access Control
Function : deposit
Location : Line 3
Issue : Public function 'deposit' modifies state without access control check
Fix : Add (asserts! (is-eq tx-sender contract-owner) (err u403)) at the top
────────────────────────────────────────────────────────────
Result : 2 total findings
1 critical
1 high
```
## CI/CD 集成
将 Clarus 添加到您的 GitHub Actions 工作流中:
```
- name: Run Clarus
run: |
cargo install --path .
clarus contracts/vault.clar --strict
```
`--strict` 标志会导致 Clarus 在检测到任何发现时以代码 `1` 退出,这将使工作流失败并阻止 pull request。
## 漏洞模式
### 重入攻击 (Reentrancy)
最关键的模式。当合约在更新自身状态之前执行外部调用(`stx-transfer?`、`contract-call?` 等)时,恶意合约可以重新进入并利用陈旧的状态。
**有漏洞:**
```
(define-public (withdraw (amount uint))
(begin
(stx-transfer? amount (as-contract tx-sender) tx-sender) ;; external call first
(map-set balances tx-sender u0) ;; state update after — dangerous
))
```
**安全(检查-生效-交互模式):**
```
(define-public (withdraw (amount uint))
(begin
(map-set balances tx-sender u0) ;; state update first
(try! (stx-transfer? amount (as-contract tx-sender) tx-sender))
(ok true)
))
```
### 未检查的返回值
在没有 `try!` 的情况下调用 `stx-transfer?` 或 `contract-call?` 意味着失败会被静默忽略,执行将继续进行。
**有漏洞:**
```
(stx-transfer? amount (as-contract tx-sender) tx-sender)
(map-delete balances tx-sender)
```
**安全:**
```
(try! (stx-transfer? amount (as-contract tx-sender) tx-sender))
(map-delete balances tx-sender)
```
## 项目结构
```
clarus/
├── src/
│ ├── main.rs — CLI entry point
│ ├── ast.rs — AST node definitions
│ ├── parser.rs — Clarity S-expression parser
│ ├── analyzer.rs — Orchestrates all detectors
│ ├── reporter.rs — Terminal and JSON output
│ └── detector/
│ ├── mod.rs
│ ├── reentrancy.rs — Reentrancy detector
│ ├── integer_overflow.rs
│ ├── access_control.rs
│ └── unchecked_returns.rs
└── tests/
└── contracts/
├── vulnerable.clar
├── safe.clar
└── bug.clar
```
## 路线图
### 阶段 1 — MVP ✅
- 单文件分析
- 重入检测
- 整数下溢/上溢
- 访问控制
- 未检查的返回值
- 带有 JSON 输出和严格模式的 CLI
### 阶段 2
- 多文件 / 多合约分析
- 基于 Trait 的动态分发检测
- 调用图可视化
- Clarinet 插件集成
### 阶段 3
- GitHub Action
- VS Code 扩展
- 基于 Web 的演练场
- 公共 Clarity 漏洞数据库
## 贡献
Clarus 是开源的,欢迎贡献。如果您发现 Clarus 遗漏的 Clarity 漏洞模式,请提交一个包含最小复现合约的 issue。
## 许可证
MIT
标签:Clarity, DeFi安全, pocsuite3, Rust, sBTC, Stacks, Streamlit, 云安全监控, 区块链安全, 可视化界面, 威胁情报, 开发者工具, 整数溢出, 文档结构分析, 智能合约审计, 网络流量审计, 访问控制, 软件测试, 通知系统, 通知系统, 通知系统, 重入攻击, 静态分析