MallocSan: 네이티브 비공개 소스 애플리케이션을 위한 메모리 안전성 도구
요약
본 논문은 소스 코드 접근이나 재컴파일이 필요 없는 네이티브 x86-64 Linux 애플리케이션을 위한 힙 정화기 MallocSan을 제안합니다. MallocSan은 LD_PRELOAD를 통해 메모리 할당에 가로채기를 수행하고, 포인터의 상위 비트에 객체 식별자를 임베드하여 런타임에 경계 검사를 수행함으로써 메모리 안전성을 확보합니다.
핵심 포인트
- 소스 코드 접근 없이 네이티브 애플리케이션 분석 가능
- LD_PRELOAD를 이용한 힙 할당 가로채기 구현
- 객체 식별자 임베딩 및 런타임 경계 검사 수행
- Valgrind Memcheck 대비 향상된 성능과 병렬 확장성 입증
메모리 손상 오류는 C 및 C++ 소프트웨어에서 높은 영향도의 취약점을 유발하는 주요 원인으로 남아 있습니다. 그러나 결정론적 탐지(deterministic detection)를 구현하는 것은 여전히 어렵습니다. 컴파일러 기반의 정화기(sanitizer)는 소스 코드를 요구하며 빌드 파이프라인에 대한 제어가 필요하고, 하드웨어 지원 방식은 특정 플랫폼에 의존하며, 동적 바이너리 변환(dynamic binary translation)은 크기 차수만큼의 속도 저하를 초래할 수 있습니다. 본 논문에서는 소스 코드 접근, 재컴파일 또는 특수 하드웨어가 필요 없는, 네이티브하고 잠재적으로 비공개 소스인 x86-64 Linux 애플리케이션을 위한 힙 정화기(heap sanitizer) MallocSan을 제시합니다. MallocSan은 LD_PRELOAD를 통해 메모리 할당에 가로채기(interpose)하며, 보호되는 각 포인터의 사용되지 않는 상위 비트(high bits)에 객체 식별자(object identifier)를 임베드합니다. 그 결과 생성된 비정규화된 포인터를 역참조(dereferencing)할 때 문제가 되는 명령어에서 오류가 발생하며, MallocSan은 이를 런타임에 디코드하고 패치하여 후속 실행이 사용자 공간(userspace)에서 객체별 경계 검사(per-object bounds checks)를 수행하도록 합니다. 패치가 불가능한 영역은 핸들러 내 에뮬레이션(in-handler emulation) 또는 싱글 스텝핑(single-stepping)으로 폴백하며, 선택적인 프로파일 기반 패스(profile-guided pass)는 자주 실행되는 잔여 사이트(residual sites)를 오프라인에서 재작성합니다. MallocSan은 또한 식별자 기반 검사(identity-based checking)를 벡터 게더/스캐터 명령어에 확장하고 정책 범위의 커버리지(policy-scoped coverage)를 지원합니다. 7개의 SPEC CPU 2017 벤치마크 전반에서, MallocSan은 다섯 개 항목에서 Valgrind Memcheck보다 우수한 성능을 보였으며, 네이티브 실행 대비 기하 평균 실행 시간 계수는 4.82배였습니다(Memcheck의 경우 18.55배). 또한 평가된 두 멀티스레드 워크로드인 644.nab_s와 pigz 모두에서 상당한 병렬 확장성을 유지했습니다. 범위 내 Juliet 테스트에서는 MallocSan이 좋은 실행(good executions)에서 오탐지 없이 시딩된 모든 위반을 탐지합니다. 또한 LibTIFF의 tiffcrop 유틸리티에 존재하는 알려진 1바이트 초과 읽기(one-byte overread)를 포함하여 실제 애플리케이션의 힙 버퍼 오류도 탐지합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 arXiv Codex (cs.SE)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기