Iago Attacks: Why the System Call API is a Bad Untrusted RPC Interface

(Iago Attack에서 넘어옴)


ASPLOS 2013 Stephen Checkoway, Hovav Shacham

개요

Untrusted kernel로부터 Application을 보호하는 것을 단순히 생각하면, Application의 메모리만 커널로부터 IntegrityConfidentiality만을 보장하면 되는 것이라고 생각된다. 하지만 Lago Attack을 사용하면 System call과 같은 커널과의 RPC 리턴값을 정교히 조작하여 임의의 수행을 어플리케이션이 수행하도록 조작할 수 있다. 즉 위와 같은 단순한 방식은 General purpose의 Application을 보호하기에는 불완전한다.

Motivation

기존의 Untrusted kernel로부터 Application을 보호하려는 기법은 주로 Application의 메모리를 OS가 참조하지 못하도록 하는 것이 대부분 이었다.

Importance

정교히 구성된 시스템콜 Return value로부터 Application의 잘못된 동작을 유도할 수 있음이 Iago Attack을 통해서 밝혀졌다. 이를 사용하면 대다수의 Untrusted kernel을 보호하는 기법을 무력화 시킬 수 있다.

Main Idea

Malloc이나 brk처럼 메모리를 참고하는 시스템 콜의 리턴값, 혹은 Application이 getpid와 같은 값에 깊의 의존 하는 경우 (예를 들어서 난수값을 getpid로부터 가져오는 경우)와 같이 특정 시스템 콜이 시큐리티에 직접적 혹은 간접적인 영향을 미칠 수 있는데 이를 해킹하여 공격하였다.

Design

여러 예시가 있지만, mmap를 사용하는 예시를 들어 작성하였다. mmap에서 리턴되는 매핑 주소가 Application의 스택을 가르치게 한뒤, 정교하게 read 시스템 콜에서 ROP를 위한 일련의 주소값을 작성하면 Application이 read나 write시스템 콜처럼 returned mmap value에 접근할때 스택 값을 덮어 임의의 명령을 수행할 수 있다.

Result

결과는 OpenSSL을 해킹할 수 있음을 보였다.

Contribution

기존에는 Untrusted kernel로부터 trusted application을 보호하는 것이 General한 Application도 단순한 기법을 사용하여서 쉽게 방어할 수 있을 것이라고 생각하였지만, Iago Attack을 고려해야 할 사항이 더 있다는 것을 그리고 생각보다 쉽지 않다는 것을 증명하였다.

References