疫情三年终于结束了,MOSEC国内外的老朋友们也得以再次回归。能一路乘风破浪坚持九年,也是希望安全从业者们还有一处净土可以尽情交流。

会议准时开始,POC Security 的 CEO JinWook简短的祝词过后,就是正式的议题环节了。

第一个议题《小议 GPU 安全》由薮猫科技的王宇带来。说是小议 ,做实了就是一篇宏大的综述。开场,他展示了一个生动的喷枪作画短片,通过这个短片,观众能够直观地理解 CPU 准备数据、GPU 渲染以及最终点阵打在银幕呈现的过程。之后,他回溯了 GPU 的历史,一路追溯到 16 位 VGA 时代。在这个过程中,他不时地通过一些暴露年龄的实验将观众带回到那个蛮荒的时代,例如使用 SoftICE 来调试 16 位 Windows 程序切换到 32 位执行环境的过程。

接下来,他综合了攻击面、代码执行流程,绘制了一份关于 GPU 安全的框图,用以解释不同阶段可能存在的问题,包括浏览器、OpenCL、内核驱动、GPU 内存管理和指令提交处理等。他从原理出发,解释了很多代码存在的理由,以及各个结构的意义,比如跨核数据共享需求以及生产者消费者问题需要的 ring buffer。

紧接着,他对每种可能的攻击面进行了系统性的分析和案例解读。这一部分涉及了大量的漏洞实例,例如龚广的梯云纵以及 Ben Hawkes 的补丁绕过。王宇以他独特的视角再次阐释这些经典案例时,仍然能够激发很多新的思考。在分析了高通和微软的案例后,最后他还回顾了苹果的 GPU以及他自己发现的诸多漏洞,由于很多问题尚未完全修复,无法透露太多细节。如果不是今天后面还有其他演讲者要上台,他估计可以再分享上一整天,基本是想分享的经验太多,国内这种会议活动又太稀缺。临近尾声,他还是以招牌的现场 fuzz 打蹦自己的 Mac 收场。

第二个议题《Securing Web3 Mobile Wallets with TEE: Delving into the Security Guarantees and Real-world Implementation Pitfalls》涉及到了移动安全领域的一个特别问题,即手机上的数字货币钱包是否能够真正保护用户的密钥。议题的演讲者是来自 CertiK 的庄园。她首先介绍了一般手机上 Web3 钱包存储密钥的几种方式,以及非 TEE 方案导致密钥在内存中暴露的问题。

然后,她详细分析了一个不愿透露品牌的手机厂商的 TEE 解决方案的实现(简称为 TWallet)。这套方案包括应用层 SDK、系统服务和安全世界的TA 。她详细分析了执行流程,以及不同层面去攻击时的优劣。TWallet 使钱包应用具备了更高的保障:保护用户输入,即确保屏幕上的用户点击是经过安全的传输并直接调用显示驱动来呈现;能够提供TEE侧的签名相关函数(椭圆曲线,公钥私钥计算存储,哈希),以便Android侧的交易消息签名过程完全不需要触碰到私钥(助记词)等敏感信息。

接下来,她以一个 TWallet 的典型越界读漏洞为例,分析了如何通过 Qiling 的模拟环境进行 fuzz并还原漏洞触发时的内存布局。之后她通过hook用户态进程在真机上触发这个漏洞。漏洞的利用思路是用越界读,将 pin 所在内存作为长度字段所在内存传递给 malloc,超长分配失败报错时会打印错误日志中实现任意读,进而在REE侧泄漏出用户的 pin。有了pin,就可以通过钱包验证,获取助记词(私钥)。之后,她的DEMO演示了获取手机 root、劫持进程并触发漏洞泄漏密码的全过程。

