嵌入式GPRS/EDGE、3G、4G和5G模块通常用于很多用途,包括连接设备,如对讲机、警报器、汽车ECU、车载信息娱乐系统(IVI)、租赁汽车的开锁箱(Getaround连接解锁系统使用蓝牙,但也有个备份的移动连接)等等。在疫情期间意外地发现了一些模块设备管理过程中的漏洞,可能导致攻击者利用FOTA更新模块远程控制。

这篇文章介绍了移动模块、FOTA攻击向量以及针对不同厂商的几个模块可以找到的不同的漏洞类型。

移动模块

这些模块以不同的形式存在 (LGA、PCIe、PCI-SIG M.2),取决于所支持的插槽和为连接对象选择的模块化方式

例如在对讲机中使用的Quectel LGA移动模块

如下图所示,可以看到EC20这样的裸模组:

Quectel mobile(来源:Osmocom)

移动模块包括以下组件:

  • 应用程序处理器

  • 采用适应天线的DRx和PRx前端

  • 基带处理器

  • NAND和DDR存储器、PMIC (RTC)、I/O接口等

基带用于处理信号,通过无线电接收和传输数据使用特定的移动堆栈进行通信。在这种情况下,芯片上的应用程序处理器提供了许多功能,包括通过将模块连接到PC(e.g: /dev/ttyUSBx)

Harald Welte和Osmocom团队也展示了基于OE的Linux运行在一些移动模块上比如Quectel EC20,模块中暴露的设备,有的可以通过AT命令进行通信,有的还可以通过暴露的DIAG接口与基带通信

固件更新

为了让客户对新版本和新功能满意,同时也对模块进行修复,供应商通常支持两种类型的固件更新方法:

  • 默认通过FOTA进行无线传输

  • 采用串行线路

对于串行线路更新,供应商通常向客户提供一个实用程序来更新固件,并提供最新版本二进制文件的链接,这个实用程序可以运行一个暴露的USB/USIF接口从移动模块到主机更新固件

这些工具使用一个特有协议,步骤如下:

  • 检查当前版本

  • 重新启动设备

  • 进入启动模式

  • 然后读取流并上传以更新模块

下面是由Ghidra检索的一个反汇编实用程序的伪代码中的一个步骤示例:

[...]      if (pcVar3 == (char *)0x0) {        dbg_print(1,"Current firmware is up to date. Nothing to do.\n");        close(fdStream);        destroyDevice(dev);                    /* WARNING: Subroutine does not return */        exit(0);      }    }  }  if (boot_delay != 0) {    setBootDelay(dev,boot_delay);    dbg_print(1,"Forced boot delay %d ms\n",boot_delay);  }  if ((0 < deviceSpeed) && (usb_flag == 0)) {    setDeviceSpeed(dev,(uint8_t)deviceSpeed);    dbg_print(1,"Setting device speed %d\n",deviceSpeed);  }  if (restart_needed != 0) {    if (atDevice[0] == '\0') {      manage_failure(&fdStream,"No at channel found for restarting the modem\n");    }    cmd = (char *)(*dev->_vptr.Device[4])();    if (cmd == (char *)0x0) {      manage_failure(&fdStream,"*** Device does not support shutdown\n");    }    dbg_print(1,"*** Restart device: %s\n",atDevice);    fd = open_device(atDevice);    if (fd == -1) {      manage_failure(&fdStream,"*** unable to open the device for restart\n");    }    cmd = (char *)send_verify(fd,cmd,"OK",read_buffer,0x100);    if ((int)cmd < 1) {      manage_failure(&fdStream,"*** error response to AT command\n");    }    close(fd);  }  uVar4 = (*dev->_vptr.Device[1])(cmd,deviceName);  if (((uVar4 ^ 1) & 0xff) != 0) {    manage_failure(&fdStream,"*** Error entering boot mode\n");  }  uVar4 = (*dev->_vptr.Device[2])();  if (((uVar4 ^ 1) & 0xff) != 0) {    manage_failure(&fdStream,"*** Error uploading stream\n");  }  tVar5 = time((time_t *)0x0);  dbg_print(1,"Elapsed time: %lu seconds\n",tVar5 - tVar2);  cmd = getStreamSwVersion(dev);  dbg_print(1,"*** Stream uploaded successfully, installed version %s\n",cmd);

