2、Android安全架构基础:Android安全模型、硬件抽象层(HAL)、TrustZone与TEE、密钥认证(KeyAttestation)

各位同学,咱们今天聊点硬核的。指纹认证不是凭空跑起来的,它背后站着一整套安全架构。我做了这么多年系统安全,见过太多只盯着上层API调用的开发者,结果一遇到安全漏洞就抓瞎。说白了,不理解地基,你盖的楼再漂亮也是危房。

这一节,我带大家把Android安全架构的四个核心模块捋一遍。分别是:安全模型、HAL、TrustZone/TEE、密钥认证。这四个东西,是指纹认证的“四大护法”。

核心观点:指纹数据从采集到比对,全程不能离开安全环境。任何一次“裸奔”都是灾难。

2.1 Android安全模型:沙箱与权限

Android的安全模型,核心就两个词:沙箱权限

沙箱是什么?说白了,每个App都是一个独立的“小隔间”。App A拿不到App B的数据,除非你明确授权。这个机制从Linux继承过来,每个应用分配一个独立的UID,进程隔离。

权限模型呢?就是“你要用我的摄像头?先问我同不同意”。运行时权限(Runtime Permission)是Android 6.0引入的,指纹相关的权限是 USE_BIOMETRICUSE_FINGERPRINT(已废弃)。

我个人习惯把安全模型比作“小区安保系统”:沙箱是每家每户的防盗门,权限是小区大门的门禁卡。你想想看,如果门禁卡随便复制,指纹数据随便读取,那还谈什么安全?

避坑指南:我曾经遇到一个案例,某App直接申请了 SYSTEM_ALERT_WINDOW 权限,然后通过悬浮窗窃取指纹输入界面。嗯,这就是权限模型没用好。记住:最小权限原则,永远不要申请你不需要的权限。

2.2 硬件抽象层(HAL):承上启下的关键

HAL,全称Hardware Abstraction Layer。它的作用很简单:让上层Framework不用关心底层硬件是谁家的。指纹传感器是汇顶的?还是FPC的?HAL层帮你屏蔽差异。

Android 8.0之后,HAL被“绑定化”了,变成了Treble架构。什么意思?以前厂商改个内核,Framework也得跟着改。现在HAL是独立的,Framework通过HIDL(Hardware Interface Definition Language)跟HAL通信。

指纹HAL的接口定义在 hardware/interfaces/biometrics/fingerprint 目录下。核心接口就几个:

// IFingerprint.hal
interface IFingerprint {
    // 注册指纹
    enroll(uint64_t challenge, uint32_t gid, uint32_t timeout_sec);
    // 认证指纹
    authenticate(uint64_t operation_id, uint32_t gid);
    // 取消操作
    cancel();
    // 删除指纹
    remove(uint32_t gid, uint32_t fid);
    // 获取指纹列表
    enumerate();
};

你看,接口很简洁。但简洁不代表简单。HAL层要处理的事情包括:驱动加载、图像采集、特征提取、模板存储。这些操作必须在TEE里完成,否则指纹数据就暴露在REE(普通世界)了。

注意:HAL层是攻击者的重点目标。如果HAL被篡改,攻击者可以伪造指纹数据。我曾经在项目里见过一个“黑盒”方案,厂商直接把指纹比对逻辑写在了HAL层,而不是TEE里。结果呢?一个root权限就能dump出所有指纹模板。这是严重的架构错误。

2.3 TrustZone与TEE:真正的安全堡垒

TrustZone是ARM架构提供的一种硬件隔离技术。它把CPU分成两个世界:普通世界(Normal World)安全世界(Secure World)。Android跑在普通世界,指纹处理跑在安全世界。

TEE(Trusted Execution Environment)就是安全世界里的操作系统。常见的有:高通QSEE、Trustonic、OP-TEE。指纹的采集、特征提取、模板存储、比对,全部在TEE里完成。

为什么非要这样?因为普通世界可以被root、被刷机、被注入代码。但安全世界是硬件隔离的,普通世界的代码根本访问不到TEE的内存。

