NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

谷歌砸重金求挑错,360 发现安卓重大安全漏洞

  • 2018-01-23
  • 本文字数:3550 字

    阅读完需:约 12 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

北京时间 1 月 22 日,“穿云箭”组合漏洞媒体沟通会于 360 大厦召开。上周,谷歌官方发文致谢 360 Alpha 团队,并向 360 Alpha 团队负责人龚广颁发了总额为 112500 美金的安卓漏洞奖励计划(ASR)史上最高金额的奖金。360 Alpha 团队在 2017 年 8 月向谷歌提交了关于攻破 Pixel 手机的“穿云箭”组合漏洞报告。

谷歌砸重金求安全公司挑错

Android Security Rewards(ASR)项目是 Google 于 2015 年启动,主要对那些向公司提交 Android 安全漏洞的安全专家提供奖励。该项目要求专家在运行最新 Android 版的 Pixel 手机和平板上进行测试,然后根据漏洞的危险程度来提供不同的奖金。

该项目于 2017 年 6 月的到了安全专家和白帽子们的大力支持,但是 Google 表示:“每个 Android 版本包含更多的安全保护,但是已经有两年没有专家获得漏洞链这个顶级大奖了。”不过在上周五,公司终于宣布来自奇虎 360 技术公司的 Guang Gong 赢得了这个大奖,奖金共计达到 11.25 万美元(约合 72 万人民币)。

图:谷歌团队发文致谢360 团队

据360 安全团队介绍,这次发现的两个漏洞分别是基于Chrome 浏览器的V8 引擎漏洞CVE-2017-5116,以及Android 系统漏洞CVE-2017-14904,是ASR 首个可以远程有效利用的系列漏洞。其中,Chrome 浏览器漏洞CVE-2017-5116 可被用于在Chrome 浏览器沙盒内远程执行代码。

“穿云箭”组合漏洞可以彻底远程攻破谷歌Pixel 手机,对用户的隐私及财产安全造成极大的威胁。为了保护用户的手机安全,360 Alpha 团队在17 年8 月将该组合漏洞报告给谷歌,已成功帮助其修复Android 系统和Chrome 浏览器。

图:360 助理总裁兼首席安全工程师郑文彬现场演讲

之所以此次Google 会颁发如此高的奖金,一方面是由于“穿云箭”组合漏洞的影响面广,未修复前大部分安卓手机都可能会被黑客利用这个组合漏洞攻破。另一方面该漏洞是基于底层系统存在的,能影响手机设备上所有应用,甚至包括电话短信等基础应用,造成的危害最大。不法分子可利用该漏洞获取用户短信验证码、支付应用权限等,对用户的个人隐私和财产都造成极大威胁。

Pixel 远程利用链的技术细节

根据谷歌发布的在线安全文档,我们找到了有关这两个漏洞的技术细节。

漏洞链包括两个漏洞,CVE-2017-5116 和 CVE-2017-14904。CVE-2017-5116 是一个 V8 引擎错误,用于在沙盒渲染过程中获得远程代码执行。CVE-2017-14904 是 Android 的 libgralloc 模块中的一个漏洞,用于从 Chrome 的沙箱中转移。通过访问 Chrome 中的恶意 URL,这个利用链可以用来将任意代码注入到 system_server 中。

RCE 错误(CVE-2017-5116)

V8 6.0 引入了对 SharedArrayBuffer 的支持,SharedArrayBuffer 是一种在 JavaScript 工作人员之间共享内存的低级别机制,并在工作人员之间同步控制流。

SharedArrayBuffers 给 JavaScript 访问共享内存,原子和 futexes。WebAssembly 是一种可以在现代 Web 浏览器中运行的新类型的代码,它是一种低级汇编式语言,具有紧凑的二进制格式,可以接近本机的性能运行,并提供汇编语言(如 C / C ++)目标,使他们可以在网上运行。通过在 Chrome 中结合使用 SharedArrayBuffer WebAssembly 和 web worker 这三个功能,可以通过竞争条件触发 OOB 访问。简而言之,WebAssembly 代码可以放入 SharedArrayBuffer 中,然后传递给 Web Worker。当主线程解析 WebAssembly 代码时,工作线程可以同时修改代码,这会导致 OOB 访问。

多功能代码位于函数 GetFirstArgumentAsBytes 中其中参数 args 可能是一个 ArrayBuffer 或 TypedArray 对象。将 SharedArrayBuffer 导入到 JavaScript 后,TypedArray 可能由 SharedArraybuffer 支持,因此 TypedArray 的内容可能随时由其他工作线程修改。

