ZIP アーカイブ エントリを読み取るときに CRC32 検証が追加されました

.NET 11 以降では、zip アーカイブ エントリを読み取るときに、System.IO.Compression ライブラリによって CRC32 チェックサムが検証されます。 計算された CRC32 チェックサムが ZIP ファイルのメタデータに格納されている期待値と一致しない場合は、 InvalidDataException がスローされます。

導入されたバージョン

.NET 11 Preview 3

以前の動作

以前は、ZIP アーカイブ エントリを読み取るときに、 System.IO.Compression は CRC32 チェックサムを検証しませんでした。 破損または改ざんされた ZIP エントリがエラーなしで読み取られる可能性があり、サイレント データの破損の原因になる可能性があります。

using System.IO.Compression;

using var archive = ZipFile.OpenRead("corrupted.zip");
var entry = archive.GetEntry("file.txt") 
    ?? throw new FileNotFoundException("Entry 'file.txt' not found in archive.");

using var stream = entry.Open();

// Data read without any validation of its integrity.
byte[] buffer = new byte[entry.Length];
stream.ReadExactly(buffer);

新しい動作

.NET 11 以降、ライブラリは読み取り操作中に ZIP エントリの整合性を検証します。 計算された CRC32 チェックサムが ZIP ファイルのメタデータの期待値と一致しない場合は、 InvalidDataException がスローされます。

破壊的変更の種類

この変更は 動作の変更です。

変更理由

この変更により、 System.IO.Compressionの信頼性とセキュリティが向上します。 CRC32 チェックサムを検証することで、ライブラリは破損または改ざんされた ZIP エントリの使用を検出して防止し、アプリケーションが誤って無効なデータを処理しないようにします。 詳細については、「 dotnet/runtime#124766」を参照してください。

破損または改ざんされた可能性のある ZIP ファイルをアプリケーションで処理する場合は、 InvalidDataException を適切に処理します。

try
{
    using var archive = ZipFile.OpenRead("corrupted.zip");
    var entry = archive.GetEntry("file.txt") 
        ?? throw new FileNotFoundException("Entry 'file.txt' not found in archive.");

    using var stream = entry.Open();

    byte[] buffer = new byte[entry.Length];
    stream.ReadExactly(buffer);
}
catch (InvalidDataException ex)
{
    Console.WriteLine($"Error reading ZIP entry: {ex.Message}");
}

影響を受ける API