Web3 Hack Series : Phishing Attack with tx.origin
안녕하세요. 스마트 컨트렉트 개발자 개발이 체질의 최원혁입니다.
이번 Web3 Hack 시리즈는 tx.origin 함수를 이용한 스마트컨트렉트 피싱 공격에 대해 다뤄보겠습니다.
🔎 실습으로 다루는 Solidity 코드는 게시글 마지막에 github 링크를 참고해주세요.
Smart Contract Phishing Attack 취약점 : tx.origin
msg.sender VS tx.origin
스마트컨트렉트 개발자는 흔히 msg.sender 함수를 많이 사용할 겁니다. 하지만 tx.origin은 정말 옛날 Solidity 코드가 아니면 잘 볼 수 없습니다. 아래 예시를 통해 자세하게 알아보겠습니다.
- ContractA Address : 0xf8e...9fBe8
- ContractB Address : 0xD7A...F771B
- Wallet Address : 0x5B3...eddC4
위 Solidity 코드를 보면 ContractA와 ContractB가 있습니다.
ContractA의 function callContractB() 함수 코드를 보면 ContractB의 function getContractA() 함수를 호출하는 걸 알 수 있습니다. 그리고 함수 getContractA()는 msg.sender과 tx.origin을 결과값으로 리턴합니다.
- msg.sender : 0xf8e...9fBe8
- tx.origin : 0x5B3...eddC4
function callContractB()를 실행해서 msg.sender과 tx.origin의 값을 확인할 수 있습니다.
msg.sender는 해당 함수를 호출한 ContractA의 주소가 리턴 됐고,tx.origin은 해당 함수 호출 트랜잭션을 보낸 지갑의 주소가 리턴된 것을 확인할 수 있습니다.
msg.sender: 스마트 컨트렉트의 기능을 직접 호출하는 계정의 주소 또는 스마트 스마트컨트렉트의 주소를 나타냅니다.
tx.origin: 스마트 컨트렉트의 기능을 호출하는 계정의 주소를 말하며 계정 주소만 tx.origin이 될 수 있습니다.
Solidity의 msg.sender와 tx.origin은 위와 같이 정의할 수 있습니다.
Smart Contract Phishing Attack 방법 : 피싱 컨트렉트(Phishing Contract)
해커는 Solidity의 msg.sender와 tx.origin의 차이점에서 취약점을 발견하여, 피싱(Phishing) 사이트를 만들어 지갑주소에 들어 있는 암호화폐를 탈취하였습니다.
Example Code
ERC20 Contract와 Phishing Contract가 있습니다.
require(tx.origin == _from, "Not owner");
ERC20 Contract의 function transfer()의 첫 번째 require을 보면 tx.origin == _from을 확인할 수 있습니다. 해당 예외처리로 토큰을 보유하고 있는 주인만 전송할 수 있게 코딩되었습니다.
function attack() public {
_ERC20.transfer(msg.sender, AttackerAddress,_ERC20.getBalance(msg.sender));
}
하지만 해커는 tx.origin의 특성을 이용하여 function attack() 함수를 통해 사용자가 보유 중인 토큰을 본인의 지갑주소로 옮기는 가짜 컨트렉트를 만들었습니다.
그리고 피싱사이트를 만들어서 사용자가 Phishing Contract의 attack() 함수를 실행시키도록 만들었고, ERC20 Contract의 예외처리된 tx.origin == _from 부분을 문제없이 통과하며 Atacker Address로 사용자의 토큰이 전송하게 만들었습니다.
사용자는 당연히 본인의 토큰을 다른 사람에게 전송하는 트랜잭션을 ERC20 Contract에 보낸 것이 아닌, 다른 Contract를 통해 ERC20 Contract의 transfer() 함수를 호출했기에, 문제가 없다고 판단했습니다. 하지만 tx.origin은 이를 구분하지 못했고, 결과적으로 피싱 컨트렉트에 의해 사용자의 토큰은 도난당하게 되었습니다.
실제로 이런 사례는 Solidity 0.6에서 빈번하게 일어났습니다. 때문에 암호화폐와 토큰에 관련된 스마트컨트렉트는 tx.origin 대분 msg.sender 사용을 권장했고, Ethereum Request Comment(ERC)에 등재되며 모든 스마트컨트렉트 코드가 바뀌었습니다.
Smart Contract Phishing Attack 사례 : ThorChain 프로토콜
탈중앙화 암호화폐 거래서 ThorChain 프로토콜은 2021년 7월 Phishing Attack로 인해 약 800만 달러의 자산을 잃었습니다.
심지어 해커는 커뮤니티에 메시지를 남기며 해당 프로토콜의 취약점을 알려주기도 했습니다.
이후 ThorChain 개발팀은 디스코드 커뮤니티에 피싱사이트에 대한 경고를 남기며 홀더들에게 주의를 주며, 1차적인 피해로 사건을 마무리할 수 있었습니다.
About. ThorChain 프로토콜 Phishing Smart Contract Attack
https://www.adrianhetman.com/unboxing-tx-origin/
📌 전체 코드 Github :
https://github.com/imelon2/My-Solidity-Playground/blob/main/Hack%20Series/Tx_Origin.sol
📘 Reference :
https://davidkathoh.medium.com/tx-origin-vs-msg-sender-93db7f234cb9
https://0xsage.medium.com/ethernaut-lvl-4-walkthrough-how-to-abuse-tx-origin-msg-sender-ef37d6751c8
https://www.adrianhetman.com/unboxing-tx-origin/
'Block Chain > Hack Series' 카테고리의 다른 글
[Hack Series] 51% 공격이란? || 고아 블록 Orphan Blocks | 체인재구성 Chain Reorganization || (1) | 2023.02.25 |
---|---|
[Hack Series] 컨트렉트 주소를 지갑주소로 속이는 방법 || Solidity 0.8 | Zero Code Size || (0) | 2023.01.31 |
[Ethernaut Challenge] Fallout 문제풀이 (0) | 2023.01.06 |
[Hack Series] Front Running & Sandwich Attack || Block-Chain || KR (0) | 2022.12.12 |
[Hack Series] 블록체인 컨펌 이란? || Blockchain Security || (0) | 2022.10.29 |
댓글