来看看一行价值 38 万美元的代码

Glzae & Jasmine:如果你还没有看过第一期,点这里。在第二期中我们将给大家带来区块链安全事故的分析。看完这一期的智能合约代码范例和常见框架介绍,或许你就可以独立编写简单的智能合约了。恭喜!你离一份区块链行业的工作更近了。
如果你喜欢本期内容,不妨分享本期内容到社交平台 ,并订阅 un.Block Weekly

Force DAO 是最近的 DEFI 明星项目,但它一上线就发生了严重的安全事故。目前 FORCE DAO 空投已经暂停。本期本周热点将会为你介绍区块链安全,以及回顾 FORCE DAO 的安全漏洞。
安全是个有人在意,有人不在意的问题。随着互联网的兴盛,各种数据泄露,黑客攻击也层出不穷。相比过去的小打小闹,现在的黑客行动有着更加明确的目标,强大的破坏力。在区块链中,安全是重中之重。因为区块链与钱的连接更加紧密,黑客们更有攻击的动力。一个严重的安全问题可能导致一个区块链项目的失败。有关区块链给安全带来的独特挑战,我们有机会再介绍。

从项目方的披露中我们可以了解攻击的流程。受到攻击的是 xFORCE Vault。这个合约负责 xFROCE 代币的生成和销毁。正常的逻辑是用户抵押 FORCE 代币,收到 xFORCE 代币。漏洞是没有校验 FORCE 代币的转账结果。这导致攻击者可以让 FORCE 代币转账失败,但仍旧收到 xFORCE 代币。
没有校验函数返回值是智能合约中很常见的问题。在此次事件中,攻击者就是利用了合约并没有处理 FORCE 代币 transferFrom 的返回值,凭空铸造了很多 xFORCE。然后将 xFORCE 销毁,换回 FORCE。合约认为 transferFrom 必定成功,即使用户并没有真的把 FORCE 转给智能合约。漏洞在ForceProfitSharing.sol L43 。
在开发过程中我们可以添加代码来处理 transferFrom 的返回值。我们也可以使用 SafeERC20 的 ·
safeTransferFrom。使用 safeTransferFrom 时,如果转账失败整个交易会进行回滚。
我个人觉得这是一个十分容易发现的漏洞。不需要人工审计,静态分析器也能发现这个问题。很有可能项目方没有进行正规的代码审计。
在报告中他们提到 xFORCE vault 代码来自 xSUSHI,FORCE 来自 Aragon Minime。xSUSHI 代码假设转账操作失败会回滚,然而 FORCE 并没有实现转账失败回滚的功能(缝合失败)。我们可以理解为项目方借用了其他项目的代码,但并没有弄清楚这些代码运行的前提。