解密SonicOSX固件:逆向工程SonicWall防火墙加密机制

本文详细介绍了Bishop Fox团队如何逆向工程SonicWall SonicOSX固件的加密机制,包括密钥提取、多层解密流程分析,并开源了自动化工具Sonicrack,助力安全研究人员进行善意安全测试。

解密SonicOSX固件:逆向工程SonicWall防火墙加密机制

摘要

Bishop Fox研究人员成功逆向工程了保护SonicWall SonicOSX固件的加密机制,通过分析VMware OVA镜像提取密钥,并逐步解密固件文件系统。研究团队在DistrictCon Year 0会议上展示了详细过程,并开源了自动化工具Sonicrack,用于从VMware虚拟机组中提取密钥并解密NSv固件镜像。

背景

SonicWall生产一系列下一代防火墙设备,广泛用于大型企业网络边界保护。设备型号包括SOHO、TZ(消费者和小型企业)、NSa(中型企业)、NSsp和Supermassive(大型企业),以及NSv(虚拟化和云部署)。这些设备运行SonicOS操作系统,目前有四个主要版本(5至8)处于活跃支持状态。

在7.1.1版本之前,硬件设备的固件镜像使用专有的SIG加密格式分发,而NSv虚拟机使用LUKS加密保护嵌入式卷。2022年2月,Catalpa发布了一种从内存中提取加密密钥并解密NSv卷的技术。2023年12月,Praetorian改进了该技术,逆向工程了密钥派生过程,并发布了解密静态NSv镜像的工具。

从7.0.1版本开始,SonicWall将操作系统升级为SonicOSX,带来了平台功能、OS架构、文件系统组织和固件打包的重大变化。值得注意的是,7.1.1及更高版本的NSv虚拟机使用与硬件设备固件相同的专有SIG加密。

演练第一部分:提取密钥

在本演练中,我们使用SonicOSX版本7.1.1-7047的Open Virtualization Application(OVA)版本。目标是解包VMware OVA镜像,获取根文件系统,以便分析其中的文件并了解操作系统功能。

初始步骤

OVA包是一个tar存档,解包后包含多个VMware用于构建虚拟机的文件,但我们只关心主虚拟机磁盘(VMDK文件)。该文件也是一个存档,可以使用7zip解包。通常,此存档包含多个在虚拟机启动时挂载的卷镜像。其中一个应包含固件,我们通常只需挂载镜像即可提取。如果未加密,则只需解包即可获取根文件系统。

当文件系统加密时,我们必须先解密才能解包文件系统。为此,我们需要找到加密密钥以及加密方式的指示。在硬件设备中,我们期望密钥包含在某种安全存储机制中,如可信平台模块(TPM)。但在虚拟机中,没有此类机制可用,因此我们知道密钥必须包含在虚拟机镜像中的某个位置。

解包和分析

我们首先解包OVA文件,然后解包disk1.vmdk,找到几个嵌入式卷:

  • BOOT卷包含EFI引导加载程序。
  • INSTALL-CACHE卷包含SIG格式的固件。

对固件二进制文件运行binwalk时,未能识别任何文件签名,熵分析显示整个文件具有高熵,表明已加密。

引导加载程序分析

由于虚拟机卷中只有一个其他文件,加密密钥很可能在引导加载程序中。使用binwalk自动解包bootx64.efi生成以下文件:

  • grub.cfg
  • dropin.cfg
  • soniccorex.bin
  • initramfs.gz

检查Grub配置文件,发现dropin.cfg用于强制执行安全启动,soniccorex.bin是Linux内核,initramfs.gz用作初始ramdisk(initrd)。初始ramdisk用于在挂载真实根文件系统之前进行准备工作,例如解密文件系统。

初始ramdisk分析

解包initramfs存档后,我们在文件系统中发现一个密钥文件onetime.key和一个加密存档sunup.cpio.gz.enc。检查init脚本,发现当onetime.key存在于主initram文件系统中时,使用该密钥解密sunup镜像 before mounting it。

使用openssl命令解密sunup镜像:

1
2
3
openssl enc -a -d -aes-256-cbc -pbkdf2 -in sunup.cpio.gz.enc -salt -out sunup.cpio.gz -pass file:onetime.key
gunzip sunup.cpio.gz
cpio -i <sunup.cpio

解包后,我们获得阶段2 initramfs(sunup安装程序),其中包含可能的固件密钥:

  • FW-crypt-release.key
  • SUNUP-crypt-release.key
  • SCX-crypt-release.key

演练第二部分:解密固件

分析sunup卷中的init脚本,指向init.d目录中的几个Bash脚本,这些脚本又指向/usr/bin中的更多Bash脚本。最终,我们找到负责解密固件和安装根文件系统的文件:

  • /usr/bin/installer
  • /usr/bin/fwDecrypt
  • /usr/bin/multi-crypto
  • /usr/lib/config/platform/system.sh

fwEncrypt函数分析

在/usr/bin/installer中,找到用于解密固件镜像的主要函数:

1
2
3
4
fwEncrypt() {
  CMD_TAG=fw-decrypt stdin: "$SOURCE_MONITOR" fwEncryptExtract
  SCX_PACKAGING+=(SW-fwEncrypt)
}

fwEncrypt调用fwEncryptExtract函数,该函数从SIG固件镜像的头部解析格式,提取加密的密钥材料,并调用recoverAesX解密以获取AES密钥。recoverAesX使用FW_DECRYPT_KEY(密钥加密密钥,KEK)解密AES密钥。FW_DECRYPT_KEY在/usr/lib/config/platform/system.sh中定义为FW-crypt-release.key。

installer_decrypt_key函数分析

在/usr/bin/multi-crypto中,installer_decrypt_key函数尝试使用KEK解密密钥材料,使用两种不同的填充类型:oaep和pkcs1。两种函数调用都使用openssl执行AES密钥解密。

sw-crypt-package函数分析

sw-crypt-package函数从SSDH包中提取256字节头部,base64编码,并传递给swpackage_decrypt函数:

1
2
3
4
swpackage_decrypt() {
  local KEY
  if KEY="$(installer_decrypt_key "$INSTALLER_DECRYPT_KEY" "$1")"
}

INSTALLER_DECRYPT_KEY在system.sh中定义为SCX-crypt-release.key。解密AES密钥后,swpackage_decrypt使用openssl解密SSDH包的其余部分。

最终解密

解密后的SW包包含根文件系统。运行binwalk确认:

1
binwalk -e sw-package

解包rootfs镜像:

1
2
3
mkdir rootfs
cd rootfs
7z x ../extractions/sw-package.extracted/B7F/decompressed.bin

最终,浏览SonicOSX的根文件系统,找到主二进制文件sonicosv,证明解密成功。

Sonicrack工具

为了将研究成果开源,Bishop Fox发布了Sonicrack工具,用于自动从VMware虚拟机组中提取密钥并解密VMware NSv固件镜像。使用Sonicrack:

1
2
docker build -t sonicrack .
docker run -it --privileged --rm -v .:/data sonicrack ./sonicrack.py --keys /data/keys --output /data /data/nsv-vmware.7.1.1-7047-R5557.ova

首次运行针对OVA镜像以提取密钥,之后可以使用密钥解密任何VMware SIG固件(7.1.1及更高版本)。

结论

通过逆向工程SonicOSX固件的加密机制,Bishop Fox团队成功解密了固件文件系统,并开源了Sonicrack工具,助力安全研究人员进行善意安全测试。这一过程涉及多层解密和密钥提取,展示了固件加密的复杂性及解密方法的有效性。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计