一、知识背景随着AndyRubin和几个朋友在2003年10月创立了Android公司,后来影响大家的智能设备操作系统公司就此诞生(2005年被谷歌收购)。如今,全球越来越多的智能终端,包括手机、电视、SmartBoxes和IoT、汽车、多媒体设备等都在深度使用Android系统,而Android的底层是Linux内核,这也使得Linux内核的安全性对Android影响很大。但是,Android因为要绕过商业授权的问题,所以开发了类似的解决方案,比如用bionic代替Glibc,用Skia代替Cairo,而不是使用标准内核和GNU/Linux。由于这些原因,Google在Android内核开源方面的理念与Linux内核社区并不完全吻合。这也导致Android对内核做了很多有针对性的修改,却无法集成到上游。这也导致Android内核在安全方面与Linux内核存在一定的差异,侧重点也不一样。在操作系统层面,Android平台不仅提供了Linux内核的安全特性,还提供了安全的进程间通信(IPC)机制,用于运行在不同进程中的应用程序之间的安全通信。这些操作系统级别的安全功能旨在确保即使是本机代码也受制于应用程序沙箱。该系统可防止违规应用程序损害其他应用程序、Android系统或设备本身,无论代码是本机应用程序行为的结果还是利用应用程序漏洞。以下配置设置用作Android内核配置的基础。设置会组织android-base和android-recommended.cfg文件,android-base.cfg和android-recommended.cfg文件位于android-commonkernelrepo:https://android.googlesource.com/内核/通用/。android-base这些选项启用核心Android功能,应在所有设备上启用。android-recommended这些选项启用高级Android功能,设备可以选择启用这些功能。上游Linux内核版本4.8为内核配置片段指定了一个新位置(kernel/configs)。对于基于4.8或更高版本的分支,Android基础和推荐的配置片段位于此目录中。对于基于4.8之前版本的内核分支,配置片段位于android/目录中。2.生成内核配置对于具有最小defconfig的设备,您可以使用以下命令启用选项,生成.config文件,使用此文件保存新的defconfig或编译启用Android功能的新内核:ARCH=archscripts/kconfig/merge_config.shpath/device_defconfigandroid/configs/android-base.cfgandroid/configs/android-recommended.cfg3.Seccomp-BPF和TSYNCSeccomp-BPF是一种内核安全技术,支持创建沙箱来限制进程可以进行的系统调用。TSYNC函数允许在多线程程序中使用Seccomp-BPF。此功能仅限于具有上游seccomp支持的架构:ARM、ARM64、x86和x86_64。ARM-32、X86、X86_64的内核3.10向后移植,确保在Kconfig中启用CONFIG_SECCOMP_FILTER=y(从Android5.0CTS开始验证),然后从AOSP内核/通用:android-3.10商店中挑选以下更改:9499cd23f9d05ba159fac6d55dc35a7f49f9ce76。..a9ba4285aa5722a3b4d84888e78ba8adc0046b281.cfc7e99e9arm64:Add_NR*definitionsforcompatsyscalls(arm64:Add_NR*definitionsforcompatibilitysystemcalls),作者:JPAbgrall2。bf11863arm64:Addauditsupport(arm64:Addauditsupport),作者:AKASHITakahiro3.3e21c0barm64:audit:Addaudithookinsyscall_trace_enter/exit()(arm64:audit:addaudithookinsyscall_trace_enter/exit()),作者:JPAbgrall4.9499cd2syscall_get_arch:removeuselessfunctionarguments(syscall_get_arch:removeuselessfunctionparameters),作者:EricParis5.2a30a43seccomp:createinternalmode-settingfunction(seccomp:createinternalmode-settingfunction),作者:KeesCook6.b8a9cffseccomp:extractcheck/assignmodehelpers(seccomp:extractcheck/assignmodehelper),作者:KeesCook7.8908ddeseccomp:分离模式设置例程(seccomp:splitmodesettingroutine),作者:KeesCook8。e985fd4seccomp:添加KeesCook的“seccomp”系统调用9.9d0ff69sched:moveno_new_privsintonewatomicflags(sched:moveno_new_privsintonewatomicflags),作者:KeesCook10。b6a12bfseccomp:从检查和应用中拆分过滤器准备,作者:KeesCook11.61b6b88seccomp:引入编写器锁定,作者:KeesCook12。c852ef7seccomp:allowmodesettingacrossthreads(seccomp:allowcross-threadmodesetting),作者:KeesCook13。f14a5dbseccomp:implementSECCOMP_FILTER_FLAG_TSYNC(seccomp:implementSECCOMP_FILTER_FLAG_TSYNC),作者:KeesCook14.9ac8600seccomp:ReplaceBUG(!spin_is_locked())withassert_spin_lock(seccomp:replaceBUG(!spin_is_locked())withassert_spin_lock作者:locked1(.Gu)_er_)900e9fdseccomp:fixsyscallnumbersforx86andx86_64(seccomp:fixsyscallnumbersforx86andx86_64),作者:LeeCampbell16。a9ba428ARM:addseccompsyscall(ARM:addseccompsyscall),作者:KeesCook17.4190090ARM:8087/1:ptrace:reloadsyscallnumberaftersecure_computing()check(ARM:8087/1:ptrace:aftersecure_computing()Reload检查后的系统调用号),作者WillDeacon18。abbfed9arm64:ptrace:添加PTRACE_SET_SYSCALL(arm64:ptrace:添加PTRACE_SET_SYSCALL),作者AKASHITakahiro19。feb2843arm64:ptrace:allowtracertoskipasystemcall(arm64:ptrace:allowtracerprocesstoskipasystemcall),作者:AKASHITakahiro20.dab1073asm-generic:addgenericseccomp.hforsecurecomputingmode1(asm-generic:addgenericseccomp.hforsecurecomputingmode1),作者:AKASHITakahiro21.4f12b53addseccompsyscallforcompattask(addforcompatibilitytasksseccomp系统调用),作者:AKASHITakahiro22.7722723arm64:addSIGSYSsiginfoforcompattask(arm64:addSIGSYSsiginfoforcompatibilitytasks),作者:AKASHITakahiro23.210957carm64:addseccompsupport(arm64:addseccompsupport),作者:AKASHITakahiro4.HWAddressSanitizerHardware-assistedAddressSanitizer(HWASan)是一个内存错误检测工具,类似于AddressSanitizer与ASan相比,HWASan使用的内存少得多,因此更适合清理整个系统。HWASan仅适用于Android10及更高版本,并且仅适用于AArch64硬件。具体可以检测以下异常情况:stackandheapbufferoverflow/underflowheapusageafterfreestackusageoutofrangestackusageafterrepeatedfree/errorfreereturnHWASan是基于内存标记的方法,在这种方法中,小随机标记值与指针和内存地址范围都相关联。要使内存访问有效,指针和内存标记必须匹配。HWASan依靠ARMv8特性Top-Byte-Ignore(TBI,也称为虚拟地址标签)将指针标签存储在地址的最高位。HWASan要求Linux内核在系统调用参数中接受标记的指针。在以下上游补丁集中实现了对这一要求的支持:arm64标记地址ABIarm64:取消标记mm用于传递给内核的用户指针:避免在brk()/mmap()/mremap()中创建虚拟地址别名arm64:验证标记从内核线程调用的access_ok()中的地址Android-4.14及更高版本的通用Android内核将这些补丁作为backports提供,但Android10特定分支(例如android-4.14-q)不提供这些补丁作为backports。五、KASANAndroid包含内核地址故障排除程序(KASAN)。KASAN是内核和编译时修改的组合,以形成一个检测系统,可以更轻松地发现错误和分析根本原因。KASAN可以检测内核中多种类型的内存违规。它还检测堆栈、堆和全局变量上的越界读取和写入,并检测释放后使用和双重释放错误。KASAN将编译时内存函数检测与影子内存相结合,以跟踪运行时的内存访问。内核内存空间的八分之一专门用于影子内存,以确定内存访问是否有效。目前支持x86_64和arm64架构。自4.0以来,它一直是上游内核的一部分,并已向后移植到基于Android3.18的内核。KASAN已经在基于内核4.9.2的gcc编译的Android内核上进行了测试。除了KASAN,kcov是另一个对测试非常有用的内核修改。kcov旨在允许在内核中进行覆盖引导的模糊测试。Itmeasurescoverageonsystemcallinputsandisusefulforfuzzingsystemssuchassyzkaller.如需在启用KASAN和kcov的情况下编译内核,请将以下构建标志添加到内核构建配置:CONFIG_KASANCONFIG_KASAN_INLINECONFIG_TEST_KASANCONFIG_KCOVCONFIG_SLUBCONFIG_SLUB_DEBUGCONFIG_CC_OPTIMIZE_FOR_SIZE并移除以下内容:CONFIG_SLUB_DEBUG_ONCONFIG_SLUB_DEBUG_PANIC_ONCONFIG_KASAN_OUTLINECONFIG_KERNEL_LZ4然后照常构建和刷写内核。KASAN内核比原始内核大得多。考虑到这一点,修改任何引导参数和引导加载程序设置(如果适用)。刷新内核后,检查内核启动日志以查看KASAN是否已启用并正在运行。内核将启动并显示KASAN的内存映射信息,例如:...[0.000000]c00Virtualkernelmemorylayout:[0.000000]c00kasan:0xffffff8000000000-0xffffff9000000000(64GB)[0.000000]c00vmalloc:0xffffff9000010000-0xffffffbdbfff0000(182GB)[0.000000]c00vmemmap:0xffffffbdc0000000-0xffffffbfc0000000(8GBmaximum)[0.000000]c000xffffffbdc0000000-0xffffffbdc3f95400(63MBactual)[0.000000]c00PCII/O:0xffffffbffa000000-0xffffffbffb000000(16MB)[0.000000]c00fixed:0xffffffbffbdfd000-0xffffffbffbdff000(8KB)[0.000000]c00modules:0xffffffbffc000000-0xffffffc000000000(64MB)[0.000000]c00memory:0xffffffc000000000-0xffffffc0fe550000(4069MB)[0.000000]c00.init:0xffffffc001d33000-0xffffffc001dce000(620KB)[0.000000]c00.text:0xffffffc000080000-0xffffffc001d32284(29385KB)...错误将如下所示:[18.539668]c31==================================================================[18.547662]c31BUG:KASAN:null-ptr-derefonaddress0000000000000008[18.554689]c31任务swapper/0/1[18.559988]c31CPU:3PID:1Comm:swapper/0Trainted:GW3.18.24-xxx#1[18.569275]c31硬件名称:Android设备[18.577433]c31调用跟踪:[18.580739]c31[
