白帽黑客samczsun:针对NFT资产的进攻会越来越频繁

注:原文作者是拥有“审计上帝”之称的白帽黑客samczsun,同时他也是Paradigm的研究合资人,其最近脱手拯救了BitDAO MISO荷兰拍卖资金池中的3.5亿美元资产,而在这篇文章中,他提醒了关于NFT代币尺度的潜在安详风险,他还预测称,跟着ERC-721和ERC-1155代币尺度变得越来越风行,针对NFT的进攻很大概会越来越频繁。

假如你从事软件工程方面的事情,很大概你传闻过至少一条软件工程原则。固然我不主张严格遵守每一条原则,但有一些确实是值得存眷的。

我本日要讲的就是最小惊奇原则,它有一个怪异的名字,但却是一个很是简朴的想法。它所说的是,当泛起声称要做某件事的代码时,大大都用户城市假设它是如何完成这件事的。因此,作为开拓人员,你的事情是编写切合这些假设的代码,这样你的用户就不会感想意外。

这是一个很好的原则,因为开拓人员喜欢对事物举办假设。假如你导出一个名为calculateScore(GameState) 的函数,许多人就会假设该函数只会从游戏状态中读取。假如你还改变了游戏状态,你会使得许多人面对狐疑的状态,他们试图弄清楚为什么他们的游戏状态会随机被粉碎。纵然你把它放在文档中,仍然不能担保人们会看到它,所以最好首先确保你的代码不会令人惊奇。

“6小时的调试事情,可觉得你们节减5分钟的文档阅读时间。”

越安详越好,对吗?

早在 2018 年头,当ERC-721 尺度被起草出来时,有人就提出了实施转账安详性‌的发起,以确保代币不会被卡在不消于处理惩罚代币的接管者合约中。为此,提案作者修改了transfer函数的行为,以查抄吸收方是否可以或许支持代币转账。他们还引入了unsafeTransfer函数,假如发送者愿意,该函数将绕过这个查抄。

然而,由于担忧向后兼容性,这个函数在随后的提交中被重定名了。这使得ERC-20 和 ERC-721 代币的transfer函数表示沟通。可是,此刻需要将吸收方查抄转移到其他处所。因此,尺度作者就引入了safe类函数:safeTransfer 以及 safeTransferFrom。

这是一个关于合法性问题的办理方案,因为有很多 ERC-20 代币被意外转移到从未期望收到代币的合约的例子(一个出格常见的错误是将代币转移到代币合约中,将其永久锁定)。而在起草 ERC-1155 尺度时,提案作者从ERC-721尺度罗致了灵感,不只在转账时,并且在锻造(mint)也纳入了吸收方查抄,这一点也不敷为奇。

在接下来的几年里,这些尺度大多处于休眠状态,而 ERC-20代币尺度保持了它的风行状态,而最近gas本钱的飙升,以及社区对NFT乐趣的加强,自然而然导致开拓者越来越多地利用ERC-721和ERC-1155代币尺度。有了这些新的乐趣,我们应该名誉这些尺度的设计思量了安详性,对吗?

越安详越好,真的吗?

Ok,但对付转帐和锻造来说,安详意味着什么呢?差异的当事人对安详有差异的表明。对付开拓人员来说,一个安详函数大概意味着它不包括任何bug或引入特另外安详问题。而对付用户来说,这大概意味着它包括特另外护栏,以掩护他们不被意外射中本身的脚。

事实证明,在这种环境下,这些函数更多的是后者,而较少会是前者。这是出格令人遗憾的,因为在transfer和safeTransfer函数之间举办选择时,你为什么不选择安详的谁人函数呢?名字都浮现出来了!

好吧,个中的一个原因大概是我们的老伴侣reentrancy(可重入性),可能我一直在尽力将其重定名为:不安详的外部挪用。追念一下,假如吸收方是进攻者节制的,则任何外部挪用都大概不安详,因为进攻者大概会导致你的合约转换为未界说状态。按照设计,这些“安详”函数执行对代币吸收者的外部挪用,凡是在锻造或转移期间由发送者节制。换句话说,这实际上是不安详外部挪用的教科书示例。

可是,你大概会问本身,假如答允吸收方合约拒绝他们无法处理惩罚的转账,那最坏的效果是什么?好吧,让我通过两个案例研究来答复这个问题。

例子1: Hashmasks

Hashmasks是一个供给有限的 NFT头像项目,用户每次生意业务最多可以购置 20 个mask NFT(尽量它们已经售罄数月了)。下面是购置mask的函数:

你大概以为这个函数看起来很是公道。然而,正如你大概已经预推测的,在 _safeMint 挪用中埋没着一些险恶的对象。让我们来看看。


免责声明:数字资产交易涉及重大风险,本资料不应作为投资决策依据,亦不应被解释为从事投资交易的建议。请确保充分了解所涉及的风险并谨慎投资。OKEx资讯站仅提供信息参考,不构成任何投资建议,用户一切投资行为与本站无关。