{"content":{"title":"零时科技 || BEGO Token 攻击事件分析","body":"![](https:\/\/p0.ssl.qhimg.com\/t01b8eb6eef55923821.jpg)\r\n# 事件背景\r\n\r\n零时科技区块链安全情报平台监控到消息，北京时间2022年10月20日，BSC链上EGO 合约受到黑客攻击，攻击者一次性mint 10,000,000,000,000,000 BEGO 代币，攻击者地址为0xde01f6Ce91E4F4bdB94BB934d30647d72182320F，零时科技安全团队及时对此安全事件进行分析。\r\n\r\n# 漏洞核心\r\n\r\nBgeoToken.mint函数调用时，会对函数签名进行判断。但函数签名十五r，s，v的值由用户自行传入，并且对于传入需要mint的数量没有限制。\r\n![](https:\/\/p3.ssl.qhimg.com\/t0140d9531d7a12878d.png)\r\n在判断签名的函数中首先执行判断签名的长度，只要三个签名长度相等即可通过验证。第二步进入for循环调用预编译的函数ecrecover返回传入签名者的地址，但是当r的长度为0时for循环会被跳过直接执行后续步骤，第三步根据第二步for循环中计算出的地址判断该地址是否存在，同理，当singers的长度为0时循环被跳过，直接返回true。因此当传入的r，s，v的值全部为空时可以绕过对于签名的判断直接进行铸币操作。\r\n![](https:\/\/p3.ssl.qhimg.com\/t01b4be373865848909.png)\r\n![](https:\/\/p5.ssl.qhimg.com\/t01423ab25cb97e5e33.png)\r\n![](https:\/\/p2.ssl.qhimg.com\/t01ab722c48d3f3a8e5.png)\r\n从攻击者传入的数据可知r，s，v的确传入的是空值，成功mint 10,000,000,000,000,000 BEGO代币。\r\n![](https:\/\/p0.ssl.qhimg.com\/t016e442480699688b3.png)\r\n\r\n# 总结及建议\r\n\r\n此次攻击主要是因为对于函数签名判断不当造成的，函数签名可以由用户自行传入并且没有考虑到签名值为空时不会执行for循环，使得攻击者可以通过不传入r，s，v的值绕过判断，并且在mint函数中没有对于铸币的数量进行限制，使得攻击者可以一次铸造大量代币。\r\n\r\n**安全建议**\r\n\r\n建议添加对于签名值为空时的判断，避免通过空的签名绕过检验。\r\n\r\n建议项目方上线前进行多次审计，避免出现审计步骤缺失"},"author":{"user":"https:\/\/learnblockchain.cn\/people\/52","address":null},"history":null,"timestamp":1666275570,"version":1}