Skip to content

Wuheon/week 03#41

Open
m1k-2y wants to merge 2 commits intoBay-17th:mainfrom
m1k-2y:wuheon/week-03
Open

Wuheon/week 03#41
m1k-2y wants to merge 2 commits intoBay-17th:mainfrom
m1k-2y:wuheon/week-03

Conversation

@m1k-2y
Copy link

@m1k-2y m1k-2y commented Feb 26, 2026

과제 제출 정보

주차: Week

과제 유형:

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

구현 내용

재진입 공격을 막기 위햐여 CEI패턴을 사용하였다. deposit함수는 그대로 사용을 하였고 withdraw함수가 중요하다. 우선은 bool 타입의 locked라는 변수를 선언해준다. locked는 기본값으로 false를 가진다. 그 후 withdraw함수에서 require로 출금하려는 금액만큼 잔액이 있는지 확인을 하고 locked 값을 true로 바꾸어 준다. 그 후 잔액을 상태 변경 하고 외부 호출을 실행한다. 그런데 이때 재진입 공격은 외부 호출 이전에 상태변경을 해주었으니 막아지지만 문제는 단순히 순서를 변경하여 외부호출 후 require을 사용하여 suceess == true인지 확인하여 아니라고 뜬다면 첫번째의 정상적인 출금마저 실패한다는 것을 알게 되었다. 이 때문에 bool 타입의 locked를 사용하였다. locked 값을 잔액 확인 후 true로 변경해놓았다. 일종의 화장실을 잠금 표시 한 것 과 같다. 이때 withdraw 첫째줄에 if (locked) return을 한다면 재진입시 실패하였을 때 revert를 시켜 정상 출금마저 실패하게 하는 것이 아닌 조용히 return 시킬 수 잇게 되었다.

배운 점 (What I Learned)

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

  1. 첫번째로는 msg.sender와 tx.origin의 차이를 알게 되었으며 이를 통해 악의적인 공격이 가능함을 알았다. 개인적으로는 재진입 공격보다 tx.origin을 이용한 공격을 이해하는 데 훨씬 오래 걸렸다.
  2. 두번째로는 재진입 공격이 처음에는 전체 잔액이 1 ETH이더라도 장부 상으로 상태 변경이 되지 않아 없는 돈을 계속해서 뽑아내는 버그라고 착각을 하였는데 그것이 아닌 자신이 가져갈 수 있는 금액의 권리를 넘어서 전체 저장소에 있는 금액만큼을 빼았아 갈 수 있음을 아게 되었다.

어려웠던 점과 해결 방법

어려웠던 점:
CEI를 실행할때 단순히 순서만 변경하여 했더니 첫번째 정상 출금마저 실패하는 오류가 생겨 어려웠다.

해결 방법:
챗 gpt가 bool 타입의 locked라는 변수를 통해 화장실 문을 사용 중 빈칸 두가지로 표현할 수 있듯이 잠금 표현을 할 수 있음을 알려주어 해결하였습니다.

질문 사항

-3주차의 추가학습 자료 중 보안 패턴 상세 가이드가 열리지 않는 데 혹시 어떻게 볼 수 있는지 여쭤봅니다.


체크리스트

테스트

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

제출 규칙

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

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