谷歌BugSWAT | 无恒实验室针对安卓应用的供应链攻击研究

一、背景

近日,BugSWAT 2023在东京顺利落幕,字节跳动无恒实验室研究员受邀参加主题演讲。

BugSWAT 2023由Google主办,伴随着今年的Hackeler8 CTF决赛开展。会议邀请了全球的安全专家,共同探讨安全洞见和分享前沿技术。受邀研究者均来自Android、Chrome等项目的顶级漏洞研究专家。

来自无恒实验室的安全研究员胡天易带来的议题是《针对安卓应用的供应链攻击 》,通过拿到域名的所有权进而影响Android供应链安全。攻击者可以通过基于针对maven源的同名组件污染安卓供应链,从而达到攻击的效果。同时他还分享了一个Google未能正确修复安卓系统漏洞的案例,该问题使得多个高危系统漏洞在未修复的情况下被公开披露。

二、Android应用程序的依赖管理

在Android应用开发中,主流的依赖管理系统由Gradle和Maven组成。单个Maven组件由group、artifact、version唯一标识,即GAV,例如com.google.android.gms:play-services-ads:22.4.0。实际项目中,开发人员可以引用任意Maven源,但他们通常使用几个主要的公开源,如Google和Maven Central。另一方面,在较大的组织中,总会存在一些私有Maven源用于托管自研组件。有时组织内部也会存在Maven源代理组(proxy group),方便开发人员通过一次引用使用多个源。

在项目中引用多个Maven源的时候,除非特别声明,否则Gradle会按照源声明的顺序去查找特定的库

三、攻击思路

由于Gradle默认按照引用顺序查找特定组件,我们可以通过同名组件的形式实现供应链攻击,例如对以下声明:

rust 复制代码
repositories {
    mavenCentral()
    maven {
        url 'https://some-self-hosted-maven.com'
    }
}

implementation 'com.somedomain.dev:lib:1.0.0'

开发者原本的预期是从私有源下载com.somedomain.dev:lib:1.0.0,然而Maven Central在私有源之前被引用,假如攻击者在Central源上传同名组件,实际构建时Gradle会选择Central而非私有源,如下图所示:

要实现这一效果,攻击者需要

  1. 注册somedomain.com这一域名,原因是Maven Central以域名所有权进行鉴权。即somedomain.com域名的所有者可以上传任意group前缀为com.somedomain的组件到Central源;
  2. 上传恶意组件到Central的同一坐标,即com.somedomain.dev:lib:1.0.0;
  3. 等待项目重新构建,完成恶意代码嵌入。

通过这一思路,我们实际上将Android组件的供应链安全性和特定域名的所有权关联在了一起。值得注意的是,部分项目可能受到过期域名的影响,使得原本安全的源重新存在风险。例如,由于mule.org这一域名已经过期并可以购买,以下引用方式就可能受到攻击:

rust 复制代码
repositories {
    mavenCentral()
    maven {
        url 'https://repository.mulesoft.org/releases/'
    }
}

implementation 'org.mule.xxx:artifact:version'

其中org.mule.xxx:artifact:version应当从mulesoft Maven源下载,然而mule.org已经过期,任何人都可以购买并在Maven Central上传同名组件,进而造成供应链攻击。

四、如何避免

安全人员应当检查:

  1. 组织内部是否存在私有Maven源或Maven源代理组
  2. 在内部的安卓项目(包括应用和组件)及代理组中,是否使用正确顺序引用Maven源,即内部私有源优先;
  3. 必要的时候使用include或exclude规则来显式指定从哪个源下载组件;
  4. 组织是否存在Android组件命名规则,保证所有组件的group均为组织所有的域名,例如所有组件group都以com.google.作为前缀。

五、关于无恒实验室

无恒实验室(security.bytedance.com/security-la... Hat等顶会会议和期刊。

未来,无恒实验室将继续深耕移动安全和隐私安全,与业界共享研究成果,协助企业避免安全风险;亦希望与业内同行共同合作,为网络安全行业的发展做出贡献。

相关推荐
jyan_敬言18 分钟前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
代码的余温21 分钟前
5种高效解决Maven依赖冲突的方法
java·maven
paishishaba30 分钟前
Maven
java·maven
程序员老刘37 分钟前
Android 16开发者全解读
android·flutter·客户端
福柯柯2 小时前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩2 小时前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子2 小时前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖2 小时前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera
用户2018792831672 小时前
🌟 童话:四大Context徽章诞生记
android
yzpyzp2 小时前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio