Cling: A Memory Allocator to Mitigate Dangling Pointers


Usenix Security 2010
Periklis Akritidis

개요

Cling은 메모리 Allocation에서 reuse가 같은 type을 가질 경우에만 가능하도록 하여서, UAF버그로 인한 공격 포인트를 다수 줄였다. 이러한 Type inference는 Runtime에 Stack을 참고하여 알아내었다. 이를 통해서 Cling은 적은 Performance & Memory overhead로 성공적인 UAF Prevention시스템을 구현하였다.

Motivation

Use after free버그의 내용 참고.

Importance

기존 (2010)전으로 UAF버그를 성능상의 오버헤드와 메모리 오버헤드를 최적으로 Prevent하는 시스템이 연구가 덜된 상태였으며, Cling은 기존의 BIBOP Allocator와는 다르게 메모리 Type정보를 유추하여서 효율적인 Memory allocation이 가능하도록 하였다.

Main Idea & Challenge

Main Idea는 Stack probing을 하여서 Call stack정보를 얻고, 이를 이용하여서 같은 Type (즉 Allocation되는 오브젝트)을 가지는 경우, 같은 메모리 Pool에서 할당하는 것이다. 이에 따라서 효율적으로 Call stack을 얻어야 하며, 그 정확성에 대한 Challenge 포인트가 존재한다.

Design

Out-of-band heap metadata
Free-list의 메타데이터를 보존하기 위해서 Cling은 큰 메모리 오브젝트에 대해서는 보호된 Linked-list방식으로 small object의 경우에는 bitmap을 이용한 방식을 이용하였다.
Type-safe address space reuse
Runtime에 stack tracking으로 알아낸 semantic정보를 활용하여서 memory allocation을 같은 type을 사용하는 Allocation은 Pool을 분라하여서 사용하도록 사용하였다. 특히 Array와 같은 경우에는 size를 type정보로 사용하여서 size가 같은 object들이 같은 pool을 사용하도록 하였다. 이를 통해서 offset이 다름으로서 생길수 있는 UAF버그를 mitigate하였다. 이러한 방식을 사용하면 Pool마다 object들을 생성하면서 생기는 memory overhead가 생기는데 cling은 madvise를 통해서 OS의 physical address를 날리는 방식으로 이 한계를 극복하였다.
Heap Organization
Cilng의 메모리 풀은 16K단위로 구성된다. 이 메모리 풀은 return address call site에 따라서 다르게 사용된다. Address로부터 pool을 찾기 위해서 Cling은 Hash를 사용하였다. Large object와 같은 경우에는 Memory pool이 아니라 directly하게 할당되도록 하였다.
Small Allocation (<= 8K)
Small allocation은 bitmap을 통해서 freelist를 관리하였다. 이를 통해서 Metadata corruption을 방지하였다.

Evaluation & Conclusion

Cling Runtime stack probing을 통해서 얻은 semantic 정보를 활용하여서 효율적인 UAF Allocator을 구현하였다. 비록 Full prevention, detection이 되지 않으며, 완벽한 Protection을 제공하지는 않지만, runtime stack tracking을 통해서 어떠한 정보를 어떻게 이용하여야 효율적으로 UAF를 막을 수 있을지 탐구하였다는 점에서 좋은 논문이라 할 수 있을 것 같다.