Emery D. Berger, Benjamin G. Zorn PLDI 2006
개요
DieHard는 Randomization을 통해서 heap corruption을 막은 논문이다. DieHard는 Probabilistic memory safety라는 개념을 제시하고 DieHard라는 Implementation을 통해서 Pratical함을 보였다.
Motivation
Importance
Valgrind, Purify와 같은 기존의 UAF detector들은 testing을 위해서 사용되었지, 실제 Deployment환경에서는 사용되지 않았다. GC에 기반한 매커니즘들도, Soundness와 stop-the-world 문제 그리고 performance측면에서의 문제가 있었다.
Main Idea
Allocator는 메모리를 선형적으로 배치하는 것이 아니라 랜덤한 위치에 배치한다. 선형적이지 않기 때문에, Buffer overflow공격을 탐지 할 가능성이 올라가며, UAF버그와 같은 temporal bug또한 확률적으로 탐지할 수 있다.
Design
- Allocation
- large object: mmap을 통해서 직접적으로 할당하고 해제한다.
- small object: 비어있는 memory slot의 랜덤한 위치에 heap메모리를 할당한다.
- Free
- Large object: munmap을 통해서 해제한다.
- small object: double free, invalid free를 확인하고 slot을 비운다.
- Detecting heap buffer overflow
Diehard는 완벽하게 buffer overflow를 막을 수는 없지만, 확률적으로 막을 수 있다. strncpy와 같은 함수를 hooking하여서, 우선 allocator metadata를 참고하여 size가 할당된 메모리 영역을 넘는지 확인하고 함수를 수행한다.
- Increase bug detect possibility
- 같은 인스턴스를 복사해서, 인스턴스 끼리 일치하는지 검사하였다.
Conclusion
Limitations
- Locality: Diehard는 Randomization의 특성상, 오브젝트들의 TLB hit locality를 살릴 수 없다.
- Probablistic: Diehard는 확률적으로 공격을 막지, 모든 공격을 100% 막지는 못한다.
- Memory overhead: Diehard는 메모리 사용를 log2로 할당하기 때문에, 큰 internal fragmentation이 생긴다. 이는 bitmap allocator의 특징으로, fine하게 freelist를 관리하면 metadata의 memory overhead가 커지기 때문이다.
- Virtualization fragmentation: VA의 크기는 정해져 있기 때문에, 시간이 지날수록 할당 가능한 VA수가 줄어드는 문제가 존재한다.
- Replication은 Scalability측면, 그리고 CPU Overhead측면에서 매우큰 Penalty가 있기 때문에 Pratical한 방법이 아니다.
하지만, Diehard는 probalistic bug detection이라는 개념을 선구적으로 제시한 논문으로써, 후의 DieHarder와 같은 randomization논문들에 영향을 주었다.