别再复制Compound的代码了

jackson 发布于 2022-03-23 阅读 5585

代码是别人的,但是复制过来后,漏洞却是需要自己承受的,如此局面下,我们能够做的,就是严谨对待自己的项目和代码,因为出了问题后,Compound 和审计公司都没有义务为你负责。

别再复制Compound的代码了

前段时间看Compound的代码,发现两个可能影响资金安全的漏洞。

漏洞一

发现Compound的一个严重漏洞 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn)

这个漏洞的主要原因是Compound采用的这种资金池净值的算法可以被攻击,攻击者可以在资金池份额很小时,恶意转入一定量资金导致净值达到一个极大的值,从而让后面存入资金时,份额=资金/份额,整除后结果为0,也就是说用户存入资金确得不到份额!然后攻击者就可以取回份额,盗走用户的资金。

这个漏洞的利用条件比较苛刻,基本上只有在创建资金池的时候才有攻击的可能,但是,对于合约这种极其关键的东西,应该严谨对待,不能因为难以利用就置之不理,特别是这个漏洞要堵上是非常简单的。

因此给Compound的漏洞赏金计划邮箱发了一封邮件,告知了这个问题,但是至今没有收到回复。

担心是邮件没有收到,我又通过一个中间人来联系上Compound,但是一个中间人表示这个漏洞他们已经知道了,并说这个漏洞很难被利用,可以通过运营手段规避。想想确实是这样,这个漏洞虽然可能被利用,但是难以被利用,不必大惊小怪。

漏洞二

发现Compound的第二个严重漏洞 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn)

这个漏洞则似曾相识,基本逻辑还是回调、重入,但是漏洞确比第一个更加严重,而且也容易被利用一些,只要有带钩子的代币,就可以攻击!

于是我第一时间联系一个中间人,然后他们的回复依然是,这个漏洞他们已经发现了!

这次我就不是很理解了,后果如此严重,又比较容易被利用的漏洞,为什么被大家发现了还能够存在?而且堵上这个漏洞只需要调换一下两句代码的顺序就可以了,这样简单却能解决大问题的事情,却没有人做?难道仅仅是因为Compound没有带钩子的代币?

这让我对漏洞的认知产生了怀疑!第一次在本站发布这个漏洞后没多久,觉得内容比较敏感,我就把主要内容都删除了。

漏洞终于被利用

然而,漏洞还是被利用了。March-15-2022 06:28:40 PM +8 UTC,Hundred Finance遭受攻击,黑客获利2363 ETH,总价值超过4000万人名币。Hundred Finance代码源自Compound。利用的漏洞和上文中的第二个思路相同。事实上,黑客可以更狠一些,攻击的时候同时调用exitMarket()退出借贷市场,从而攻击者赎回、借款时,欠款会被全部忽略!

反思

代码是别人的,但是复制过来后,漏洞却是需要自己承受的,如此局面下,我们能够做的,就是严谨对待自己的项目和代码,因为出了问题后,Compound和审计公司都没有义务为你负责。

相关文章

12 条评论

其实情况不是说的那样,不回复你,是因为:你说的这些漏洞,已经被前人分析过很多次了。 你可以找一下 Lendf.me 攻击。

2022-03-23 16:39
jackson 回复 Tiny熊

不回复不是最关键的,关键的是这些漏洞留在代码里,让复制的项目遭殃。

2022-03-23 16:44

您好,您的第一篇文章讲述的攻击还是不太现实,因为totalsupply是在放入池子中的时候直接获得的,totalcash和totalcash之间没有明显变化,所以只是兑换的比例比较小,不存在cTokens的totalsupply仍然很小导致后面用户兑换比例特别高而吃亏

2022-03-23 18:09

您好,您的第一篇文章讲述的攻击还是不太现实,因为totalsupply是在放入池子中的时候直接获得的,totalcash和totalcash之间没有明显变化,所以只是兑换的比例比较小,不存在cTokens的totalsupply仍然很小导致后面用户兑换比例特别高而吃亏

2022-03-23 18:09

您好,您的第一篇文章讲述的攻击还是不太现实,因为totalsupply是在放入池子中的时候直接获得的,totalcash和totalcash之间没有明显变化,所以只是兑换的比例比较小,不存在cTokens的totalsupply仍然很小导致后面用户兑换比例特别高而吃亏

2022-03-23 18:09

您好,您的第一篇文章讲述的攻击还是不太现实,因为totalsupply是在放入池子中的时候直接获得的,totalcash和totalcash之间没有明显变化,所以只是兑换的比例比较小,不存在cTokens的totalsupply仍然很小导致后面用户兑换比例特别高而吃亏

2022-03-23 18:09
Tiny熊 回复 jackson

不认同呢, 这个就像:考试抄同桌作业,然后完了发现抄错了, 然后骂同桌,妈的,给老子错答案。 自作孽不可活。

Compound 没有让你抄,没有所谓的“让复制的项目遭殃”,你要抄是你的事。 项目保持链上链下代码一致,才是负责的态度,而不是让人误以为链上是这样运行的。

2022-03-24 09:01

可以的,文章里面有模拟攻击相关的交易,已经攻击成功了,攻击合约的代码已经在rinkebyscan上验证,可以看下代码逻辑

2022-03-24 10:33
jackson 回复 Tiny熊

题目是说不要再复制Compound的代码了,不是说复制代码多正确。

代码是别人的,但是复制过来后,漏洞却是需要自己承受的,如此局面下,我们能够做的,就是严谨对待自己的项目和代码,因为出了问题后,Compound和审计公司都不会为你负责,可能还觉得你活该!

这句话可能不好听,但是局面就是这样,你复制人家的代码,还把作者改成自己,这本是不应该。然后我因为不想让你复制,就把问题代码给你复制,然后出了问题,我心理特别舒服。这两者都是有问题的。

给后人铺路的,那是前人,给后人挖坑的,是罪人。

另外,Lendf.Me的那次攻击和这个漏洞并不完全一样,虽然都是利用token的钩子回调,但是一个是可以通过重入锁解决的,一个是使用重入锁还是可以攻击的,并且还多了一个exitMarket()的手段。

2022-03-24 10:36

另外,项目保持链上链下代码一致,这个猜想也不成立,这个看其github的提交记录就可以知道。

比较靠谱的,还是看其在etherscan上验证的代码,相信验证,而不是相信某个人,这才是参与区块链该有的态度。

2022-03-24 10:47
Tiny熊 回复 jackson

你的文章事实部分是对的,认同你文章的价值,但是你对Compound的说法全部来自你的揣测,我个人认为是不对的(这个是我前面不认同的部分),以下是你的原文,我加上主语: 开头的:“(Compound)可能还觉得你活该”, 结论里: “(Compound)对于漏洞的态度竟然如此漠然” , 回复第 2 楼的: “(Compound)让复制的项目遭殃 ”

这个我的观点:我们发表文章应该尽量说明事实, 不是揣测。 以上内容我建议修改。

2022-03-24 14:32
jackson 回复 Tiny熊

已改

2022-03-24 14:54