🔑 100배 수익 경험자의 노하우가 담긴 치트키 공개 🔑
- 네이버, 카카오 임직원들이 듣고 있는 비트코인 강의
- 아무도 알려주지 않은 비트코인, 이더리움의 리스크
- 블록체인 전문가들도 놓치기 쉬운 비트코인, 이더리움의 핵심 가치
- 천배 수익이 가능한 디파이(DeFi), 코인 생태계 지도
- 토큰 제작, 1억 연봉의 블록체인 개발자로 거듭나자!
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
댓글