Аккурат к концу новогодних каникул в России, 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, конечно. Спасение утопающих — дело рук самих утопающих!

Комментарии (15)


  1. sergey_bakey
    16.01.2018 17:44
    +3

    Стоило бы упомянуть что данный патч под номером KB4055002 для Windows 7 SP 1 при установленном .Net 4.7.1 ломает приложения Wpf: ссылочка на баг репорт


    1. olegchir Автор
      16.01.2018 17:48
      +1

      Ничего себе. Сейчас добавлю.


    1. olegchir Автор
      16.01.2018 18:36

      Fixed. Раньше статья была только про .NET Core, а сейчас — обновлена вашей информацией про .NET Framework. В тексте могли остаться артефакты миграции, все баги по тексту статьи принимаются в личку. Перед постингом бага рекомендуется обновить страницу, чтобы удостовериться, что он ещё не исправлен. Спасибо! :)


  1. vesper-bot
    16.01.2018 17:44

    Для каких виндов это .NET Core? Если его просто нет (c:\program files\dotnet отсутствует), надо что-то делать или нет?


    1. olegchir Автор
      16.01.2018 19:18

      Переписал часть «Я тоже под угрозой?», посмотрите ещё раз


  1. Cayp
    17.01.2018 00:34

    Проверить версию самого .NET Framework проще всего, открыв Control Panel > Programs and Features, и в фильтр поиска вписав ".NET Framework".

    Не надо так, это плохой совет. .NET Framework отсутствует в этом списке у большей части пользователей свежих версий Windows.

    Вот правильный способ: docs.microsoft.com/ru-ru/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed



    1. olegchir Автор
      17.01.2018 00:58

      Спасибо, сейчас добавлю.

      Расскажи вот что, как правильно посмотреть, установлен ли KB?

      Я пробовал get-hotfix, wmic qfe full, dism /online /get-packages, systeminfo, ещё что-то — и нужные KB там не отображаются. Но они есть в update history в windows update. Это значит, что у меня база апдейтов посыпалась, или я просто неправильно смотрю?


      1. Cayp
        17.01.2018 01:17

        Да, с обновлениями всё не так просто.
        Вот тут разъяснено неплохо, плюс скрипты: social.technet.microsoft.com/wiki/contents/articles/4197.how-to-list-all-of-the-windows-and-software-updates-applied-to-a-computer.aspx


  1. mayorovp
    17.01.2018 15:44

    Ну ЁПРСТ… Ладно еще сертификаты, там регулярно какую-нибудь ерунду находят — но в XML-то с чем можно было так накосячить?!


    1. freepvps0
      17.01.2018 18:17
      +1

      Вчера буквально столкнулся с тем, что для большие XML нужно обрабатывать итератором, а не циклом, так как обращение к i элементу происходит где-то за O(i)
      Не знаю, нормальное ли это поведение, но я очень сильно удивился, наткнувшись на подобное
      Подозреваю, что обращение к полям по xpath происходит не быстрее


  1. w1ld
    17.01.2018 17:20

    Что делать ?


    1. Проверить, версии 4.7.1 и 2.0.5. https://stackoverflow.com/questions/3487265/powershell-script-to-return-versions-of-net-framework-on-a-machine


    2. Обновить .net core. В powershell под админом: choco upgrade dotnetcore -y.


    3. Обновить .Net Framework: https://www.microsoft.com/en-us/download/confirmation.aspx?id=55170


    1. olegchir Автор
      17.01.2018 18:28

      Замечательно, что вы приняли участие в обсуждении. Но есть некая корректировка.

      Не у всех есть Chocolatey. Не у всех есть .NET Core или .NET Framework. Не все пользуются Windows. Не всем достаточно обновить фреймворк и кор — кое-кому придётся сделать ещё ряд вещей. У кого-то после ваших шагов всё сломается, и придётся болезненно чинить. Чтобы учесть все ситуации — имеются официальные рекомендации Microsoft (в статье ей ссылки на них), и собственно эта статья.



  1. MrDaedra
    19.01.2018 10:46

    Зачем для .NET Core идти на файловую систему?

    dotnet --info