当前位置: 首页 > news >正文

gomarkdown漏洞CVE-2024-44337--手把手教你go-fuzz模糊测试引擎如何进行漏洞挖掘

前言

本文将探讨如何利用模糊测试工具go-fuzz,成功发现并分析了gomarkdown项目中的一个重要漏洞,即CVE-2024-44337。该漏洞涉及输入处理不当,能够被恶意攻击者利用,造成程序崩溃或拒绝服务。这个漏洞的ID编号已经申请出来了,但是细节还没来的急写上去,这是我挖到的第一个CVE,所以记录分析一下!

go-fuzz模糊测试工具地址:dvyukov/go-fuzz: Randomized testing for Go (github.com)
gomarkdown项目地址:gomarkdown/markdown: markdown parser and HTML renderer for Go (github.com)
CVE发现时的issues:“Program Hanged (Timeout 10 Seconds)” Found Using go-fuzz in gomarkdown/markdown · Issue #311 · gomarkdown/markdown (github.com)
复现源码:Brinmon/CVE-2024-44337: CVE-2024-44337 POC .

CVE-2024-44337简介:
包“github.com/gomarkdown/markdown”是一个 Go 库,用于解析 Markdown 文本并呈现为 HTML。在伪版本 ‘v0.0.0-20240729232818-a2a9c4f’ 对应于提交’a2a9c4f76ef5a5c32108e36f7c47f8d310322252’ 之前,在parser/block.go文件的paragraph函数中存在逻辑问题,此漏洞允许远程攻击者通过提供导致无限循环的特制输入来导致拒绝服务(DoS)条件,从而导致程序挂起并无限期地消耗资源。提交’a2a9c4f76ef5a5c32108e36f7c47f8d310322252’包含此问题的修补程序。

CVE-2024-44337漏洞成因分析

该漏洞修复的diff链接:fix infinite loop with empty list definition (fixes #311) · gomarkdown/markdown@a2a9c4f (github.com)

1.问题代码分析

这里的漏洞成因非常微小,就只是一个if条件判断考虑失误造成的!
存在漏洞问修复的代码,代码位置parser/block.go:

...if p.extensions&DefinitionLists != 0 {if i < len(data)-1 && data[i+1] == ':' {listLen := p.list(data[prev:], ast.ListTypeDefinition, 0, '.')return prev + listLen}}...

这段代码的主要功能是在段落中遇到定义列表项时,判断其是否符合定义列表的语法(是否有冒号 :),并调用相应的函数 p.list 来处理列表条目。如果成功解析出定义列表,函数返回定义列表的结束位置,确保段落处理逻辑能够正确跳过定义列表部分继续解析。
在未修复的代码中,调用 p.list() 方法后会立即返回 prev + listLen,但是没有验证 listLen 是否有效(即是否大于 0)。

2.修复后的代码分析

漏洞修复后的代码:

...if p.extensions&DefinitionLists != 0 {if i < len(data)-1 && data[i+1] == ':' {listLen := p.list(data[prev:], ast.ListTypeDefinition, 0, '.')return prev + listLenif listLen > 0 {return prev + listLen}}}
...

如果 p.list() 返回 0 或者其他异常值,程序没有足够的检查机制来处理这种情况,这可能导致程序进入一个无限循环或者挂起状态&


http://www.mrgr.cn/news/66920.html

相关文章:

  • 国内版Sketchfab平台 - CG美术之家(3D编辑发布篇)
  • window10解决 docker is starting 问题
  • 开发中使用UML的流程_01概述
  • Chrome 130 版本开发者工具(DevTools)更新内容
  • YOLO即插即用---CLFT
  • 关于Linux系统调试和性能优化技巧有哪些?
  • Modbus解析流程全面升级:体验全新核心与终极优化!
  • SpringBoot中使用SpringTask实现定时任务
  • 设置Three.js响应式画布
  • Android RecyclerView ,使用ItemDecoration设置边距的大坑:左右边距不均匀/不同,已解决。
  • 【C++课程学习】:string的模拟实现
  • 防患于未然才是预警大屏的意义所在,看它是如何做的?
  • java-web-day14-项目属性配置和bean的管理
  • docker 常用方法
  • 编译cartographer和cartographer_ros 过程
  • 超好用的运维终端 NuShell
  • 《纺织报告》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 再也不怕丢失灵感:Heynote,让开发者的笔记更高效
  • 【开发工具】解决Ubuntu首次打开vscode工作区字体小的问题
  • UCLA、MIT数学家推翻39年经典数学猜想!AI证明卡在99.99%,人类最终证伪
  • 检索增强和知识冲突学习笔记
  • 企业防泄密指南|如何防止员工泄密?5个常用的防泄密方案详细说明,赶紧去试!
  • spark人才推荐系统-计算机设计毕业源码19842
  • 智能存储解决方案:探索 TDengine 的多级存储功能
  • 高亚科技签约酸动力,助力研发管理数字化升级
  • LangChain Ollama实战文献检索助手(一)环境配置和输入输出解析