实现受保护的确认

注意事项

必须留意以下注意事项,以确保 Android 受保护的确认的完整性。如果这些注意事项得不到圆满的处理,则无法在设备上实现受保护的确认。

Linux 内核注意事项

受保护的确认旨在确保安全运行,即使在设备的内核受到攻击后也不例外。当“受保护的确认”对话框处于启用状态时,内核无法干扰屏幕内容的完整性、用户输入的完整性以及用户输入和输出之间的原子性。在架构方面,必须首先防止内核扩充用户的决定和冒用用户事件。对于这种用例,内核会被视为不可信,因为它可能会受到攻击者的控制或被完全不同的内容所取代。

固件注意事项

只有当一个设备的所有相关组件均具有可信固件时,才可以在该设备上实现受保护的确认。“受保护的确认”旨在确保用户有机会看到可信界面上显示的消息,从而就是否继续进行交易做出明智决定。显示面板驱动程序尤为重要,因为它可能会导致用户无法查看可信界面。

输入注意事项

选择使用安全的输入法,以确保所选输入法生成的输入事件只有在以下情况下才会传递到“受保护的确认”对话框:用户在该对话框处于启用状态时生成事件。

物理硬件

不得让可由 Android 内核控制的任何组件(例如系统芯片 (SoC) 或电源管理集成电路 (PMIC))驱动与物理确认按钮的有线连接。

触摸控制器注意事项

受保护的确认可以将屏幕上的软件按钮用作输入。只要触摸控制器由 TEE 驱动,就必须采取措施来清理触摸控制器的状态。

预期行为

中断

如果系统因来电或电源事件中断确认会话,则 HAL 必须报告 ResponseCode::Aborted。应用会获得 onCanceled() 回调,并获知用户没有选择操作。闹钟无需中止会话,但需要通知用户。当对话框处于启用状态时,不允许出现任何类型的通知叠加层。

输入宽限期

启动受保护的确认后,输入需要在至少 1 秒的时间内处于非活动状态,然后再变为可响应用户互动的状态。此宽限期可确保用户有机会对意外确认对话框作出反应。此宽限期必须由受信任的应用强制执行。

屏幕旋转

竖屏是唯一的指定模式,不支持屏幕旋转。屏幕旋转可能会导致该功能在遭到入侵的系统上被滥用,例如按钮位置具有误导性或正文文本被操纵。

正文文本呈现失败

正文文本有一个 6144 (0x1800) 字节的硬边界,其中包括其他未显示数据和 CBOR 标题信息。此外,它还有一个必须强制执行的软边界。如果呈现的消息无法完全放入可用的屏幕空间,请确保“受保护的确认”会中止并取消相应交易。如果 MessageSize 超出所允许的大小上限,您的实现必须在 promptUserConfirmation 上返回 UIErrorMessageTooLong

最佳做法是在收到 API 调用后格式化正文文本。必须向用户显示完整的正文文本。

辅助显示屏

在某些情况下支持使用辅助显示屏。必须保持输出和用户输入的完整性,且不得通过其他方式显示具有误导性的信息。否则,该对话框只能显示在主显示屏上,所有其他显示屏都应被禁用或处于空白状态。流式传输和屏幕共享解决方案不得显示该对话框或生成“确认”消息。