Январская починка дыр в .NET Framework и Core

olegchir 16 января в 17:03 13,3k

Аккурат к концу новогодних каникул в России, 9-го января, Microsoft выпустили обновления, исправляющие CVE-2018-0786 и CVE-2018-0764. Починили так, что кое-где ещё и сломали. В этом коротком посте мы ещё раз вспомним, что это такое и что нам теперь делать.


Для иллюстрации этого хабрапоста я попытался изобразить решето. Как видите, у меня не получилось. К сожалению, сделать решето в коде — гораздо проще, чем изобразить его, в первый раз взяв в руки графический планшет.



Я тоже под угрозой?


Если вы используете .NET Framework, нужно удостовериться, что у вас установлена версия 4.7.1, а Windows установил обновление .NET Framework January 2018 Security and Quality Rollup (KB4055002). Или, как минимум, Security-Only Update (KB4054183).
Если это не так — у вас проблемы.


Проверить версию самого .NET Framework можно с помощью инструкции по ссылке. Чтобы не проверять каждый раз руками, есть скрипт для Power Shell.


Если вы используете .NET Core, то нужно пойти на файловую систему и посмотреть, какая версия рантайма установлена. Если там нет директории 1.0.9, 1.1.6 или 2.0.5, то у вас проблемы!


Где смотреть:


Windows C:\Program Files\dotnet\shared\Microsoft.NETCore.App\
macOS /usr/local/share/dotnet/shared/Microsoft.NETCore.App/
GNU/Linux /usr/share/dotnet/shared/Microsoft.NETCore.App/

Точный список уязвимых версий .NET Core:


Версия рантайма Исправлено в версии
1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.7, 1.0.8 1.0.9
1.1.0, 1.1.1, 1.1.2, 1.1.4, 1.1.5 1.1.6
2.0.0, 2.0.3, 2.0.4 2.0.5

Что делать?


Разработчикам придётся обновить .NET Framework до 4.7.1 и обновить Windows самыми свежими обновлениями. Не на всех версиях Windows это обновление работает хорошо (читайте статью до конца).


.NET Core SDK необходимо обновить до версий 2.1.4 или 1.1.7. Сисадминам нужно обновить .NET Core до версий 1.0.9, 1.1.6 или 2.0.5.


Self-contained приложения придётся пересобрать, в остальных случаях достаточно обновления рантайма и SDK.


CVE-2018-0764: Denial of Service when parsing XML documents


Официальные ссылки



Что случилось?


.NET Framework и Core плохо парсят XML, пользуясь чем, хакер может устроить DDOS-атаку на ваше приложение.


В обновлении это починили. Эксплоиты публично не распространялись.




CVE-2018-0786: Security Feature Bypass in X509 Certificate Validation


Официальные ссылки



Что случилось?


В общедоступных версиях .NET Framework и Core есть уязвимость, позволяющая хакеру подсунуть сертификат, помеченный невалидным для конкретного способа использования, и тем не менее использовать его по этому назначению. Это позволяет игнорировать Enhanced Key Usage.


В обновлении это починили. Эксплоиты публично не распространялись.


Нужно ли обновлять пакеты?


Уязвимости подвержен пакет Microsoft.NETCore.UniversalWindowsPlatform.
Версия пакета указана вместе с соответствующей ему версией .NET Native.


NuGet / .NET Native Исправлено в версии
5.2.* / 1.4.* 5.2.4
5.3.* / 1.6.* 5.3.5
5.4.* / 1.7.* 5.4.2
6.0.* / 2.0.* 6.0.6

Как починить моё приложение, если я использую .NET Core?


Для этого бага важен тип приложения:



Обычные приложения можно починить, просто установив нужную версию SDK или рантайма, на которых вы запускаетесь. Скачать можно здесь.


Self-contained приложения придётся пересобрать со свежеобновлённым SDK и передеплоить.


Дальше поговорим о нативных приложениях. Нужно снова обработать его нативным компилятором обновлённого SDK и результат перевыложить в Windows Store.


MS рекомендует обновить UWP-приложения до самой последней минорной версии NuGet-пакета Microsoft.NETCore.UniversalWindowsPlatform, чтобы можно было пересобрать приложение и понять, что оно не развалилось. Можно, конечно, обновиться сразу и на более свежую мажорную версию, но это не обязательно — обновление выпускается для всех мажорных версий, которые пострадали от бага.


