Аккурат к концу новогодних каникул в России, 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, конечно. Спасение утопающих — дело рук самих утопающих!
Комментарии (15)
vesper-bot
16.01.2018 17:44Для каких виндов это .NET Core? Если его просто нет (c:\program files\dotnet отсутствует), надо что-то делать или нет?
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-installedCayp
17.01.2018 00:39И скрипт, чтоб не руками: stackoverflow.com/questions/3487265/powershell-script-to-return-versions-of-net-framework-on-a-machine
olegchir Автор
17.01.2018 00:58Спасибо, сейчас добавлю.
Расскажи вот что, как правильно посмотреть, установлен ли KB?
Я пробовал get-hotfix, wmic qfe full, dism /online /get-packages, systeminfo, ещё что-то — и нужные KB там не отображаются. Но они есть в update history в windows update. Это значит, что у меня база апдейтов посыпалась, или я просто неправильно смотрю?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
mayorovp
17.01.2018 15:44Ну ЁПРСТ… Ладно еще сертификаты, там регулярно какую-нибудь ерунду находят — но в XML-то с чем можно было так накосячить?!
freepvps0
17.01.2018 18:17+1Вчера буквально столкнулся с тем, что для большие XML нужно обрабатывать итератором, а не циклом, так как обращение к i элементу происходит где-то за O(i)
Не знаю, нормальное ли это поведение, но я очень сильно удивился, наткнувшись на подобное
Подозреваю, что обращение к полям по xpath происходит не быстрее
w1ld
17.01.2018 17:20Что делать ?
Проверить, версии 4.7.1 и 2.0.5. https://stackoverflow.com/questions/3487265/powershell-script-to-return-versions-of-net-framework-on-a-machine
Обновить .net core. В powershell под админом:
choco upgrade dotnetcore -y
.
- Обновить .Net Framework: https://www.microsoft.com/en-us/download/confirmation.aspx?id=55170
olegchir Автор
17.01.2018 18:28Замечательно, что вы приняли участие в обсуждении. Но есть некая корректировка.
Не у всех есть Chocolatey. Не у всех есть .NET Core или .NET Framework. Не все пользуются Windows. Не всем достаточно обновить фреймворк и кор — кое-кому придётся сделать ещё ряд вещей. У кого-то после ваших шагов всё сломается, и придётся болезненно чинить. Чтобы учесть все ситуации — имеются официальные рекомендации Microsoft (в статье ей ссылки на них), и собственно эта статья.
Taciturn
19.01.2018 06:18Вышла замена для KB4055002, KB4074880:
download.windowsupdate.com/d/msdownload/update/software/secu/2018/01/ndp47-kb4074880-x86_3b871776f1918a0bc83f51bb2c5ac0366b18f08b.exe
download.windowsupdate.com/d/msdownload/update/software/secu/2018/01/ndp47-kb4074880-x64_7614e045d68cf219949917b18194b0bc8ee2b007.exe
sergey_bakey
Стоило бы упомянуть что данный патч под номером KB4055002 для Windows 7 SP 1 при установленном .Net 4.7.1 ломает приложения Wpf: ссылочка на баг репорт
olegchir Автор
Ничего себе. Сейчас добавлю.
olegchir Автор
Fixed. Раньше статья была только про .NET Core, а сейчас — обновлена вашей информацией про .NET Framework. В тексте могли остаться артефакты миграции, все баги по тексту статьи принимаются в личку. Перед постингом бага рекомендуется обновить страницу, чтобы удостовериться, что он ещё не исправлен. Спасибо! :)