复制代码
i::wasm::ModuleWireBytes GetFirstArgumentAsBytes(
const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) {
......
} else if (source->IsTypedArray()) { //--->source should be checked if it's backed by a SharedArrayBuffer
// A TypedArray was passed.
Local<TypedArray> array = Local<TypedArray>::Cast(source);
Local<ArrayBuffer> buffer = array->Buffer();
ArrayBuffer::Contents contents = buffer->GetContents();
start =
reinterpret_cast<const byte*>(contents.Data()) + array->ByteOffset();
length = array->ByteLength();
}
......
return i::wasm::ModuleWireBytes(start, start + length);
}

EoP 错误(CVE-2017-14904)

沙盒转义错误是由 map 和 unmap 不匹配造成的,这会导致 Use-After-Unmap 问题。

复制代码
static int gralloc_map(gralloc_module_t const* module,
buffer_handle_t handle)
{ ……
private_handle_t* hnd = (private_handle_t*)handle;
……
if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) &&
!(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) {
size = hnd->size;
err = memalloc->map_buffer(&mappedAddress, size,
hnd->offset, hnd->fd); //---> mapped an ashmem and get the mapped address. the ashmem fd and offset can be controlled by Chrome render process.
if(err || mappedAddress == MAP_FAILED) {
ALOGE("Could not mmap handle %p, fd=%d (%s)",
handle, hnd->fd, strerror(errno));
return -errno;
}
hnd->base = uint64_t(mappedAddress) + hnd->offset; //---> save mappedAddress+offset to hnd->base
} else {
err = -EACCES;
}
……
return err;
}

gralloc_map 将由参数句柄控制的图形缓冲区映射到内存空间,而 gralloc_unmap 将其取消映射。映射时,mappedAddress 加 hnd-> offset 被存储到 hnd-> base,但是当 unmapping 时,hnd-> base 被直接传递给系统调用 unmap 减去偏移量。hnd-> offset 可以从 Chrome 的沙盒进程中操作,所以可以从 Chrome 的沙盒渲染进程中取消映射 system_server 中的任何页面。

复制代码
static int gralloc_unmap(gralloc_module_t const* module,
buffer_handle_t handle)
{
……
if(hnd->base) {
err = memalloc->unmap_buffer((void*)hnd->base, hnd->size, hnd->offset); //---> while unmapping, hnd->offset is not used, hnd->base is used as the base address, map and unmap are mismatched.
if (err) {
ALOGE("Could not unmap memory at address %p, %s", (void*) hnd->base,
strerror(errno));
return -errno;
}
hnd->base = 0;
}
……
return 0;
}
int IonAlloc::unmap_buffer(void *base, unsigned int size,
unsigned int /*offset*/)
//---> look, offset is not used by unmap_buffer
{
int err = 0;
if(munmap(base, size)) {
err = -errno;
ALOGE("ion: Failed to unmap memory at %p : %s",
base, strerror(errno));
}
return err;
}

尽管 SeLinux 限制了域 isolation_app 访问大部分 Android 系统服务,但 isolated_app 仍然可以访问三个 Android 系统服务。

复制代码
52neverallow isolated_app {
53 service_manager_type
54 -activity_service
55 -display_service
56 -webviewupdate_service
57}:service_manager find;

要从 Chrome 的沙箱中触发前面提到的 Use-After-Unmap 错误,首先将一个可解析的 GraphicBuffer 对象放入一个包中,然后调用 IActivityManager 的 binder 方法 convertToTranslucent 将恶意包传递给 system_server。当 system_server 处理这个恶意软件包时,会触发该错误。

360 携手移动安全联盟推出“先行者”行动

目前,我国 Android 系统手机用户占比超过 50%,数量非常庞大。然而由于补丁的下放延迟,导致市场上的 Android 手机会存在漏洞修复相对滞后的情况。大多数手机厂商,对于 Android 系统漏洞的修复都是在等待谷歌官方的补丁。然而,从白帽子发现漏洞提交给谷歌,谷歌收到漏洞报告进行修复,最后下发补丁给厂商需要一段相对漫长的时间。在这段期间,手机用户往往会因为各类漏洞而面临着一定的安全威胁。

