界: Security Features

软件安全不是安全软件。此处我们关注的主题包括身份验证、Access Control、机密性、加密和权限管理。

Authorization Bypass: tx.origin

Abstract
函数使用全局变量 tx.origin 进行授权。
Explanation
tx.origin 全局变量保存发起交易的帐户地址。

如果智能合约 S1 从帐户 A1 收到交易,然后 S1 调用另一个智能合约 S2,然后在 S2 内部,tx.origin 包含帐户 A1 的地址,用于调用 S1。如果 tx.origin 的意图是验证 A1 的授权,那么将绕过此授权。

现在,如果攻击者可以诱骗用户将交易发送到恶意合约,然后该合约调用易受攻击的合约,在这种情况下用户通过 tx.origin 获得授权,然后 tx.origin 将保存发起交易的用户帐户的地址,并且将绕过授权。

示例 1:以下代码要求合约所有者(之前在构造函数中设置)与 tx.origin 相同,然后才能将资金转到提供的地址。

如果攻击者能够诱骗合约所有者将交易发送到恶意合约,该合约将立即调用易受攻击的合约中的 sendTo 函数,然后 require 语句中的条件将为 true,并且会将资金转到攻击者合约在调用 sendTo 时指定的任何地址。


function sendTo(address receiver, uint amount) public {
require(tx.origin == owner);
receiver.transfer(amount);
}
References
[1] Enterprise Ethereum Alliance No tx.origin
[2] Standards Mapping - CIS Azure Kubernetes Service Benchmark 4
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 4
[4] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 3
[5] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[6] Standards Mapping - Common Weakness Enumeration CWE ID 477
[7] Standards Mapping - Smart Contract Weakness Classification SWC-115
desc.structural.solidity.swc115