3

例如,virt-what显示您是否在硬件虚拟化“沙盒”中运行。

如何检测您是否在 ARM "TrustZone" 沙箱中运行?

4

3 回答 3

4

TrustZone可能与您的想法不同。有一个连续的模式。从“受信任功能的简单 API”到在每个世界中运行的“双操作系统”。

如果该问题有更多上下文,那将很有帮助。这是为了以编程方式确定还是出于逆向工程考虑?对于当前的 Linux 用户空间,答案是否定的。

概括

  • 当前没有用户空间实用程序。
  • 基于时间的分析。
  • 基于代码的分析。
  • CPU 排除和SCR.
  • ID_PRF1位 [7:4]。

virt-what不是一个万无一失的方法来发现你是否在管理程序下运行。它是为linux 用户空间编写的程序。大多数情况下,这些是检查等 的shell 脚本。procfs是一个伪文件系统,它在内核上下文中运行代码并向用户空间报告。主线ARM linux中没有这样的TrustZone检测。根据设计,ARM使其难以被发现。设计意图是让正常世界中的代码不加修改地运行。/proc/cpuinfo

代码分析

为了与安全世界对话,普通世界需要SMC指令。如果您的用户空间可以访问内核代码或vmlinux映像,您可以尝试分析代码部分以获取SMC指令。但是,此代码可能存在于图像中,但从未激活。至少这说明了Linux内核是否对TrustZone有一些支持。您可以编写一个内核模块来捕获SMC指令的任何执行,但可能有更好的解决方案。

时序分析

如果操作系统在安全的世界中运行,一些时间分析会显示,如果频率缩放未激活,一些 CPU 周期已被窃取。我认为这不是原始问题精神的答案。这依赖于知道安全世界是一个带有计时器(或至少是可抢占中断)的成熟操作系统。

CPU 排除和 SCR

SCR安全配置寄存器)在正常世界中不可用。来自 ARM Cortex-A5 MPcore 手册(pg4-46),

使用限制SCR 是:
• 只能在特权模式
下访问 • 只能在安全状态下访问。
尝试从安全特权以外的任何状态访问 SCR 都会导致未定义指令异常。

ID_PRF1位 [7:4]。

在某些Cortex-A系列上,指令,

mrc p15, 0, r0, c0, c1, 1

将获得一个值,其中位 [7:4] 指示 CPU 是否支持Security Extensions,也称为TrustZone。非零值表示支持。许多早期的 CPU 可能不支持这个 CP15 寄存器。所以,它很像SCR处理未定义的指令。此外,它不会告诉您代码在TrustZone模式下处于活动状态。

概括

您可以编写一个内核模块来尝试该指令并处理未定义的异常。这将检测到正常安全的世界。但是,您必须排除根本没有TrustZone的 CPU。

如果设备不是 ARMv6 或更高版本,那么TrustZone是不可能的。很多Cortex-A设备的 CPU 中都有TrustZone,但它不是活动的。

组合SMC测试和 CPU id 仍然不够。一些引导加载程序安全世界中运行,然后过渡到正常世界。所以安全仅在启动期间有效。

从理论上讲,有可能知道,尤其是对系统有更多的了解。可能有很多迹象,例如来自 GIC 的虚假中断等。但是,我认为截至 2014 年 1 月不存在任何用户空间linux 工具。这是病毒/rootkit 编写者和恶意软件检测软件之间的典型升级战争. TZ Rootkit

于 2014-01-20T23:37:40.793 回答
1

您尚未指定要检测处理器状态的处理器(A8、A9、A15?)或执行模式(用户/内核/监视器)的任何详细信息。

Secure Configuration Register根据 ARM 文档,可以通过读取和检查该NS位来检测处理器的当前状态为安全(又名 TrustZone 沙箱)或非安全。

访问安全配置寄存器:MRC p15, 0, <Rd>, c1, c1, 0 设置位 0 对应于处理器处于非安全模式,反之亦然。

于 2014-01-19T17:31:08.093 回答
0

您可以查看处理器的数据表,并找到那些在正常世界和安全世界之间表现不同的寄存器。通常,在 Secure World 中,当您读取这些寄存器时,您只会得到空值。但是在普通世界中获取数据。还有,有些寄存器在安全世界里只能访问,如果你在安全世界里,你可以访问它,但在普通世界里你的访问会被拒绝。

无论如何,区分普通世界和安全世界的方法有很多种。只需详细阅读数据表即可。

于 2016-02-23T08:12:09.440 回答