① 攻击者(地址: 0x50f753c5932b18e9ca28362cf0df725142fa6376)通过低价收购大量True Seigniorage Dollar项目代币TSD,然后利用大量的投票权,强行通过2号提案。图1:TSD项目2号提案的目标(恶意)代币实现合约以及提案人信息
② 在2号提案中,攻击者提议并通过了将位于0xfc022cda7250240916abaa935a4c589a1f150fdd地址的代理合约指向的实际TSD代币合约地址,改为攻击者通过另外地址0x2637d9055299651de5b705288e3525918a73567f部署的恶意代币实现合约。恶意代币实现合约地址:0x26888ff41d05ed753ea6443b02ada82031d3b9fb图2:代理合约指向的代币实现合约通过2号提案被替换为恶意代币实现合约

图3:攻击者利用所持地址之一建立恶意代币实现合约
③ 当2号提案被通过后,攻击者利用地址0x50f753c5932b18e9ca28362cf0df725142fa6376,实施确定提案中包含的新代币实现合约地址0x26888ff41d05ed753ea6443b02ada82031d3b9fb。图4:攻击者利用所持地址之一确定2号提案,并向所持另一地址铸造巨额TSD代币
④ 同时,位于0x26888ff41d05ed753ea6443b02ada82031d3b9fb地址的恶意合约中的initialize()方法也会在升级过程中被调用。通过反编译恶意合约,可以得知恶意合约的initialize()方法会将约116亿枚TSD铸造给攻击者的另外一个地址0x2637d9055299651de5b705288e3525918a73567f。图5:代理合约合约在升级代币实现合约的时候会同时调用initialize()方法

图6:反编译恶意代币实现合约中initialize()方法向攻击者地址铸造代币
⑤ 当以上攻击步骤完成后,攻击者将所得TSD代币转换成BUSD,获利离场。图7:攻击者将116亿TSD代币通过PancakeSwap交易为BUSD