📢 대니월드 공식 홈페이지가 'TradingRoom'으로 변경되었습니다
모든 최신 시황과 교육 자료를 가장 빠르게 받는 방법!
지금 아래 버튼을 클릭해 이메일 구독을 완료해 주세요.
솔리디티 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
댓글