Validação CRC32 adicionada ao ler entradas de arquivos ZIP

A partir do .NET 11, a biblioteca System.IO.Compression valida os checksums CRC32 ao ler entradas de arquivos ZIP. Se a soma de verificação CRC32 computada não corresponder ao valor esperado armazenado nos metadados do arquivo ZIP, será gerada uma InvalidDataException .

Versão introduzida

.NET 11 Versão Prévia 3

Comportamento anterior

Anteriormente, System.IO.Compression não validava os checksums CRC32 ao ler entradas de arquivo ZIP. Entradas ZIP corrompidas ou adulteradas podem ser lidas sem erros, potencialmente causando corrupção de dados silenciosos.

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);

Novo comportamento

A partir do .NET 11, a biblioteca verifica a integridade das entradas ZIP durante as operações de leitura. Se a soma de verificação CRC32 computada não corresponder ao valor esperado dos metadados do arquivo ZIP, um InvalidDataException será gerado.

Tipo de mudança disruptiva

Essa alteração é uma mudança comportamental.

Razão da alteração

Essa alteração melhora a confiabilidade e a segurança de System.IO.Compression. Ao validar somas de verificação CRC32, a biblioteca detecta e impede o uso de entradas ZIP corrompidas ou adulteradas, garantindo que os aplicativos não processem dados inválidos inadvertidamente. Para obter mais informações, consulte dotnet/runtime#124766.

Se seu aplicativo processa arquivos ZIP que podem estar corrompidos ou adulterados, trate InvalidDataException adequadamente:

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}");
}

APIs afetadas