Go의 조용한 산수 버그를 고-패닉트로 감지하기 노트

Go의 조용한 산수 버그를 고-패닉트로 감지하기

표준 정수형에 대한 Go의 산술 연산은 기본적으로 묵묵히 수행됩니다. 즉, 오버플로우가 패닉 없이 래핑되어 숨겨진 보안 취약점을 초래할 수 있습니다. 이 문제를 해결하기 위해, 묵묵한 정수 오버플로우를 명시적인 패닉으로 바꾸는 go-panikint라는 수정된 Go 컴파일러가 출시되었습니다. Go-panikint는 Cosmos SDK의 RPC 페이지네이션 로직에서 실제 정수 오버플로우를 발견하는 데 사용되었으며, Go 프로젝트 퍼징의 주요 사각지대를 제거하는 데 효과적임을 입증했습니다. 이 도구는 컴파일러가 코드를 정적 단일 할당 형태로 변환하는 동안 추가 검사를 삽입하여 작동하며, 런타임에 오버플로우가 발생하면 자세한 오류 메시지와 함께 패닉을 발생시킵니다. Go-panikint는 정수 절단 문제도 감지할 수 있지만, 현재는 오탐으로 인해 이 기능은 사용되지 않고 있습니다. 이 도구는 사용하기 쉽고 공식 Go 컴파일러를 대체하여 기존 워크플로우에 통합할 수 있습니다. Go-panikint는 의도적인 오버플로우를 처리하기 위해 소스 위치 기반 필터링 및 코드 내 주석을 포함한 두 가지 필터링 메커니즘을 가지고 있습니다. 이 도구는 Cosmos SDK에 대한 퍼징 캠페인을 통해 검증되었으며, RPC 페이지네이션 로직에서 정수 오버플로우 취약점을 발견했습니다. Go-panikint는 보안 연구 및 퍼징, 그리고 지속적인 배포 및 통합이라는 두 가지 주요 사용 사례를 가지고 있습니다. 커뮤니티는 자체 프로젝트에서 go-panikint를 사용해 보고 CI 파이프라인에 통합하여 숨겨진 산술 버그를 발견하도록 권장됩니다. 전반적으로 go-panikint는 동적 분석에서 이전에 보이지 않던 Go 프로젝트의 보안 취약점을 발견하는 데 유용한 도구를 제공합니다.