메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Delta Pointers: Buffer Overflow Checks Without the Checks

noriwiki


Taddeus Kroes, Koen Koning, Erik van der Kouwe, Herbert Bos, Cristiano Giuffrida
EuroSys 2018

개요

Memory santizier에서 메모리 버그를 추적하기 위한 Branch개수와 Memory access빈도를 최소화 하는 것이 중요하다.

Motivation & Importance

Memory santizier은 중요한 연구 분야이다. 쉽게 Production system에 적용 가능하고, Performance overhead가 적은 Memory santizier를 개발하는 것이 따라서 중요하다. 그러나 기존의 논문 같은 경우 많은 문제점이 있었다. 따라서 이러한 문제를 해결하기 위해서는 OOB버그를 Detection하고 Preventing할 수 있는 Code gadget를 최대한 빠르게 만드는 것이 중요하다.

Main Idea

Delta marking은 Pointer의 Validty를 체크하기 위한 Branch와 Memory access를 삭제하였다.

Design

Bug Detection Scheme
  • Tag는 Pointer와 오브젝트의 끝 사이의 간격으로 설정된다.
  • Overflow bit이 1로 설정되면 Page fault가 발생된다.
  • 만약 포인터가 OOB가 되면 Tag + 1한 값은 Overflow가 나기 때문에 맨 위의 Carry bit가 1로 설정된다.
  • Overflow bit가 1로 설정되면 Page fault가 나도록 Mapping이 이루어져 있기 때문에, Page fault로 OOB를 탐지할 수 있다.
Pointer Dereferences & Null Pointer
  • Program이 포인터를 Dereferencing하기 전에 포인터 태그와 Bitmask And operation을 통해서 포인터 사용이 Valid하도록 설정하였다.
  • 또한 Null pointer과 같은 경우에는 Delta bit을 1로 설정해서, 어떠한 Dereference도 Carry bit가 1로 설정되도록 하여서 반드시 Page fault가 나도록 설정하였다.
Pointer Tagging Limitations & Solutions
  • C pointer assumptions: 만약 여러개의 포인터가 하나의 오브젝트를 가르키는 Semantic을 프로그램이 사용중이라면, 정상적으로 작동하지 않는다. 또한 Pointer artithmetic이 정상적으로 작동하지 않을 수 있다. 예를 들어서, Tagged pointer과 같은 경우에는 Order가 일치하지 않기 떄문에 단순히 Integer arithmetic을 사용하여 비교가 어렵다. Arithmetic을 위해선, 매 Arithmetic마다 Tagged된 영역에 Masking을 해줘야 한다.
  • Compiler optimizations: Pointer tagging은 Compiler support로 Marking과 같은 일을 수행한다. 그러나 Optimization전에 Masking을 하면, Pointer에 대한 Static analysis가 어려워지기 떄문에, 논문에서는 Optimization이후에 Tagged pointer을 위한 Compiler support를 삽입하였다. 그러나 이 방식은 여러 고려사항이 있다. 예를 들어서 Integer type을 가지고 있는 Pointer과 같은 경우(e.g., uint64_t ptr)에는 특수한 방식 (Use-def chains)를 이용해서 해결해야 한다.
  • Pointers with metadata: 대부분의 Pointer tagging방식의 Sanitizer는 Zeroed metadata를 Valid한 경우로 생각하지만, Delta pointer를 Invalid한 케이스로 생각하여, False negative의 가능성을 차단하였다. 또한 Protection boundary를 넘나드는 경우도 생각해야 한다. 예를 들어서 System call을 호출하였을 경우에 어떻게 대응해야 하는가? 이를 위해서는 Rule-based로 어떤 경우에 Pointer tagging을 Masking할지 일일이 지정해야 한다.
Micro-architectural properties: ARM의 ARM MTE처럼 다양한 Micro-architecture디자인을 이용하여 좀더 효율적으로 만들 수도 있다.

Evaluation

SPEC CPU 2006에서 41%의 Performance overhead가 발생하였고, 메모리 OVerhead는 리포트 되어 있지 않지만 중요하진 않을 것으로 (0%대일 것으로) 생각한다.

Conclusion

본 논문은 참신한 아이디어를 제안하고 있으며, 포인터 태깅에 대한 전반적인 내용을 잘 정리하고 있어 읽기에 유익하였다.