상세 컨텐츠

본문 제목

솔리디티 깨부수기 - Security 1강 재진입 공격(re-entrancy attack) 이란?

솔리디티 깨부수기 - Security

by D_One 2022. 7. 30. 16:20

본문

안녕하세요, 

 

오랜만에 인사드리네요, 제가 블로그는 너무 소홀히 했네요.

알람이 안와서 계속 잊어버리고 있었습니다. 

답글 못 달아주신분 죄송합니다 ㅠㅠ;; 

유튜브는 알람이 잘 와서 확인하기 쉬우니 제가 만약 답글이 없다면 유튜브에 달아주시면 감사하겠습니다.  

 

사실 제가 최근에 ERC20강의를(https://inf.run/5qrS) 오픈을 했는데요. 

해당 강의에서 재진입 공격에 대해서 계속 언급하게 돼서 솔리디티 깨부수기 - Security강의를 찍고자 합니다.

사실 스마트 컨트랙트 잘 작성을 해도, 보안이 없다면 정말 큰문제가 되기에 보안이 정말 중요합니다!

 

 

TLDR ; 유튜브에서 편하게 확인하세요 :))

https://www.youtube.com/watch?v=mFbZE-p4ges

 

 

 

재진입 공격이란?

트랜잭션이 끝나기도 전에 재진입해 이더를 탈취하는 공격! 

 

먼저 그림1을 보시면 은행을 나타내는 스마트 컨트랙트 Bank가 있습니다.

 

 

 

그림1 Bank 스마트 컨트랙트는 Deposit과 Withdraw 함수가 있다.

Bank는 2개의 함수 Deposit()Withdraw() 함수가 있습니다. 

 

Deposit함수는 Bank 스마트 컨트랙트에 이더를 입금하는 함수입니다.

Withdraw함수는 Bank 스마트 컨트랙트에 예치한 이더를 출금하는 함수입니다. 

 

그림 2 user1, user2, user3 각 2이더씩 입금

그림 2를 보시면 User1,User2, User3은  Deposit함수를 통해 각 2 이더씩 Bank에게 입금하고 있습니다.

즉 Bank에는 총 6이더가 있습니다. 

 

그림3 Attacker 스마트 컨트랙트가 1이더 입금

그림 3을 보시면 Attacker 스마트 컨트랙트는 1이더를 입금하고 있습니다. 

 Bank에는 총 7이더가 있습니다. 

 

여기서 저희가 의문을 가져야할 점이 있습니다.

User1,User2, User3은 EOA(Externall Owned Accounts) 즉 유저가 암호화폐 지갑으로 이더를 입금 한것인입니다. 

Attacker는 CA(Contract Accounts), 즉 스마트 컨트랙트가 1이더를 Bank 스마트 컨트랙트에게 입금 한점입니다.

그리고 Attacker가 바로 재진입공격을 하면되는데 왜 1이더를 입금했을까요? 

 

자 그래서 정리를 하자면, 저희가 의문을 가져야할 점입니다.

1. Attacker가 스마트 컨트랙트

2.Attakcer가 이더를 입금 

 

 

그 다음 그림을 보도록 하겠습니다. 

 

 

그림4 Attakcer는 자신이 예치한 1이더를 찾고자 Withdraw 함수를 실행

 

그림 4를 보시면, Attacker는 1이더를 입금하자마자 Withdraw함수를 통해 출금합니다. 

 

 

그림5 1이더를 반환하는 Bank 그리고 Attacker의 receive는 다시 withdraw()함수를 부른다.

 

그림 4에서 AttackerBank에게 Withdraw함수를 호출해, Bank는  1이더를 Attacker에게 줍니다.

그런데!, Attackerreceive 함수가 있기 때문에 다시 한번 Withdraw함수를 호출합니다.

자 그러면 Bank는 다시 1 이더를 줍니다. 그러면 또 Attackerreceive 함수는 다시 한번 Withdraw함수를 호출합니다.

 

자 이걸 무한 반복하다 보면, Bank의 모든 이더(7이더) 고갈이 나고 다음 그림과 같이 됩니다. 

그림6 Bank의 모든 이더 (7 이더)를 가진 Attacker.

그림6에서 볼 수 있듯이 모든 이더는 Attacker가 갖게 되었습니다. 

트랜잭션이 끝나기도 전에, Attakcer가 계속 재진입한것을 알 수 있습니다. 

 

자 그러면 의문점을 풀어 보도록 하겠습니다. 

 

1.왜  Attacker가 스마트 컨트랙트? 

Receive함수를 통해 재진입 하기위해서 

 

2.Attakcer가 이더를 입금 ?

재진입 공격을 하려면 Withdraw 함수를 실행해야한다.

그런데, Withdraw 함수를 실행하려면 약간의 이더를 Bank 스마트 컨트랙트에 예치를 해야하니까

 

재진입 공격이 성립하기 위해서는, 

1. 스마트 컨트랙트가 1이더를 입금해야합니다.  

2. 출금할 권한이 필요하다. 

 

다음 시간에 코드를 보도록 하겠습니다. 

 

관련글 더보기