Android/Seploicy

avc: denied 로그 분석 및 이해하기

임베디드 친구 2025. 4. 29. 21:29
반응형

avc: denied 로그 분석 및 이해하기

Android에서 SELinux(보안 강화 리눅스, Security-Enhanced Linux)는 시스템 보안을 강화하는 중요한 역할을 합니다. SELinux 정책이 적용되면서 종종 avc: denied 로그가 발생하는데, 이 로그는 특정 프로세스가 허용되지 않은 액세스를 시도했음을 의미합니다. 본 포스팅에서는 avc: denied 로그의 의미를 분석하고 이를 해결하는 방법을 살펴보겠습니다.


1. avc: denied 로그란?

avc: denied는 SELinux가 특정 액세스를 차단했음을 나타내는 커널 로그 메시지입니다. 이 로그는 Android 시스템의 dmesg 또는 logcat을 통해 확인할 수 있습니다.

다음은 대표적인 avc: denied 로그 예제입니다.

avc: denied { read } for pid=1234 comm="my_app" name="data" dev="sda1" ino=56789
scontext=u:r:untrusted_app:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=0

이 로그를 분석하면 다음과 같은 정보를 얻을 수 있습니다:

  • { read } : read 권한 요청이 거부됨.
  • pid=1234 : 프로세스 ID가 1234인 프로세스에서 발생.
  • comm="my_app" : 해당 프로세스의 실행 파일이 my_app.
  • name="data" : 접근하려던 파일(또는 리소스)의 이름.
  • scontext : 요청을 보낸 주체의 SELinux 컨텍스트.
  • tcontext : 요청 대상 리소스의 SELinux 컨텍스트.
  • tclass=file : 대상이 파일(file) 객체임.
  • permissive=0 : SELinux가 강제 적용 중(= 차단됨).

이제 이러한 로그를 기반으로 문제를 분석하는 방법을 살펴보겠습니다.


2. avc: denied 로그 분석 방법

(1) SELinux 모드 확인하기

SELinux가 Enforcing 모드에서 실행 중인지 확인해야 합니다. Android에서는 getenforce 명령어를 사용하여 현재 모드를 확인할 수 있습니다.

adb shell getenforce

출력 결과:

  • Enforcing : SELinux 정책이 강제 적용됨 (허가되지 않은 액세스가 차단됨).
  • Permissive : 정책이 적용되지만 차단하지 않고 로그만 기록함.

(2) Denied 로그 상세 분석

로그를 분석할 때 중요한 정보는 scontext, tcontext, tclass 세 가지입니다.

예제 1: 앱에서 시스템 파일 접근 실패

avc: denied { write } for pid=5678 comm="my_app" name="config.xml" dev="mmcblk0p1"
scontext=u:r:untrusted_app:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=0

이 로그는 untrusted_app 컨텍스트에서 system_data_filewrite를 시도했으나 거부된 상황입니다.

예제 2: 서비스가 HAL 인터페이스 접근 실패

avc: denied { connectto } for pid=4321 comm="camera_service" path="/dev/hw_camera"
scontext=u:r:camera_server:s0 tcontext=u:object_r:hw_camera_device:s0 tclass=chr_file permissive=0

이 경우 camera_servicehw_camera_device에 대한 connectto 요청을 했으나 정책에 의해 거부되었습니다.


3. avc: denied 해결 방법

(1) SELinux 정책 로그 분석

audit2allow 도구를 사용하면, avc: denied 로그를 기반으로 허용 정책을 생성할 수 있습니다.

adb logcat -d | grep avc > denied.log
cat denied.log | audit2allow -p sepolicy

이 명령어를 실행하면, SELinux 정책에서 필요한 허용 권한을 분석할 수 있습니다.

(2) 정책 수정 및 추가

  1. 파일 접근을 허용하는 규칙 추가
    예를 들어, my_appsystem_data_file에 대한 읽기 권한이 필요하다면 다음과 같은 정책을 추가해야 합니다.

    allow untrusted_app system_data_file:file { read open };

    이를 sepolicy에 반영하고 빌드하면 해결될 수 있습니다.

  2. 도메인 전환 고려
    untrusted_app이 시스템 파일을 수정하려고 할 경우, my_app을 별도의 SELinux 도메인으로 정의하고 필요한 권한을 부여하는 방법도 있습니다.

(3) 정책 테스트 및 적용

새로운 SELinux 정책을 적용한 후 setenforce 0 명령어를 사용하여 Permissive 모드에서 동작을 확인한 뒤, 문제가 없으면 Enforcing 모드로 다시 설정합니다.

adb shell setenforce 0   # Permissive 모드로 변경 (테스트용)
adb shell setenforce 1   # Enforcing 모드로 복귀 (보안 적용)

4. SELinux 정책 유지보수

SELinux 정책은 지속적으로 유지보수해야 합니다. 다음 사항을 고려하여 정책을 관리하면 avc: denied 문제를 줄일 수 있습니다.

(1) 불필요한 정책 허용 금지

정책을 추가할 때 최소한의 권한만 부여해야 합니다. 광범위한 허용(allow all)은 보안 취약점을 초래할 수 있습니다.

(2) audit2allow 자동화 활용

SELinux 로그 분석을 자동화하면 불필요한 수작업을 줄일 수 있습니다. 빌드 과정에서 audit2allow를 활용하여 정책 검토를 자동화할 수 있습니다.

(3) SELinux 정책 업데이트

Android 버전 업그레이드 시 SELinux 정책이 변경될 수 있으므로 정기적인 정책 검토가 필요합니다.


5. 결론

avc: denied 로그는 Android SELinux 정책이 적용될 때 발생하는 중요한 보안 메시지입니다. 이를 분석하고 해결하는 과정에서:

  1. dmesg 또는 logcat을 활용하여 로그를 확인하고,
  2. scontext, tcontext, tclass를 분석하여 문제의 원인을 파악하며,
  3. audit2allow를 이용해 허용해야 할 정책을 도출한 후,
  4. 적절한 SELinux 정책을 추가하고 검증해야 합니다.

SELinux 정책을 철저히 관리하면 Android 시스템의 보안을 유지하면서도 필요한 기능을 원활하게 실행할 수 있습니다.

반응형