ACSAC 2021

개요

Rust는 sound하지만 incomplete하다. 이러한 단점을 극복하기 위해서 러스트는 unsafe keyword를 제공함으로써 외부 unsafe한 언어로 적힌 라이브러리들을 import할 수 있도록 한다. 그러나 이러한 라이브러에서 발생한 error는 전체 safe한 러스트에도 영향을 가한다. 이를 분리 하기위해서 runtime check를 각 코드에 가함으로써 메모리가 분리되어 영향을 끼치지 못하도록 하였다.

Design

우선 Rust code는 Unsafe code영역 즉 Unsafe code가 allocated 한 메모리 영역에 모두 접근 할 수 있지 그 반대의 경우에는 unsafe code area에서만 접근할 수 있도록 하였다. 이를 위하여 다음과 같은 Design을 제시하였다.

  • Heap Isolation: Unsafe code와 Safe code (RUST)가 사용하는 힙의 Access를 분리함.
  • Heap Splitting: Rust와 external library가 사용하는 힙을 분리함.
  • Access checking (i.e. Sanitizer): 러스트 내부의 포인터를 직접 제공하지 않고 API와 id를 제시함으로써 Rust code에서 지정된 동작으로 적절한 응답이 왔는지 체크할 수 있도록 함.

이떄 Heap Isolation그리고 Heap Splitting은 libmpk를 통해서 구현하였다. 또한 Access checking은 Pesudo-pointer개념을 Rust macro와 C API를 통하여 구현하였다. 여기서 이러한 Access checking을 위해서 기존의 pointer based방식을 id verfication으로 바꾸기 위해서 자동화된 LLVM을 통하여 자동으로 바뀔수 있도록 즉 developer의 노력을 덜 수 있도록 하였다.