如果你是去中心化的常规用户,那么不会对貔貅诈骗( Honeypot scam)行为感到陌生。即便你没听说过这个词,也一定遇到过这种诈骗行为。Honeypot…
2023-01-1703:42
Go+ Security
2023-01-17 03:42
Go+ Security
2023-01-17 03:42
收藏文章
订阅专栏

培养 Web3 安全意识,从了解新的貔貅代币骗局开始

如果你是去中心化的常规用户,那么不会对貔貅诈骗( Honeypot scam)行为感到陌生。即便你没听说过这个词,也一定遇到过这种诈骗行为。Honeypot 其实是一个类比,本质上是指通过一种蓄意诱骗手段吸引其他人落入陷阱。如果是 Honeypot 代币,则会通过营造各类假象(比如极高的流动性和涨幅)诱骗投资者购买代币,但当他们购买后才发现,因为合约上部署了恶意代码,根本卖不掉这些代币,这就是貔貅骗局( Honeypot scam)。

为了更好地收割用户,貔貅骗局往往会不断更新迭代合约代码和采用更加复杂的实现逻辑,隐藏自己的真实意图,试图逃过安全引擎的法眼或增加安全引擎的分析难度。

GoPlus 的数据显示,2022 年加密市场的貔貅代币总量大幅增长,新增貔貅代币为 64661,与 2021 年同期相比,增长达 83.39%,其中貔貅代币 92.8% 来自 BNB Chain,6.6% 来自以太坊,这两条公链也是最为活跃、Token 最多的公链之一。

貔貅代币陡增的原因之一是去年年底 FTX 事件的影响,大量用户将数字资产从中心化交易所向去中心化钱包转移,导致链上活跃用户激增,攻击者也变得更加活跃。 GoPlus 数据显示,仅在 FTX 事件发生的一周内,新增貔貅攻击方式超过 120 种,攻击次数增长 6 倍。

除了绝对的数量增长趋势之外,在特点上貔貅代币也呈现多样化更加复杂的趋势,从去年一年的安全数据来看,GoPlus 发现,貔貅代币的攻击方式也变得越来越难以发现、越来越隐秘,整体上呈现以下几大特征:

1.混淆代码

通过降低代码可读性,增加无效逻辑或混乱的调用关系,通过复杂的实现逻辑,增加安全引擎的分析难度。

2.伪造知名合约

这类攻击合约会通过假扮为知名的项目合约,比如伪造合约名称、伪造合约实现过程,误导引擎,从而增加风险检测的误判概率。

3.采用更加隐蔽的触发方式

这类攻击合约将攻击的触发条件埋得很深,比如将触发条件隐藏在用户的交易行为中,并且通过对交易行为进行一种更加复杂化的处理(比如嵌套多层判断条件后才出发交易中断、增发或转移等典型的蚍蜉风险行为),从而实现实时修改合约状态和盗取用户资产的目的。

4.伪造交易数据

为了让交易看起来更加真实,攻击者还会随机触发空投、对敲等行为,这样一是可以引诱更多用户上钩,二是可以让交易行为看起来更自然。

鉴于 honeypot 代币变幻莫测的攻击方式,Goplus 计划推出一系列文章,针对对当今市面上新出的合约代码片段的恶意逻辑进行解读,该栏目将定期更新,以下为本系列的第一篇文章,

将对 Goplus token 安全引擎最新检测到的一种 honeypot 代码机制进行代码层面上的特征分析:

该代币在 BSC 上发行,合约地址为:0x8f96e9348898b498a2b4677f4c8abdad64e4349f

该合约代码试图给持币者账户地址设置了一个代币转出额度上限,一旦累计转出代币量超过该上限数值,转账交易会失败,这是一种典型的 honeypot 代币机制,最终导致持有人无法卖出资产。

通过将合约的所有者权限发送给 dead 地址,该代币创建者试图营造一种合约所有权已经被销毁的假象,然而,仔细查看合约代码我们才发现,该合约还构造了一个 setAccSeMaxAmount 方法,通过该函数重新保留了特定权限 — — 设置特定地址最大卖出限额的权限,且可随意更改。

以下我们将从代码层面解读该代币的部署详情:

对代币持有的地址设置卖出额度的上限条件

在 492 行,该合约对卖单设置了限制条件:

to == uniswapV2Pair ,说明有卖出行为发生,此时,通_accSeAmount[from] > 0 这个条件对这个转出地址设置了交易上限,并会对该地址的转出代币数量进行累计,存储到_accSeAmount[from]变量中,接下来 495 行代码中,对交易的执行设置了条件,只有当 1000 万 x 最大总转出(含卖出)限制 >= from 地址的累积转出量该执行才会被执行,一旦不满足该条件,交易就会失败,即意味着,如果该地址的累积转出量超过了最大额度的 1000 万,交易无法执行,用户无法卖出。

setAccSeMaxAmount 方法设置最大转出限额

查看区块浏览器,发现合约所有权已经转给 dead 了,这意味着合约创建者已经销毁了对合约的所有控制权限。那么,这个 _accSeMaxAmount[from] 是在哪设置的呢?

仔细查看合约代码,我们发现,该合约中还构造了一个 setAccSeMaxAmount 方法,该方法可用来对某地址设置最大转出限额_accSeMaxAmount,且该方法只有一个唯一的执行者 contractSender1,此变量在合约部署时赋值为了合约创建者 。

此时我们确定,该合约表面上看起来似乎已 disable 了所有合约创建者的方法权限,实际上则在合约中定义了一个仅可由 contractSender1 调用的函数 setAccSeMaxAmount 通过该函数项目方保留了特定权限 — — 设置特定地址最大卖出限额的权限,且可随意更改。

链下监听

通过查询合约创建者地址的交易记录,我们发现,该地址频繁调用了这个 setAccSeMaxAmount 方法,这意味着该合约在调用 setAccSeMaxAmount 方法对某些地址进行最大卖出额度的限制。查看相应交易记录,我们还发现,黑客是通过链下监听搜集目标代币的买入地址,一旦发现新的持币用户地址,就将其加入黑名单中。

一旦发现这些黑名单中的地址的代币累计卖出数量超过限额,就会交易失败。

随着黑客不断进化自己的攻击方式,安全防御也成为一件极具挑战的任务。

就像 GoPlus 的监测引擎永不停歇地对加密代币相关的攻击面风险进行实时监测一样,对加密安全的学习也将永不停止,只有这样,才能应对这些层出不穷且不断进化的安全风险。

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

专栏文章
查看更多
数据请求中

推荐专栏

数据请求中

一起「遇见」未来

DOWNLOAD FORESIGHT NEWS APP

Download QR Code