打开ASIC固件包:AntMiner开发利用
导言
有专家表示,加密货币(比如Bitcoin, Monero, and Ethereum)将会成为非中心和分布式经济系统的主角。如果这是真的,那么在加密货币这一领域,其中最具争论性的主题之一就是在尽可能少地花费资源核实付款的合法性,这对于密码安全来说尤其重要。
这其中有很多核查方式,执行“Proof of Work”是一种简单的核查方式但是很难创建。有旷工曾经收到交易事务,他们解决了一个数学难题,以便将新块添加到区块链中。因为这项任务需要大量的资源,包括经济上的( 能源费用)和技术上的(CPU,RAM),因此,建造一条专门用于降低这些成本的电路是有好处的。
一个专门的集成电路(ASIC)的应用程序就是为解决非常具体的计算问题而产生的集成电路。其中的一个例子可以是Bitcoin ASIC,它专门使用SHA-256算法来挖掘比特币。由于是专门为采矿而设计和开发的,因此很少有公司生产和制造ASIC电路。此外,有一个差距存在于使用CPUs或GPUs的开发人员与使用ASICs的开发人员之间,增加了失败的概率,那就是政府可以向开发团队施压,要求植入后门。
Monero是少数反对ASIC的加密货币之一。ASIC会导致采矿集中化,那样就会引发潜在的安全风险,如50+1%攻击。我将会在这篇文章解释原因并且提供一个例子,那就是 “Antminer”—一种由Bitmain生产的ASIC的开发利用。
打开Antminers固件包
一个无聊的下午,我决定证明ASICs是不安全的。因为全球很少有公司生产ASICs。我通过搜索引擎寻找了一个固件,并发现了提供固件下载的BitMain公司。。
处于好奇,我下载了Antminer-X firmware 版本 201904231321.
ser@hack:~/asic# ls && file Antminer-X-fixed-718M-201904231321-sig.tar.gz
Antminer-Z11-fixed-718M-201904231321
我使用tar,解压了tar.gz存档。
ser@hack:~/asic# tar xzvf Antminer-X-fixed-718M-201904231321-sig.tar.gz
...
uramdisk.image.gz
正如我们所见,文档解压之后,我们得到uramdisk.image.gz。然而,这不仅仅包含了GZ文件,文件用途显示这是一个用gzip和u-boot legacy uImage压缩的RAMdisk镜像。
uramdisk.image.gz: u-boot legacy uImage, , Linux/ARM, RAMDisk Image (gzip), 12739696 bytes, Tue Apr 23 05:22:28 2019, Load Address: 0x00000000, Entry Point: 0x00000000, Header CRC: 0xEAEC1837, Data CRC: 0xEF02B3B3
由于我的目标并不是向你展示如何提取这个文件,我想介绍的是Binwalk-一个用于分析、拆卸和提取固件镜像的实用软件。Binwalk可以作为一个python模块利用,而签名扫描是其最常用的特性。简单地说,它能检查文件签名并使用分析软件解压文件。最后,Binwalk不仅限于固件开发,它也可以用于其他类型的文件。
ser@hack:~/asic# binwalk uramdisk.image.gz
DECIMAL HEXADECIMAL DEsc riptION -----------------------------------------------------------------------------
0 0x0 uImage header, header size: 64 bytes, header CRC: 0xEAEC1837, created: 2019-04-23 05:22:28, image size: 12739696 bytes, Data Address:
0x0, Entry Point: 0x0, data CRC: 0xEF02B3B3, OS: Linux, CPU: ARM, image type: RAMDisk Image, compression type: gzip, image name: "" 64 0x40 gzip compressed da
您可以通过添加flag“e”来提取固件镜像。(注意,你必须按照安装指南中指定的方式,根据对binwalk的扫描来安装必备软件。)
ser@hack:~/asic# binwalk -e uramdisk.image.gz
实际上,当一个指定的文件在固件镜像中被找到时,binwalk尝试使用以前安装的实用程序来提取该文件。
之后,我们就会获取固件已解压的ext-root文件夹。
理解固件
由于我们已经提取了固件,让我们开始了解AntMiner的工作原理。 在该文件夹中,我们拥有基于Unix的固件镜像的基本结构,所有与Linux或任何Unix发行版相同功能。
ser@hack:~/asic/_extracted# ls
bin etc lib mnt sbin usr var www
我们有包含了系统的所有二进制文件(例如ls,file等..)的bin文件夹。 首先,让我们深入研究包含“Host-specific system-wide configuration files”的etc文件夹。 一个名为os-release的文件向我们展示了一些有关操作系统的信息。
PRETTY_NAME="The Ångström Distributi
这个固件基于Angstrom Distribution,有着更详细的主机名,固件是使用beaglebone程序开发的。
我还在Github上发现了一个包含使用源代码构建固件说明的旧的BitMain存储库。然而,我检查此存储库的原因很简单:它自2015年以来一直未更新。因此,它有一些安全问题需要修复。 由于这个存储库不安全,我不建议基于它构建固件镜像。
文件lighttpd-htdigest.user包含默认帐户的详细信息。
root:antMiner Configuration:23c2a2d78c0d20ec069097d7d20c4392
正如在BitcoinTalk上的这篇文章中所报道的, "23c2a2d78c0d20ec069097d7d20c4392"是"root:antMiner Configuration:root"(没有引号)的一个md5的散列,最后的:root是web接口的密码。
文件shadow.factory包含root帐户的SHA-512散列
root:$6$saaYvC9T$PqLC9JWHDZsWYmpB0b0Zf.34b1m5/r9U6A8PPig2qzxAyUN78pyI/vi7OZrCA0T2y1fT5UNFtPiBYuCyBTA610:15975:0:99999:7:::
有些人可能不同意我的说法,并解释说这是设备中的默认密码。然而,我的目标不是强调存在默认用户这一事实,而是设备的设置不要求立即更改root密码。
继续探索,我们可以看到文件夹“www”,其中包含用于设置挖矿的Web API文件。
深入研究Web界面
可以通过简单的Web界面配置ASIC矿工。 这些页面由lighttpd 1.4.32提供,一种流行的轻量级Web服务器的旧版本。
这个旧版本存在很多安全漏洞:
- CVE-2013-4508 – 对于lighttpd,当SNI被启用时,会配置弱SSL密码,这使远程攻击者更容易通过嗅探网络获取敏感信息来劫持会话;
- CVE-2013-4559 – lighttpd不检查setuid,setgid,o setgroups函数的返回值,这可能导致lighttpd重新启动时,以root身份运行并允许远程攻击者获得特权,如当用户进程达到限制时多次调用克隆函数导致setuid失败提示;
- CVE-2013-4560 - 免费后可让远程攻击者通过未指定的向量导致拒绝服务(分故障和崩溃)。
- CVE-2014-2323 - mod_mysql_vhost.c中的SQL注入漏洞允许远程攻击者通过主机名执行任意SQL命令;
- CVE-2014-2324 - 多个目录遍历漏洞允许远程攻击者通过主机名中的..读取任意文件;
由于我家里没有Antminer,因此我使用固件中提供的CGI脚本修补了我的lighttp。
该接口运行于/bin/sh(bash shell)的CGI脚本。 这非常有趣,因为所有脚本都以root用户身份运行,然后注入的所有命令都以最高权限执行。
发现问题
接下来我正要分析的其中一个名为“upgrade.cgi”的文件。 这个文件用于升级或替换自定义固件。 我认为这是一个调查的很好的起点,因为它是程序的关键脚本。
事实上,在升级过程中,必须有一个并行系统,保证有操作系统的必备功能(例如支持复制功能),这是为了在新旧固件之间进行切换。
在我的研究期间,我发现CVE报告2018-11220描述的潜在的安全问题。 当tar归档文件上传到Web界面时,antminer将提取它并尝试运行名为restoreConfig.sh的文件。 我决定对此详细调查。
首先,upgrade.cgi从用户接收包含文件名和文件内容的POST响应。 该文件不会检查签名(如果上传的是tar,txt或pdf),但是与之相反,它将会在/tmp/ 目录下创建该文件。以下命令会被执行以提取文件。
mkdir $file
cd $file
tar zxf –
CVE 2018-11220似乎通过工具openssl和公钥bitmain-pub.pem引入两个文件签名检查器来修复。 在这里,Bitmain公司增加了一项安全检查,因为理论刷设备的非官方和不受信任的固件破坏了公司与最终用户之间的协议。
openssl dgst -sha256 -verify /etc/bitmain-pub.pem -signature runme.sh.sig runme.sh >/dev/null 2>&1
然后脚本将运行bash runme.sh。 在runme.sh文件中,另一项检查将为了检查uramdisk_image的内容,这个内容是包含我之前向你展示的文件夹“ext-root”的镜像。 为了执行检查,将调用OpenSSL来分析包含部分文件的散列的“fileinfo”。
md5hashmd5hashmd5hashmd5hashmd5hashmd5hash fileinfo
shmd5hashmd5hashmd5hashmd5hashmd5hashmd5ha runme.sh
hashmd5hashmd5hashmd5hashmd5hashmd5hashmd5 runme.sh.sig
[no hashes are present for .bin files]
绕过此文件签名检查有可能吗? 当然! 请记住,.bin文件没有hash! 这是runme.sh内容的一部分。 你能发现这个问题吗?
...
if [ -e BOOT.bin ]; then
flash_erase /dev/mtd0 0x0 0x40 >/dev/null 2>&1
nandwrite -p -s 0x0 /dev/mtd0 BOOT.bin >/dev/null 2>&1
fi
if [ -e devicetree.dtb ]; then
flash_erase /dev/mtd0 0x1A00000 0x1 >/dev/null 2>&1
nandwrite -p -s 0x1A00000 /dev/mtd0 devicetree.dtb >/dev/null 2>&1
fi
if [ -e uImage ]; then
flash_erase /dev/mtd0 0x2000000 0x40 >/dev/null 2>&1
nandwrite -p -s 0x2000000 /dev/mtd0 uImage >/dev/null 2>&1
fi
..
不对bin文件执行检查。 首先,对于每个文件,flash_erase命令将删除指定分区内的部分(举个例子,对于devicetree.dtb,它将从0x1A00000删除到0x200000 -1)。 其次,所有文件都将安装在同一个分区中。
从理论上讲,你可以安装你想要的任何内核,甚至是恶意内核! 您不需要编辑任何特定文件,简单添加已修改但具有相同名称“boot.bin”的bin文件将成为“boot.bin”。
问题在于该控件仅在名为“fileinfo”的文件和其中描述的文件中执行。
这显示了如何通过重建固件映像来破坏文件签名以及如何注入恶意软件。 然而,这些似乎不是影响Antminer Z11的唯一问题,因为某些版本仍然具有固件升级功能而不去检查签名。
举一个可能发生攻击,更改你的矿工地址。 和这种攻击以及一些预防措施(例如向您的目标提交虚假交易)相结合,您可以窃取ASIC的所有收益。 注入恶意程序也是可能的!
结论
错误和缺陷是软件开发的内在特征,是在创建软件时常有的问题。 修复错误的艺术是尽可能地减小错误发生的概率。 在关键基础设施开发中,某些问题可能会影响程序的可用性和稳定性。
ASICs是管理加密货币的关键工具。 想象一下,如果我们发现了一个漏洞,能让我们关闭同一网络中的所有设备,这意味着它们无法工作。 这将是大范围的对区块链的破坏性攻击。
Bitmain是否将安全性作为首要目标? 加密货币应该禁止特定的采矿硬件吗? 加密货币网络的ASICs是安全的吗?
我要感谢00whiterabbit,他为我提供了有关该文章的可靠建议,Anhdres提供了博客图片,shardwick帮助编辑了文件。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://serhack.me/articles/unpacking-asic-firmware-antminer-exploited
最新评论