界: 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