BlockChain

Solidity re-enterancy

부산대보금자리 2022. 1. 20. 17:26

 

기본적인 재진입 패턴

Deposit() -- > user token 또는 balance 올린다

이후 withdraw로 Deposit한 balance를 확인하고 출금한다.

이때 악의적인 fallback function 동작하면서 다시 withdraw 동작

 

 

방지 패턴

1) Call 방지

2) 전송전 로직 진행

3) mutex(= re-enterancy guard)

 

그러나 

최근 공격은 Call과 같은 명시적인 출금 함수로 인해 진행되는 것이 아니다. 토큰을 활용한 거래에서 사용되는 로직에서 발생 

 

 

 

* CEI pattern

Make Checks ->make change -> all another contract

 

 

  1. 2020.04- Uniswap/Lendf.Me hacks

Supply 함수는 deposit하는 token 다루는 함수인데 asset address 토큰의 수를 입력 받는다.

  1. Msg.sender의 asset에서 balance 읽는다.
  2. 그리고 checkTransfer함수가 asset 불러서 입금하고자하는 해당 token 가지고 있는지 확인한다.
  3. doTransfer함수는 asset transferFrom함수를 불러서 해당 컨트랙트 주소로 토큰을 전송받는다. 전송받은 후에 supply 함수는 유저의 deposit balance 업데이트한다.

Withdraw function withdraw하고자하는 token 양을 입력받고 유저가 가지고 있는지 확인한다. 그리고 transfer함수를 사용하여 전송한다.

Issue 생기는 곳은 supply function내의 asset transferFrom call한 balance update할 생긴다.

이때 external call 하기 전에 받아뒀던 value를 사용하는데 그렇다면 사이에 업데이트를 시도한 value들 무시 있다.

 

Initial State

       Market.     Wallet

Bal.      9             1

                 <-1              (before = 9)

Withdraw 9

                        (after = 10)

But 9 is withdrawed

 

 

 

Not under : but now with an external call to MoneyMarket.withdraw(asset = imBTCAddress, requestedAmount = 9)

( https://valid.network/post/the-reentrancy-strikes-again-the-case-of-lendf-me )

 

 

Flash Loan

무담보 대출, 일시적으로 담보를 설정하고 대출을 받은 , 대불 받은 암호화폐를 이용한 공격 조작을 통해 이득을 취한 바로 담보를 갚는다.

 

2. Burger Swap Hack == falsh Token

 

3. Siren( =https://medium.com/siren-markets/siren-incident-report-264e57f16d7)

 

Btoken을 사면 bToken과 wToken mint해서 btoken은 attacker에 wtoken은 AMM에 저장한다.

 

lpToken 얻기 위해 privideCapital 호출

 

 

 

withdrawCapital을 호출하고 sellTokens == False일때 로직이 진행되고 collateralTokenBalance 받아온다.

Sellorwithdrawactivetoken함수를 실행할 안에서는 앞에서 mint btoken과 wtoken 조회해서 transfer한.

이때 openzeppling의 upgrade버전의 safeTransferFrom을 사용한다

 

이는 onERC1155Received 실행 시키는데 이는 명시적으로 ERC1155 받는 수신자는 구현해야 하는 함수로 받을수 있는지 확인하는 함수이다.

이곳에 악의적으로 재진입 있는 코드를 집어 넣게 된다.

 

 

 

 

 

 

 

 

 

 

 

'BlockChain' 카테고리의 다른 글

텐더민트(Tendermint) 합의 알고리즘  (0) 2022.03.19
최근 Re-enterancy양상  (0) 2022.01.21
Solidity 취약점 #7  (0) 2022.01.19
Solidity 취약점 #6  (0) 2022.01.18
Solidity 취약점 #5  (0) 2022.01.17