
在当今高度互联的世界中,几乎每个设备——从物联网传感器到企业服务器——都依赖于其固件和启动过程的完整性。固件,即促进硬件操作的低级代码,是恶意行为者寻求持久、隐秘控制设备的常见目标。如果攻击者在启动过程中早期就破解固件或插入恶意组件,他们就可以绕过大多数传统安全工具,造成不可逆转的损害,窃取敏感数据,甚至挟持设备功能用于犯罪目的。
对于设备制造商来说,遵循基本的设备安全原则不仅是法规要求,也是负责任的工程核心内容。其中最重要的是维护设备完整性:确保从第一个启动加载程序到主操作系统的每个关键软件组件都在执行前经过加密验证。
这篇博文深入探讨了驱动设备安全的关键原则和技术,重点关注像安全启动、固件完整性保护和加密证明的有效利用等机制。我们将提供现实案例、代码演练和可操作的最佳实践,适用于初学者和高级用户。
设备完整性是指对设备完全按照制造商意图操作的信心,没有未授权修改的任何操作阶段。这包括从设备通电那一刻起的启动过程,直到操作系统和应用程序的运行。
国家网络安全中心(NCSC)将维护设备完整性作为制造商安全系统设计的核心支柱。特别是,NCSC强调:
“确保每一部分启动软件与先前已知的良好签名匹配,这给人以信心,即设备正在启动到一个良好的状态,从而在后续操作中是值得信赖的。”
未能确保启动软件完整性将为rootkit和bootkit的植入打开大门——这是能够在不被检测的情况下持久存在的恶意代码,无论操作系统级别的安全控件如何。
固件完整性保护旨在确保在设备上运行的固件完全如制造商预期,没有在部署后被篡改或未经授权修改。
制造商还必须保护固件知识产权以防提取和逆向工程。常见技术包括:
设备证明机制允许其他系统验证设备仅运行授权的固件。这通常通过证书(公钥基础设施,PKI)或使用**可信平台模块(TPM)**实现,TPM安全存储加密度量并证明当前固件状态。
启动过程初始化设备硬件并加载必要的软件组件,直到操作系统完全运行。这涉及多个阶段或加载程序,通常包括:
“信任链”描述了这一安全交接:
这一过程有助于防止固件级恶意软件和未经授权的修改。
(来源:微软安全博客)
随Windows 8引入,安全启动依赖UEFI(统一可扩展固件接口)固件和信任根,确保只有签名过的可信代码在启动期间加载。
以管理员身份打开PowerShell:
Confirm-SecureBootUEFI
输出:
True:安全启动已启用并有效。False:安全启动关闭或不支持。if (Confirm-SecureBootUEFI) {
Write-Output "Secure Boot is ENABLED"
} else {
Write-Output "Secure Boot is DISABLED or not supported"
}
安卓设备(安卓4.4+)包括验证启动,每个阶段检查启动加载程序和系统分区的完整性。
通过ADB shell:
adb shell getprop ro.boot.verifiedbootstate
常见输出:
green:设备启动时使用经过验证的系统映像yellow:使用了自定义密钥orange:验证启动已禁用苹果的T2安全芯片,可在Mac硬件中找到,提供一个硬件信任根。只有苹果签署的固件才会加载,而外部存储签名防止未经批准的外部OS映像启动。
硬件信任根(RoT)负责在上电时进行初始签名验证的专用不可变硬件组件。它们可能采取以下形式:
它们在启动过程中推行第一阶段,测量和证明初始固件,然后才加载其他组件。
tpm2_getcap properties-fixed | grep -i firmware
安全启动和固件完整性的核心是公钥加密。制造商在启动ROM中嵌入了一个公钥,所有合法固件映像都由对应的私钥签署。
import hashlib
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
def verify_firmware_signature(firmware, signature, public_key_file):
with open(public_key_file, "rb") as pkf:
public_key = serialization.load_pem_public_key(pkf.read())
try:
public_key.verify(
signature,
firmware,
padding.PKCS1v15(),
hashes.SHA256()
)
return True
except Exception:
return False
这样确保固件不仅是真实的(由制造商签署)且未被篡改的(哈希与签名时的匹配)。
**可信平台模块(TPM)**提供用于启动度量和加密密钥的安全存储。
在Linux上使用tpm2-tools:
tpm2_pcrread
这会输出代表启动过程各组件测量状态的哈希列表(PCR 0-7通常与BIOS、启动加载程序和OS加载器阶段相关)。
mokutil, efibootmgr, 和 fwupd检查是否启用了安全启动:
mokutil --sb-state
示例输出:
SecureBoot enabled
列出EFI启动条目:
efibootmgr
检查固件版本(使用fwupd):
fwupdmgr get-devices
#!/bin/bash
if mokutil --sb-state | grep -q enabled; then
echo "Secure Boot is ENABLED"
else
echo "Secure Boot is NOT enabled"
fi
echo "Current EFI Boot Entries:"
efibootmgr
使用tpm2-tools和Python解析启动测量:
tpm2_pcrread -o pcrs.json
import json
with open('pcrs.json', 'r') as f:
pcrs = json.load(f)
# 显示与启动相关的PCR
for idx in range(8): # PCR 0到7
print(f"PCR {idx}: {pcrs['sha256'][str(idx)]}")
您可以将这些哈希与设备出厂状态时存储的“黄金”(已知良好)值进行比较。
设备制造商有责任确保硬件从他们的工厂离开时免受各种已知和未知的rootkit、bootkit和固件攻击的威胁。实施设备安全原则——尤其是那些确保启动过程和固件完整性的方法——是建立可信数字基础设施的基本措施。
从基本的启动周期加密签名验证到高级的TPM支持的证明机制,建立强大的信任链是阻止对持久控制有企图的攻击者的最可靠方法。这篇博文描述了每个安全工程师或制造商应了解的基础原则和实用工具(具有可脚本化示例)。
保护固件和启动过程最终可以遮蔽用户免受可见和不可见威胁,提高攻击者的入侵难度,并为所有人创造更安全的数字生态系统。