时值国庆大假期间,加密钱包初创公司ZenGo的研究员亚历克斯·马努斯金(Alex·Manuskin)爆料称,有用户一夜之间损失了价值14万美元的Uniswap代币UNI,而这与名为UniCats的“收益农场”有关。

据了解,一些参与DeFi提供流动性挖矿赚取收益的用户最近发现了UniCats这个新农场。从界面来看,UniCats类似Yam Finance和SushiSwap;收益方面,不仅可挖矿本地MEOW代币,同时还可挖出包括UNI在内的其它代币。

界面友好,产能不赖,资产入场。

当用户准备提供流动性时,UniCats弹出提示框,要求获取消费限制许可,而该许可的限制是:无限。

用户可能怎么也不会想到,在这个无限消费的许可的背后,UniCats开发者早已暗置了一个直通自家资产的“后门”。用户的资产可由此被悄悄转移至开发者指定的地址。

就这样,有大胆且不幸的“农夫”瞬间被窃取了价值14万美元的UNI,而其他用户也有不同程度的损失。

盗窃“现场”

那么,UniCats开的这个“后门”,又是如何对用户进行窃金操作的呢?

1、盗窃者首先将UniCats的owner权限转移给一个合约地址。

2、盗窃者通过获得owner权限的合约地址调用UniCats的setGovernance方法。

3、setGovernance函数调用对于代币的transferFrom函数,将用户资产转移到盗窃者地址。

第2、3步为此次盗窃的核心步骤,如下图所示:

“后门”分析

UniCats合约中的setGovernance函数是实现盗窃的关键。通过调用此函数,UniCats合约即可作为调用者,能够向任意合约发起任意调用。

据上图所示,调用该方法可输入两个参数 ,即一个地址类型的“_governance”和一个bytes类型的“_setData”。而函数的governance.call(_setupData)其实是表示向参数“_governance”地址发起一笔交易,其calldata为参数“_setData”。如此一来,只要有权限调用这个方法,便可以借合约的身份发起任意交易。

在进行代码编写时,其注释表示此函数是一个修改治理合约的函数,如下图所示:

事实上,根据成都链安的审计经验,修改治理合约通常并不需要调用call。而且,UniCats在对用户资产进行盗窃时,还刻意多次变换owner地址,如下图所示:

不仅如此,资产在转出后还立刻被流入混淆器,如下图所示:

如此操作,老练狠辣、一气呵成,因此基本可以断定,该项目就是一个彻头彻尾的骗局,为的就是钓鱼诈骗而上线。 

令人细思极恐的是,在本案例中盗窃者调用了transferFrom方法对用户的资产实施转账,这就使得即便存在于钱包的用户资产,也可能面临被盗的风险。由于在合约授权时发起的是无额度限制授权,因此,一旦授权许可通过,合约就有权转移用户所有的资产。

成都链安郑重提醒,用户在进行合约授权时,使用多少,授权多少。这样操作的话,即便不幸遭遇类似欺诈性质的合约,也不会殃及钱包中的本金。如果用户不太清楚自己的授权情况,可以通过以下工具进行查询。

1https://approved.zone

2https://revoke.cash

3https://tac.dappstar.io/#/

小结

于DeFi领域,用户获得新币的门槛大大降低,通过组合资产投资的确可能在短期内实现大规模的增值收益。但是,用户资产可能面临的风险状况就变得更为复杂,在这点上必须引起高度注意。

在DeFi这个“黑暗森林” ,大胆冒险是禁忌一般的行为。用户资产不仅要受到客观行情波动的影响,质押时是否遭受“清算”也无法预知,而合约中的人为陷阱更是无处不在。

尤其是,不少DeFi项目都存在代理转账的逻辑,多数项目方也会直接要求用户授权最大值。也就是说,用户授权后,某些不良合约将利用留“后门”的手段,反噬用户所持的全部资产。 

因此,对于用户而言,来自合约的一切许可请求都要格外注意,宁理性退场,不冒然入坑,时刻警惕恶意项目方的此类“后门”陷阱。​​​​