供应商使用的协议允许上传,但也可以实现下载或读取功能,可能会泄露当前固件

在线更新

无线更新固件,即FOTA更新,是一种被许多嵌入式设备用于远程(无线)更新的方法,在嵌入式移动模块的情况下,设备使用的移动网络GPRS/3G/4G或5G取决于可用的移动堆栈

FOTA更新通常以delta差分包的形式出现,它是由FOTA更新生成器生成的,生成器创建一个设备映像及其文件系统,其中有:

  • 配置数据

  • 设置

  • 系统状态等其他信息

生成的增量软件包仅包含源固件版本和目标固件版本之间的差量更改,从而确保了下载高效更新

Osmocom已经记录了增量软件包的格式:EC20 / EC25增量空中固件(DFOTA)升级页面,其中包含多个嵌套部分和指针/偏移量

P1 实际更新:

  • CRC32 + 长度

  • 常见的头

  • TableOfContents(TOC)的解压缩大小的信息,TOC中信息的偏移量

  • 不同更新量(差异,插入,删除,链接等)的信息

  • 可变部分取决于上述信息(例如,旧的和新的CRC32文件,未使用的插入数据等等)

  • LZMA TableOfContents(TOC)(需要在头中标有未压缩的大小,并且没有有效载荷结束标记)

  • 以终止的空文件名开头

  • 文件权限列表(以0xAF分隔)

  • 有关更新的信息(公共标头指向此偏移量)对于插入内容,包括文件大小、权限偏移、压缩的更新大小)

  • 插件的LZMA(与上述要求相同)等等

P2 FileNamesTable:

  • CRC32 + 长度

  • 公共信息

  • Len + null终止字符串

使用专用通信协议将delta包发送到不同的设备。通常使用OMA DM(开放移动联盟设备管理)标准从HTTP/HTTPS中的设备管理客户端提取固件,该协议应该提供包括密钥安全功能在内的软件更新过程的所有管理方面。此OMA DM协议中使用了不同的对象

  • FUMO(固件更新管理对象),允许远程更新设备上的固件

  • SCOMO(软件组件管理对象),用于远程管理设备上的软件组件

  • 远程锁定和/或擦除设备的LAWMO(锁定和擦除管理对象)

客户端发起的FOTA的服务流程示例如下:

FOTA更新进程(来源:Telit)

为了管理移动模块,供应商通常使用SaaS解决方案,该解决方案可以扩大请求更新的设备数量,还可以识别基本更改,并供这些不同模块开箱即用OMA DM配置

在提取OMA DM配置时,我们已经能够识别出一些漏洞。实际上我们可以了解一些配置细节查看如何使用OMA DM客户端进行FOTA更新:

<rdmtree><version>version><node>[...]    <name>FwUpdatename>    <get/>    <acl>Add=*&Delete=*&Exec=*&Get=*&Replace=*acl>    <node>      <name>Flashname>      <add/><exec/><get/><replace/>      <type>urn:oma:mo:oma-fumo:1.0type>      <leaf>        <name>Statename>        <get/><replace/>        <format>intformat>        <value>50value>      leaf>      <node>        <name>DownloadAndUpdatename>        <exec/><get/>        <leaf>          <name>PkgURLname>          <get/><replace/>          <format>chrformat>          <value>value>        leaf>  [...]

其他部分还告诉我们有关同步的不同端点以及如何下载新的固件二进制文件:

<node>    <name>DMAccname>    <permanent/><get/>    <node>      <name>synchronicaname>      <add/><copy/><delete/><get/><replace/>      <node>        <name>AppAddrname>        <add/><copy/><delete/><get/><replace/>        <node>          <name>APPSRVname>          <add/><copy/><delete/><get/><replace/>          <leaf>            <name>Addrname>            <copy/><delete/><get/><replace/>      <value>http://**********/****ml/dmvalue>          leaf>          <node>            <name>Portname>            <add/><copy/><delete/><get/><replace/>            <node>              <name>Portname>              <add/><copy/><delete/><get/><replace/>              <leaf>                <name>PortNbrname>                <copy/><delete/><get/><replace/>                <value>80**value>              leaf>            node>          node>          <leaf>            <name>AddrTypename>            <copy/><delete/><get/><replace/>            <value>URIvalue>          leaf>        node>      node>   [...]

