前两天,世超看到一条新闻。

事儿说大也不大,总的来说就是你的安卓手机,可能成了一个远程窃听器。

 只要一首歌的功夫,黑客就能黑掉一台安卓手机。



你刚按下播放键,对方就已经获得了你的摄像头和麦克风权限。

不仅能窃听你的通话内容,甚至连你周围的声音都能监听到。。

这事波及范围还不小,目前全球可能有 37% 的手机,都暴露在这样的危险之下。

是不是突然有点不敢呼吸了,先别慌,听世超来解释一下到底发生了啥。



前两天,一家以色列的 IT 公司 CHECK POINT,发现高通和联发科都在使用的一种开源音乐编码格式,存在一个高危漏洞。



这个漏洞可怕的地方在于,黑客可以通过一段错误格式的音频,实现远程代码执行( RCE )。

啥是远程代码执行,咱先不管。

问题是依靠这个漏洞,黑客可以在你手机里横行霸道。不光可以做到开头说的强制获取权限,还可以执行恶意软件或窃取数据。

 而这件事真正魔幻的地方在于,倒大霉的安卓这回可能是被苹果坑了。。

因为高通和联发科都在用的这个音乐编码格式,其实是来自苹果。

一切的纠葛,咱还得从 11 年前的那天说起。

一向喜欢关起门来搞建设的果子哥,在听歌方面也没有例外。

2004 年的时候,苹果弄了一个无损音乐编码格式 Apple Lossless,又叫做 Apple Lossless Audio Codec( 下面简称 ALAC ),只允许自家的设备使用。



别看它名字又臭又长,其实就是一种音频格式,类似于我们最熟悉的 MP3。

只不过,MP3 是有损压缩,而 ALAC 是无损压缩,缩小文件大小的同时,还能保证音质。目前使用比较广泛的无损格式就 FLAC 和 ALAC。

本来如果一直封闭在苹果生态里,就没安卓这茬子事了。

问题是, 2011 年的时候,为了普适性( 谁能想到,有一天果子哥也会考虑普适性问题 ),果子哥破天荒在 GitHub 上面开放了源代码,出了一个开源版 ALAC。

 正是这次慷慨开源,很多非苹果的设备和播放器,都美美用上了无损格式,其中也包括 Windows 播放器。

而这次的主人公高通和联发科,更是直接将开源版 ALAC 代码移植到了自己的音频解码器里。



 然后,扯淡的事情就出现了。。

我们知道 ALAC 有两个版本。苹果自己使用的专利版,苹果一直在不断更新维护。类似的漏洞,苹果早就修复了。

而提供给其他厂商的开源版,这 11 年来,苹果作为开发者从来没有维护更新过它。

更扯的是,不光苹果懒得去管这个东西,高通和联发科也都坚定地奉行 “ 拿来主义 ”,只拿不修。

世超盲猜高通它们可能心里在想: 

“ 谁要帮苹果维护啊,拿来直接用得了。” 

ALAC 的开源协议为 Apache,

所有使用者都可以对项目进行更改 ▼



所以,高通和联发科都在使用一套 11 年来从没有更新过的代码。

如果高通它们是移植到了相对底层的解码器中,事情就麻烦了。。只要是使用高通和联发科芯片的手机,都可能会因为这个漏洞遭到黑客攻击。

按照这两个全球最大移动芯片制造商的市场份额来看,2021 年售出的手机里,有三分之二都暴露在危险中。

2020 年第二季度与 2021 年第二季度

全球智能手机 AP/SoC 出货量市场份额 ▼



看到这,你是不是觉得事态相当严重,巴不得亲自替这些偷懒的厂家上手。

稍安勿躁,还记得世超开头说的吗,这事它说大也不大。

这个漏洞带来的后果确实很严重,上百万台手机都可能被攻击。不过,check point 在对外公布漏洞之前,已经提前告知了两家芯片厂商。

 目前补丁都已经推送了,咱只要留意一下最近厂商推送的系统更新,安装好,缝缝补补之后,基本上就没啥问题。

