DASP TOP 10 - Access Control(Delegatecall)

Glen·2023년 6월 23일
0

smart contract

목록 보기
2/2
post-thumbnail

call, delegate call

call

  • 사용자는 proxy컨트랙트의 a함수를 호출함
  • proxy는 logic 컨트랙트의 b함수를 호출함
  • call을 사용하면 logic컨트랙트에서의 msg.sender는 proxy의 컨트랙트 주소가 됨(0xbb)
  • logic컨트랙트에서 변경부분 또한 logic에 저장

delegate call

  • delegatecall을 사용하면 logic컨트랙트에서의 msg.sender는 사용자의 주소가 됨(0xaa)
  • logic컨트랙트에서의 변경된 사항은 proxy로 리턴하여 proxy에 저장
  • upgrade proxy 패턴이 아래와 같음.

테스트

예제코드(remix)

  • proxy(caller)의 컨트랙트를 통하여 logic(Plus)컨트랙트의 함수를 실행
  • proxy(caller)컨트랙트의 call함수를 호출하면 logic(Plus)컨트랙트에 num이 저장
  • proxy(caller)컨트랙트의 delegate call함수를 호출하면 proxy(caller)컨트랙트에 num이 저장

delegatecall 취약점

  • a가 Lib, HackMe 배포
  • b(공격자)가 attack 배포
    • 이때 HackMe의 owner는 a
  • Attack.attack()을 실행
    • HackMe의 owner는 Attack이 됨

예방기법

  • 컨트랙트를 라이브러리로 사용할경우 라이브러리 키워드로 선언
    • they cannot have state variables
    • they cannot inherit nor be inherited
    • they cannot receive Ether
    • they cannot be destroyed

reference

profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글