我画了一张图,帮你理解这个架构:

Android指纹认证安全架构 普通世界 (REE - Rich Execution Environment) 安全世界 (TEE - Trusted Execution Environment) 硬件隔离 (TrustZone) App (指纹认证) BiometricPrompt API Framework FingerprintService HAL (硬件抽象层) fingerprint.default.so 指纹驱动 Kernel Driver TEE OS QSEE / OP-TEE 指纹TA Trusted Application 特征提取 Feature Extraction 模板存储 Template Storage 指纹比对 (Fingerprint Matching) 比对结果通过安全通道返回 安全通道 (SMC调用) 指纹数据全程在TEE内处理,REE只能获取“通过/失败”结果

你看这张图,REE和TEE之间只有一条窄窄的安全通道。指纹数据从传感器采集后,直接进入TEE,REE根本碰不到。这就是TrustZone的威力。

个人经验:我在做某个项目时,厂商为了省成本,把指纹模板存到了REE的文件系统里。结果呢?一个简单的adb backup就把所有指纹数据导出来了。嗯,这种“伪安全”方案,我建议直接打回重做。

2.4 密钥认证(KeyAttestation):证明你是你

密钥认证,英文叫Key Attestation。它的作用是:证明你手里的这把密钥,是在TEE里生成的,没有被篡改过。

Android 8.0引入了KeyStore的认证功能。当你生成一个密钥对时,TEE会签发一个证书链,证明这个密钥是“可信的”。这个证书链包含:

  • 根证书:由设备制造商预置,证明设备身份
  • 中间证书:由TEE OS签发
  • 叶子证书:包含密钥的元数据(用途、算法、是否支持指纹解锁等)

指纹认证中,KeyAttestation用来验证“指纹模板是否被篡改”。每次认证时,TEE会生成一个签名,证明比对结果是真的。

我举个例子:

// 生成一个支持指纹认证的密钥对
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
        "my_fingerprint_key",
        KeyProperties.PURPOSE_SIGN)
        .setDigest(KeyProperties.DIGEST_SHA256)
        .setUserAuthenticationRequired(true)  // 需要用户认证
        .setUserAuthenticationValidityDurationSeconds(30)  // 30秒内有效
        .setAttestationChallenge(challenge)  // 防重放攻击
        .build();

KeyPairGenerator generator = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();

// 获取认证证书链
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
Certificate[] certChain = keyStore.getCertificateChain("my_fingerprint_key");

这段代码生成的密钥,只有通过指纹认证后才能使用。而且,你可以通过证书链验证这个密钥确实是在TEE里生成的。

注意:KeyAttestation的根证书是厂商预置的。如果厂商的根证书泄露了,那整个认证体系就崩塌了。我曾经在某个设备上发现,厂商居然用了同一个根证书签发了所有设备。这意味着,一台设备被攻破,所有设备都危险。这是典型的“一把钥匙开所有锁”的问题。

2.5 四个模块如何协同工作?

咱们把四个模块串起来,看看指纹认证的完整流程:

  1. App调用BiometricPrompt:触发指纹认证请求
  2. Framework通过HAL下发指令:HAL层将请求转发给指纹驱动
  3. 驱动采集指纹图像:传感器采集指纹,数据直接送入TEE
  4. TEE内的指纹TA处理:特征提取、模板比对,全部在安全世界完成
  5. 比对结果签名返回:TEE使用KeyAttestation签名的密钥,对结果签名
  6. Framework验证签名:通过证书链验证结果是否来自可信TEE
  7. App收到认证结果:只有“通过”或“失败”,没有指纹数据

你看,每一步都有安全机制兜底。沙箱隔离了App,HAL隔离了硬件,TrustZone隔离了数据,KeyAttestation验证了身份。四者缺一不可。

总结一句话:Android指纹认证的安全,不是靠某一个环节,而是靠整个架构的层层防护。任何一个环节出问题,整个链条就断了。

好了,这一节的内容就到这里。下一节咱们深入指纹HAL的源码实现,看看那些接口背后到底干了什么。


公众号:蓝海资料掘金营,微信deep3321