Marton Erdos, Sam Ainsworth, Timothy M.Jones ASPLOS '22
개요
Use-after-free bug를 막기 위해서, Free된 오브젝트를 격리구역 (Quarantine)에 보관하고 있다가, 오브젝트에 대한 참조가 없을때 Quaratine에서 풀어서 접근가능하도록 하는 기법을 개발하여서, 거의 오버헤드 없이 Use-after-free 버그가 없도록 하는 기법을 개발하였다.
Motivation & Importance
Use-after-free 버그는 치명적임에도 불구하고 자주 일어나는 버그로서 이를 해결하는 방법이 필요하다.
Design
Free된 메모리들은 격리 리스트에 등록되고, Sweep이 주기적으로 작동하면서 메모리에서 더이상 존재하지 않는 Reference를 찾아서 격리 구역에서 다시 할당될 수 있도록 한다. Free된 오브젝트들이 만약 연속된 Page granulaity에 충족할 경우 Physical address는 release하도록 하였다. 이를 통해서
- Shadow Maps
- 메모리의 1%정도를 사용하여서, 메모리의 어떤 부분이 사용되고 있는지를 기록하는 Shadow maps (Allocation list)를 작성하였다.
- When to sweep
- Heap의 사용량이 특정 범위 (15%)를 넘어가면 Sweep이 시작되도록 하였다. 이때 Failed Free된 영역을 계속 포함하면 Sweep이 너무 자주 시행되는 문제점이 있어서 Optimization으로 이러한 영역은 Heap사용량에서 제거하였다.
- Limitations
- Pointer와 Arbitary한 데이터를 구분할 수 없어서, 포인터처럼 생긴 데이터가 존재할 경우, 격리 구역에서 해제되지 않는 문제가 있을 수 있다.
- Application이 만약 Pointer를 파일에 저장하거나, 아니면 변조하는 방식으로 Leak시킬 경우, 이러한 부분은 격리 구역에서 잘못 해제되는 문제가 있다.
- Parallel and concurrent sweeping
- Sweep은 Parallel하게 스레드에서 일어나며, Concurrency issues를 기존 Garbage collector처럼 빡세게 할 필요가 없어서 Concurrency 이슈를 생각할 필요가 없었다.
Conclusion
- Minesweeper는 MarkUS보다 훨씬 좋은 메모리 오버헤드와 성능 향상을 보임
- 그러나 MarkUS와 다른 것은 Advanced한 Allocator와 GC매커니즘의 채택과 zeroing을 통한 linear sweep이라는 점은 아쉬운 부분
- Implementation을 통해서 MarkUS의 단점이었던, Concurrency, High stop-the-world time과 같은 부분을 해결할 수 있음을 보임
- Still, obfuscated된 포인터는 해결할 수 없으며, 적지만 stop-the-world 시간이 발생함