Wedge: Splitting Applications into Reduced-Privilege Compartments


Adrea Bittau, Petr Marchenko, Mark Handley, Brad Karp
NSDI'0: 5th USENIX Symposium on Networked Systems Design and Implementation

개요

현재 리눅스의 Security policy는 Corase-grained인데, 이를 Fine-grained로 나누어서 (wedge해서), 성능의 큰 저하 없이 Security를 높히는 새로운 디자인을 제시하였다.

Motivation

점점더 많은 소프트웨어들이 네트워크 상에 존재함에 따라서, 잠재적 보안에 대한 취약점도 증가하고 있다. Principle of least privilege원칙에 따르면 Application을 여러개로 쪼개서, 각 부분에 맞는 최소한의 권한을 주는 것이 보안적으로 좋은 방법이 된다.

Importance

현재 Process로 주어지는 Isolation granularity는 너무 Coarse-grained라서 이러한 시스템에 적용시키기에는 문제가 있다.

Main Idea

Wedge는 프로그래머가 default-deny정책을 적용한 Isolation단위를 OS레벨에서 제공하여서, 사용자가 위에서 설명한 디자인을 쉽게 구현할 수 있는 모델을 제시하였다. Wedge는 메모리를 Tagging할 수 있도록 하여서, 각 Tagged된 메모리에 대한 접근 권한을 나누었다. 또한 Wedge는 이러한 분리 디자인을 분석할 수 있는 Crowbar이라는 tool을 만들어서, 쉽게 Application을 분석하여서 Wedge로 나눌 수 있도록 하였다.

Design

Sthread
Sthread는 각 Application의 Protection domain의 중심이 되는 단위이다. 각 Sthread는 tagged memory, file descriptors, callgates 그리고 UNIX에 Resource들이 Permission과 함께 배정이 되어 있다. Sthread의 스폰시에는 Sensitive한 데이터에 대한 접근권한이 전혀 없는데, Parent는 자기자신이 가지고 있는 권한하에서 Child Sthread에게 권한을 상속 시킬 수 있다.
Tagged Memory
Memory permission을 tag라는 단위로 제공하는데, tag는 Sthread가 다른 Sthread와 메모리를 공유하기 위한 방법이다. Tag을 통하지 않고 Allocate된 메모리들은, 다른 Sthread에서 접근할 수 없으며, 다른 Sthread와 메모리를 공유하기 위해서는 Tag를 상속시켜야 한다.
Callgates
Callgate는 프로그램중에서 Caller의 권한보다 더 높은 권한에서 돌 수 있는 함수를 말한다. Callgate는 Untrusted component에서 민감한 자료에 접근하기 위해서 사용된다. Callgate는 Entry point, 리소스에 대한 permissions, 그리고 사용할 수 있는 argument들로 구성된다. Sthread는 Callgate를 만들어서, 다른 SThread에 넘길 수 있고, 그 다른 Sthread는 Callgate에 요구된 Argument만을 사용해서 호출해서 생성자의 권한을 가지고 함수를 수행할 수 있다. Callgate가 호출되면, callgate가 지정하는 permission을 가지는 새로운 Sthread가 생성되어서, entry point로 점프한다. Caller는 Callgate수행이 종료될 때 까지 blocking되며 return 값을 받을 수 있다.
Crowbar
Crowbar는 Application을 분석해서 어디서 할당된 메모리가 어디서 사용되었는지를 분석해 준다. 이를 통해서 Crowbar은 Sthread와 Tagged memory의 관계를 파악할 수 있는 정보를 개발자에게 제공한다.