Android/Seploicy

adb logcat에서 avc: denied 로그 분석 및 해결 방법

임베디드 친구 2025. 5. 10. 22:27
728x90
반응형

adb logcat에서 avc: denied 로그 분석 및 해결 방법

SELinux(보안 강화 리눅스)는 Android에서 중요한 보안 정책을 담당하는 핵심 구성 요소입니다. 시스템에서 수행되는 각종 작업이 SELinux 정책에 의해 허용되거나 차단되며, 허용되지 않은 작업이 발생하면 avc: denied 로그가 생성됩니다. 이 글에서는 adb logcat을 활용하여 avc: denied 로그를 분석하고, 문제를 해결하는 방법에 대해 설명하겠습니다.


1. SELinux avc: denied 로그란?

Android SELinux는 강제 접근 제어(MAC)를 기반으로 동작하며, 정책에 정의되지 않은 접근이 발생하면 이를 차단하고 avc: denied 로그를 기록합니다. 이 로그는 adb logcat 명령을 통해 확인할 수 있으며, 시스템의 보안 문제를 해결하는 데 중요한 정보를 제공합니다.

avc: denied 로그는 다음과 같은 정보를 포함합니다:

  • denied 유형: 허용되지 않은 접근 유형 (read, write, execute 등)
  • 소스 도메인: 접근을 시도한 프로세스의 SELinux 도메인
  • 타겟 객체: 접근 대상 (파일, 디바이스, 서비스 등)
  • 타겟 객체의 유형: 파일이나 리소스의 SELinux 유형 (예: file_type, system_data_file 등)
  • 정책 허용 여부: 현재 SELinux 정책에 의해 허용되지 않는 동작인지 여부

예제 로그:

adb logcat -b all | grep 'avc: denied'

출력 예시:

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

위 로그를 통해 untrusted_app 도메인이 system_data_file 유형의 파일에 대해 read 액세스를 시도했으나 차단되었음을 알 수 있습니다.


2. avc: denied 로그 분석

avc: denied 로그를 분석하는 핵심 요소는 다음과 같습니다:

  1. 소스 도메인(scontext): 문제를 일으키는 프로세스의 도메인
  2. 타겟 컨텍스트(tcontext): 접근하려는 객체의 보안 컨텍스트
  3. 허용되지 않은 작업({ read }, { write } 등)
  4. 클래스(tclass): 문제의 대상(예: file, dir, socket 등)
  5. permissive 값: 0이면 강제 적용(Enforcing), 1이면 허용(Permissive) 모드

예제 분석

다음 로그를 살펴보겠습니다.

avc: denied { write } for pid=5678 comm="custom_daemon" path="/data/myfile" 
 scontext=u:r:custom_daemon:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=0

분석 과정

  • custom_daemon 도메인이 /data/myfile 파일에 대해 write 액세스를 시도함
  • 대상 객체(tcontext)는 system_data_file 타입이며, SELinux 정책에서 write 허용이 없음
  • permissive=0 이므로 실제로 차단되었음

이 경우 해결 방법은 custom_daemonsystem_data_filewrite할 수 있도록 SELinux 정책을 수정하는 것입니다.


3. avc: denied 해결 방법

3.1 audit2allow를 이용한 정책 생성

audit2allow 도구를 활용하면 avc: denied 로그를 기반으로 새로운 SELinux 정책을 생성할 수 있습니다.

1. adb를 이용해 SELinux 로그 수집

adb shell su -c 'dmesg | grep avc: denied' > avc_logs.txt

2. audit2allow를 사용하여 정책 생성

cat avc_logs.txt | audit2allow -M mypolicy

3. 새로운 정책 로드

semodule -i mypolicy.pp

이제 새로운 정책이 적용되었으며, 문제 발생 프로세스가 필요한 작업을 수행할 수 있습니다.


3.2 수동으로 te 파일 수정

수동으로 정책을 추가하는 방법도 있습니다. 정책 파일(.te)을 직접 수정하여 적용할 수 있습니다.

1. 새로운 유형 정의

# custom_daemon이 system_data_file을 write할 수 있도록 허용
allow custom_daemon system_data_file:file write;

2. 빌드 및 적용

checkpolicy -M -o custom_policy.pp custom_policy.te
semodule -i custom_policy.pp

이제 custom_daemonsystem_data_filewrite할 수 있도록 SELinux 정책이 수정되었습니다.


3.3 Permissive 모드에서 테스트

정책 변경 없이 문제를 확인하려면 Permissive 모드를 사용할 수 있습니다.

adb shell setenforce 0  # Permissive 모드 활성화

이후 로그를 다시 확인하여 접근이 허용되는지 테스트한 후, 적절한 정책을 추가하는 방식으로 해결할 수 있습니다.

adb shell setenforce 1  # Enforcing 모드 재활성화

Permissive 모드는 개발 중에만 사용해야 하며, 실제 배포 환경에서는 반드시 Enforcing 모드를 유지해야 합니다.


4. 결론

avc: denied 로그는 Android SELinux 정책에서 차단된 접근을 의미하며, 이를 적절히 해결하지 않으면 앱 또는 시스템 서비스가 정상적으로 동작하지 않을 수 있습니다.

  • adb logcat을 활용하여 avc: denied 로그를 수집하고 분석해야 합니다.
  • audit2allow 또는 .te 파일을 수정하여 적절한 SELinux 정책을 추가할 수 있습니다.
  • Permissive 모드를 활용하여 테스트한 후 정책을 적용하는 것이 좋습니다.

SELinux 정책을 적절히 조정하여 시스템의 보안성과 안정성을 유지하면서 필요한 기능을 수행할 수 있도록 하는 것이 중요합니다.

728x90
반응형