Android 8.0에는 커널 취약점을 완화하고 커널 드라이버의 버그를 찾는 데 도움이 되는 커널 강화 기능이 추가되었습니다. 이 기능은 android-3.18, android-4.4, android-4.9 브랜치의 kernel/common에 있습니다.
구현
이러한 기능을 사용하려면 기기 제조업체와 SOC가 kernel/common
의 모든 강화 패치를 커널 트리에 병합하고 다음 커널 구성 옵션을 사용 설정해야 합니다.
- 강화된 usercopy:
CONFIG_HARDENED_USERCOPY=y
- PAN 에뮬레이션 - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- PAN 에뮬레이션 - arm:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - 4.4 이상 커널:
CONFIG_RANDOMIZE_BASE=y
KASLR에는 기기 트리 노드 /chosen/kaslr-seed
를 통해 또는 EFI_RNG_PROTOCOL
을 구현하여 하드웨어 엔트로피를 전달하기 위한 부트로더 지원도 필요합니다.
또한 기존 강화 기능이 사용 설정되었는지 확인합니다.
- 스택 버퍼 오버플로 완화:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- 내부 메모리 보호:
CONFIG_DEBUG_RODATA=y
또는CONFIG_STRICT_KERNEL_RWX=y
- 커널에서 사용자 공간 액세스 제한 - x86(기본적으로 사용 설정됨):
CONFIG_X86_SMAP=y
테스트
구현을 테스트하려면 CONFIG_LKDTM=y
를 커널 구성에 추가하고 다음 각 명령어가 커널 패닉으로 이어지는지 확인합니다.
echo ACCESS_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO_AFTER_INIT > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_KERN > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_STACK > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_RODATA > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_KMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_VMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo CORRUPT_STACK > /sys/kernel/debug/provoke-crash/DIRECT
android-4.9의 경우:
echo USERCOPY_HEAP_SIZE_TO > /sys/kernel/debug/provoke-crash/DIRECT
echo USERCOPY_HEAP_SIZE_FROM > /sys/kernel/debug/provoke-crash/DIRECT
일반적인 문제
이러한 변경으로 인해 커널 드라이버에서 버그가 발생할 수 있는데, 이러한 버그는 기기 제조업체나 커널 드라이버의 소유자가 수정해야 합니다.
- 강화된 usercopy는 사용자 공간에서 또는 사용자 공간으로 데이터를 복사할 때 잘못된 경계 검사를 발생시킵니다. 다른 메모리 손상 버그처럼 수정해야 합니다.
- PAN 에뮬레이션은 커널에서 직접 사용자 공간 액세스가 발생하도록 하지만 이는 허용되지 않습니다. 사용자 공간 메모리에 액세스하려는 드라이버는 대신 표준
copy_to_user()
/copy_from_user()
함수를 사용하도록 변경해야 합니다.