🔑 코인 투자 추천 링크 🔑
솔리디티 0.8.15에서의 dritybytes
Memory나 calldata에서 storage로 ‘bytes’ 배열을 복사할 때, 길이가 32의 배수가 아닌 경우에도 32바이트 단위로 청크(chunks)를 나눠서 복사함
따라서 배열 끝을 넘어서는 추가 바이트가 calldata나 memory에서 storage로 복사될 수 있음.
이런 dirty bytes는 storage의 ‘bytes’ 배열에 ‘.push()’를 인자 없이 수행한 후에 관찰 가능해질 수 있음
즉, 이러한 .push()는 배열 끝에 예상대로 0 값이 생성되지 않을 수 있음.
이 버그는 레거시코드 생성 파이프라인에만 영향을 미치며, IR을 통한 새로운 코드 생성 파이프라인에는 영향을 미치지 않음.
테스트 소스
https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Dirtybytes.sol
테스트 결과
Array element in h() not being zero::: 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002
Such that the byte after the 63 bytes allocated below will be 0x02.
참고문서
https://web3sec.notion.site/DirtyBytes-d68e72cf89fa4eea965d2e341c6a673d
댓글