SMT整型溢出漏洞分析笔记

作者:腾讯湛泸实验室

来源:https://weibo.com/ttarticle/p/show?id=2309404232782242012923#_0

此次漏洞发生的虚拟货币为SmartMesh(简称SMT),目前该货币以以太坊智能合约的形式发布,Token为0x55f93985431fc9304077687a35a1ba103dc1e081,最初触发漏洞的交易记录位于下图所示的交易记录上:

异常交易记录
根据图中Input Data中的信息,定位到SMT中发生错误的智能合约函数transferProxy,该函数主要用于没有以太币的SMT币拥有者,将签署过的交易信息交由第三方节点进行发布,而消息的发送节点会收到SMT币作为酬劳。

漏洞函数截图
该函数的第一行对于此次交易转出者的余额进行校验。交易记录中的0-6变量依次对应于该函数的7个参数,此处的_feeSmt + _value实际为:

0x7000000000000000000000000000000000000000000000000000000000000001 +
0x8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

运算结果会被映射为uint256型数据,因此会发生无符号整型数据的上溢,使计算结果为0,从而绕过了此处检查。这最终将导致msg.sender(发送交易消息的节点)和_to(钱币接受者)代表的钱包在记账时分别记入feeSmt(0x7000……)和_value(0x8FFF……)个SMT货币。这一过程被同样被记录在了以太坊的交易记录中,如下图最后两条记录所示,而后续发生的交易则是攻击者向其他钱包进行钱币转移的操作。

攻击者账户交易信息