Android System & AOSP Engineering/Android Security & SELinux

Android 보안의 핵심 SELinux: 역할과 필요성 완벽 정리 (Lollipop 이후 필수)

임베디드 친구 2025. 4. 25. 14:19
반응형

Android는 오픈 소스를 기반으로 수많은 앱과 서비스가 복잡하게 얽혀 동작하는 운영체제입니다. 플랫폼이 개방적인 만큼 보안 위협도 다양해질 수밖에 없는데, 이를 방어하기 위해 도입된 최후의 보루가 바로 SELinux(Security-Enhanced Linux)입니다.

Android 4.3에서 처음 도입된 이후 5.0(Lollipop)부터 전면 강제 적용된 SELinux는, 이제 안드로이드 개발자라면 반드시 이해해야 하는 필수 보안 아키텍처가 되었습니다. 오늘은 SELinux가 안드로이드 시스템 내에서 구체적으로 어떤 역할을 수행하며, 왜 보안의 핵심인지 정리해 보겠습니다.

Generated by Gemini AI.


📌 핵심 요약 3줄

  1. 강력한 격리: 프로세스, 파일 시스템, IPC 등 모든 자원에 대해 강제 접근 제어(MAC)를 적용하여 보안 경계를 구축합니다.
  2. 권한 상승 방지: 악성 앱이 루트 권한을 획득하더라도 SELinux 정책에 막혀 시스템 핵심부를 공격하지 못하도록 차단합니다.
  3. 공격 표면 최소화: 불필요한 리소스 접근을 사전에 정의된 정책으로 제한하여 전체 시스템의 취약 노출 부위를 줄입니다.

1. SELinux와 기존 보안 모델(DAC) 비교

SELinux를 이해하려면 기존 리눅스의 자율 접근 제어(DAC)와의 차이를 아는 것이 중요합니다.

구분 DAC (Discretionary Access Control) MAC (Mandatory Access Control, SELinux)
제어 주체 파일/리소스 소유자(Owner) 시스템 보안 정책 (System Policy)
보안 기준 사용자 ID(UID) 및 그룹 ID(GID) 보안 컨텍스트(Type, Role, Domain)
특징 루트(Root) 사용자는 모든 권한을 가짐 루트 사용자라도 정책에 없으면 접근 불가
주요 한계 관리자 권한 탈취 시 시스템 전체가 무너짐 권한이 탈취되어도 정책 내 동작만 허용됨

2. Android에서 SELinux의 4가지 핵심 역할

2.1 시스템 프로세스 및 Zygote 보호

안드로이드의 모든 앱 프로세스는 Zygote에서 파생됩니다. SELinux는 프로세스 간의 벽을 세워, 특정 앱 프로세스가 Zygote나 다른 핵심 시스템 데몬에 무단 접근하는 것을 방지합니다.

2.2 파일 시스템 및 데이터 보호

중요한 설정 파일이나 사용자 데이터가 저장된 경로를 라벨(Label) 기반으로 보호합니다.

보호 대상 SELinux 정책 효과
시스템 디렉터리 일반 앱의 /system, /data/system 접근 차단
사용자 데이터 앱별 UID 격리를 넘어 도메인 단위의 접근 제한
바이너리 파일 su, sh 등 위험한 실행 파일의 무단 실행 방지

2.3 IPC(Inter-Process Communication) 보안

안드로이드 앱과 서비스는 Binder를 통해 통신합니다. SELinux는 이 Binder 트랜잭션 경로에도 개입하여 허가받지 않은 앱이 중요한 시스템 서비스를 호출(Call)하거나 찾는(Find) 행위를 차단합니다.

2.4 악성 코드 실행 및 권한 상승 방지

공격자가 취약점을 이용해 임시로 루트 권한을 얻더라도, SELinux 정책 파일(sepolicy)에 정의되지 않은 커널 리소스 접근이나 시스템 파일 쓰기 시도는 즉각 거부됩니다.


3. SELinux가 안드로이드에 꼭 필요한 이유

  • 루트 권한 오남용 방지: "Rooting"이 되어도 시스템 무결성을 어느 정도 유지할 수 있는 원동력입니다.
  • 공격 표면(Attack Surface) 감소: 각 프로세스가 실행에 꼭 필요한 자원에만 접근하게 하여(최소 권한 원칙), 침투 경로를 좁힙니다.
  • 개방형 생태계 보호: 다양한 제조사와 앱이 섞인 환경에서 일관된 보안 가이드라인을 제공합니다.

🛠️ 개발자를 위한 팁 & 흔히 하는 실수

✅ 개발 팁 (Best Practices)

  • 로그 분석이 우선: 접근 거부 문제가 발생하면 dmesg나 logcat에서 avc: denied 로그를 먼저 확인하세요. 문제의 원인이 되는 scontext(주체), tcontext(대상), tclass(클래스)를 정확히 파악할 수 있습니다.
  • Neverallow 규칙 준수: 구글의 기본 정책에는 neverallow 규칙이 포함되어 있습니다. 이를 우회하려 하기보다, 구글의 보안 가이드라인 내에서 허용 가능한 도메인을 정의하는 것이 좋습니다.

❌ 흔히 하는 실수 (Common Mistakes)

  • 전체 허용(Allow-all) 지양: 특정 기능을 구현하기 위해 allow domain self:capability { all }; 처럼 과도한 권한을 부여하는 것은 보안 구멍을 만드는 지름길입니다. 필요한 작업(read, write 등)만 세분화해서 부여하세요.
  • 개발 중 모드 변경 잊음: 개발 단계에서 편의상 setenforce 0(Permissive 모드)으로 설정했다가 정식 릴리스 때 Enforcing 모드로 돌리지 않아 대형 보안 사고가 날 수 있습니다. 배포 전 반드시 모드 설정을 확인하세요.

4. 결론

SELinux는 단순한 제약 사항이 아니라, 안드로이드라는 거대한 생태계를 지탱하는 안전장치입니다. 시스템 프로세스부터 IPC 통신까지 전방위적으로 작동하는 이 정책을 이해하는 것은 안드로이드 보안 전문가나 프레임워크 개발자에게 선택이 아닌 필수입니다.

반응형