OTA是什么?

Over-the-Air (OTA) 更新是 Android 设备接收新系统镜像、安全补丁和功能更新的机制,无需物理访问或手动刷机。它从简单的"下载 zip、重启进入 recovery、应用"模式,演变成了 AOSP 中最复杂的子系统之一。

OTA 升级(Over-The-Air)是指在设备或系统中通过移动通信网络(2G/3G/4G/5G或Wifi等)进行设备上的系统升级。

通过 OTA,用户可以方便地更新设备的操作系统、驱动程序、固件或应用软件,以改善设备的性能功能和安全性,或者修复软件中的错误和漏洞。

  • OTA 包结构(Google 标准格式):
ota_package.zip
    payload.bin                    -- 二进制负载
    payload_properties.txt         -- 键值元数据
    META-INF/
        com/android/metadata       -- 包元数据
        com/android/metadata.pb    -- Protobuf 元数据
    care_map.pb                    -- 用于验证的块关注映射

通常,OTA 升级是由设备制造商或软件开发者提供的,用户可以通过设备的系统设置中的 OTA 更新选项或应用商店中的更新选项来获取和安装更新。OTA 升级可以自动的,设备会在有可用的更新时自动下载和安装;也可以是手动的,用户需在设备上手动检查更新并选择是否进行升级。

对于手机厂商闭源的系统组件,漏洞挖掘的核心工作流程如下图所示,它将直接从设备固件中逆向二进制文件作为突破口:

image-20260622151438668

获取OTA

一般厂商通常会定期发布完整的系统固件包,这样我们就可以从官网下载提取。亦或者从第三方网站,私下买卖的方式也可以获取。

比如: OPPO Ace2

image-20260512100522235

下载下来的包是加密的:

PDHM00_11_OTA_0250_all_iyi66E9mjnZC.ozip

解密

通过 oppo_ozip_decrypt 工具解密解密 ozip 包。

  • 环境搭建
git clone https://github.com/bkerler/oppo_ozip_decrypt.git
cd oppo_ozip_decrypt
pip install -r requirements.txt --break-system-packages
  • 使用方法
python ozipdecrypt.py PDHM00_11_OTA_0250_all_iyi66E9mjnZC.ozip

解密后得到对应的 zip 文件。这个 zip 文件就是我们要分析的 ota 增量包。

提取镜像

对于 ota 增量包我们可以先通过 zip 工具解压。

unzip PDHM00_11_OTA_0250_all_iyi66E9mjnZC.zip

OPPO 的 OTA 格式不是 Google 标准格式,而是 OPPO 私有的格式。

❯ ls
META-INF                    firmware-update             product.patch.dat      vendor.transfer.list
boot.img                    oppo_operate_data.sh        product.transfer.list  version.19161.new.dat.br
compatibility.zip           oppo_product.new.dat.br     system.new.dat.br      version.19161.patch.dat
dynamic_partitions_op_list  oppo_product.patch.dat      system.patch.dat       version.19161.transfer.list
engineering.new.dat.br      oppo_product.transfer.list  system.transfer.list   version.19163.new.dat.br
engineering.patch.dat       oppo_update_script.sh       vendor.new.dat.br      version.19163.patch.dat
engineering.transfer.list   product.new.dat.br          vendor.patch.dat       version.19163.transfer.list
  • 解包.new.dat.br文件
# 安装 brotli
sudo apt install brotli

# 解压 system.new.dat.br -> system.new.dat
brotli -d system.new.dat.br -o system.new.dat

# 批量解压所有 .dat.br 文件
for f in *.new.dat.br; do
    brotli -d "$f" -o "${f%.br}"
done
  • sdat2img 转换
# 下载 sdat2img
wget https://raw.githubusercontent.com/xpirt/sdat2img/master/sdat2img.py

# 转换 system 分区
python3 sdat2img.py system.transfer.list system.new.dat system.img

# 转换 vendor 分区
python3 sdat2img.py vendor.transfer.list vendor.new.dat vendor.img

# 转换 product 分区
python3 sdat2img.py product.transfer.list product.new.dat product.img

# 转换 oppo_product(OPPO 私有分区)
python3 sdat2img.py oppo_product.transfer.list oppo_product.new.dat oppo_product.img
  • 7z解压
7z x system.img -o./system_extracted/
7z x vendor.img -o./vendor_extracted/
7z x oppo_product.img -o./oppo_product_extracted/
7z x product.img -o./product_extracted/

然后就可以将镜像中的文件提取出来分析了。

分析

通过安全工具(如 IDA、Jadx)进行逆向分析。

这里以 OPPO 私有文件为例:

oppo_product_extracted
├── app/                          # 预装应用
│   └── OVoiceManagerService/     # OPPO 语音服务
│
├── etc/                          # 配置文件
│   ├── audio_policy_config.xml   # 音频策略
│   ├── permissions/              # 权限定义
│   └── refresh_rate_config.xml   # 屏幕刷新率配置
│
├── media/                        # 媒体文件
│   ├── bootanimation/            # 开机动画
│   └── quickboot/                # 快速启动资源
│
├── oppo/                         # OPPO 私有数据
│   └── prerom_tempres/           # 预装 ROM 临时资源
│
├── overlay/                      # 资源覆盖(影响系统行为)
│   ├── CarrierConfigOverlay.apk  # 运营商配置覆盖
│   └── framework_res_overlay.apk # 框架资源覆盖
│
├── product/framework/            # 产品框架文件
├── res/engineermode/             # 工程模式资源
└── vendor/etc/                   # 厂商配置

我们可以针对预装应用以及 framework 类的资源文件进行分析,如:通过 jadx 逆向分析 OPPO 语音服务:

image-20260512212114200

人工分析太麻烦,我们可以借助 Agent 接入 jadx-mcp 进行自动化的漏洞挖掘。