安全与风控
审计 Algorand 智能合约(TEAL/PyTeal)时…
当你需要审计或预审 Algorand 智能合约(TEAL/PyTeal)时,用这套流程逐项排查 rekeying、费用未校验、字段缺失校验、访问控制等 11 类漏洞并输出完整覆盖表。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
审计 Algorand 智能合约(TEA通用
解决思路
- 平台识别:确认文件扩展名(`.teal`、`.py`),识别框架(PyTeal、Beaker、纯 TEAL),判断合约类型(有状态应用 vs 智能签名),定位 approval 与 clear state 程序。
- 识别 PyTeal 标记:`from pyteal import *`、`from algosdk import *`,以及 `Txn`、`Gtxn`、`Global`、`InnerTxnBuilder`、`OnComplete`、`ApplicationCall`、`TxnType`、`@router.method`、`@Subroutine` 等常见模式。
- 识别项目结构:`approval_program.py` / `clear_program.py`、`contract.teal` / `signature.teal`,以及对 Algorand SDK 或 Beaker 框架的引用。
- 安装并使用 Tealer 静态分析器:`uv tool install tealer`(确保 uv 的 tool bin 目录在 PATH 上),运行 `tealer contract.teal --detect all`,或指定检测器 `tealer contract.teal --detect unprotected-rekey,group-size-check,update-application-check`。
- 逐项排查 11 类漏洞:1) Rekeying Attack(未校验 RekeyTo 字段,CRITICAL);2) Unchecked Transaction Fee(智能签名中未校验费用,HIGH);3) Closing Account(未校验 CloseRemainderTo 导致账户被清空,CRITICAL);4) Closing Asset(未校验 AssetCloseTo 导致资产被清空,CRITICAL);5) Group Size Check(原子组未校验 `Global.group_size()`,HIGH);6) Time-Based Replay Attack(无 lease 或轮次范围约束,MEDIUM);7) Access Controls(Update/Delete 及特权调用未保护,CRITICAL);8) Asset ID Verification(资产操作中未校验 Asset ID,HIGH);9) Denial of Service(Asset Opt-In,向未 opt-in 账户推送转账导致卡死,MEDIUM);10) Inner Transaction Fee(内部交易费用未显式设为 0,MEDIUM);11) Clear State Transaction(clear state 程序无法拒绝,状态遗留不一致,HIGH)。
- 手工漏洞扫描:对上述 11 类漏洞逐一搜索相关交易字段的使用、验证校验逻辑是否存在、检查绕过条件、验证内部交易处理。
- 建立交易字段校验矩阵:Payment 交易检查 RekeyTo、CloseRemainderTo、Fee(智能签名);Asset Transfers 检查 Asset ID、AssetCloseTo、RekeyTo;Application Calls 检查 OnComplete、访问控制、Group size;Inner Transactions 检查 Fee 显式设为 0、RekeyTo 不受用户控制(Teal v6+)、所有字段已校验。
- 原子交易组分析:校验 `Global.group_size()` 检查、审查绝对索引 vs 相对索引、检查重放保护(Lease 字段)、验证组内 ApplicationCall 的 OnComplete 字段。
- 访问控制审查:确认 creator/admin 权限被正确强制、Update/Delete 操作受保护、敏感函数有授权检查。
- 输出覆盖表:在发现项之上输出包含全部 11 行的表格,每行给出 Verdict(`found` 需引用 `file:line` 并在下方完整写出发现;`clear` 需写明搜索的字段/操作码/检查以便复现;`n/a` 需给出一句话原因,未检查不算 `n/a`)。少于 11 行或 Verdict 单元格为空即视为不完整扫描。
- 按模板撰写发现项:包含严重级别与漏洞名、Location(`file:line` 或函数)、Description、Vulnerable Code、Attack Scenario、Recommendation(附修复代码)、References(如 `building-secure-contracts/not-so-smart-contracts/algorand/rekeying`、Tealer 检测器名)。
- 按优先级处理:Critical(立即修复)——Rekeying、CloseRemainderTo/AssetCloseTo、访问控制绕过;High(部署前修复)——未校验交易费用、Asset ID 校验、Group size 校验、Clear state 交易检查;Medium(审计中处理)——内部交易费用、时间重放攻击、Asset opt-in DoS。
- 编写单元测试:为每个漏洞场景编写 PoC 利用、验证修复能阻止利用、测试边界情况(group size = 0、空地址等)。
- 集成 Tealer 到 CI/CD:`tealer approval.teal --detect all --json > tealer-report.json`,并用 `tealer approval.teal --detect all --fail-on critical,high` 在发现严重问题时使构建失败。
- 场景测试:提交所有关键字段被篡改的交易、测试异常大小的原子组、尝试访问控制绕过、验证内部交易费用处理。
- 完成审计前核对清单:RekeyTo 在所有交易类型中已校验、CloseRemainderTo 在 payment 中已校验、AssetCloseTo 在资产转移中已校验、交易费用已校验(智能签名)、原子交易 group size 已校验、适用处使用 Lease 字段防重放、Update/Delete 有访问控制、所有资产操作校验 Asset ID、资产转移使用 pull 模式避免 DoS、内部交易费用显式设为 0、ApplicationCall 的 OnComplete 已校验、Tealer 扫描无 critical/high 发现、单元测试覆盖所有漏洞场景、覆盖表含全部 11 行且每行有 `found`/`clear`/`n/a` 及理由。
- 拒绝常见借口:合约小不代表模式不适用(`n/a` 只需一句话且可复核);Tealer 无报告不等于干净(它只覆盖部分模式,需说明覆盖了哪些);「只检查了相关的模式」不成立(判断哪些相关本身就是扫描的一部分);无发现也要输出完整覆盖表;「PyTeal/Beaker 会处理」需给出具体版本与机制;「检查在另一个程序里」需引用 `file:line`。
- 参考资源:`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/。
适用边界 · 注意事项
- 非 Algorand 平台的智能合约(如 Ethereum/Solidity)不适用,本技能针对 Algorand 交易模型特有漏洞。
- 没有 TEAL/PyTeal 源码、只有编译后字节码且无法反编译时,无法进行源码级模式排查。
- 仅依赖 Tealer 自动扫描而不做手工逻辑级排查时,会漏掉工具未覆盖的模式(如访问控制、时间重放等)。