而且,世超去翻了一下发布的补丁。发现这 BUG 虽然很危险,但实现手法还挺常见的,主要是利用了缓冲区溢出。

世超这里粗糙地解释一下,这到底啥玩意。

首先要科普的是,程序是怎么在系统里跑起来的。

手机里的各个程序要想跑起来,就得向系统要内存来运行,这个大多数人都知道。

分配结束后,一堆程序在各自申请来的内存里跑,井水不犯河水。

这有点像一个施工队要了个库房,在里头干活儿的感觉。

但这些程序是咋知道这要来的 “ 库房 ” 在哪里呢?这是因为系统给程序分配内存的时候,给了一个叫做内存地址的玩意儿。

一般来说这些地址是一串十六进制的数字 ▼



另一个需要科普的概念,是缓冲区。

有的时候,一个程序在运行某些功能时,临时会需要一些额外的内存,用完就还给系统。

这一部分临时要来的内存被称为缓冲区,它们也有相对应的地址,这就好比是在库房外卖临时搭了一个棚。

程序运行的时候,需要的库房(内存)地儿不够了,它可能会崩溃。

但如果需要的临时棚(缓冲区)地儿不够了,它不一定会崩溃,但是这些堆在棚里的家伙,在棚里干活的人(代码)会堆到别的地儿去。

这个情况就是缓冲区溢出。



而溢出的部分,在一些不安全的系统里是不一定会检测的。

因此即使是恶意代码,也可以通过溢出偷偷执行。

有的黑客故意要一个小一点的临时棚,然后规模过大的施工队进去,那他们就容易跑到别的施工现场去,这些地方可能有很重要的程序在跑。

然后这些施工队手脚还不太干净(恶意代码),去别的地儿搞破坏,或者偷看一些有的没的,想办法传给黑客。。。

 这就是溢出的危险之处。

看完了世超的解释,你就不难理解,这个事儿听着挺可怕,实际上原理挺基础。

也就是说,这并不是很难避免。

人家搭棚子前,你(系统)看看人带了多大施工队(检查缓冲区输入)来不就行了吗?

但是,苹果的这套 ALAC 没去检查这件事,同时整整 11 年没人去维护过这玩意儿。。。



只要我给你塞一段特别大的音频文件,然后猥琐地把恶意代码藏在文件尾端。就能利用溢出,瞒天过海地干点有的没的。

不过,更多的技术细节 check point 会专门开个会详细介绍,感兴趣的差友可以关注一下。

事情到这算是圆满解决了,不过世超想在最后来算算总账。

这事咱们到底该赖谁呢?

差友们可能会有点难理解,其实这事两边都没错,但都不太厚道。

先讲果子哥。按理来说,开源项目丢出来之后,免费给所有人用,维不维护就全看开发者的心情。

但错就错在你可是苹果。



一般苹果这种体量的公司,项目的使用人数往往比较多,波及范围广,公司都会派人员负责维护。

但果子哥直接当起了甩手掌柜,多多少少有点不地道。

 而高通和联发科这边,又一心只想白嫖,能省一点人力维护就省一点。( 毕竟这可是苹果 )

秉持着极简的态度,能躺着绝不坐着,能坐着绝不站着。

 等大鼻涕流进嘴里知道甩了,漏洞出现知道有问题了。

毕竟就算真的栽跟头了,还有爆肝的程序员,以及俺们这些隐私泄露得裤衩都不剩的消费者来买单。。

类似的 “ 白嫖 ” 开源项目还不少,这次只是小毛病,那下次呢?

图片、资料来源:

维基百科、 GitHub 

https://blog.checkpoint.com/2022/04/21/largest-mobile-chipset-manufacturers-used-vulnerable-audio-decoder-2-3-of-android-users-privacy-around-the-world-were-at-risk/ 

知乎 @a301 : 浅谈缓冲区溢出

如何选择开源许可证?|阮一峰