如何审计Solana智能合约 第1部分:系统方法

  • Sec3dev
  • 发布于 2021-11-12 20:56
  • 阅读 28

本文介绍了对Solana智能合约进行审计的系统方法,强调了与以太坊相比,Solana在编程语言和代码与数据分离上的独特之处。文章详细列出了攻击者可能的动机以及智能合约的攻击面,并探讨了一些常见漏洞和审计时应考虑的逻辑和经济错误。

Solana因其极低的交易费用而爆炸性地增长。随着越来越多高价值的Dapp在Solana上构建,开发相应的审计技术至关重要。

然而,审计Solana智能合约需要相比于以太坊(在过去三年中已建立审计规则)新的更高级的技能。Solana与以太坊有两个主要区别:

  1. 它使用不同的语言 — Rust(以太坊使用Solidity)和
  2. 它将代码和数据解耦

在这一系列文章中,我们将介绍一种系统化的方法,包括一些自动化的审计技术,用于审计Solana智能合约。

攻击者想要什么,他们可能做什么?

首先,审计应该培养攻击者的思维模式,了解他们的动机。以下是一些攻击者的用户故事:

  • 我能从智能合约中窃取资金(SPL代币、SOL或其他原生货币)吗?
  • 我能冻结智能合约吗(锁定用户资金,禁用存款/取款过程,禁用升级等)?
  • 我能让智能合约向错误的用户发送资金吗?
  • 我能改变智能合约的重要状态(改变所有者、多签所有者或验证者列表)吗?
  • 我能改变智能合约的代码(将其升级为恶意代码)吗?
  • 我能以低价购买代币吗?
  • 我能要求更多的退款超过应得金额吗?
  • 我能购买超过允许数量的代币吗?

以上列表可以很容易地扩展,包括利用智能合约中的经济或逻辑漏洞进行的攻击。

智能合约中的攻击面有哪些?

接下来,找出智能合约的所有攻击面。与每个公共或外部函数都可以被攻击者调用的Solidity不同,Solana智能合约只有一个由entrypoint!宏定义的入口点:

在上面,函数process_instruction是唯一的入口点。它传递了三个参数:program_id、accounts和instruction_data,后两个参数可能被攻击者控制(除了program_id)。换句话说:

攻击者可以为accounts和instruction_data提供任意数据,以利用由program_id标识的Solana智能合约

在process_instruction中,合约可以实现任何商业逻辑。以下是来自solido的代码片段:

根据instruction_data的解析结果,合约可以调用不同的函数来处理不同的逻辑:process_initialize、process_deposit、process_stake_deposit等。这些函数可以读取和写入accounts中的数据,调用Rust库和Solana辅助函数,或进一步调用其他链上程序。如果这些代码路径中的任何一个存在缺陷,攻击者可能利用它们窃取资金或做其他坏事。

攻击者可以利用Solana中的哪些常见漏洞?

接下来,了解Solana中的特定领域规则和复杂性。虽然智能合约漏洞和攻击向量的数量在增长,但有多种已知漏洞,其中一些在所有智能合约中很常见,而一些是Solana特有的:

  1. 缺少签名者检查:如果指令仅应对有限实体可用,但程序未验证调用是否已由适当实体签名(例如,检查AccountInfo::is_signer)。
  2. 缺少所有权检查:对于不应该完全由用户控制的账户,程序未检查AccountInfo::owner字段。
  3. 缺少租金豁免检查:所有持有Account、Mint或Multisig的Solana账户必须包含足够的SOL,以被视为免租。否则,账户可能无法加载。
  4. 调用未验证程序的签名调用:程序未验证任何通过invoke_signed() API调用的程序的pubkey。
  5. Solana账户混淆:程序未能确保账户数据具有其期望的类型。
  6. 跨实例混淆的重新初始化
  7. 算术溢出/下溢:如果一个算术操作导致更高或更低的值,该值将以二进制补码的形式进行环绕。
  8. 数值精度错误:浮点数的数值计算可能导致精度错误,这些错误可能会累积。
  9. 计算中的精度损失:像整数类型的除法这样的数值计算可能会导致精度损失。
  10. 不正确的计算:例如,因复制/粘贴错误导致的计算错误。
  11. 类型转换截断
  12. 计算中的指数复杂性
  13. 缺少冻结权限检查
  14. SPL代币账户验证不足
  15. 贷款的超/低付款

Solana和Rust程序中的一般问题是什么?

审计还应考虑Solana区块链和Rust编程语言的一些一般问题,例如跨程序调用的深度、有限重入、不安全的Rust等。

  • Solana跨程序调用的深度:当前的深度限制为4
  • 重入:由于跨程序调用的深度限制,Solana允许自我递归,且限定在固定深度内。这防止了大多数在以太坊中发现的重入攻击。
  • 不安全的Rust代码:Rust类型系统不检查不安全Rust代码的内存安全性。因此,如果智能合约包含任何不安全的Rust代码,它仍然可能遭受内存损坏,如缓冲区溢出、使用后释放、未初始化内存等。
  • 过时的依赖关系:Rust/Cargo使管理依赖关系变得容易,但这些依赖关系可能过时或包含已知的安全漏洞。可以使用cargo-outdated检查过时的依赖关系。
  • 冗余代码:可以清理或简化以减少代码复杂度的重复代码或死代码。
  • 不遵循安全最佳实践:未能正确使用断言、检查用户错误、多签名等。

检查高级逻辑及经济错误

除了检查这些常见漏洞和一般问题外,审计还应检查智能合约是否存在高级语义错误,例如:

  • 确保合约逻辑正确实现项目规范
  • 详细检查代码以查找合约特定的低级漏洞
  • 排除经济攻击
  • 排除拒绝服务攻击
  • 检查允许抢跑或三明治攻击的指令,
  • 检查可能导致未来引入常见漏洞的不安全设计,
  • 检查Solana区块链结构中出现的任何其他尚未明示的漏洞类别,
  • 检查拔腿机制或隐藏后门。

sec3审计

sec3团队很高兴为Solana上具有高影响力的Dapps提供审计服务。请通过电子邮件contact@sec3.dev与我们联系或访问sec3.dev

sec3由区块链安全和软件验证领域的领先人才创立。

接下来是什么

在接下来的几篇文章中,我们将详细说明一些常见漏洞及其实例,审计使用Anchor框架编写的Solana智能合约,并介绍自动化安全扫描和测试工具。

如何审计Solana智能合约系列?

有关sec3的所有博客,请访问https://www.sec3.dev/blog

  • 原文链接: sec3.dev/blog/how-to-aud...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Sec3dev
Sec3dev
https://www.sec3.dev/