上午最后一个演讲者是来自阿里的王勇,这已经不知道是他第多少次讲通用 root 的问题了。这一次,他首先回顾了一下已经研究过的应用内可以触发的攻击面,包括 ptmx、dmabuf、ashmem、binder、kgsl/mali。他大概是从 2021 年开始专门研究 GPU 相关漏洞的。当时 Pixel 6 按照他的预测,最有可能会使用 Mali 的 driver。因此,他决定提前研究跟进 Mali 这个新目标。他分享了 GPU 架构演化过程中存在的诸多问题,其中以逻辑问题为主。他的议题某种程度上算是续写了 2021 年 Slipper 在 MOSEC 讲的《Hacking Android GPU For Fun》。

除了分析和复现以往漏洞外,他还总结了 CSF 出现前后新老架构的利用思路;RO/RW 只读变可写类型漏洞如何转换并获得内核权限;新老架构上的同一漏洞如何实现通用的利用,磨平不同结构的差异,规避 GPU 指令和工作流程的逆向。

他重点分析的一个漏洞是 CVE-2022-20186,当时不巧的是跟 Man Yue Mo 撞了,但收获是他再回首时搞清了漏洞的本源。漏洞是在 r31 的代码变更中才引入的,恰逢当年发布的 Pixel 6 及其他 MTK 9000 的手机初始版本是 r32,所以那会儿老新 GPU 架构都受到了此漏洞的影响。Man Yue Mo 基于 Panfrost 逆向的 GPU 指令完成了漏洞利用,但利用方法其实只适用于老的 GPU 架构。随后r34 的版本的修复实际上也仅仅是修复了原有的漏洞利用思路,但漏洞本身仍然存在。

议题结尾他照例秀了一下在 Pixel 7 提权到 root 。

下午第一个议题《A Silicon Bug in Apple"s A7 SoC》演讲者是盘古的王纬。这个议题相当于是2020年盘古徐昊讲过的《Attack Secure Boot of SEP》的续篇,同样讨论的也是苹果的安全芯片 SEP 中的硬件漏洞。

议题一开始,王纬详细分析了AP和SEP之间的通信协议,Mailbox 的寄存器,不同启动阶段的消息结构体,以及SEP的启动流程。随后,他展示了两个漏洞:第一个漏洞源于SEP处理高8位包含加密频道的地址时,对异常频道输入没有做处理。第二个漏洞在于,SEP里的地址偏移是32位,而内存保护寄存器AMCC使用的是64位寻址。

这两个问题叠加的结果是SEP对地址偏移和AMCC对地址偏移的解读发生不一致,导致SEP实际使用的内存没有被隔离,这一攻击链被命名为 hardbird。之后,他又详细分析了后续SEP的执行过程,内存密钥的读取,以及每个启动阶段的内存数据布局。代码级别的分析极其细致,基本上是听完就可以上手实操地剖析。

接下来,奇点实验室的两位安全研究员谢海阔和邢禹带来了他们的《An Interesting Research Journey: Over-the-air Attack Surface of Wi-Fi》,深入讲解了他们在 Wi-Fi 这个 0-click 攻击面的漏洞挖掘和利用之旅。首先,他们从普通用户、开发者和漏洞研究人员的角度依次呈现了 Wi-Fi 的多样的应用、协议的复杂性以及潜在的攻击面(用户态、内核和 Wi-Fi 固件)。

他们对 Wi-Fi 的漏洞挖掘遵循的是审计、Fuzzing、再审计再 Fuzzing、人工寻找新攻击点以及 Fuzzing 解决变体问题的方法。在测试时,他们使用了 Ralink RT2870/RT3070/RT5370、Atheros AR9271 和 SDR/OpenWi-Fi 等设备。

接着,他们进行了海量的漏洞案例分析,介绍了近几年他们发现的 0-click 空口 Wi-Fi 漏洞,并列举了 Stackoverflow、Out-Of-Bound Write、UAF、Information Leakage 等几类 Wi-Fi 高发问题的漏洞案例,并结合具体漏洞总结漏洞模式。其中对于 Information Leakage 这一类问题进行了详细展开,并利用部分漏洞内存搜索的特性,结合内核结构体如 ol_txrx_vdev_t 的内存特征,实现了远程泄露内核基址及 Wi-Fi 模块基址的攻击效果。

