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_file
에 write
를 시도했으나 거부된 상황입니다.
예제 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_service
가 hw_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) 정책 수정 및 추가
파일 접근을 허용하는 규칙 추가
예를 들어,my_app
이system_data_file
에 대한 읽기 권한이 필요하다면 다음과 같은 정책을 추가해야 합니다.allow untrusted_app system_data_file:file { read open };
이를
sepolicy
에 반영하고 빌드하면 해결될 수 있습니다.도메인 전환 고려
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 정책이 적용될 때 발생하는 중요한 보안 메시지입니다. 이를 분석하고 해결하는 과정에서:
dmesg
또는logcat
을 활용하여 로그를 확인하고,scontext
,tcontext
,tclass
를 분석하여 문제의 원인을 파악하며,audit2allow
를 이용해 허용해야 할 정책을 도출한 후,- 적절한 SELinux 정책을 추가하고 검증해야 합니다.
SELinux 정책을 철저히 관리하면 Android 시스템의 보안을 유지하면서도 필요한 기능을 원활하게 실행할 수 있습니다.
'Android > Seploicy' 카테고리의 다른 글
Android SELinux 정책 설정: domain, file_contexts, genfs_contexts 설정 방법 (0) | 2025.05.01 |
---|---|
Android SELinux 정책 문법과 규칙 (0) | 2025.04.30 |
Android SELinux 정책의 주요 파일 및 디렉터리 구성 (0) | 2025.04.28 |
Android SELinux 정책의 기본 파일 구조 (0) | 2025.04.27 |
Android sepolicy 구조 개요 (0) | 2025.04.26 |