如何确定ARM处理器是否在正常锁定状态下运行;“世界”;或在Secore中;世界;?

如何确定ARM处理器是否在正常锁定状态下运行;“世界”;或在Secore中;世界;?,arm,trust-zone,Arm,Trust Zone,例如,virt如果您在硬件虚拟化“沙箱”中运行,将显示什么 如何检测您是否在ARM“TrustZone”沙箱中运行?您尚未指定要从中检测处理器状态的处理器(A8、A9、A15?)或执行模式(用户/内核/监视器)的任何详细信息 根据ARM文档,可以通过读取安全配置寄存器并检查NS位来检测处理器的当前安全状态(即信任区沙箱)或非安全状态 要访问安全配置寄存器:MRC p15,0,c1,c1,0 设置的位0对应于处于非安全模式的处理器,反之亦然。TrustZone可能与您认为的不同。模式是连续的。从“

例如,
virt如果您在硬件虚拟化“沙箱”中运行,将显示什么


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

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

根据ARM文档,可以通过读取
安全配置寄存器
并检查
NS
位来检测处理器的当前安全状态(即信任区沙箱)或非安全状态

要访问安全配置寄存器:
MRC p15,0,c1,c1,0

设置的位0对应于处于非安全模式的处理器,反之亦然。

TrustZone可能与您认为的不同。模式是连续的。从“可信函数的简单API”到在每个世界运行的“双OSs”

如果能为这个问题提供更多的背景,那将是有益的。这是用于程序确定还是用于逆向工程考虑?对于当前的Linux用户空间,答案是否定的

总结
  • 没有当前用户空间实用程序
  • 基于时间的分析
  • 基于代码的分析
  • CPU排除和
    SCR
  • ID\u PRF1
    位[7:4]
这不是一个傻瓜式的方法来发现你是否在一个超级遮阳板下运行。它是为linux用户空间编写的程序。主要是检查
/proc/cpuinfo
等。procfs是一个伪文件系统,在内核上下文中运行代码并向用户空间报告。在主线ARM linux中没有检测到托管区。根据设计,手臂使其难以检测。设计意图是让代码在正常情况下不经修改地运行

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

时序分析 如果操作系统运行在安全的环境中,一些时间分析将显示,如果频率缩放未激活,则某些CPU周期已被盗。我认为这不是一个符合原问题精神的答案。这取决于知道安全世界是一个具有计时器(或至少是可预防中断)的成熟操作系统

CPU排除和SCR
SCR
(安全配置寄存器)在正常情况下不可用。来自ARM Cortex-A5 MPcore手册(pg4-46)

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

ID\u PRF1
位[7:4]。 在一些Cortex-A系列中,指令

mrc p15, 0, r0, c0, c1, 1
将获取一个值,其中位[7:4]指示CPU是否支持安全扩展,也称为信任区。非零值表示受支持。许多早期的CPU可能不支持此CP15寄存器。因此,它很像
SCR
和处理未定义的指令。此外,它不会告诉您代码在信任区模式下处于活动状态

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


如果设备不是ARMv6或更高版本,则不可能使用信任区。许多Cortex-A设备在CPU中有信任区,但它不处于活动状态

组合的
SMC
测试和CPU id仍然不够。一些引导加载程序在安全世界中运行,然后过渡到正常世界。因此,安全仅在引导期间处于活动状态


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

您可以查看处理器的数据表,找到那些在正常世界和安全世界中表现不同的寄存器。通常,在安全的世界中,当您读取这些寄存器时,您只会得到null。但在正常情况下获取数据。而且,一些你们可以在安全世界中访问的寄存器,若你们在安全世界中,你们可以访问它,但在正常世界中你们的访问将被拒绝


无论如何,有很多方法可以区分正常世界和安全世界。只需详细阅读数据表。

它应该只能从操作系统内核或任何进程访问吗?AFAIK没有一个协处理器寄存器可以从用户空间访问。您应该在内核中尝试。安全配置寄存器也无法从正常模式内核访问,并且将触发未定义的指令异常。然而,这也是唯一一种可移植的查找方法。@artlessnoise:我对这个问题的理解非常不同——它是关于检查您当前在哪里执行代码。故障表明您未处于安全模式。无论如何,无法从非安全的execut中确定