Skip to content

feat(week-03): complete dev, quiz assignment#39

Open
kignoh wants to merge 3 commits intoBay-17th:mainfrom
kignoh:kignoh/week-03
Open

feat(week-03): complete dev, quiz assignment#39
kignoh wants to merge 3 commits intoBay-17th:mainfrom
kignoh:kignoh/week-03

Conversation

@kignoh
Copy link

@kignoh kignoh commented Feb 26, 2026

과제 제출 정보

주차: Week 03

과제 유형:

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

구현 내용

  • CEI 패턴 적용: balances[msg.sender] -= amount(Effects)를 msg.sender.call{value: amount}("")(Interactions)보다 먼저 실행
  • 커스텀 재진입 가드: bool private _withdrawing 상태 변수를 선언하고, withdraw() 진입 시 true로 설정하여 재진입 호출을 차단
  • Silent return 전략: 재진입 시도 시 revert 대신 if (_withdrawing) return으로 조용히 반환하여, 공격자의 receive()가 정상 완료되도록 처리 (revert 전파 방지)

배운 점 (What I Learned)

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

  1. 재진입 공격 메커니즘: call()이 외부 컨트랙트의 receive()를 실행하는 사이, 상태 변수가 아직 업데이트되지 않은 시점을 악용하는 원리를 직접 이해했습니다. 2016년 The DAO 해킹($60M 손실)이 이 취약점으로 발생했음을 학습했습니다.
  2. CEI 패턴(Checks-Effects-Interactions): 단순히 코드 순서를 바꾸는 것만으로 재진입 취약점을 막을 수 있다는 점이 인상적이었습니다
  3. revert 전파 문제: nonReentrant처럼 재진입 시 revert를 던지면, 공격자의 receive() 내부에서 revert가 발생하고 이것이 원래 call()까지 전파되어 success = false가 되면서 require(success)도 revert되는 연쇄 문제가 있습니다. 이 때문에 단순 revert 가드가 아닌 return 가드가 필요한 상황이 있습니다.

어려웠던 점과 해결 방법

어려웠던 점:
재진입 가드 방식 선택 (revert vs return)

해결 방법:
처음에는 if (_withdrawing) revert()를 사용했으나, 이 경우 공격자의 receive() 내부에서 revert가 발생하고, 그 revert가 원래 call()까지 전파되어 success = false → require(success, "Transfer failed") revert로 이어지는 문제가 있었습니다. if (_withdrawing) return으로 바꿔 receive()가 정상 반환하도록 처리하여 해결했습니다.

질문 사항


체크리스트

테스트

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

제출 규칙

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

@kignoh kignoh changed the title Kignoh/week 03 feat(week-03): complete dev, quiz assignment Feb 26, 2026
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