
固件是连接硬件和高级系统软件的基础软件。在现代计算中,固件攻击已成为一个日益严重的威胁——攻击者和国家对手持久关注的目标。为应对这些风险,美国国家标准与技术研究院(NIST)发布了 SP 800-193: 平台固件弹性指南,定义了确保平台固件的保护、检测和恢复能力的强大机制。
此长篇指南探讨了 NIST SP 800-193 和平台固件弹性(PFR)概念,提供从基础到高级应用的深入见解。我们结合了真实案例、扫描方法及 Bash 和 Python 的代码示例。这篇文章是 IT 专业人员、安全工程师和希望遵循现代固件安全标准的组织的一站式资源。
平台固件弹性(PFR) 是一种架构方法,提供机制来保护、检测和恢复对平台固件的网络威胁。固件嵌入在几乎所有硬件组件中:主板、网卡、存储设备等。由于这种低层次的软件通常不可变或很少更新,攻击者希望长期掌控低层次的控制,因此它们成为了吸引人的目标。
许多重大网络攻击利用了固件漏洞,获取了系统的高级隐蔽访问,通常会在重新映像或重新安装操作系统后仍然持续存在。
NIST SP 800-193 是一个规范指南,标准化了组织实现平台固件弹性的方法,以确保业务连续性和减少攻击面。
由于固件在计算堆栈中的基础位置,其具有独特的特性:
现实世界影响:
传统的安全控制措施对固件是不足够的。因此,如 SP 800-193 中所定义的专用框架和严格保护对于关键平台是必要的。
NIST 特别出版物 (SP) 800-193: 平台固件弹性指南 是为应对越来越多的固件攻击趋势而发布的。它为平台设计者、制造商和运营商提供了关于实施机制以确保固件安全和网络弹性的建议。
SP 800-193 重点关注平台固件,如 UEFI、BIOS、BMC(基板管理控制器)、选项 ROM 和设备固件在服务器、笔记本电脑、台式机和网络设备中的应用。
NIST SP 800-193 将固件弹性组织为三个主要支柱:
让我们深入了解每一部分。
目标: 防止未授权修改或破坏平台固件和配置数据。
UEFI 固件更新过程在允许闪存写入之前检查签名:
# 验证 UEFI 固件镜像签名(使用 Linux 上的 'sbverify',来自 sbsigntools)
sbverify --list /path/to/firmware_update.cap
Output:
signature 1
owner: X.509 Cert SHA1:11:22:33:..
issuer: CN=Vendor Signer, O=Vendor..
如果缺少签名或签名无效,更新将被拒绝。
目标: 在启动时和运行时识别对固件或配置数据的未授权或恶意更改。
使用 TPM(可信平台模块)在启动时测量 UEFI 固件:
你可以在 Linux 上使用 tpm2-tools:
# 读取可能存储系统固件状态哈希的 PCR 0
tpm2_pcrread sha256:0
# 输出:
# sha256:
# 0 : 6e5e144f3e10a0a79f0e7d1bdfbbae1bcad9b7e5d480442e1edb3448c3816a3a
将此值与预期的参考(金)哈希进行比较。
目标: 如果检测到恶意修改,则恢复可信固件和安全配置数据。
信任根是一组执行关键安全功能的硬件、固件和/或软件组件。在 SP 800-193 中,RoT 通常:
这是一个使用 tpm2-pytss 库读取 TPM 2.0 设备的 PCR 并与已知的金色哈希进行比较的 Python 代码片段。
from tpm2_pytss import *
import binascii
# 固件区域的已知良好哈希
GOLDEN_PCR0 = "6e5e144f3e10a0a79f0e7d1bdfbbae1bcad9b7e5d480442e1edb3448c3816a3a"
with ESAPI() as sapi:
pcrs = sapi.PCR_Read(
pcrSelectionIn=[TPM2_PCR_SELECTION(hash=TPM2_ALG.SHA256, pcrSelect=[0])]
)
actual_pcr0 = binascii.hexlify(pcrs.pcrValues[0]).decode()
if actual_pcr0 == GOLDEN_PCR0:
print("固件测量与已知良好值匹配。")
else:
print("固件测量不匹配!可能检测到篡改。")
固件测量包括对代码和数据区域的哈希处理并将这些值存储在防篡改存储中。
假设你在一个 Linux 系统上,知道你的固件存储在 /dev/mtd0 中(根据实际情况替换):
sudo sha256sum /dev/mtd0
# 输出: <hash value> /dev/mtd0
将此值与存储的金色哈希进行比较。
固件漏洞被以下人员利用:
第一个在野外发现的 UEFI rootkit;修改了 UEFI 代码以持续存在恶意模块并在重装操作系统后继续存在。它的目标是 SPI 闪存芯片。
自定义固件植入物允许在格式化磁盘后仍然读取/写入。
描述了向 Thunderbolt 选项 ROM 注入恶意代码的方法。
NIST SP 800-193 鼓励定期进行固件完整性扫描和适当的更新管理。
fwupd 检查固件完整性fwupd 是一个处理系统固件更新并可检查设备固件是否与已知良好版本匹配的 Linux 守护进程。
# 列出所有支持的设备和固件版本
fwupdmgr get-devices
# 获取固件更新历史
fwupdmgr get-history
# 进行已知漏洞的安全检查
fwupdmgr security
Bash:
sudo flashrom -p internal -r bios_dump.bin
sha256sum bios_dump.bin
将已知良好的哈希保存在安全位置,以供日后比较。
flashrom 输出假设你需要自动检测 BIOS 更改。
import subprocess
import hashlib
def dump_and_hash_bios(output_file='bios_dump.bin'):
subprocess.run(['sudo', 'flashrom', '-p', 'internal', '-r', output_file], check=True)
with open(output_file, 'rb') as f:
bios_data = f.read()
sha256_hash = hashlib.sha256(bios_data).hexdigest()
print(f"SHA256: {sha256_hash} {output_file}")
return sha256_hash
# 已知良好的哈希值(来自安全存储)
GOLDEN_HASH = "xxx..."
if __name__ == "__main__":
current_hash = dump_and_hash_bios()
if current_hash == GOLDEN_HASH:
print("固件与金色镜像匹配。")
else:
print("警告:固件已更改!可能被入侵。")
根据 NIST SP 800-193 和行业经验,以下是一些可操作的指南:
fwupd、flashrom、TPM PCRs)定期监控固件完整性。固件是计算基础设施中的基础构建块,在任何全面的网络安全策略中,它的保护至关重要。NIST SP 800-193 为构建弹性、面向未来的平台提供了可操作的、面向供应商的基础。不论是保护企业服务器、工业控制系统,还是关键的物联网基础设施,遵循“保护、检测、恢复”模型可确保您的组织在最复杂和危险的攻击向量前站稳脚跟。
常规扫描、使用安全的更新机制、硬件信任根以及操作最佳实践——与 NIST SP 800-193 指南结合,能提高入侵者的门槛,并能在任何妥协后快速恢复。
欲了解更多防御网络架构的见解,请订阅我们的技术博客,并遵循这些硬件根安全的最佳实践!