gaia version 0.26.1-rc1
发现bug的源码文件是 github.com/cosmos/cosmos-sdk/x/auth/ante.go,下面是关键部分
通过构造一定的条件,使程序只执行步骤一和步骤二,忽略步骤三,这样,就可以凭空产生代币。这里产生的代币是会按照Power比例分给所有validators,另外,打块的validator会多分一些。
如果想利用上面这个漏洞,我们必须有一个validator节点,同时需要构造一种交易,符合下面两个条件
- 交易签名是错误的
- 交易消费(fee)大于0(等于0的话,不产生任何影响;小于零的话,会产生另外一个问题,和本次hack无关)
要想满足这两个条件,我们就需要修改客户端gaiacli代码和服务端gaiad代码
重新编译之后,使用gaiad-hack重新启动区块链程序,然后使用gaiacli-hack发送恶意交易
/home/ec2-user/cosmos-sre/bin/hack/gaiacli-hack tx send \
--from wall-e \
--to cosmos1uer4my4l3v7qlwz75qr5tzdu8qk5mgftypyzff \
--amount ${NUM}steak \
--fee 300steak \
--sequence $SEQ \
--async \
--chain-id gaia-9001
上面这条命令,循环执行500次,就可以发行150000个代币了。