dmesg와 logcat을 활용한 SELinux 디버깅
1. 개요
SELinux(Security-Enhanced Linux)는 Android에서 필수적으로 적용되는 보안 메커니즘으로, 시스템의 보안을 강화하기 위해 강력한 접근 제어 정책을 적용합니다. 그러나 SELinux 정책이 예상하지 못한 동작을 하거나 새로운 바이너리 및 서비스를 추가할 때, 접근이 차단되면서 정상적으로 동작하지 않는 경우가 발생할 수 있습니다. 이때 dmesg와 logcat을 활용하면 SELinux 문제를 효과적으로 디버깅할 수 있습니다.
본 글에서는 dmesg와 logcat을 활용한 SELinux 디버깅 방법을 설명하고, 예제 로그를 기반으로 문제를 해결하는 방법을 소개하겠습니다.
2. SELinux 디버깅을 위한 기본 도구
SELinux 디버깅을 위해 다음과 같은 도구를 사용할 수 있습니다.
dmesg
: 커널 메시지를 출력하여 SELinux 거부 로그를 확인할 수 있습니다.logcat
: Android의 시스템 로그를 출력하는 명령어로, SELinux 관련 정보를 포함한 전체 로그를 확인할 수 있습니다.audit2allow
: SELinux 거부 로그를 분석하여 새로운 정책을 생성하는 데 사용할 수 있습니다.
2.1 dmesg 로그 확인
커널에서 발생하는 SELinux 정책 거부 로그를 확인하려면 다음 명령어를 사용할 수 있습니다.
adb shell dmesg | grep -i "avc:"
위 명령어는 avc: denied
로그를 필터링하여 SELinux 관련 접근 거부 메시지만 출력합니다.
2.2 logcat 로그 확인
logcat을 사용하여 SELinux 관련 거부 로그를 확인할 수도 있습니다.
adb logcat -d | grep -i "avc:"
logcat에서는 SELinux 정책 거부 로그뿐만 아니라, 사용자 애플리케이션과 관련된 다양한 로그도 함께 출력됩니다.
2.3 SELinux 상태 확인
현재 시스템의 SELinux 상태를 확인하려면 다음 명령어를 실행할 수 있습니다.
adb shell getenforce
출력 결과가 Enforcing
이면 SELinux가 강제 모드로 실행 중이며, Permissive
이면 정책을 기록하지만 실제로 차단하지는 않습니다.
SELinux를 일시적으로 Permissive
모드로 변경하여 문제를 확인하고 싶다면 다음 명령어를 사용할 수 있습니다.
adb shell setenforce 0 # Permissive 모드
adb shell setenforce 1 # Enforcing 모드로 복귀
3. dmesg와 logcat을 활용한 SELinux 디버깅 예제
SELinux 정책에 의해 접근이 차단되었을 때 발생하는 avc: denied
로그를 분석하는 방법을 예제와 함께 살펴보겠습니다.
3.1 avc: denied
로그 예제
adb shell dmesg | grep -i "avc:"
출력 예제:
[ 123.456789] type=1400 audit(123456789.123:456): avc: denied { read } for pid=1234 comm="my_app" name="example_file" dev="sda1" ino=12345 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:example_data_file:s0 tclass=file permissive=0
위 로그에서 각 필드의 의미는 다음과 같습니다.
avc: denied
: SELinux에 의해 접근이 거부됨{ read }
: 프로세스가 수행하려던 동작(읽기)pid=1234
: 차단된 프로세스의 PIDcomm="my_app"
: 실행 중인 프로세스 이름name="example_file"
: 접근하려던 파일scontext=u:r:untrusted_app:s0
: 요청한 프로세스의 SELinux 보안 컨텍스트tcontext=u:object_r:example_data_file:s0
: 접근 대상의 보안 컨텍스트tclass=file
: 접근 대상이 파일permissive=0
: SELinux가 강제 모드(Enforcing
)
3.2 문제 해결 방법
위 로그를 기반으로 해결할 수 있는 방법을 살펴보겠습니다.
방법 1: 필요한 권한 추가 (새로운 정책 작성)
해당 프로세스가 특정 파일을 읽을 수 있도록 정책을 추가해야 합니다. audit2allow
를 사용하여 자동으로 정책을 생성할 수도 있습니다.
adb shell su
cat /sys/fs/selinux/access | grep "avc: denied" | audit2allow -M mypolicy
semodule -i mypolicy.pp
이 방법은 SELinux 정책을 생성 및 적용하는 가장 쉬운 방법입니다.
방법 2: 대상 컨텍스트 변경
파일의 보안 컨텍스트가 잘못 지정되었을 수 있습니다. 이를 확인하고 수정할 수 있습니다.
adb shell ls -Z /data/example_file
출력 예제:
u:object_r:example_data_file:s0 example_file
필요한 경우, 보안 컨텍스트를 변경할 수 있습니다.
adb shell chcon u:object_r:app_data_file:s0 /data/example_file
이 방법은 일시적인 해결책이며, 다음 부팅 시 원래 값으로 복원될 수 있습니다.
방법 3: Permissive
모드에서 동작 확인
일시적으로 SELinux를 Permissive
모드로 변경하여 접근이 차단되지 않는지 확인할 수 있습니다.
adb shell setenforce 0 # Permissive 모드 활성화
adb shell dmesg | grep -i "avc:"
이후 문제가 발생하지 않는다면, SELinux 정책을 수정하여 올바른 권한을 부여하는 방향으로 해결해야 합니다.
4. 마무리
SELinux는 Android 보안을 강화하는 중요한 역할을 하지만, 새로운 바이너리 및 서비스를 추가할 때 예상치 못한 접근 거부가 발생할 수 있습니다. 이러한 문제를 해결하려면 dmesg와 logcat을 활용하여 SELinux 로그를 분석하고, 필요한 경우 새로운 정책을 추가해야 합니다.
본 글에서는 SELinux 정책 거부 로그를 분석하는 방법과 해결하는 방법을 설명하였습니다. 적절한 디버깅 기법을 활용하면 SELinux 문제를 보다 효과적으로 해결할 수 있습니다.
'Android > Seploicy' 카테고리의 다른 글
SELinux 정책 최소화 및 최적화 기법 (0) | 2025.05.14 |
---|---|
Sepolicy neverallow 정책을 활용한 보안 강화 (0) | 2025.05.13 |
audit2allow를 활용한 SELinux 정책 생성 및 검증 (0) | 2025.05.11 |
adb logcat에서 avc: denied 로그 분석 및 해결 방법 (0) | 2025.05.10 |
Third-party 앱을 위한 SELinux 정책 설정 (untrusted_app, isolated_app) (0) | 2025.05.09 |