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
로그를 분석하는 핵심 요소는 다음과 같습니다:
- 소스 도메인(
scontext
): 문제를 일으키는 프로세스의 도메인 - 타겟 컨텍스트(
tcontext
): 접근하려는 객체의 보안 컨텍스트 - 허용되지 않은 작업(
{ read }
,{ write }
등) - 클래스(
tclass
): 문제의 대상(예:file
,dir
,socket
등) - 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_daemon
이 system_data_file
에 write
할 수 있도록 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_daemon
이 system_data_file
을 write
할 수 있도록 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 정책을 적절히 조정하여 시스템의 보안성과 안정성을 유지하면서 필요한 기능을 수행할 수 있도록 하는 것이 중요합니다.
'Android > Seploicy' 카테고리의 다른 글
dmesg와 logcat을 활용한 SELinux 디버깅 (0) | 2025.05.12 |
---|---|
audit2allow를 활용한 SELinux 정책 생성 및 검증 (0) | 2025.05.11 |
Third-party 앱을 위한 SELinux 정책 설정 (untrusted_app, isolated_app) (0) | 2025.05.09 |
Vendor 영역에서 추가한 바이너리에 대한 정책 적용 (vendor_sepolicy) (0) | 2025.05.08 |
Android 사용자 정의 System Service를 위한 SELinux 정책 작성 (0) | 2025.05.08 |