Tx.origin鉴权使用不当
简单介绍
tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址,在智能合约中使用此变量进行身份验证可能会使合约受到类似网络钓鱼的攻击
案例分析
contract Phishable {
address public owner;
constructor () public {
owner = msg.sender ;
}
function () public payable {} // collect ether
function withdrawAll(address _recipient) public {
require(tx.origin == owner);
_recipient.transfer(this.balance);
}
}
该合约有三个函数:
- constructor构造函数,指定合约owner
- fallback函数,通过添加payable关键字以便接收用户转账
- withdrawAll函数,对tx.origin进行判断,如果tx.origin是owner,则将合约地址所拥有的ether发送到_recipient中
现在攻击者创建了以下合约: