tx.origin 사용 시 주의
8437 단어 soliditysecuritybestpractice
tx.origin
및 msg.sender
가 있습니다. 다음은 둘 사이의 차이점입니다.tx.origin
- Alice -> 계약_A -> 계약_B; tx.origin
= 앨리스msg.sender
- Alice -> 계약_A -> 계약_B;msg.sender
= 계약_A피싱 공격의 가능성이 있으므로 tx.origin을 사용하는 동안 주의하는 것이 중요합니다.
예를 들어 이해해 봅시다.
transfer()
함수에서 tx.origin
가 발신자가 Alice인지 확인하는 데 사용되는 것을 볼 수 있습니다.contract Victim {
address owner;
constructor() {
owner = msg.sender; // Alice
}
receive() external payable {
}
function transfer(address _to, uint amount) external payable {
require(tx.origin == owner, "Only owner can cause this txn");
(bool sent,) = _to.call{value: amount}("");
require(sent, "Send txn failed");
}
function getBalance() external view returns(uint) {
return address(this).balance;
}
}
공격자는 Alice를 속여 공격자 계약의 기능
attack()
을 호출함으로써 이를 이용할 수 있습니다.transfer()
가 Alice와 같은 Victim 계약의 tx.origin
함수를 호출합니다.interface IVictim{
function transfer(address _to, uint amount) external payable;
function getBalance() external view returns(uint);
}
contract Attacker {
address attacker;
IVictim victimContract;
constructor(address _victim) {
attacker = msg.sender;
victimContract = IVictim(_victim);
}
function attack() external payable { // attacker will trick Alice to call this function
victimContract.transfer(attacker, address(victimContract).balance);
}
}
이러한 피싱 공격은
msg.sender
대신 tx.origin
를 사용하여 방지할 수 있습니다.Alice가 Attacker 계약의
attack()
함수를 호출하도록 사기를 당하더라도 이것이 transfer()
함수를 호출할 때 msg.sender
는 Attacker 계약의 주소와 같기 때문입니다. 따라서 트랜잭션이 실패합니다.contract VictimSafe {
address owner;
constructor() {
owner = msg.sender;
}
receive() external payable {
}
function transfer(address _to, uint amount) external payable {
require(msg.sender == owner, "Only owner can cause this txn");
// changing tx.origin to msg.sender, to avoid phishing attack
(bool sent,) = _to.call{value: amount}("");
require(sent, "Send txn failed");
}
function getBalance() external view returns(uint) {
return address(this).balance;
}
}
Reference
이 문제에 관하여(tx.origin 사용 시 주의), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rushanksavant/careful-while-using-txorigin-5c90텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)