Zheng Yu, Ganxiang Yang, Xinyu Xing USENIX Security 2024
개요
기존의 Use-after-free 버그를 막기 위한 여러 기법들[1][2][3]에 새로운 Bound checking을 추가하여서 Temporal + Spatial Bug를 효과적으로 막을 수 있는 새로운 Memory bug preventer를 디자인 하였다.
Motivation & Importance
기존의 Use-After-Free 방지 기법들은 성능 면에서 강력한 이점을 제공하지만, spatial bug를 효과적으로 방지하지는 못한다. 이에 따라, 이러한 시스템에 Spatial bug를 예방할 수 있는 새로운 기법을 통합함으로써 전반적인 메모리 오류를 방지하는 것이 중요하다.
Design

- Shadow Memory Layout
- 8바이트의 메모리당 8바이트의 Shadow memory로 매핑하였다. 각 Shadow memory의 4바이트는 시작부터 현재 위치가 몇 바이트 떨어져 있는지 기록하였고, 뒤의 8바이트는 끝부터 지금 위치까지 몇 바이트 떨어져 있는지 기록하였다 (Figure 1참고). Shadow memory의 할당은 Allocation operation이 수행되는 순간 하도록 하였다.
- Boundary checking
- Boundary를 알 수 있기 떄문에, Pointer에 대한 Arithmetic operation마다 Bound checking을 수행하도록 하였다. Pointer에 특정 Offset을 더해서 Shadow memory로부터 Boundary를 읽고, Pointer가 그 바운더리에 들어가는지 체크하였다.
- Compiler Optimization
- Runtime-Driven Checking Elimination: 최소 N bytes를 할당하면, 만약 N bytes보다 offest이 작은 Address접근은 Bound checking을 할 필요가 없음으로 제거하였다.
- Directional Boundary Checking: 만약 Offset의 Sign을 미리 알 수 있으면, 양뱡항 Bound checking이 아니라, 단 방향만 체크함으로서, 2번의 분기 체크를 한 방향으로 줄였다.
- Security Pattern Identification: 만약 프로그램이 내부적으로 Bound checking을 수행하면, bound checking을 수행하지 않도록 하였다.
- Merge Metadata Extraction: 만약 정적인 시간에 base pointer를 공유하는 것이 명확하면, base pointer를 가져오는 Operation을 merge하였다.
- Redundant Checking Elimination: 루프에서 같은 함수를 계속 사용하는 것 과 같이, 명확히 중복되는 체크가 있으면, 체크를 한번만 하도록 제거하였다.
Evaluation
SPEC CPU 2006에서 Performance overhead는 대략 5.72% Memory overhead는 대략 54.59%였으며, 다른 UAF버그 Preventer와 함께 사용시 PUMM에서 최저 6.60% Perf, 55.29% Mem overhead부터 최고 MarkUs에서 16.20% Perf, 302.51% Mem overhead를 보였다.
Conclusion
본 논문은 ASan과 같은 메모리 오류 탐지 기법과는 달리, 오류를 사전에 방지하는 접근을 취한다. 그러나 평가 측면에서 ASan과 직접 비교를 수행하고 있으며, 이는 기능상의 차이점인 탐지 여부를 고려하지 않은 완전히 공정한 비교로 보기 어렵다. 특히 Shadow memory 구성에서 ASan은 8대1 비율을 유지하는 반면, 본 시스템은 1대1 구조를 사용하므로, 메모리 낭비 측면에서 더 큰 부담이 발생할 가능성이 있다.
또한, 논문에서 강조하는 성능 이득 중 상당 부분은 실제 방지 기법의 구조보다는 컴파일러 최적화의 효과에 기인하는 것으로 보인다. 최적화가 적용되지 않은 SHADOWBOUND의 오버헤드는 ASan보다 더 높은 수준이며, 이는 시스템 자체의 설계보다는 컴파일러 기법에 의존도가 크다는 것을 시사한다. 따라서, 동등한 수준의 컴파일러 최적화를 ASan에 적용한 경우와의 비교가 필요하다. 추가적으로 어떤 Optimization이 SHADOWBOUND에만 적용가능하고 아닌지가 명확하지가 않다.
그럼에도 불구하고, 본 논문은 메모리 접근 오류에 대한 실행 시점 검증을 기존의 포인터 연산 시점이 아니라 포인터 산술 시점으로 옮김으로써, 보다 효율적인 메모리 방지 기법 설계가 가능함을 보였다. 이러한 설계 아이디어는 새로운 시사점을 제공하며, 메모리 보안 기법의 방향성에 있어 의미 있는 기여를 한다고 평가할 수 있다.