我们可以注意到这里使用的是HTTP而不是HTTPS。因此,我们可以快速想象如果启用此协议栈,这些请求可能会被伪GPRS站拦截。我们将不集中于对这些模块进行后门程序的拦截攻击,而将重点放在请求的端点上

此外,我们还可以按以下方式检索BASIC Auth,来进行同步或获取二进制文件:

<leaf>            <name>AAuthDataname>            <replace/>            <format>binformat>            <value>q****************==value>          leaf>          <leaf>            <name>AAuthSecretname>            <replace/>            <value>fotavalue>          leaf>          <leaf>            <name>AAuthTypename>            <copy/><delete/><get/><replace/>            <value>BASICvalue>          leaf>          <leaf>            <name>AAuthNamename>            <copy/><delete/><get/><replace/>            <value>synchronicavalue>          leaf>          <leaf>            <name>AAuthLevelname>            <copy/><delete/><get/><replace/>            <value>SRVCREDvalue>          leaf>        node>        <node>          <name>CLIENTname>          <add/><copy/><delete/><get/><replace/>          <leaf>            <name>AAuthDataname>            <copy/><delete/><get/><replace/>            <format>binformat>            <value>e****************==value>          leaf>

更进一步,我们可以请求标识的端点URL来了解所使用的技术

端点为主要目标

通过简单地查询配置中标识的端点,我们可以获得多种含有缺陷的框架版本

  • 专用status页面的泄漏

  • 身份验证旁路管理接口含有一个动词篡改漏洞

  • 通过管理界面进行远程代码执行或恶意应用程序部署

对SaaS端点应用程序的简单攻击模式

因此,通过针对这些端点,攻击者将能够对每个FOTA更新请求进行后门处理,并针对ECU进行如下配置:

<flashjobConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ecuName="SEAT_****" schemaVersion="1.0.0" xsi:noNamespaceSchemaLocation="config.xsd">    <config name="Development">        <variantPatterns>            <variantPattern>                <matchService>                    <matchParameters>                        <matchParameter value="0****"/>                    matchParameters>                matchService>            variantPattern>        variantPatterns>        <swils>             <swil downloadSequence="0" logicalBlockId="0" startAddress="******" swilFile="Flash***.bin">                <crc>0x**, 0x**, 0x**, 0x**crc>            swil>        swils><security>***********.pgpsecurity>        <usedSecurityElement>*******usedSecurityElement>        <securityClass>NONEsecurityClass>        <fblRevision>REV_***fblRevision>          config>

还应该注意,这些还取决于在这些端点上利用远程命令检索权限

总结FOTA设备管理服务是想要同时对大量移动模块进行后门操作,而无需在无线电中进行任何移动拦截攻击。要执行攻击,仅需要获取这些端点的列表并利用与设备管理端点所使用的框架版本相关的公共漏洞即可原文来源:物联网IOT安全