2017 年 12 月,中国信息通信研究院泰尔终端实验室牵头会同设备生产厂商、互联网厂商、安全厂商、高等院校共同发起成立移动安全联盟(Mobile Security Alliance,简称 MSA)。

因此,作为移动安全联盟理事成员的 360,与移动安全联盟携手,推出“先行者”行动,与移动安全联盟一起,帮助国内移动厂商成为漏洞修补的“先行者”。

图:移动安全联盟标准政策组组长翟世俊博士现场演讲

未来,“先行者”行动将配合移动安全联盟漏洞修补相关计划,360 在发现漏洞信息的第一时间与移动安全联盟成员共享,从政策、标准、检测、修复、应急响应等方面积极推进,与合作厂商同步,判断漏洞风险,并联合制定防御方案,确保最短时间内对漏洞进行修复。

2018-01-23 01:362817
用户头像
陈思 InfoQ编辑

发布了 576 篇内容, 共 263.1 次阅读, 收获喜欢 1293 次。

关注

评论

发布
暂无评论
发现更多内容

行业盛会丨九科信息亮相第十一届中国电子信息博览会(CITE2023),与您共享科技盛宴

九科Ninetech

苹果电脑软件应用打开出现意外退出、崩溃问题解决办法

互联网搬砖工作者

面试还不懂Netty,看这篇文章就够了!

程序员小毕

Java 程序员 后端 Netty 架构师

阿里内部都在疯传!企业级Spring Boot 项目开发实战教程,我先肝了

程序知音

Java 微服务 springboot java架构 Java进阶

详解 Flink Catalog 在 ChunJun 中的实践之路

袋鼠云数栈

flink

MobTech ShareSDK|分享报错怎么办

MobTech袤博科技

关于FTP文件传输协议说明,带你了解更详细的文件传输协议

镭速

选择低代码,帮企业数字化转型提交一份满分答卷

加入高科技仿生人

软件开发 低代码 数字化 数字转型

干货分享|金融机构如何通过标签画像实现精细化客户运营?

索信达控股

面试官:谈谈分布式一致性机制

Java永远的神

程序员 分布式 微服务 后端 架构师

EMQ&阿里云Lindorm联合方案:解决物联网关键业务场景数据处理难题

EMQ映云科技

阿里云 物联网 IoT 数据处理 企业号 4 月 PK 榜

智慧公共厕所,重构城市公共服务的新模式@光明源智慧公厕

光明源智慧厕所

智慧城市

上传了ipa但在苹果App Store中没有看到构建版本的问题

浪潮inBuilder低代码平台分布式微服务架构事务一致性技术解析

inBuilder低代码平台

分布式事务 低代码

软件团队文档管理工具哪个好?

PingCode

团队管理 PingCode 企业文档管理工具

OpenSea交易平台开发NFT系统部署技术

薇電13242772558

NFT

华秋PCB生产工艺分享 | 第十一道之成型

华秋电子

​ 如何处理Xcode上传IPA文件后无法在后台架构版本中显示的问题?

雪奈椰子

【论文解读】不和谐区域定位

合合技术团队

人工智能 图像识别 图像处理

EasyMR 安全架构揭秘:如何管理 Hadoop 数据安全

袋鼠云数栈

大数据

现在学C4D还是Blender好?这俩有啥区别?

Finovy Cloud

blender C4D

新旧版本功能对比 | v1.5.0 全新升级

BinTools图尔兹

数据库 社区版 版本更新

关于 IDP 的五大认知误解

SEAL安全

IdP 平台工程

Redis崩吗?来一起搞定 Redis 实践中的常见问题!

Steven

redis

【福利】ChatGPT免费体验期延长,商用版正式开启预约!

WorkPlus

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等

汀丶人工智能

人工智能 自然语言处理 深度学习 关系抽取 命名实体识别

在生产环境中运行 grpc 服务所面临的挑战

黑客不够黑

golang gRPC

低代码是行业毒瘤吗?

这我可不懂

团队 低代码 JNPF 专业低代码

GOPS 全球运维大会来了,龙蜥社区邀您一起了解“系统运维”

OpenAnolis小助手

开源 操作系统 内核 龙蜥社区 GOPS全球运维大会

PCB拼版对SMT组装的影响,华秋一文告诉你

华秋电子

携多款产品亮相“深圳先进制造业集群展”,华秋积极探索发展机遇

华秋电子

谷歌砸重金求挑错,360发现安卓重大安全漏洞_安全_陈思_InfoQ精选文章