OceaBase开发者大会落地上海!4月20日共同探索数据库前沿趋势!报名戳 了解详情
写点什么

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

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

关注

评论

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

EMQX企业版正式上架华为云OSC,助力企业实现云原生MQTT Broker的全生命周期管理

EMQ映云科技

物联网 华为云 mqtt emqx 8月月更

Seata-php 入门与下半年展望

apache/dubbo-go

【LeetCode】设计有序流Java题解

Albert

LeetCode 8月月更

科创板的一束“海光”,正在让中国半导体发展之路更清晰

脑极体

兼容认证|天融信太行云与观测云完成产品兼容性互认证

观测云

个推漫话数据智能 | 《天才基本法》中的贝叶斯网络及原理解读

个推

人工智能 机器学习 深度学习 算法模型

故障复盘后的告警如何加出效果?浙江移动等老司机总结了6条注意事项

TakinTalks稳定性社区

大数据培训中心哪家比较靠谱

小谷哥

<T>和<?>区别

六月的雨在InfoQ

开源 T 8月月更

LeaRun.Java微服务快速开发平台

力软低代码开发平台

Gartner:云安全面临的三大挑战以及三个对应策略

WorkPlus

Apache Doris 助力网易严选打造精细化运营 DMP 标签系统

SelectDB

数据分析 OLAP Doris 多维分析 DMP

【数独 1】不回溯,试试候选数法1ms高效解数独谜题-C++实现

清风莫追

8月月更

重新定义容器化 Serverless 应用的数据访问

阿里巴巴中间件

云计算 阿里云 Serverless 容器 云原生

攻克美颜、虚拟背景、眼神接触多个难题,腾讯会议技术领先的秘诀找到了

科技热闻

iofod - 为攻城师们打造的低代码平台

iofod jude

低代码 实用工具

Tapdata 与麒麟软件完成兼容性互认证,国产化生态布局再跃步

tapdata

Tapdata Tapdata架构

开源一夏 | 使用 CSS 的仿 GitHub 登录页面

海拥(haiyong.site)

开源 8月月更

政企组织为什么更需要私有化的IM即时通讯平台?

WorkPlus

音视频大佬离职后,我是如何在短时间内在音视频开发做出一个性价比高的最优方案

擎声科技

开发者 RTC sdk 实时音视频 擎声Qtt

Jedis 客户端

武师叔

8月月更

灵感宝盒图谱全新改版!代码实验室开启报名丨RTE NG-Lab 双周报

声网

人工智能 RTE NG-Lab

头脑风暴:完全平方数

HelloWorld杰少

算法 LeetCode 数据结构, 8月月更

当云走向行业垂直化,企业该如何应对?

WorkPlus

如何开发一款基于 Vite+Vue3 的在线表格系统(上)

葡萄城技术团队

Vue 前端 vite 框架 系统开发

排查 log4j2 安全漏洞的一次经历

观测云

一文讲透研发,SRE,运维,DevOps 的区别

Bytebase

DevOps SRE dba database

15条建议,把技术成果写成一篇高质量学术论文

阿里技术

经验分享

融云 | 企业通讯录的设计与实现

融云 RongCloud

通信 企业

自研发RTC退退退!接入第三方RTC才是真的香

擎声科技

RTC 实时音视频 社交APP出海 泛娱乐出海 擎声Qtt

合并两个有序单链表,对象析构这一着我实在没想到。

清风莫追

8月月更

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