fota 差分包_移动物联网模块之FOTA更新攻击相关推荐

  1. fota 差分包_艾拉比FOTA差分升级助力电力厂商加速软件迭代

    电力载波作为电力系统特有的通信方式,广泛应用在远程抄表领域.但是由于电力载波拥有可靠性差,通讯不稳定的缺点,使得设备的升级成功率比较低.本期的小课堂,艾拉比将系统介绍下我们提供的FOTA差分升级是如何 ...

  2. fota 差分包_FOTA升级

    分以下三个模块分析FOTA升级介绍 1.在一个高通安卓项目中部署FOTA升级 2.Android ota升级的基本过程 3.Android ota升级异常分析 升级: 从方法上分为整个文件替换,以打p ...

  3. Android Fota(差分包)制作

    Android Fota包制作 Fota包生成步骤 问题 Fota包生成步骤 在Android系统编译(make)完成后,执行 make otapackage即可生成制作差分包所需的target pa ...

  4. fota 差分包_chaoFOTA

    远程升级套件 简介 远程升级(Firmware Over The Air)可通过无线网络实现固件升级.OneOS的OTA为差分升级,采用此方式可极大降低升级包的大小.OneOS OTA组件分两部分:B ...

  5. fota 差分包_FOTA

    NB模组实现FOTA升级操作流程(M5310-A为例) 1.准备工作 (1)升级方式: 差分包升级. (2)模组侧准备工作 NB 模组型号: M5310-A(仅以此模组举例, 其他具有 FOTA 功 ...

  6. fota 差分包_FOTA相关知识总结

    Android OTA升级,顾名思义是指over-the-air升级方式.通过在线下载安装包的形式,对整个系统进行升级. 在说FOTA之前,先看看Android的系统分区.具体参考官方网页 Andro ...

  7. Air780E|FOTA|IOT|FotaToolkit|空中下载软件升级|云平台|CSDK|差分包升级|编译|官方demo|学习(1):example_fota_iot差分包升级示例

    目录 基础资料 探讨重点 硬件准备 ​内容参考 2.1 编译底包 2.2 编译升级包 2.3 Fota CSDK样例使用说明 2.4 差分包生成 三.差分包升级测试流程 基础资料 基于Air780E开 ...

  8. Fota 升级-差分包制作

    Fota 升级差分包制作 1. 升级包打包 make otapackage 编译界面输入 make otapackage,主要生成 target_files 和 ota 文件 \out\target\ ...

  9. android差分升级原理,BigNews Android 增量更新框架差分包升级 @codeKK c开源站

    支持增量包/差分包/升级包 原理:在服务器端使用 bsdiff 工具将新老安装包的差异打包为一个体积较小的差分包/升级包,然后在 App 端通过 bspatch 工具(和 bsdiff 配套的)用差分 ...

最新文章

  1. Android 多屏显示分析
  2. 【Android 安全】DEX 加密 ( 不同 Android 版本的 DEX 加载 | Android 8.0 版本 DEX 加载分析 | Android 5.0 版本 DEX 加载分析 )
  3. 041_Popover弹出框
  4. linux最常用的目录表示,Linux磁盘分区的命名方式和常用目录?【每日一个知识点第84期-Linux】...
  5. 动态规划之——又见拦截导弹(nyoj814)
  6. crontab详解-如何让脚本自动定时运行,设置、启动 linux定时器
  7. 利用 Cosole 来学习、调试JavaScrip
  8. 2017-03-10Git版本回退
  9. 通过对象引用访问成员
  10. pcb结构链表_lwip中tcp_pcb结构体及其组成链表
  11. 苹果发布iOS 12.4首个测试版 苹果信用卡即将来袭
  12. delphi与java_Delphi XE8中Delphi和JAVA数据类型对应关系!
  13. 为什么大多数编程语言性能对比都有问题?
  14. 基于semisync实现MySQL的主从半同步复制
  15. C#正则表达式获取html标签之间的内容
  16. [秩相关] Spearman秩相关系数计算及假设检验
  17. 串口总线舵机之舵机命令
  18. openwrt安装docker并启动
  19. 桌面的html快捷消失了,桌面上的IE浏览器不见了解决教程
  20. logstash清除sincedb_path上传记录,重传日志数据

热门文章

  1. APS车间管理系统中加工单、派工单与作业排序的作用
  2. 北京语言大学计算机大赛获奖,学堂在线携手北京语言大学 助力中国大学生计算机设计大赛...
  3. ANKI卡牌的一些使用操作
  4. 安科瑞ANAPF有源电力滤波柜
  5. 京东2022.9.3笔试三题
  6. Java递归求斐波那契数求猴子吃桃
  7. E312 MIMO教程
  8. UG开发实战001:UG8.5安装图文详解(加工环境齐全)
  9. 2018-5 - 热经 - 北京中地时空数码科技有限公司 - 研发工程师(WEBGIS 方向)
  10. 2022-07-13 第五小组 瞒春 学习笔记