【问题标题】:Can a Linux kernel run as an ARM TrustZone secure OS?Linux 内核能否作为 ARM TrustZone 安全操作系统运行?
【发布时间】:2014-09-02 07:48:22
【问题描述】:

我正在尝试在支持 TrustZone 的开发板(Samsung exynos 4412)上运行 Linux 内核作为安全操作系统。尽管有人会说安全操作系统应该小而简单。但我只是想试试。如果可能的话,那么编写或移植一个 trustlet 应用程序到这个安全的操作系统会很容易,特别是对于具有 UI(可信 UI)的应用程序。

我购买了基于Xv6的可运行安全操作系统的开发板,正常操作系统是Android(android版本4.2.2,内核版本3.0.15)。我试过用android Linux内核替换简单的安全操作系统,也就是前面加一点汇编代码,比如清除SCR寄存器的NS位,直接调用Linux内核入口(传入必要的内核标记列表) .

内核未压缩代码正确执行,内核的第一个 C 函数 start_kernel() 也被执行。除了运行到 calibrate_delay() 之外,几乎所有的初始化函数都运行良好。这个函数会等待 jiffies 改变:

/* wait for "start of" clock tick */
ticks = jiffies;
while (ticks == jiffies);

我猜原因是没有产生时钟中断(我在时钟中断回调函数中打印日志,它们从未进入)。我在 local_irq_enable() 函数之前和之后检查了 CPSR 状态。 IRQ 和 FIQ 位设置正确。我还在中断向量表中定义的 Linux 内核的 IRQ 处理程序中打印了一些日志。没有任何记录。

我知道安全世界和非安全世界之间的中断系统可能存在一些差异。但是我在任何文档中都找不到差异。有人可以指出他们吗?而最重要的问题是,Linux 是一个非常复杂的操作系统,Linux 内核能否作为 TrustZone 安全操作系统运行?

我是 Linux 内核和 ARM TrustZone 的新手。请帮帮我。

【问题讨论】:

  • 内核是为“真实”硬件而不是硬件 TrustZone(甚至不太可能存在驱动程序)编译的。
  • 感谢您的回复。但是我已经看到了几个可以做很多事情的 trustzone 实现,比如 UI 显示和触摸屏。你可以看到 Genode 的实现。 DocumentationVideo
  • 您的问题似乎有点不清楚。查看标签trust-zone 中的所有问题,尤其是问题How to develop programs for arm trust zone。您不需要安全的操作系统来拥有安全的trustlet;只需安全启动、带启动锁的分区检查器和带安全 API 的监控表。
  • 是的,安全启动可以解决一些问题。但是在安全的世界中做的事情越多,它就越安全。例如,UI 输入可能会被其他应用程序拦截。如果 UI 在安全环境中运行,可能会调用 trustui,那么它们就无法被拦截。此时在非安全世界中无法访问整个屏幕物理外围设备。

标签: linux-kernel arm interrupt trust-zone


【解决方案1】:

将 Linux 作为一个安全的世界操作系统运行应该是默认的标准。即,安全世界监督者是最受信任的并且可以轻松地转换到其他模式。 安全世界是 ARM CPU 的一个操作概念。

注意:仅仅因为 Linux 在安全的世界中运行,并不能使您的系统安全! TrustZone 和安全世界是您可以用来构建安全系统的功能。

但我只是想试试。如果可能的话,那么编写或移植一个 trustlet 应用程序到这个安全的操作系统会很容易,特别是对于具有 UI(可信 UI)的应用程序。

TrustZone 允许对软件进行分区。如果您在同一层同时运行 Linux 和 trustlet 应用程序,则没有任何用处。 trustlet 只是一个普通的应用程序。

trustlets 的正常模式是在启动时设置监控向量页面并锁定物理访问。然后,Linux 内核可以使用smc 指令调用 trustlet 中的例程来访问 DRM 类型的功能以解密媒体等。在这种模式下,Linux 像普通世界操作系统一样运行,但可以调用通过您定义的SMC API,安全世界中的有限功能。

除了运行到calibrate_delay()之外,几乎所有的初始化函数都运行良好。

这是无功能中断的症状。 calibrate_delay() 在等待 tick 计数通过系统计时器中断增加时运行紧密循环。如果您在安全的世界中运行,您可能需要路由中断。寄存器GICD_ISPENDR 可用于强制中断。您可以使用它来验证 ARM GIC 是否正常运行。另外,内核命令行选项lpj=XXXXX(其中XXXX是某个数字)可以跳过这一步。