最后,他们选取了其中一组漏洞实现了远程内核级的代码执行,CVE-2020-11118(leak) + CVE-2020-11116(oob)。其中越界写的利用思路是篡改临近堆块的 freelist 指针,使得第二次分配的内存地址可控,而接受的数据就会写到指定位置,构造出内存任意写的原语。他们尝试篡改的内存指向内核 coredump 时调用的 /proc/sys/kernel/core_pattern,即内核会在 coredump 时执行该应用程序。为了触发 coredump,他们利用了一个蓝牙的漏洞 CVE-2020-0022。他们将这一利用链组合起来,实现了一个非常酷的演示:三个漏洞依次触发,实现 0-click 攻击,关闭内核 selinux,获取 root 权限,最后让用户手机拨打了一个任意手机号码(可以用此来随时监听目标设备周围的通信)

最后一个议题《Killing the Ethereum VM of Ethereum Killers》的演讲者是 Offside Lab 的 Slipper 和 PwningETH。他们首先介绍了 Web3 安全和传统安全之间的重大区别:Web3 上的安全问题不仅直接导致经济损失,而且发生频率更高,掉钱眼里的攻击者通常极其疯狂。在这个议题中,"以太坊杀手" 特指那些试图取代以太坊或自称更优解的layer1或layer2的解决方案,如 Optimism、Aurora、Moonbeam、Polkadot 等。然而,尽管戴着脚镣跳舞的他们还是不免要兼容以太坊的合约,因此他们的代码中要包含一个 EVM 的虚拟机,或以 precompile 合约的形式存在。他们则试图对这些 "以太坊杀手" 进行反杀,保护了 Web3 链上的巨量资金。

他们首先分析了 Optimism 的漏洞原因,即账户生命周期处理与 Ethereum 不一致,导致一个交易期间可以通过 selfdestruct 多次转账。也是受此启发,他们进入了 Web3 安全研究领域,成功从当时备受瞩目的 Aurora拿到一血。他们发现 Aurora 的跨链转账合约不仅可以通过 call 调用,还可以通过 delegatecall 调用,两者都会生成使bridge验证通过的日志。区别在于 delegatecall 不会伴随实际的转账,context.apparent_value(msg.value)仅代表用户余额而非合约余额。因此,他们可以通过反复双花攻击来耗尽 Aurora 的资金池。

他们的第二个案例出自 Moonbeam,过程和第一个案例很像但又略有不同。第二个漏洞触发时可以吸引受害者调用他们的合约,然后用 delegatecall 访问预编译合约,直接进行transfer或approve掉其全部资金。而这里最佳的受害者并不是真实的用户,而是支持callback的flash loan或 DeFi 的借贷平台。它们在打钱时会调用你的合约,使得攻击者可以在不引起察觉划走他们大池子里的全部资产。第三个案例涉及到 Frontier 的 ERC20 合约,其中的 256 到 128 位的截断使用户可以通过transfer函数传参 1<<128 使得转账金额为零,但账户记录中却保留了一个大数,也就是记账和转账的不一致。这个问题可以可以让攻击者洗空Frontier 上的所有 ERC20 代币。

议题结束时,相信即便没有他们最后对Web3安全问题的重要性的强调,很多人也会因为bounty想要跃跃欲试了。

正式议题到此结束,但简短的休息过后,茅台味浓浓的baijiucon就开始了。今年新加坡的Thomas也回归现场,亲自和baijiucon的演讲者们干上几杯。

首先是来自蚂蚁光年实验室的 pattern-f,他带来的第一个议题是讲解如何在苹果的加密芯片 SEP里开发一个可以运行于 SEPOS的应用程序。他们从一个可以触发崩溃的 syscall 开始,然后逐步将这个黑盒环境转变为一个白盒的开发环境,最终演示了如何printf出当前 SEPOS 运行进程的信息,以及如何暴力猜解锁屏密码。

