作者:korpi,Degen Score Citadel成员
编译:PANews
你知道在Metamask中的一条简单签名就可以把你钱包的资产变的一干二净吗?一位经验丰富、Degen评分前10名(译者注:Degen排名前10的玩家,分数需达到3000左右,过去两三年来一直不间断进行链上操作)的用户在一次漏洞中损失了近50万美元。
这件事是如何发生的?我们又如何避免?
一个安静的下午,乔(化名)注意到469k USDC离开了他的钱包。这不是简单的转移,因为攻击者显然无法访问乔的钱包。这是一份恶意合约,转光了他地址中的所有USDC。
我们先暂停故事来解释一些技术细节。
USDC代币是以太坊上的合约。它有许多功能定义了我们如何与USDC交互,以及可以用它做什么。让我们关注两个功能:
> transfer
> transferFrom
> transfer
当你在钱包之间转移USDC(或其他 ERC20)时,你使用了转账功能。它将代币从调用者(调用函数的地址)移动到其他地址。如果要代表你进行恶意转账,必须有人控制你的钱包。
> transferFrom
当你与合约交互时,它们使用 transferFrom 来移动你的代币。这些合约最多可以占用你在授权功能中设置的授权金额。如果你允许一个合约可以无限量使用你的的USDC,它就可以全部拿走。
如我以前所说,你知道如何保护自己免受导致许多人丢失宝贵NFT的网络钓鱼攻击吗?
作恶的人发明了越来越多复杂的方法来获取你的JPEG,但他们通常依赖于使用相同的漏洞。
许多NFT持有者的JPEG被盗。高级的加密用户过去常常取笑他们,认为他们对只有“菜鸟”才会上当的简单网络钓鱼策略免疫。但上周Uniswap V3流动性头寸(也是 NFT)也以同样的方式被盗。
许多漏洞利用不再是使用最明显的方式,即偷盗他们的私钥或者助记词。人们现在更聪明了,不会在Telegram和Discord上与冒充客服的人分享他们的私钥。但他们仍然是被盯上的对象。
要了解这些漏洞利用的工作原理,你需要熟悉以太坊和其他EVM链上的“授权”概念。
第一部分:理论
无需信任任何人即可保管自己的资产是区块链的本质。如果你的钱包中有可替代 (ERC20) 或不可替代 (NFT) 代币,那么没有人可以从你那里拿走它们,除非你让他们这样做(授权)。
授权是授予第三方访问你资金的权限的行为。未经授权,智能合约不能在你的钱包中使用资产——你不能在Uniswap上出售ERC20或在Opensea上列出 NFT。让我们更深入地了解授权的工作原理。
你授权合约以获取ERC20s类型的X个代币TKN。
- 被授权的合约可以随时从你的钱包中取出X个TKN。
- 有没有硬件钱包都没有关系。
- 直到 X 个TKN被合约转走或你撤销授权。
你授权合约以访问某个NFT藏品CLN中的所有物品。
- 被授权的合约可以随时从你的钱包中取出CLN中的所有物品。
- 有没有硬件钱包都没有关系。
- CLN被授权,直到你撤销授权。
与区块链上的智能合约交互需要授权,但也很危险。许多漏洞利用实际上非常简单——一位不知情的受害者授权了一份恶意合约,该合约从受害者的钱包中获取了授权的ERC20/NFT。
如何避免?
第二部分:实践
以太坊和其他EVM链上的大多数用户都使用 Metamask,所以我将使用这个钱包来演示如何保护你的资产不被盗。我们集中来说ERC20s和NFTs的授权,以便你将来永远不会授权恶意合约。
假设你想在 Uniswap 上出售$APE 。第一步是授权 -如下面的 Metamask 弹出窗口。
它很好地解释了你在做什么 - 允许合约访问你的 APE。但它对保护你免受网络钓鱼几乎没有作用。
你该怎么办?
1. 检查你正在授权的合约。
如果前端被黑了怎么办?或者你在钓鱼网站上?你可能会被诱骗授权一项恶意合约,该合约会扣押你的代币。检查Etherscan上的合约-他们有对你有用的标签。
2.检查你正在授权的代币
想象一下,一个恶意网站触发了对WETH的授权,而不是空投给你的无价值代币。这可能会偷光你的钱包的WETH。仔细阅读Metamask弹出窗口。
3.查看授权限额
大多数dapp都要求对代币进行无限制授权。如果将来授权的合约落入恶意者手中,它可以从你的钱包中拿走所有授权的代币。因此在发送交易之前检查和编辑授权限额。
4.撤销不必要的授权。
如果你预期未来不再与这个合约交互,请撤销其访问你的代币的权限。有些合约是安全的,但也请谨慎,安全总比后悔好。
使用https://etherscan.io/tokenapprovalchecker撤掉授权。
当涉及到你的ERC20时,这些是保持高安全级别的简单步骤。不幸的是,它对NFT的用户友好度有点低,这是大多数授权漏洞针对NFT持有者的原因之一。
假设你想在OpenSea上挂出你的NFT。第一步是授权 - 如下面的Metamask弹出窗口。
与ERC20不同,这里非常神秘-很难知道你在做什么。为了确保你的JPEG文件安全,你需要保持警惕并遵循以下准则。
1.检查你正在授权的地址
如果你授权了恶意合约,别人可以立即从你的钱包中取出已授权集合中的所有NFT。因此确保你信任合约。现在转到Etherscan并检查标签以了解它是什么。
2. 在Metamask中保存可信地址
Metamask为你提供了为地址添加昵称的选项。保存后,它们将显示在弹出窗口而不是0x字符串中,因此你将立即知道你正在与哪个地址进行交互。添加昵称以避免被网络钓鱼。
3.检查你正在授权的集合
确保你不会被诱骗授权你不想授权的集合。这可能是在你没有密切注意的情况下试图窃取你宝贵的JPEG文件。转到数据选项卡并检查Etherscan上的集合。
4.撤销不必要的授权
撤销NFT的授权不如ERC20常见,但风险是相同的。因此,如果你将来不打算与合约交互,请删除其访问你的NFT的权限。
使用https://etherscan.io/tokenapprovalchecker撤销授权。
按照这些简单的步骤,你将避免许多恶意网站设置的网络钓鱼陷阱。
加密货币中的许多漏洞利用不涉及任何黑客攻击。当你与智能合约交互时,他们只是利用你的注意力不集中。重视审批,不输就赢。
回到乔的故事……
前面提到的偷光Joe的USDC的合约交互确实是transferFrom函数。但是,只有在乔授权了使用他的USDC的合同时,transferFrom才会起作用。
乔100%确信他在此期间没有做任何授权。
等一下...
DeBank历史清楚地显示,在漏洞利用前10分钟,乔的USDC对恶意合约无限授权......
乔真的同意了吗?
是的。但也没有。不是直接的。
Etherscan可以看到,无限授权不是Joe自己调用的授权函数。它是由其他地址调用的授权函数,它授予恶意合约使用Joe的所有USDC的权限。
怎么回事?其他人如何代表你授权合约?
引入授权功能是为了改善以太坊的用户体验。它允许用户在不提交交易的情况下修改授权金额。一个签名就足够了。有了你的签名,任何人都可以调用授权功能并更新你的消费限额。
当你使用1inch dApp时,你可以看到授权在起作用。如果你想出售USDC,你不必先授权给它,只需要签署一条消息即可。此签名授予1inch使用你所有USDC的权限。 1inch不会这样做,但恶意合约会。
乔一定是不小心在恶意网站上签名了这样的消息。不幸的是,这一次他使用了热钱包,签名只是一个看似一不留神的点击。使用硬件钱包,在外部设备上签名消息时会有一个三思而后行的提示。
借助乔的签名,作恶的人提交了具有授权功能的交易。它允许恶意合约使用Joe钱包中的所有 USDC。然后调用transferFrom函数,偷光了所有资金。
很显然签名可能是灾难性的。在某些情况下,Metamask会警告你签名的消息可能是危险的。但那些在技术上是按照原本设计好的流程工作的签名授权则不然,这如果被滥用,会造成很大的损失。