🔑 코인 투자 추천 링크 🔑
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
댓글