Исследователь нашёл серьёзную уязвимость в MSI Center — утилите, которая поставляется предустановленной на ноутбуках и ПК MSI. После изучения проблем в софте AMD и ASUS он взялся за MSI.
Он скачал офлайн-установщик, определил, что программа упакована через Inno Setup, и распаковал её с помощью innoextract. Внутри оказалось 170 исполняемых файлов (включая DLL), большинство на C#. Их декомпилировали через ilspycmd, а часть C++ файлов проанализировали в IDA. Объём кода был огромен, поэтому вместо ручного просмотра исследователь искал типовые слабые места — в частности, искал вызов CreateNamedPipe.
И нашёл. Служба MSI «Notebook Foundation» при запуске создаёт именованный канал (named pipe) \\.\pipe\MSI_SERVICE_2, доступный любому аутентифицированному пользователю. Через него отдаются команды с правами LocalSystem (самые высокие в Windows). Можно читать, писать и удалять любые ключи реестра, менять настройки системы — включая отключение Windows Defender. А главное — команда PC:REXE запускает любой исполняемый файл с любыми аргументами от имени LocalSystem, а KEXE убивает любой процесс.
MSI полагалась на «безопасность через неясность»: для связи с каналом нужна регистрация приложения по произвольному имени, а сами команды шифруются устаревшим 3DES (ключом служит то самое имя). Служба тупо перебирает зарегистрированные имена, пытаясь расшифровать сообщение. Это ломается за секунды.
Исследователь написал PoC, который запускает cmd.exe от имени системы. Позже выяснилось, что эксплойт работает и удалённо через SMB в локальной сети, но требует валидных учётных данных.
Отправив отчёт в MSI, он получил отказ: почтовый ящик PSIRT был переполнен (ошибка QuotaExceededException). Помог Стив Бёрк из Gamers Nexus — связался с сотрудником MSI. Оказалось, письмо всё же дошло. MSI отреагировала хорошо: патч выпустили через два дня в версии MSI Center 2.0.70.0. CVE компания присвоить не смогла — исследователь запросил его через VulDB, где заявка ждёт проверки уже месяц. Баг-баунти за эту находку, как и за предыдущие у Google, ASUS, AMD и других, он не получил — в сумме ноль долларов.