写点什么

谷歌砸重金求挑错,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:362852
用户头像
陈思 InfoQ编辑

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

关注

评论

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

Flutter&Dart Callback转同步

小呆呆666

flutter ios android 大前端

空手撸SOLID架构设计原则,六大原则层层解析,你绝想不到

Java MySQL 程序员

自定义 View 功能上线,你的小程序可以更多变

蚂蚁集团移动开发平台 mPaaS

小程序 mPaaS 自定义控件

企业想要升级生产管理系统,有哪些好用的低代码平台推荐?

优秀

低代码

一周信创舆情观察(6.14~6.20)

统小信uos

阿里云中间件首席架构师李小平:企业为什么需要云原生?

阿里巴巴云原生

Github上星标85k的,图解操作系统、网络、计算机 PDF,竟是阿里的?

Java架构师迁哥

“区块链指导意见”重磅发布 场景化应用昭示新蓝海

旺链科技

区块链应用 区块链供应链金融落地

用node写个简单的脚手架!

Node cli

windows11泄露版尝鲜体验新功能!!!

学神来啦

win10 win11 windows10 windows 11

不愧是Alibaba技术官,Kafka的精髓全写这本“限量笔记”里,服了

Java 架构 面试 分布式

Python接口自动化之常见用例读取方法介绍

行者AI

测试 #python

腾讯同事内推的那位Linux C/C++后端开发同学面试没过......

Linux服务器开发

Linux C/C++ Linux服务器开发 Linux后台开发 Linux网络编程

仿imtoken钱包源码开发,imtoken去中心化钱包开发

fish_redux使用详解---看完就会用!

小呆呆666

flutter ios android 大前端 社区

我看JAVA 之 JVM

awen

Java JVM

EBean ORM 框架介绍-3.实体草稿功能

Barry的异想世界

jpa ORM Ebean

网络攻防学习笔记 Day54

穿过生命散发芬芳

网络攻防 6月日更

最强大的内在激励:自我承诺

石云升

激励 职场经验 管理经验 6月日更

数据校检

若尘

计算机组成原理 6月日更

与其摸鱼,不如来看:高性能消息中间件NSQ解析的整体介绍

为什么vacuum后表还是继续膨胀?

华为云开发者联盟

索引 GaussDB 元组 VACUUM 行存表

Quick BI的可视分析之路

瓴羊企业智能服务

阿里云 数据中台 数据分析 数据可视化 商业分析

Rust从0到1-自动化测试-如何编写测试

rust 自动化测试 如何编写测试 Automated Tests

CloudQuery 使用教程之《No.1 基础入门》

BinTools图尔兹

数据库 程序员 dba 国产数据库 运维开发

4个改变你编程技能的小技巧,建议细读

欢喜学安卓

android 程序员 面试 移动开发

nodejs学习记录

Node

限量!Alibaba首发“Java成长笔记”,差距不止一点点

Java 编程 程序员 架构 面试

Visual Studio 2010下ASPX页面的TreeView控件循环遍历

DisonTangor

C#

4面字节跳动拿到Offer,灵魂拷问

欢喜学安卓

android 程序员 面试 移动开发

Flutter Webview添加Cookie的正确姿势

小呆呆666

flutter ios android 大前端

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