1 文件系统加密
FBE 文件级加密 (FBE)
文件级加密;
/dev/block/platform/soc/soc:ap-ahb/20600000.sdio/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,inline_xattr,inline_data wait,check,fileencryption=aes-256-xts,reservedsize=128M
文件级加密 | Android 开源项目 | Android Open Source Project
2 启用文件级加密
如需在设备上启用文件级加密 (FBE),就必须在内部存储设备 (userdata
) 上启用 FBE。这也会自动为可合并的存储设备启用 FBE;但是,如有必要,可以覆盖可合并的存储设备的加密格式。
内部存储设备
通过将 fileencryption=contents_encryption_mode[:filenames_encryption_mode[:flags]]
选项添加到 userdata
的 fstab
行 fs_mgr_flags 列,可启用 FBE。此选项用于定义内部存储设备的加密格式。它最多包含三个以英文冒号分隔的参数:
contents_encryption_mode
参数指定将哪种加密算法用于加密文件内容,可为aes-256-xts
或adiantum
。从 Android 11 开始,它也可以留空以指定默认算法,即aes-256-xts
。filenames_encryption_mode
参数指定将哪种加密算法用于加密文件名,可为aes-256-cts
、aes-256-heh
或adiantum
。如果不指定,则当contents_encryption_mode
为aes-256-xts
时该参数默认为aes-256-cts
,当contents_encryption_mode
为adiantum
时该参数默认为adiantum
。- Android 11 中新增的
flags
参数是以+
字符分隔的一个标记列表。支持以下标记:v1
标记用于选择第 1 版加密政策;v2
标记用于选择第 2 版加密政策。第 2 版加密政策使用更安全、更灵活的密钥派生函数。如果设备搭载的是 Android 11 或更高版本(由ro.product.first_api_level
确定),则默认选择第 2 版;如果设备搭载的是 Android 10 或更低版本,则默认选择第 1 版。inlinecrypt_optimized
标记用于选择针对无法高效处理大量密钥的内嵌加密硬件进行了优化的加密格式。其具体做法是仅为每个 CE 或 DE 密钥派生一个文件内容加密密钥,而不是为每个文件派生一个。IV(初始化向量)的生成也会相应地进行调整。emmc_optimized
标记与inlinecrypt_optimized
类似,但它还选择了将 IV 限制为 32 位的 IV 生成方法。此标记应仅在符合 JEDEC eMMC v5.2 规范的内嵌加密硬件上使用,因此仅支持 32 位 IV。在其他内嵌加密硬件上,请改用inlinecrypt_optimized
。此标记一律不得在基于 UFS 的存储设备上使用;UFS 规范允许使用 64 位 IV。- 在支持硬件封装密钥的设备上,
wrappedkey_v0
标记允许为 FBE 使用硬件封装的密钥。此标记只能与inlinecrypt
装载选项以及inlinecrypt_optimized
或emmc_optimized
标记结合使用。
如果不使用内嵌加密硬件,则建议对大多数设备采用设置 fileencryption=aes-256-xts
。如果使用的是内嵌加密硬件,则建议对大多数设备采用设置 fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized
(或等效的 fileencryption=::inlinecrypt_optimized
)。在没有采用任何形式的 AES 加速的设备上,可以设置 fileencryption=adiantum
,从而用 Adiantum 代替 AES。
在搭载 Android 10 或更低版本的设备上,也可以使用 fileencryption=ice
来指定使用 FSCRYPT_MODE_PRIVATE
文件内容加密模式。Android 通用内核未实现该模式,但供应商可使用自定义内核补丁程序实现该模式。该模式生成的磁盘格式因供应商而异。在搭载 Android 11 或更高版本的设备上,不允许再使用该模式,而必须使用标准加密格式。
三、安全编译项
1. Hardening the heap
系统dlmalloc版本 2.8.6。堆溢出,unlink的利用,针对这种攻击,dlmalloc 添加了对unlink的校验功能。
assert(P !=B);\
assert(P !=F);\
assert(chunksize(P)==small_index2size(I));\ 检测“卸下”的chunk的前向指针指向的内存块,保证其后向指针指向当前块,检查前向指针指向内存块,保证其前向指针指向当前块。
2 Preventing Data Execution
在build/core/combo/TARGET_linux-arm.mk 文件中,TARGET_GLOBAL_LDFLAGS 已经包含--noexecstack 参数。攻击者利用栈溢出,改写函数的返回地址,执行shellcode将变得不可行。因为使用该机制后,系统利用CPU的硬件特性,把栈设置为不可执行,也就让攻击者的注入的shellcode 无法得到执行。链接选项加入 noexecstack 参数截图如下:
例如:
去掉-Wl -z noexecstack 参数,加上 -z execstack 编译出来的可执行文件通过readelf 工具,读出GNU_STACK 项的flg 为RWE;
而使用 -Wl -z noexecstack 参数后,读出的Flg 为 RW。
Android系统支持ASLR,并且在init.rc启动脚本中,有echo 2 > proc/sys/kernel/randomize_va_value。 所以Android ASLR 机制更加强大,支持mmap基地址,栈基地址,so加载基地址和堆地址随机化。 在 build/core/binary.mk文件中 -fpie的选项。
例如:picc_service 是在系统编译出来的可执行文件,通过readelf -h picc_service,类型是DYN,如下图红框部分。
Stack-smashing Protection 在运行时,就可以检测到这种破话,从而对栈进行保护。Stack-samshing protection 使用canaries 探测,在缓冲区在保护函数返回地址的同时,还有意将局部变量的数组放在函数栈的高地址,而将其他变量放在低地址,这样使得通过数组溢出来修改其他变量(函数指针)会更为困难。编译时,GCC 编译器 传入 -fstack-proctector 标志,会启用 stack-smashing proctection (即propolice)栈保护机制。 如下图,在系统的android.mk文件中,已经传入该标注
支持,build/core/combo/TARGET_linux-arm.mk 中定义。
整体策略禁止non-firmware application使用的permissions Android protectionLevel属性是system/signature权限等.
1) 第三方应用安装过程检查申请的permissions属性level是否属于system/signature,同时使用platform证书签名,定制后的代码片段部分如下:
RSA 密钥位宽可选 1024、 2048、 3072 及 4096。根据 RSA 算法原理,明文和密文都
必须比公钥 N 小,所以待加解密的数据长度必须小于或等于密钥的长度,惯用作法是
在待加解密的数据的高位补 0 等,使其长度和公钥 N 相等,但其值比公钥 N 小,
PKCS#1 标准定义了几种填充数据的方式,分别是 Block Type 0, Block Type 1,
Block Type 2, RSAES-OAEP 和 RSAES-PKCS1-v1_5 等。
Android GKI 架构简介
相关术语:
ACK:Android Common Kernel
AOSP:Android Open Source Project
GKI:Generic Kernel Image
KMI:Kernel Module Interface
LTS:Long Term Supported
DLKM:Dynamically loadable kernel module
GSI:Generic System Image
VTS:Vendor Test Suite
CTS:Compatibility Test Suite
chattr +i jenkins_test/ #加上i权限,让它无法写入
1.可执行文件设置成不可写
2.可执行文件(如二进制文件、引导脚本和系统脚本)的权限应为r-xr-xr-x(555)或更严格的限制。说明:只允许小于等于555的设置,例如 r-xr-xr-x (555)、r-xr--r-- (544)、或 r-x------ (500)。
3.共享库文件和配置文件的权限应该是rw-r--r--(644)或更严格的限制。