본문 바로가기
Block Chain/Hack Series

[Hack Series] Smart Contract Phishing Attack with tx.origin || Solidity 0.8 | tx.origin || KR

by 개발이 체질인 나그네 2022. 12. 26.
반응형

 

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 코드가 아니면 잘 볼 수 없습니다. 아래 예시를 통해 자세하게 알아보겠습니다.

 

example

 

  • 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/
 

Unboxing tx.origin. Rune Token case

Today we saw how ThorChain protocol get rekt on multiple levels. First we saw a black-hat attack the protocol and steal $8M. > THORChain has suffered a sophisticated attack on the ETH Router, around $8m. The hacker deliberately limited their impact, seemin

www.adrianhetman.com

 

 


📌 전체 코드 Github :

https://github.com/imelon2/My-Solidity-Playground/blob/main/Hack%20Series/Tx_Origin.sol

 

GitHub - imelon2/My-Solidity-Playground

Contribute to imelon2/My-Solidity-Playground development by creating an account on GitHub.

github.com

 

📘 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/

 

 

 

반응형

댓글