Who Goes First? Detecting Go Concurrency Bugs via Message Reordering | xxxWho Goes First? Detecting Go Concurrency Bugs via Message Reordering – xxx
菜单

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering

二月 27, 2022 - 安全客

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering

宾夕法尼亚大学(PSU),胡宏,ASPLOS 2022

开源地址:https://github.com/system-pclub/GFuzz

Go语言是为高效安全并发场景设计的一种程序语言。它提供协程(goroutine)和管道(channel)来辅助完成高效安全并发的目的,并推荐使用管道完成不同协程之间的信息传递,降低程序中并发漏洞出现的可能性。但是最近的研究表明,与管道相关的并发漏洞(channel-related concurrency bug)在Go程序中依然很常见,本文就是针对这类漏洞设计了一个工具进行挖掘。

本文的作者设计了一个工具GFuzz,用来针对channel-related concurrency bug进行挖掘。首先需要定位可能引入bug的并发channel,并对程序完成改写与编译,使之支持channel中信息的乱序到达。然后使用模糊测试的方式,将一系列不同顺序的channel信号送入改写之后的程序中。同时设计了一个runtime sanitizer,在运行时去监控channel-related concurrency bug是否发生。作者在7个最后欢迎的开源项目上进行测试,共发现184个新漏洞并上报,开发者已经确认了124个bug report,并完成修复其中的67个漏洞。

 

Intro

Go的并发控制

Go中并发漏洞形式

现有工作

 

Design && Implementation

Problem Scope

本文的作者主要应用GFuzz挖掘由channel通信引起的阻塞型并发漏洞(channel-related blocking bug)和由channel通信引起的非阻塞型并发漏洞(channel-related non-blocking bug)

Design

GFuzz的整个流程如下图所示。不同于以往的fuzzer主要选择输入作为变异对象,GFuzz将一系列并发channel返回的消息组成的序列(message order)作为变异对象(种子)。在程序运行时,GFuzz依赖一种新的反馈机制,对种子进行算分排序,给予分高在队列前端的种子更多的变异。同是GFuzz也设计了一套监控机制,用于检查是否发生并发漏洞。

上述三个部分在插桩过程中分别对应着下图里的 Order EnforcementInformation CollectionBug Detection 三个部分。

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering

Implementation

如何指定channel消息序列(message order)并变异

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering

原来的每个含并发channel的select语句换成一个switch语句,switch中的每个case都是一个select语句,对应处理原来select中的每个case,同时每个switch case都设有超时T,用来防止goroutine之前存在隐式依赖造成FP的可能性。通过FetchOrder来控制每个select中执行哪个channel case。

反馈机制

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering

runtime sanitizer

 

Evaluation

作者在Kubernetes、Docker、Prometheus、etcd、Go-Ethereum、TiDB、gRPC七个项目上测试GFuzz的漏洞挖掘能力,共发现184个concurrency bug,其中170个阻塞型漏洞、14个非阻塞型漏洞以及12个FP。

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering

为了验证GFuzz每个组件的必要性,作者在gRPC项目上尝试去掉各个组件后观察GFuzz漏洞挖掘能力的变化。在12小时的测试中,去掉各个组件后GFuzz漏洞挖掘能力都有所下滑。在文中作者对每种策略下工具发现的漏洞进行更细致的讨论。

Who Goes First? Detecting Go Concurrency Bugs via Message Reordering


Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51