SEAndroid 적용

SEAndroid(Security Enhancements for Android)

SEAndroid는 Android를 지원하기 위해 SELinux를 확장/개선한 보안기능이며 권한이 있는 시스템관리자만 변경할 수 있도록 지원해 줍니다.

SELinux(Security-Enhanced Linux)란 Open Source인 Linux에 추가된 MAC(Mandatory Access Control)을 의미합니다.

Access Control관련 보안 정책(Security Policy)을 포함합니다.

보안정책에 맞춰 Android Module을 추가해야 하며 관련 파일이 없거나 잘못 작성된 경우 Booting시 실행이 안되거나 다른 Module로 접근이 안되거나 기능을 사용하지 못하게 됩니다.

SEAndroid 보안라벨 흐름

SEAndroid의 보안라벨의 흐름은 크게 5가지로 구분됩니다.

첫째는 Service 실행을 위한 보안라벨입니다.

둘째는 Binder기반 서비스의 경우 Service Manager에 등록을 허락받기 위한 보안라벨입니다.

셋째는 Booting시 Property 실행을 위한 보안라벨입니다.

넷째는 Device driver 사용 허락을 위한 보안라벨입니다.

마지막으로 Untrusted application(등록되지 않은 앱)에 관련된 보안라벨 설정입니다.

아래에서 하나씩 각 설정에 관련되서 살펴보겠습니다.

①Service 실행

SEAndroid는 Android 4.4부터 추가된 보안 관련 Module이며 버전이 올라갈수록 보안관련 정책이 엄격해지고 있습니다.

Android 6.x(Marshmallow)이후에 추가되는 Service의 경우 관련파일이 없거나 잘못 작성된 경우 Booting시 실행이 안됩니다.

보안정책이 없을때 Service 실행

  • ~Android 6.x는 external/sepolicy 또는 device/.../sepolicy에 xxx.te 파일을 추가하면 보안정책에 맟춰 실행이 가능합니다.

  • Android 7.x~는 system/sepolicy에 xxx.te 파일을 추가하면 보안정책에 맟춰 실행이 가능합니다.

같은 경로에 있는 file_contexts 파일에도 항목을 추가해야 합니다.

보안정책이 있을때 Service 실행

서비스 실행을 위해서는 서비스 관련 보안라벨(그림에서는 devtest.te)와 file_contexts에 관련 내용 추가가 필요합니다.

②Binder 기반 Service(Service Manager에 등록 가능)

실행되는 Service가 Binder기반의 Service인 경우 xxx.te 파일에 추가적인 항목이 더 들어가야 합니다.

  • ~Android 6.x는 external/sepolicy 또는 device/.../sepolicyservice.te에도 항목 추가가 필요합니다.
  • Android 7.x~는 system/sepolicyservice.te에도 항목 추가가 필요합니다.

Binder 기반 Service 실행

Binder 기반서비스 실행을 위해서는 Service Manger에 등록이 필요합니다.

이를 위해서 서비스 관련 보안라벨(그림에서는 devtest.te)와 서비스 매니저 관련 보안라벨(servicervice_contextsce.te), file_contexts에 관련 내용 추가가 필요합니다.

③Property를 사용한 Service제어

Booting시 실행이 안되는 Service의 경우 Property를 사용하여 제어(Start/Stop 등)하는 것이 가능합니다.

Default값을 사용할 수도 있지만 property 값을 새로 지정해서 사용하는 것도 가능합니다.

보안정책(Security Policy)관련 설정이 없는 경우에는 실행이 불가능 합니다.

Property를 사용한 Service제어 보안라벨 필요

Property를 사용한 Service제어에 관련된 보안 정책(Security Policy)관련 설정 파일은 다음과 같습니다.

  • ~Android 6.x는 external/sepolicy 또는 device/.../sepolicyxxx.te
  • Android 7.x~는 system/sepolicyservice.texxx.te

수정이 필요한 xxx.te는 surfaceflinger의 예를 들어보면

  • surfaceflinger.te
  • property_contexts
  • property.te

가 수정이 필요합니다.

Property를 사용한 Service제어 보안라벨 설정

Property를 사용한 Service제어 실행을 위해서는 서비스 관련 보안라벨(그림에서는 surfaceflinger.te)와 property 관련 보안라벨(property.te), property_contexts에 관련 내용 추가가 필요합니다.

④Device Driver 사용

SEAndroid가 설정된 경우 Device Driver를 사용하기 위해서는 보안라벨을 사용해 허락을 받는 것이 필요합니다.

먼저 device driver를 접근하기 위한 흐름은 아래와 그림과 같습니다.

device driver를 접근하기 위한 흐름

먼저 APP(devtest_server)에서 HAL module에 장치 제어를 요청합니다. HAL module은 systemCall을 사용해서 Device Driver(Kernel)에 접근합니다.

이때 장치파일(/dev/test_dev)을 사용해 드라이버를 접근하기 위해서는 보안라벨의 허락이 필요합니다.

Device Driver와 관련된 보안라벨 관련 파일은 아래와 같습니다.

  • ~Android 6.x는 external/sepolicy 또는 device/.../sepolicy
  • Android 7.x~는 system/sepolicy

device driver를 접근하기 위한 보안라벨 수정

Device driver의 보안라벨을 수정하기 위해선 아래의 3개 파일을 수정해야합니다.

  • service와 관련된 보안라벨(그림에서 devtest.te)
  • device driver 관련 보안라벨(device.te)
  • file_contexts파일

⑤Untrusted application 사용

Untrusted application이란 보안라벨을 적용받지 않은 서비스나 앱을 통칭합니다.

보통 다운받은 APP등은 모두 Untrusted application에 속합니다.

기본적으로 Untrusted application 관련 보안라벨 파일은 다음과 같습니다.

  • ~Android 6.x는 external/sepolicy/untrusted_app.te
  • Android 7.x~는 system/sepolicy/untrusted_app.te

해당 파일에서 ②번에 등록되 있는 서비스에 관련되 Untrusted application이 접근을 허락하게 하는 가에 대해서 설정하는 것입니다.

untrusted_app.te

Untrusted application이 접근 가능한 서비스를 추가하기 위해서는 untrusted_app.te 파일에 추가가 필요합니다.

공유하기