본문 바로가기
블록체인교육/블록체인보안

[블록체인 보안] 스마트컨트랙트 취약성(abi.encodePacked())

by Danny_Kim 2023. 8. 25.

🔑 코인 투자 추천 링크 🔑

  1. 비트코인, 알트코인 투자 노하우 모두 공개
  2. OKX 거래소 - 20% 수수료 할인
  3. 플립스터 거래소 - USDT 15% 이자
  4. 해시키 거래소 - HSK 에어드랍

 

Abi.encodePacked() 해시 충돌

 

여러 가변 길이 인자와 함께 abi.encodePacked()을 사용하는 경우 특정 상황에서 해시 충돌이 발생할 수 있음.

해시함수는 각 입력에 대해 고유하도록 설계되었지만, 해시 함수의 크기 제한이나 가능한 입력 수의 한계로 인해 충돌이 발생할 수 있음.

해당 이슈 문서 

https://docs.soliditylang.org/en/v0.8.17/abi-spec.html?highlight=collisions#non-standard-packed-mode 

 

Deposit 함수에는 사용자가 _string1 및 _string2 라는 두개의 문자열 입력을 기반으로 계약에 이더를 예치할 수 있음.

계약은 이 두 문자열을 연결하여 고유한 해시를 생성하기 위해 keccak256 함수를 사용함.

 

_string1 및 _string2 의 두가지 다른 조합이 동일한 해시값을 생성하는 경우 해시 충돌이 발생함

이 코드는 이러한 시나리오를 제대로 처리하지 않고 두번째 예금자가 이전 예금을 덮어 쓸 수 있도록 허용함.

 

조치방안

abi.encodePacked() 대신에 abi.encode() 사용.

 

테스트코드

https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Hash-collisions.sol

 

 

코드취약부분

 

테스트

 

참고문헌

https://web3sec.notion.site/abi-encodePacked-Hash-Collisions-80a0ff1e17d74f86bfd1290d6e156400

🔑 코인 투자 추천 링크 🔑

  1. 비트코인, 알트코인 투자 노하우 모두 공개
  2. OKX 거래소 - 20% 수수료 할인
  3. 플립스터 거래소 - USDT 15% 이자
  4. 해시키 거래소 - HSK 에어드랍

댓글