Skip to content

feat : make VaultSecure solution, solve quiz#47

Open
jaesimin0903 wants to merge 1 commit intoBay-17th:mainfrom
jaesimin0903:jaesimin0903/week-03
Open

feat : make VaultSecure solution, solve quiz#47
jaesimin0903 wants to merge 1 commit intoBay-17th:mainfrom
jaesimin0903:jaesimin0903/week-03

Conversation

@jaesimin0903
Copy link

@jaesimin0903 jaesimin0903 commented Mar 4, 2026

과제 제출 정보

주차: Week 03

과제 유형:

  • 이론 (Theory Quiz)
  • 개발 (Dev Assignment)

구현 내용

  • 재진입 공격 방어 프로세스 CEI 패턴
  • 재진입 공격 방어 withdraw 함수 구현

배운 점 (What I Learned)

이번 주에 배운 것 (2-3가지)

  1. 재진입 공격 라이브러리 사용법
    2.재진입 공격 방어 프로세스 CEI 패턴

어려웠던 점과 해결 방법

어려웠던 점:
테스트 기획 의도 파악이 어려웠음.

해결 방법:
질문사항에 서술하겠습니다.

질문 사항

과제를 진행하면서 VaultSecure.sol을 구현하고 테스트를 해보았으나, 로직에 틀린점은 없었지만 Transfer failed 에러가 발생하며 테스트가 실패하는 현상을 발견했습니다.

원인을 분석해 본 결과, 방어 로직이 정상 작동하여 전체 트랜잭션이 안전하게 Revert 처리되는 이더리움의 정상적인 동작을 현재의 테스트 코드가 담아내지 못하고 있는 것 같습니다.

제가 이해한 바로는 다음의 순서로 트랜잭션이 revert되고 있습니다.

  1. Attacker가 최초 출금인 vault.withdraw(1 ether)를 호출합니다.
  2. VaultSecure가 공격자에게 call을 통해 1 ETH를 송금합니다.
  3. Attacker의 receive()가 트리거되어 2차 재진입(vault.withdraw)을 시도합니다.
  4. VaultSecure의 방어 로직(nonReentrant)에 막혀서 2차 출금 시도가 Revert 됩니다.
  5. 2차 출금이 Revert 되면서, 이를 호출했던 Attacker의 receive() 함수도 연쇄적으로 Revert 됩니다.
  6. receive()가 실패했기 때문에 VaultSecure의 최초 call 결과값인 success가 false로 반환됩니다.
  7. 최종적으로 require(success, "Transfer failed");에 걸려 최초의 1차 출금마저 통째로 통째로 Revert 됩니다.
    이러한 revert 연쇄 현상 때문에, 공격자는 아무런 출금이 되지않아야 한다고 생각합니다.

하지만 현재 테스트 코드의 다음과 같이 작성되어 있습니다.

// Attacker는 자신이 입금한 1 ETH만 돌려받음
// 10 ETH (초기) - 1 ETH (입금) + 1 ETH (정상 출금) = 10 ETH
assertEq(address(attacker).balance, attackerBalanceBefore ...);

즉, "방어는 하되 1차 출금은 성공해서 1 ETH를 돌려받아야 한다"는 모순된 기대를 하고 있기 때문에, 정상적으로 전체 트랜잭션을 Revert 시켜버리는 튼튼한 VaultSecure 코드가 도리어 Transfer failed 테스트 실패를 뿜게 되는 것 같습니다.

혹시 이 현상과 관련하여 제가 놓치고 있는 의도가 있을까요? 코드는 방어가 완벽하게 동작하는 현 상태로 제출합니다! 감사합니다.

체크리스트

테스트

  • forge build 성공
  • forge test 모든 테스트 통과

제출 규칙

  • 브랜치명이 {username}/week-{XX} 형식
  • .env 파일이 커밋에 포함되지 않음
  • 커밋 메시지가 규칙을 따름

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant