U-Boot 系统安全机制

保障嵌入式系统启动过程的安全性和完整性

1. 安全启动(Secure Boot)与镜像签名

安全启动是U-Boot中最重要的安全机制之一,它通过密码学方法验证启动过程中加载的所有镜像的完整性和真实性。

1.1 安全启动的基本原理

安全启动基于公钥基础设施(PKI)和数字签名技术,主要流程包括:

注意: 安全启动通常需要硬件支持,如ARM TrustZone或专用的安全启动ROM。

1.2 配置U-Boot安全启动

在U-Boot中启用安全启动需要以下步骤:

1.2.1 生成密钥对

openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem

1.2.2 编译时配置

configs/目录下的板级配置文件中添加:

CONFIG_FIT_SIGNATURE=y
CONFIG_RSA=y
CONFIG_OF_CONTROL=y
CONFIG_OF_SEPARATE=y

1.2.3 创建设备树签名

mkimage -f fit-image.its -k private_key.pem -K u-boot.dtb -r fit-image.itb
警告: 私钥必须严格保护,泄露私钥将完全破坏安全启动的保护机制。

1.3 安全启动的验证流程

U-Boot的安全启动验证过程:

  1. ROM代码验证一级引导加载程序
  2. 一级引导加载程序验证U-Boot
  3. U-Boot验证内核和设备树
  4. 内核验证模块和initramfs

每一阶段都使用前一级的公钥验证下一级的签名。

1.4 安全启动的优缺点

优点:

缺点:

2. 密码保护U-Boot命令行

为了防止未经授权的访问和修改,U-Boot提供了命令行密码保护机制。

2.1 启用U-Boot密码保护

配置步骤:

  1. 在板级配置文件中启用密码保护:
  2. CONFIG_AUTOBOOT_KEYED=y
    CONFIG_AUTOBOOT_ENCRYPTION=y
    CONFIG_AUTOBOOT_DELAY_STR="password"
  3. 在环境变量中设置密码:
  4. setenv bootdelay 3
    setenv bootcmd "run default_bootcmd"
    setenv bootstopkeys "password"
    saveenv

2.2 密码保护的行为

启用密码保护后:

提示: 密码以明文形式存储在环境变量中,对于更高安全性需求,应考虑使用加密存储。

2.3 高级密码保护配置

对于更复杂的安全需求,可以:

2.3.1 使用SHA256哈希密码

# 生成密码哈希
echo -n "mypassword" | sha256sum

# 在U-Boot中设置
setenv secure_boot_hash "a1b2c3...xyz"
setenv bootstopkeys "sha256,a1b2c3...xyz"

2.3.2 实现多因素认证

通过自定义命令实现:

# 在board.c中添加
int do_otp_auth(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
    // 实现OTP验证逻辑
    return 0;
}

U_BOOT_CMD(
    otpauth, 1, 1, do_otp_auth,
    "Perform OTP authentication",
    ""
);