Аккурат к концу новогодних каникул в России, 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?
Для этого бага важен тип приложения:
- Обычное
- Self-contained
- Native
Обычные приложения можно починить, просто установив нужную версию 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)".
Чтобы сделать это, нужно выполнить следующие шаги:
- Control Panel → Windows Update → View update history
- В списке "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.
- Когда спросят, действительно ли удалять — соглашайтесь.
- Обязательно перезапустите компьютер, если вас об этом попросили.
- Скачайте и установите патч безопасности нужной вам версии:
- Security Only update for .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, and 4.7.1 for Windows 7 SP1 and Windows Server 2008 R2 SP1 for x86 systems (KB4054183)
- Security Only update for .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, and 4.7.1 on Windows 7 SP1 and Windows Server 2008 R2 SP1 for x64 systems (KB4055269)
- Делайте всё, о чём вас просят, а в конце — обязательно перезагрузите компьютер.
Способ второй: удалить .NET Framework 4.7.1, установить .NET Framework 4.7
- Control Panel → Programs and Features
- В списке "Uninstall or change a program", выделите "Microsoft .NET Framework 4.7.1" и нажмите Uninstall/Change.
- Выберите "Remove .NET Framework 4.7.1 from this computer", и нажмите Next.
- Нажмите continue и дождитесь удаления.
- Нажмите Finish, когда удаление завершится.
- Обязательно Перезапустите компьютер, если вас об этом попросят.
- Установите .NET Framework 4.7.
Способ третий: замените GlobalUserInterface.CompositeFont
на правильный файл
- Скачайте GlobalUserInterface.CompositeFont (для Windows 7, стандартный путь установки —
%USERPROFILE%\Downloads
) - Откройте
cmd
, перейдите в%windir%\Microsoft.NET\Framework\v4.0.30319\WPF\Fonts
и запустите:
xcopy /y %USERPROFILE%\Downloads\GlobalUserInterface.CompositeFont
.
(или просто скопипастите файл GlobalUserInterface.Composite в это место) - Откройте
cmd
, перейдите в%windir%\Microsoft.NET\Framework64\v4.0.30319\WPF\Fonts
и запустите:
xcopy /y %USERPROFILE%\Downloads\GlobalUserInterface.CompositeFont
.
(или ещё раз воспользуйтесь копипастой файла в Проводнике). - Перезапустите WPF-приложение.
- Если всё ещё не помогло, перезагрузите компьютер и снова перезапустите WPF-приложение.
Резюме
Даже очень хорошие и качественные проекты содержат ошибки. Чтобы не попасть впросак, нужно вовремя обновляться, читать официальные новости и изучать современные тенденции на конференциях типа DotNext, конечно. Спасение утопающих — дело рук самих утопающих!