{"content":{"title":"2024年3月ARK合约攻击---事件分析","body":"# 概要\r\n今年三月发生了一起针对ARK合约的攻击，攻击者从中获利348枚BNB\r\n攻击交易：https://phalcon.blocksec.com/explorer/tx/bsc/0xe8b0131fa14d0a96327f6b5690159ffa7650d66376db87366ba78d91f17cd677\r\nARK合约地址：0xde698b5bbb4a12ddf2261bbdf8e034af34399999\r\nARK合约源代码：https://bscscan.com/address/0xde698b5bbb4a12ddf2261bbdf8e034af34399999#code\r\n# 攻击过程分析\r\n首先来看下攻击发生的交易：https://phalcon.blocksec.com/explorer/tx/bsc/0xe8b0131fa14d0a96327f6b5690159ffa7650d66376db87366ba78d91f17cd677\r\n参考下图可以发现攻击合约多次条用了ark的autoBurnLiguidityPairTokens这个方法（共10000次调用）\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/EhZXRjzn66a3721b78657.png)\r\n进入ark源代码里发现，autoBurnLiquidityPairTokens这个函数的实现方式如下：\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/eKqZnW8066a372269e30e.png)\r\n[Image]\r\n根据上图可以发现，liquidityPairBalance是池子里面pair的余额。percentForLPBurn是常量30（第777行定义）。所以第783行-786的行为就是每次调用这个方法，燃烧当前余额的0.3%，保留剩下的99.7%。\r\n通常情况下，autoBurnLiquidityPairToken函数只应该被_transfer函数调用，如下图498行所示：\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/bLvC5CQU66a37233e4d80.png)\r\n这样的意义是每次转账钱都销毁一部分的token达到通缩货币抬高token价值的效果。\r\n但是由于代码的不规范，autoBurnLiquidityPairToken函数不仅可以被_transfer内部调用，还可以被外部调用：\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/xEmDPtDa66a37256396b9.png)\r\n所以攻击合约调用10000次该函数，导致ark的存量在该池子中减少至99.7%的一万次方。经过这个操作，ARK数量急剧减少，导致ARK价值抬高，攻击者从中获利。\r\n下图是poc代码，分成两部分，一部分调用1万次autoburn函数，一部分将ark swap成wbnb；\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/LuQ5FrlW66a3726be8727.png)\r\n# 攻击复盘\r\n1. 我觉得最大的问题就是autoBurnLiquidityPairToken这个函数设置成为了public：\r\n  1. 如果是纯内部调用（只有_transfer方法调用）应该只给internal或者private权限\r\n  2. 如果项目方想通过这个方法人工控制通缩，应该给这个方法加入 onlyowner的修饰符"},"author":{"user":"https://learnblockchain.cn/people/21890","address":null},"history":null,"timestamp":1722427858,"version":1}