MineSweeper: A “Clean Sweep” for Drop-In Use-After-Free Prevention


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

  1. Minesweeper는 MarkUS보다 훨씬 좋은 메모리 오버헤드와 성능 향상을 보임
  2. 그러나 MarkUS와 다른 것은 Advanced한 Allocator와 GC매커니즘의 채택과 zeroing을 통한 linear sweep이라는 점은 아쉬운 부분
  3. Implementation을 통해서 MarkUS의 단점이었던, Concurrency, High stop-the-world time과 같은 부분을 해결할 수 있음을 보임
  4. Still, obfuscated된 포인터는 해결할 수 없으며, 적지만 stop-the-world 시간이 발생함