问题描述
在 Android Q (2020年9月) 版本进行 STS (Security Test Suite) 工具测试时,发现有三项测试用例失败。

问题分析
首先查看测试日志,发现测试过程会执行 cat /proc/sys/kernel/kptr_restrict 命令,并期望返回值是 2 或大于2,然后才会进行后续的安全补丁验证。这属于Android/iOS开发中涉及系统安全的测试环节。
排查步骤如下:
- 确认补丁状态:STS测试失败,首先应检查相关安全补丁是否已正确集成。经过核实,所需的补丁(例如下图中所示的代码)确实已经存在于版本中,初步排除补丁缺失问题。

- 定位失败根源:经查,在此
userdebug 版本中,内核参数节点 /proc/sys/kernel/kptr_restrict 的值为 0。但对比之前测试通过的版本,该值也一直是0。因此推测失败原因是 Google STS 测试标准或工具本身发生了更新,对 kptr_restrict 的期望值提出了更严格的要求。
kptr_restrict 参数详解
kptr_restrict 是一个关键的 Linux 内核安全参数,用于控制是否通过 /proc 等接口暴露内核地址信息。这对于运维/DevOps人员理解系统安全配置很重要。
其取值含义如下(节选自内核文档):
kptr_restrict:
This toggle indicates whether restrictions are placed on exposing kernel addresses via /proc and other interfaces.
- 当 kptr_restrict 设置为 (0) (默认值) 时,没有任何限制。
- 当 kptr_restrict 设置为 (1) 时,除非用户具有 CAP_SYSLOG 权限且有效用户/组ID等于真实ID,否则使用 %pK 格式说明符打印的内核指针将被替换为 0。
- 当 kptr_restrict 设置为 (2) 时,无论权限如何,使用 %pK 打印的内核指针都将被替换为 0。

解决方案
在正常的 userdebug 版本中,为了便于内核调试,通常会将 kptr_restrict 设置为 0,这本身并非一个缺陷。然而,为了通过 Google STS 测试(要求该值 ≥ 2),我们必须对其进行修改。
根据高通提供的相关案例,修复方案如下:
- 移除配置:在内核配置中移除
CONFIG_DEBUG_CONSOLE_UNHASHED_POINTERS 选项。
- 代码回退:回退特定提交,该提交链接为:
https://source.codeaurora.org/quic/la/device/qcom/common/commit/?id=dabbf8107e5a90630af568027f11e806e61113ce。
完成上述修改后,重新编译系统,/proc/sys/kernel/kptr_restrict 的值在 userdebug 版本中也能被正确设置为 2,从而满足 STS 测试的要求。

|