TripleDESCryptoServiceProvider - уязвимы для отказа в обслуживании? - PullRequest
5 голосов
/ 23 июня 2011

У нас есть устаревший сайт ASP.NET, который использует здесь методы шифрования:

http://www.codekeep.net/snippets/af1cd375-059a-4175-93d7-25eea2c5c660.aspx

Когда мы вызываем следующий метод, страница загружается очень медленно и в итоге возвращается Сброс подключения:

Decrypt(" ", true);

Если метод вызывается несколько раз в последующих запросах страниц, Пул приложений отключается .

Это происходит на сервере Windows 2008 под управлением .NET Framework v3.5.

Я сузил проблему до вызова TransformFinalBlock().

ПРИМЕЧАНИЕ: на Кассини я не получаю тайм-аут соединения; вместо этого выдается следующее исключение:

System.Security.Cryptography.CryptographicException: Bad Data

Вызов Decrypt () для других строк не вызывает проблем в любой среде.

Почему это происходит? Это ошибка в TripleDESCryptoServiceProvider?

Очевидно, я мог бы отфильтровать строку cipherString, чтобы отклонить "" и избежать этой конкретной проблемы. Однако меня беспокоит, что некоторые другие значения cipherString, которые я не подозреваю, вызовут DoS.

ОБНОВЛЕНИЕ 2011.06.28

Ниже приведен минимальный код для воспроизведения проблемы:

// problem occurs when toEncryptArray is an empty array {}
      byte[] toEncryptArray = {};

      MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
      byte[] keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes("dummy_key"));
      hashmd5.Clear();

      TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
      tdes.Key = keyArray;
      tdes.Mode = CipherMode.ECB;
      tdes.Padding = PaddingMode.PKCS7;
      ICryptoTransform cTransform = tdes.CreateDecryptor();

      // the following line can crashes the ASP.NET Application Pool (may need to call multiple times).
      byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

      tdes.Clear();

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Проблема, как упоминалось выше, заключается в том, что логика дешифрования неправильно обрабатывает случай, когда входной шифр является массивом нулевой длины.

Для этого был создан тикет:

http://connect.microsoft.com/VisualStudio/feedback/details/678150/denial-of-service-in-tripledescryptoserviceprovider

Обратите внимание, что при работе .NET Framework 4.0 он работает нормально.

0 голосов
/ 23 июня 2011

В последнем блоке находится отступ. В вашем примере один пробел - это первый и последний блок. DES / Triple DES - это 64-битный блочный шифр, текст шифра должен быть кратным 8 байтам (64 битам).

У меня нет среды для тестирования, но вы пробовали поиграть с опциями заполнения? Заполнение большим количеством пробелов не подойдет, потому что заполнение не будет соответствовать.

Общая схема заполнения: PKCS5 . Для одного байта (зашифрованного в виде символа пробела) ваш обычный текст должен быть в шестнадцатеричном виде:

0x?? 0x07 0x07 0x07 0x07 0x07 0x07 0x07

Но в вашем примере кода ожидается ввод base64. Что означает, что ваша входная строка должна быть:

  • кратное 12 каратам
  • Допустимая строка base64

Любая другая строка может быть отклонена.

Значение true выглядит как MAC, что означает, что за вашим вводимым простым текстом должен следовать хеш (MD5 в вашем коде). Он поможет вам обнаружить изменения в зашифрованном тексте. Это полезно, когда вы шифруете двоичные данные. Если вы можете легко обнаружить искаженный текст, вы можете установить его в false.

...