Junho Ahn, Kanghyuk Lee, Chanyoung Park, Hyungon Moon, Youngjin Kwon IEEE S&P 2025
Download: https://drive.junhoahn.kr/index.php/s/yos5GTZyJPT7ji7
개요
Garbage collection을 이용한 Memory sweeper는 UAF버그를 막는데 효과적이다. 그러나 기존 논문들은 Scalability, Stop-the-world pause, CPU Utilization측면에서 문제가 있었다. 이 문제를 해결하기 위해서 본 논문은 On-demand marking과 Delta-marking을 고안하고, 이를 효율적으로 구현하기 위해서 eBPF를 사용한 Express memory path를 구현, 최종적으로 State of the art의 UAF Preventor의 성능을 보였다.
Motivation
Background
Garbage collection을 이용한 Memory sweeper는 Explict한 Free정보를 이용하여서, C나 C++의 UAF버그를 효율적으로 막기 위한 방법을 말한다. Memory sweeper는 따라서 기본적으로 Garbage collection의 방식을 따라간다.
Garbage collection은 근본적인 문제로 Stop-the-world pause가 존재한다. 이는 Marking과 Application의 흐름이 동시에 실행되어서 발생할 수 있는 문제인 Pointer relocation를 막기 위한 방식이다. Pointer relocation은 Marking thread가 체크한 영역에 새로운 포인터가 생기거나, 다른 Marking되지 않은 영역에서 Pointer가 움직임으로서 발생할 수 있는 Concurrency문제를 말한다. 이를 해결하기 위해선 Application의 수행을 Marking동안 멈추어야 한다. 기존의 MineSweeper: A “Clean Sweep” for Drop-In Use-After-Free Prevention와 같은 논문들은 이를 해결하기 위해서 TCB를 Relax시켰으나, 이러한 방식은 Corner case에 노출되는 문제가 있었다.
Three-design problem in the Memory Sweeper
결국 위 Stop-the-world pause로 인하여 다음의 문제가 발생한다.
- Stop-the-world: Stop-the-world그 자체로 문제가 된다. Stop-the-world로 인하여 C나 C++프로그램에 Unexpected한 Application pausing이 계속 발생하며, 이는 C나 C++로 작성된 프로그램들이 Latency sensitive한 경우가 많다는 점을 고려하였을때, 치명적인 문제이다.
- High CPU Utilization: 기본적으로 Marking을 수행하기 위해서 CPU Utilization을 만히 먹으며, Marking thread들이 Synchronization을 위해서 사용하는 Busy waiting또한 High cpu utilization의 주범이다.
- Low Scalability: GC는 Dirty한 Page들을 Skip하기 위해서 Dirty page를 읽어야 하는데, 여기서 in-kernel global lock에 contention이 발생하면서 Kernel operation serialization이 발생한다. 또한 Application을 멈추는 Stop-the-world도 Serialization point가 되어서 Scalability에 영향을 미친다.
Main Idea
- On-demand marking
- Delta-marking
- eXpress Memory Path