很可能某些外围中断路由器、时钟配置或其他中断/定时器初始化是由正常系统中的引导加载程序完成的,而您缺少这些。启动新电路板总是很困难; TrustZone 更是如此。

【讨论】:

    【解决方案2】:

    技术上没有什么可以阻止 Linux 在 ARM 处理器的安全状态下运行。但这违背了 TrustZone 的全部目的。大型、复杂的内核和操作系统(如 Linux)无法正式验证到可以认为是“安全”的程度。

    有关这方面的进一步阅读,请参阅http://www.ok-labs.com/whitepapers/sample/sel4-formal-verification-of-an-os-kernel

    至于您面临的具体问题 - 安全与非安全状态下的中断处理应该没有什么特别之处(除非您明确将其配置为不同)。但可能是您删除的安全操作系统正在执行一些现在没有发生的初始计时器初始化。

    3.0.15 也是一个绝对古老的内核 - 它是在 2.5 年前发布的,基于 3 年前发布的内容。

    【讨论】:

    • 这可能会让人毛骨悚然......在安全的世界中,Linux 没有任何问题;这是 ARM 的默认设置,以支持向后兼容性。在安全的世界中同时运行 Linux 和 Trustlet 可能是错误的。从技术上讲,在具有安全外围设备的安全世界中运行最小安全 Linux 并在非安全世界中运行另一个 Linux 是可行的。不要相信微内核炒作。大多数攻击都针对 API 代码而不是操作系统。 Linux 的审阅者远比 OKL4 多。在 OKL4 中编写有缺陷的应用程序/单元与在 Linux 中一样容易(或更容易)。
    • Linux 也比 OKL4 大几个数量级(仅为了该报告而链接到 OKL4 - 操作系统本身不能安全,只有系统可以安全)。大型代码库本质上不太安全。虽然从简单的技术角度来看,安全 Linux 和非安全 Linux 可以共存,但这无助于促进系统安全。
    • 因为我的说明似乎不清楚:我对 OKL4 了解不多,我并不声称它是安全的。我之所以包含它的链接,只是因为该报告讨论了正式验证操作系统的问题。正如我在回答中首先说的那样,然后在评论中更加强烈。我我声称它可以在宇宙的热/冷死亡之前得到保护。我还声称对于任何大小的 Linux 都不是这样。减少攻击面并不是一个安全的系统——它可以让它变得不那么不安全。
    • 也许是对的 [见下文]。您的分析仅针对操作系统。您需要应用程序才能使用操作系统。当操作系统缺少功能时,它们必须在应用程序中实现。您刚刚移动了代码;由于功能有限,操作系统可能会在应用程序空间中实现笨拙。 [下] 一些子系统可以提高安全性。例如,无 MMU 操作系统与任务感知型 MMU 操作系统、进程权限、堆栈随机化等。这些子系统减少了攻击面并需要特权提升。我只提到我使用过的较小的操作系统,这些是我看到的一些问题。
    【解决方案3】:

    您所说的有几个问题需要解决。首先,你是想让 Secure world kernel 运行还是 Normal world kernel?您说您想在 SW 中运行 Linux,在 NW 中运行 Android,但您的问题是:“我已尝试用 android Linux 内核替换简单的安全操作系统”。那么您遇到的问题是哪个内核?

    其次,您提到了清除 NS 位。这真的没有意义。如果设置了 NS 位,需要清除它意味着您已经在 NW 中运行(正如设置的位所指示的那样),您已经执行了 SMC 指令,切换到监控模式,将 NS 位设置为 0,然后恢复 SW 寄存器。是这样吗?

    就中断而言,您是否为每种执行模式正确初始化了 VBAR,即安全世界 VBAR、普通世界 VBAR 和 MVBAR。所有这三个都需要设置,除了在 NSACR 和其他中设置正确的值以确保中断被引导到正确的执行世界,而不仅仅是由 SW 处理。此外,对于所有三种模式,您确实需要单独的异常向量表和处理程序。最初您可能只使用一组,但一旦使用 TZASC 对内存系统进行分区,您就需要将所有内容分开。

    TZ 需要大量配置,而不是简单地通过设置/取消设置 NS 位来处理。对于 Exynos 4412,必须正确设置大量 TZ 控制寄存器才能在 NW 中执行。不幸的是,公共版本的用户指南中没有包含关于它们的任何信息。您需要完整版本才能获得在此处理器上实际运行 SW 和 NW 内核所需的所有值和地址。

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多