Preventing Use-After-Free Attacks with Fast Forward Allocation


Brian Wickman, Hong Hu, Insu Yun, Daehee Jang
USENIX Security 2021

개요

One time allocation이라는 아이디어를 다시 가져와 Use-after-free (UAF)버그를 막을 수 있는 효율적인 Memory allocator을 만들었다.

Motivation

C와 C++같은 Memory unsafe 언어에서 UAF버그는 치명적임.

Importance

기존의 UAF를 막기 위한 방법들은 CPU가 많이 사용되거나, Overhead가 너무 큰 문제점들이 있었다. 특히 One time allocator는 다음과 같은 문제가 있었다.

  • 4096 Page단위로 Object를 할당하기 때문에 Fragmentation이 심해짐
  • 커널의 VMA구조의 제한으로 인해서 할당할 수 있는 오브젝트의 한계가 있음
  • 페이지 업데이트를 위해서 System call을 자주사용하여 성능이 하락함

Main Idea

Memory allocation시에 OTA를 효율적으로 사용할 수 있도록 큰 Object는 Forward Continuous Allocation정책으로 작은 Object는 Forward Binning Allocation정책으로 처리하여, 작은 오브젝트로 인한 Fragementation을 줄이고, VMA에 대한 업데이트를 줄여서 Kernel의 부담을 경감하며, System call들을 Delayed하여 처리해 Batching을 통한 System call overhead를 줄였다.

Design

Forward Continuous Allocation
FCMalloc은 직관적인 OTA 구현 방식으로 VA를 Page사이즈 만큼 증가시키면서 메모리를 할당한다.
Batching System call
MMAP을 할때 한번에 큰 사이즈를 요청해서 Malloc이 매 Object할당 마다 MMAP을 날릴 필요가 없도록 하였다.
Forward Binning
작은 사이즈의 Object를 할당할때는 BiBop Allocator을 활용해서 오브젝트들이 하나의 Page를 공유하도록 하였다. 이때 VA들은 서로 다른 Page alignment를 가지고 있기 때문에, OTA와는 상관이 없다.

FFmalloc은 Forward continuous allocation + Forward binning을 합쳐서 사용해서 효율적으로 메모리가 할당될 수 있도록 하였다.

Conclusion

FFmalloc은 UAF를 막기 위한 방법으로 OTA를 재발견 해냈다. 그러나 FFmalloc은 Realloc상황에서 느려질 수 있다는 점, Memory usage가 커진다는 점, VM에 한계가 있어서, VM를 다 사용하게 되면 더이상 사용할 수 있는 메모리를 Allocation할 수 없다는 점등이 단점으로 보인다.