Вне зависимости от того, обновили ли вы свои NuGet-пакеты, все приложения, залитые в стор после 9-го января, будут автоматически чиниться прямо в ходе выкладывания в стор.


Если же вы не обновите своё приложение в сторе, его всё равно автоматически обработают и разошлют через Windows Update в течение ближайших недель. Все, у кого не отключены автообновления, получат обновлённую версию без необходимости в ручном вмешательстве кого-либо. А вот для sideloaded-приложений придётся самостоятельно обновить NuGet-пакеты, пересобрать их и доставить пользователям.


Обновления сломают Windows 7 и Windows Server при использовании .NET Framework


Согласно вот этому всё еще открытому багу, патч не только лечит, но ещё и калечит. Проблема возникает только при использовании Windows 7 Service Pack 1 и Windows Server 2008 R2 Service Pack 1.


Достаточно установить обновления или .NET Framework 4.7.1, как WPF-приложения, запрашивающие fallback font (или символ, не включенный в текущий шрифт), отвалятся со следующей ошибкой:


System.TypeInitializationException

“FileFormatException: No FontFamily element found in FontFamilyCollection 
that matches current OS or greater: Win7SP1”.

Inner exception originates from: CompositeFontParser

Проблема в том, что инсталлятор неверно обрабатывает взаимодействие установщика обновлений (.NET Framework January 2018 Rollup — KB4055002) и уже установленного .NET Framework 4.7.1. Установщик Rollup случайно переписывает файл GlobalUserInterface.CompositeFont, пришедший с версией 4.7.1, отчего WPF-приложения начинают падать.


Существует три способа решения.


Способ первый: удалить январские обновления


Нужно удалить: "January .NET Framework Security and Quality Rollup (KB4055002)".


И вместо этого установить: " January .NET Framework Security-Only Update (KB4054183)".


Чтобы сделать это, нужно выполнить следующие шаги:


  1. Control Panel → Windows Update → View update history
  2. В списке "Review your update history" найти и выделить "Security Update for Microsoft .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 (KB4055002)". Нажать Uninstall.
  3. Когда спросят, действительно ли удалять — соглашайтесь.
  4. Обязательно перезапустите компьютер, если вас об этом попросили.
  5. Скачайте и установите патч безопасности нужной вам версии:
  6. Делайте всё, о чём вас просят, а в конце — обязательно перезагрузите компьютер.

Способ второй: удалить .NET Framework 4.7.1, установить .NET Framework 4.7


  1. Control Panel → Programs and Features
  2. В списке "Uninstall or change a program", выделите "Microsoft .NET Framework 4.7.1" и нажмите Uninstall/Change.
  3. Выберите "Remove .NET Framework 4.7.1 from this computer", и нажмите Next.
  4. Нажмите continue и дождитесь удаления.
  5. Нажмите Finish, когда удаление завершится.
  6. Обязательно Перезапустите компьютер, если вас об этом попросят.
  7. Установите .NET Framework 4.7.

Способ третий: замените GlobalUserInterface.CompositeFont на правильный файл


  1. Скачайте GlobalUserInterface.CompositeFont (для Windows 7, стандартный путь установки — %USERPROFILE%\Downloads)
  2. Откройте cmd, перейдите в %windir%\Microsoft.NET\Framework\v4.0.30319\WPF\Fonts и запустите:
    xcopy /y %USERPROFILE%\Downloads\GlobalUserInterface.CompositeFont.
    (или просто скопипастите файл GlobalUserInterface.Composite в это место)
  3. Откройте cmd, перейдите в %windir%\Microsoft.NET\Framework64\v4.0.30319\WPF\Fonts и запустите:
    xcopy /y %USERPROFILE%\Downloads\GlobalUserInterface.CompositeFont.
    (или ещё раз воспользуйтесь копипастой файла в Проводнике).
  4. Перезапустите WPF-приложение.
  5. Если всё ещё не помогло, перезагрузите компьютер и снова перезапустите WPF-приложение.

Резюме


Даже очень хорошие и качественные проекты содержат ошибки. Чтобы не попасть впросак, нужно вовремя обновляться, читать официальные новости и изучать современные тенденции на конференциях типа DotNext, конечно. Спасение утопающих — дело рук самих утопающих!

Проголосовать:
+35
Сохранить: