Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Keeping Safe Rust Safe with Galeed

From noriwiki


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의 노력을 덜 수 있도록 하였다.