기본적인 재진입 패턴
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
- 2020.04- Uniswap/Lendf.Me hacks
Supply 함수는 deposit하는 token을 다루는 함수인데 asset address와 토큰의 수를 입력 받는다.
- Msg.sender의 asset에서 balance를 읽는다.
- 그리고 checkTransfer함수가 asset을 불러서 입금하고자하는 해당 token을 가지고 있는지 확인한다.
- 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 |