Chromium Chronicle #8: GWP-ASan: 야생에서 버그 감지

에피소드 8:, 워싱턴주 시애틀의 블라드 치르클레비치 작성 (2019년 11월)
이전 에피소드

use-after-free 또는 버퍼 오버플로 같은 메모리 안전 오류는 디버깅하기 어려울 수 있습니다. AddressSanitizer (ASan)와 같은 도구는 단위 테스트 및 fuzzer에서 메모리 오류를 정확히 파악하는 데 유용하지만, 많은 버그는 ASan의 오버헤드가 지나치게 높은 사용자에게 배포한 후에만 나타납니다.

GWP-ASan은 야생에서 사용하도록 설계된 힙 전용 메모리 오류 감지기입니다. 이 함수는 use-after-free, 버퍼 오버플로/언더플로, double free를 감지합니다. ASan과 달리 스택 또는 전역에서 오류를 감지하지 않습니다.

GWP-ASan은 극히 일부의 할당을 샘플링하여 메모리 및 성능 오버헤드가 미미한 상태에서 확률적 오류 감지를 제공할 수 있습니다. 샘플링된 할당과 함께 메모리 오류가 발생하면 GWP-ASan이 즉시 프로세스가 비정상 종료됩니다. 이렇게 하면 나중에 손상된 메모리가 사용될 때가 아니라 오류가 발생한 곳에서 비정상 종료가 발생할 때 버그를 쉽게 발견할 수 있습니다.

ASan과 마찬가지로 GWP-ASan 비정상 종료 보고서에는 할당 및 할당 해제 스택 트레이스가 포함되어 메모리 문제를 디버그하는 데 도움이 됩니다. 비정상 종료 UI에 표시되는 추가 데이터의 예(crbug/956230)를 살펴보겠습니다.

사용 및 할당 해제는 모두 PDFiumEngine::ExtendSelection()에서 시작됩니다. 소스는 무효화된 std::vector 반복자를 사용했다는 것을 빠르게 보여줍니다.

GWP-ASan은 Windows 및 macOS에서 malloc/newPartitionAlloc를 사용하여 생성된 할당의 경우 공개 버전 채널에서 사용 설정됩니다. Android 지원은 진행 중입니다. 지금까지 60개가 넘는 GWP-ASan 버그가 보고되었으며 약 70%가 수정되었습니다. GWP-ASan 비정상 종료는 모두 악용될 수 있는 후보 보안 문제이므로 신속하게 분류하고 필요한 경우 백포트를 요청하세요.