커널 강화

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() 함수를 사용하도록 변경해야 합니다.