名称: algorand-vulnerability-scanner 描述: 扫描Algorand智能合约中的11种常见漏洞,包括重密钥攻击、未检查交易费用、缺失字段验证和访问控制问题。用于审计Algorand项目(TEAL/PyTeal)。
Algorand漏洞扫描器
1. 目的
系统性地扫描Algorand智能合约(TEAL和PyTeal)中的平台特定安全漏洞,这些漏洞记录在Trail of Bits的“Not So Smart Contracts”数据库中。此技能编码了11种关键漏洞模式,专属于Algorand的交易模型。
2. 何时使用此技能
- 审计Algorand智能合约(状态化应用程序或智能签名)
- 审查TEAL汇编或PyTeal代码
- Algorand项目的预审计安全评估
- 验证已报告Algorand漏洞的修复
- 培训团队Algorand特定安全模式
3. 平台检测
文件扩展名与指示器
- TEAL文件:
.teal - PyTeal文件:
.py带有PyTeal导入
语言/框架标记
# PyTeal指示器
from pyteal import *
from algosdk import *
# 常见模式
Txn, Gtxn, Global, InnerTxnBuilder
OnComplete, ApplicationCall, TxnType
@router.method, @Subroutine
项目结构
approval_program.py/clear_program.pycontract.teal/signature.teal- 引用Algorand SDK或Beaker框架
工具支持
- Tealer: Trail of Bits的Algorand静态分析器
- 安装:
pip3 install tealer - 使用:
tealer contract.teal --detect all
4. 此技能如何工作
当调用时,我将:
- 搜索代码库 中的TEAL/PyTeal文件
- 分析每个文件 的11种漏洞模式
- 报告发现 包括文件引用和严重性
- 提供修复 针对每个识别的问题
- 运行Tealer(如果已安装)进行自动检测
5. 示例输出
当发现漏洞时,您将获得类似此报告:
=== ALGORAND漏洞扫描结果 ===
项目: my-algorand-dapp
扫描文件: 3 (.teal, .py)
发现漏洞: 2
---
[严重] 重密钥攻击
文件: contracts/approval.py:45
模式: 缺失RekeyTo验证
代码:
If(Txn.type_enum() == TxnType.Payment,
Seq([
# 缺失: Assert(Txn.rekey_to() == Global.zero_address())
App.globalPut(Bytes("balance"), balance + Txn.amount()),
Approve()
])
)
问题: 合约未验证RekeyTo字段,允许攻击者更改账户授权并绕过限制。
---
## 5. 漏洞模式(11种模式)
我检查11种关键的Algorand特定漏洞模式。有关详细检测模式、代码示例、缓解和测试策略,请参见[VULNERABILITY_PATTERNS.md](resources/VULNERABILITY_PATTERNS.md)。
### 模式摘要:
1. **重密钥漏洞** ⚠️ 严重 - 未检查RekeyTo字段
2. **缺失交易验证** ⚠️ 严重 - 无GroupSize/GroupIndex检查
3. **组交易操作** ⚠️ 高 - 不安全的组交易处理
4. **资产回收风险** ⚠️ 高 - 缺失回收地址检查
5. **应用程序状态操作** ⚠️ 中 - 不安全的全局/本地状态更新
6. **资产选择加入缺失** ⚠️ 高 - 无资产选择加入验证
7. **最低余额违规** ⚠️ 中 - 账户低于最低余额
8. **关闭剩余地址检查** ⚠️ 高 - 未检查CloseRemainderTo字段
9. **应用程序清除状态** ⚠️ 中 - 不安全的清除状态程序
10. **原子交易排序** ⚠️ 高 - 假设交易顺序
11. **逻辑签名重用** ⚠️ 高 - 逻辑签名无唯一性约束
有关完整漏洞模式及代码示例,请参见[VULNERABILITY_PATTERNS.md](resources/VULNERABILITY_PATTERNS.md)。
## 5. 扫描工作流
### 步骤1: 平台识别
1. 确认文件扩展名(`.teal`, `.py`)
2. 识别框架(PyTeal, Beaker, 纯TEAL)
3. 确定合约类型(状态化应用程序 vs 智能签名)
4. 定位批准和清除状态程序
### 步骤2: 使用Tealer的静态分析
```bash
# 在合约上运行Tealer
tealer contract.teal --detect all
# 或特定检测器
tealer contract.teal --detect unprotected-rekey,group-size-check,update-application-check
步骤3: 手动漏洞扫描
对于上述11种漏洞中的每一种:
- 搜索相关交易字段使用
- 验证验证逻辑存在
- 检查绕过条件
- 验证内部交易处理
步骤4: 交易字段验证矩阵
为所有使用的交易类型创建清单:
支付交易:
- [ ] RekeyTo已验证
- [ ] CloseRemainderTo已验证
- [ ] 费用已验证(如果是智能签名)
资产转移:
- [ ] 资产ID已验证
- [ ] AssetCloseTo已验证
- [ ] RekeyTo已验证
应用程序调用:
- [ ] OnComplete已验证
- [ ] 访问控制强制执行
- [ ] 组大小已验证
内部交易:
- [ ] 费用明确设置为0
- [ ] RekeyTo非用户控制(Teal v6+)
- [ ] 所有字段已验证
步骤5: 组交易分析
对于原子交易组:
- 验证
Global.group_size()检查 - 审查绝对 vs 相对索引
- 检查重放保护(Lease字段)
- 验证ApplicationCalls在组中的OnComplete字段
步骤6: 访问控制审查
- [ ] 创建者/管理员权限正确执行
- [ ] 更新/删除操作受保护
- [ ] 敏感函数有授权检查
6. 报告格式
发现模板
## [严重性] 漏洞名称(例如,缺失RekeyTo验证)
**位置**: `contract.teal:45-50` 或 `approval_program.py:withdraw()`
**描述**:
合约批准支付交易而不验证RekeyTo字段,允许攻击者重密钥账户并绕过未来授权检查。
**易受攻击代码**:
```python
# approval_program.py, 行 45
If(Txn.type_enum() == TxnType.Payment,
Approve() # 缺失RekeyTo检查
)
攻击场景:
- 攻击者提交设置RekeyTo为攻击者地址的支付交易
- 合约未检查RekeyTo即批准交易
- 账户授权被重密钥给攻击者
- 攻击者获得账户完全控制
推荐: 添加RekeyTo字段的显式验证:
If(And(
Txn.type_enum() == TxnType.Payment,
Txn.rekey_to() == Global.zero_address()
), Approve(), Reject())
参考:
- building-secure-contracts/not-so-smart-contracts/algorand/rekeying
- Tealer检测器:
unprotected-rekey
---
## 7. 优先级指南
### 严重(需要立即修复)
- 重密钥攻击
- CloseRemainderTo / AssetCloseTo问题
- 访问控制绕过
### 高(部署前修复)
- 未检查交易费用
- 资产ID验证问题
- 组大小验证
- 清除状态交易检查
### 中(审计中解决)
- 内部交易费用问题
- 基于时间的重放攻击
- 通过资产选择加入的DoS
---
## 8. 测试推荐
### 必需单元测试
- 测试每种漏洞场景与PoC利用
- 验证修复防止利用
- 测试边缘案例(组大小=0、空地址等)
### Tealer集成
```bash
# 添加到CI/CD流水线
tealer approval.teal --detect all --json > tealer-report.json
# 关键/高发现时构建失败
tealer approval.teal --detect all --fail-on critical,high
场景测试
- 提交所有关键字段操作的交易
- 测试意外大小的原子组
- 尝试访问控制绕过
- 验证内部交易费用处理
9. 额外资源
- Building Secure Contracts:
building-secure-contracts/not-so-smart-contracts/algorand/ - Tealer文档: https://github.com/crytic/tealer
- Algorand开发者文档: https://developer.algorand.org/docs/
- PyTeal文档: https://pyteal.readthedocs.io/
10. 快速参考清单
在完成Algorand审计前,验证所有项目已勾选:
- [ ] RekeyTo在所有交易类型中已验证
- [ ] CloseRemainderTo在支付交易中已验证
- [ ] AssetCloseTo在资产转移中已验证
- [ ] 交易费用已验证(智能签名)
- [ ] 组大小已验证原子交易
- [ ] Lease字段用于重放保护(如果适用)
- [ ] 更新/删除操作有访问控制
- [ ] 资产ID在所有资产操作中已验证
- [ ] 资产转移使用拉模式以避免DoS
- [ ] 内部交易费用明确设置为0
- [ ] OnComplete字段在ApplicationCall交易中已验证
- [ ] Tealer扫描完成无关键/高发现
- [ ] 单元测试覆盖所有漏洞场景