iOS SandBox란?

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


SandBox란?

외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템이 부정하게 조작되는 것을 막는 보안 형태.
커널 수준에서 강제 적용되는 맥 OS의 접근제어 기술이다.

앱이 손상될 경우 시스템과 사용자 데이터의 손상을 억제하도록 설계되어있으며 앱스토어에 유통되는 모든 앱들은 앱 샌드박스를 적용시켜야만 한다. 애플 개발자 계정으로 앱 스토어가 아닌 다른 곳에서 유통된 앱 또한 앱 샌드박스를 적용시켜야한다.

커널: 컴퓨터와 전원을 켜면 운영체제는 이와 동시에 수행된다. 한편 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가 있어야 한다. 마찬가지로 운영체제 자체도 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라가야 한다. 하지만, 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라간다면 한정된 메모리 공간의 낭비가 심할것이다. 따라서 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다. 이 때 메모리에 상주하는 운영체제의 부분을 커널이라 한다. 또 이것을 좁은 의미의 운영체제라고도 한다. 즉 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분을 뜻한다. 이에 반에 넓은 의미의 운영체제는 커널뿐 아니라 각종 시스템을 위한 유틸리티들을 광범위하게 포함하는 개념이다. (보통은 운영체제라고 하면 커널을 말하게 된다.)

샌드박스가 적용되고 안되고의 차이

복잡한 시스템은 항상 취약점을 갖고 소프트웨어의 복잡도는 계속 증가한다.
개발자가 아무리 방어코드를 작성하고, 버그를 경계하더라도 해커들은 개발자의 방어를 한번만 뚫어내면 그만..

App SandBox가 앱을 공격하는 모든걸 막을수는 없지만 피해를 최소화할 수 있다.

샌드박스가 적용되지 않은 앱은 앱을 실행하는 사용자가 앱의 모든 권한을 가지며 사용자가 액세스 할 수 잇는 모든 리소스에 접근이 가능해진다. 만약 그 앱이나 그 앱과 연결되어있는 어떤 프레임워크 보안에 구멍이 생긴다면 해커는 잠재적으로 그 구멍을 이용해 앱을 제어할 수 있게 된다. 그리고 해커는 사용자가 할 수 있는 어떤 것이든 할수 있게 된다.

그렇다는 것은 앱을 통해 접근할 수 있는 사용자의 모든 데이터나 시스템 리소스에 접근해 무작위로 바이러스 등을 퍼뜨릴 수 있음을 의미하기도 한다.

샌드박스의 전략

앱 샌드박스는 어떤 식으로 피해를 최소한하는 것일까?

1. App SandBox는 개발자가 앱과 시스템이 어떤식으로 상호작용하게 할건지 설정할 수 있게 한다.

그럼 시스템은 앱이 하고자하는일을 끝내는데 필요한 권한만을 부여하고, 그 이상을 부여하진 않는다.

2. App SandBox는 사용자가 드래그 앤 드롭, 대화 상자 등의 친숙한 인터렉션을 통해 투명하게 앱에게 추가 엑세스 권한을 부여할 수 있도록 한다.

사용자는 앱을 사용하면서 많이 보면 얼럿창을 통해 앱에 추가 접근 권한을 부여할 수 있다.
샌드박스는 무적이 아니며 앱은 언제나 손상될 위험에 놓여있다. 하지만 앱이 업무를 수행하는데 필요한 최소한의 권한으로 권한을 제한할 경우 잠재적 피해의 범위는 줄어들 수 있다.

샌드박스의 원칙

각 앱마다 리소스에 대한 접근을 제한함으로써 앱 샌드박스는 해커가 앱의 보안구멍을 뚫었을 경우 사용자 데이터의 도난, 손상, 삭제, 시스템 하드웨어의 해킹에 대한 마지막 방어선을 구축한다. 예를 들어 샌드박스를 사용한 앱은 다음 리소스 중 하나를 사용하려면 그 의도를 반드시 명시해야 한다.

  • Hardware (Camera, Microphone, USB, Printer)
  • Network Connections (Inbound or Outbound)
  • App Data (Calendar, Location, Contacts)
  • User Files (Downloads, Pictures, Music, Movies, User Selected Files)

샌드박스 적용되는 방식

iOS의 각 앱은 모두 샌드박스 화 되어있다.

샌드박스는 각 앱에 대한 파일, 환경설정, 네트워크 리소스, 하드웨어 등에 대한 앱의 접근을 제한하는 세분화된 제어 집합이라고 볼 수 있다. 이렇게 앱마다 구분되어있기 때문에 이 앱을 사용하는 사용자는 이 앱의 데이터에만 접근이 가능해진다. 외부에 있는 데이터에 접근하기 위해서는 샌드박스 정책에 따라 접근 권한을 부여받아야 한다. 반대로 이 앱의 데이터도 다른 곳에서 접근은 불가능해진다.

앱의 샌드박스 디렉토리는 이런식으로 되어있다.

앱의 설치 시점에 각각의 샌드박스 디렉토리에 위치시키며, 이 디렉토리는 각 앱의 홈 디렉토리가 된다.
보안을 위해 앱과 시스템의 상호작용은 앱의 샌드박스 디렉토리에 있는 디렉토리로 제한된다.

홈 디렉토리는 각각 특별한 역할을 가진 컨테이너 디렉토리들을 하위 디렉토리로 가진다.

각 컨테이너에는 또한 역할이 있다.

1. Bundle Container

앱의 번들을 보유

2. Data Container

앱 및 사용자 데이터를 보유, 앱이 데이터를 정렬화하고 그룹화 하는 데 사용할 수 있는 여러 하위 디렉토리로 나뉨

3. iCloud Container

런타임에 접근을 요청할 수 있는 추가 컨테이너 디렉토리