怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程( 六 )


3、当前固件签名–使用功能read_firmware_signatures读取 。从保存/ usr /分区的内存分区的后40个字节中读取固件签名 。发送base64编码为POST参数 。

怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程

文章插图
POST请求的格式字符串
函数request_HTTP发出POST请求 。它只能发出HTTP请求,而不能发出HTTPS请求 。更新程序二进制文件根本没有TLS功能,这意味着握手始终在纯文本中进行,这取决于Tesla VPN的安全性 。
函数tun0_is_up检查VPN连接 。仅检查设备tun0是否存在,这似乎很幼稚 。控制了CID的攻击者可以在没有知道更新程序二进制文件的情况下建立自己的VPN 。
更新程序二进制文件本身似乎没有建立VPN连接的任何功能 。尽管无法确定是哪一个,但是必须通过外部过程来执行 。服务器对HTTP POST请求给出JSON响应 。通常,如果请求格式错误或不正确,则不会给出响应 。
怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程

文章插图
典型的握手响应
函数handle_handshake_download处理JSON响应 。
在握手响应中,可能存在数十个字段 。可以从JSON copy_handshake_var_at中提取各个字段,该字段采用字段名称的参数 。对该函数的72个引用中至少使用35个不同的字段名称 。
怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程

文章插图
多次调用以查找JSON响应中的字段
这表明特斯拉中固件更新机制的巨大复杂性 。在测试车辆的同时,很少有这些领域被使用 。
这是从函数do_install的握手响应中读取md5哈希的示例 。
怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程

文章插图
从响应中读取字段firmware_download_file_md5
然后调用handshake_is_actionable函数 。如果正在下载升级,已经在CID上升级,正在中继到IC或正在安装升级,则将阻止握手采取措施 。
怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程

文章插图
不进行握手的原因
如果可以进行握手,则调用函数
initialize_handshake_install 。握手响应存储在文件中以供以后处理,并将命令添加到队列中 。
下载
握手响应中可以包含三个不同的字段,以供下载文件:
1、Firmware_download_url –根据shell脚本方法的常规更新
2、Bsdiff40_download_url –使用开源解决方案的二进制差异
3、Rbdlt_download_url –专有的Redbend增量
使用HTTP,它们似乎都以类似的方式下载 。这是一个示例网址:
怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程

文章插图
 
我们注意到了这些URL的几个有趣的特征:
1、响应每个握手请求而生成,并且显然是唯一的 。
2、收到握手响应后,有效期始终为两周 。
3、出现一个HMAC(哈希消息身份验证代码)以检查其余请求的完整性 。
4、可从公共Internet获得从中下载它们的服务器-无需建立VPN连接 。
由于到期和HMAC,我们无法猜测或暴力破解其他固件下载链接 。
值得注意的是,由于使用公共Internet上的HTTP(未加密)进行下载,因此存在被拦截和篡改的风险 。字段
firmware_download_file_md5检查下载的完整性 。
通过安全的VPN下载哈希值时,将通过公共Internet下载文件 。如果攻击者篡改了下载,则MD5哈希可能不再匹配 。Wi-Fi或蜂窝连接可用于执行下载 。
另一个字段wifi_wait_until将允许在有限的时间内通过Wi-Fi下载 。我们认为,这是为了避免通过蜂窝连接进行下载的成本,同时允许它们进行必要的更新 。
在固件握手响应中可以看到涉及加密的字段:
怎么使用黑客手段逆向分析一点点揭开特斯拉固件更新过程

文章插图
通过开放Internet下载固件的加密密钥
Salsa20(一种轻量级算法)可用于加密下载的更新文件 。函数decrypt_and_save_file实现解密 。
握手响应通过VPN发送整个256位密钥,因此应保持安全,以防止通过Internet进行的固件下载被拦截 。
我们看到的所有下载文件都已加密 。应该可以发送未加密的文件,但是我们没有看到任何证据 。
安装
可以更新系统的许多不同方面:
  • /usr partition
  • Kernel
  • bootloader
/ usr分区更新涉及更新程序二进制文件中的大部分功能 。为此,系统分为在线和离线usr分区 。尽管它们被称为usr,而不是已挂载的文件系统,但它们在每一点都被视为原始存储设备(例如/ dev / mmcblock0p1) 。
“ usr”是指存储设备的只读方面 。一般而言,似乎大多数固件更新都应用于脱机分区 。然后,可以将脱机分区中所做的更改复制回联机分区,或直接从脱机分区运行 。为了从脱机分区执行更改,会发生以下情况:


推荐阅读