第二个上台的是 MOSEC 的老朋友,他把找漏洞比作赌场里的一次狂欢:有些赌博项目可能很容易上手,比如俄罗斯轮盘,基本上靠运气,而有些项目如21点和扑克就需要很高的技巧,也需要更长时间来掌握。他觉得 fuzz IOKIT 的过程就像在玩俄罗斯轮盘,一方面他随机调用不同函数的 "dumb fuzz",完全像是在碰运气。另一方面,报给苹果的八个漏洞,只有四个被接受的结果也像是俄罗斯轮盘在转动。苹果这种时不时内部偷偷修复,或者把你的漏洞归类到别人的漏洞报告中的做派也是让人很迷。

第三个上台的人是 Numen 的 avboy1337,他分享了 Chrome Exploit Chain 的构造经验。他会投入很多精力去复现在野外发现的漏洞,毕竟漏洞的品质都非常高。另外,他近期也公布了 V8 沙盒新的绕过方法。他的漏洞演示还包括了一个可以在 Windows 上提升至 SYSTEM 权限的漏洞,以及在安卓手机上的提权漏洞。

第四个上台的是启明星辰的王启泽,他讲的是如何绕过 GBA-Bootstrapping 的验证,实现4G/5G移动运营商级别的降维打击,尤其是在三网合一的今天,这种攻击变得更加致命。他展示了两个非常精彩的演示,一个是向用户的手机下发一个拒收电话的设置,导致用户的来电功能失效;另一个是实时篡改了用户手机发送的短信中的图片。

本来还想,王宇今年怎么没讲 WIFI,他就上来蹭茅台了,分享他的 "Understanding the Apple IO80211Family Subsystem Vol. II-2",续写了他关于 WIFI 驱动漏洞挖掘的故事。除了海量漏洞分享外,他还分享了一个自己挖漏洞的经验,即在代码重构的时候,一些反复出问题的地方可能还会再次出问题。另外,苹果现在不仅修复利用链的漏洞,还开始大幅减少攻击面。他的一个漏洞修复历时1年零2个月,原因是苹果砍了整个攻击面,确保多设备兼容性,所以花了这么长时间。不用多说,结尾他经典的fuzzing打蹦电脑收场再次上演。

第六个上台的是CertiK 的 Li Kang,他讲的是 Web2 和 Web3 安全的区别。他自己调侃说 Baijiucon 太卷了,搞得没几个 0-day 都没法上台,Thomas 也希望他上来把基线拉低点,让更多精彩的内容能上台展示一下。之后,他通过即兴准备的幻灯片讲解了 Immunefi 的十大漏洞类型,以及两个世界漏洞的影响程度不同等情况,并欢迎大家加入这个新兴领域。

第七个上台的演讲者是来自盘古的卢瑀涛。他分析了 SELinux 这个保护机制的原理和绕过方法,即已经获得了内核读写原语的情况下,如何关闭保护。期间,他发现三星的RKIP有阵子配置错误没有开启,为了让广大安全研究员有点挑战,他还是把配置错误的漏洞提交给了三星。最后,他演示了一个5.10内核手机绕过所有保护后的 root。

之后上台的兄弟讲的东西由于还没有修,不便于透露更多细节,只能说效果很厉害,是可以在一个超多用户使用的WEB系统上实现稳定的RCE。

第九个上台干杯的是来自獬豸实验室的flanker,他在去年分享的基础上介绍了新的基于Datalog函数式语言的程序分析实践,以及在安卓应用漏洞挖掘中的应用,并对比了性能上带来的巨大提升。

最后上台的是一位正在山东大学读博的妹子 Rui Li,她霸气地说,既然有能找代喝的汉子,就有自己能干杯的妹子,然后她干了一杯茅台开始她的议题。她介绍了 Android Manifest 处理过程中的一些问题。例如,通过 twin permission declarations,由于 List 到 ArrayMap 的转化,导致后面的定义覆盖了先前的定义,实现了普通应用获取系统权限。更多细节可以参考她的论文《Lost in Conversion: Exploit Data Structure Conversion with Attribute Loss to Break Android Systems》

会议最后徐昊感言,三年疫情间坚持线下办会很难,本以为三年后会再回当初,但其实时至今日只会有新的困难接踵而至。只希望我们享受此刻,不负当下。

声明:本文来自MOSEC,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。