Зачастую злоумышленники, чтобы скомпрометировать хост специалистов по ИБ, создают “вредоносные” PoC, которые, помимо заявленного функционала, имеют в себе и скрытый. Чаще всего подобная техника направлена на эксплуатацию различных IDE-инструментов. Их можно разделить на несколько векторов:
- PreBuild/PostBuild Events
- Design-time target execution
- COM, Type Libraries
Более подробно об этих техниках можно почитать в данной статье.
Относительно недавно появилась ещё одна интересная техника по эксплуатации VS IDE. Направлена она в первую очередь на SUO-файл. Это файл параметров пользователя решения, который содержит в себе различные настройки/пресеты (положение и состояние окон, настройки отладки, настройки для проектов и т.д.). Сам файл создается автоматически при запуске или создании любого проекта и находится в скрытой папке проекта .vs по следующему пути:
...\.vs\[Project name]\v17\.suoЧтобы понять, как все это работает, давайте посмотрим внутрь библиотеки Microsoft.VisualStudio.dll:


Здесь мы видим, что для загрузки VsToolboxService (что находится непосредственно в suo-файле) используется функция LoadOptions, которая в свою очередь использует метод BinaryFormatter.Deserialize. Именно здесь и рождаются риски, связанные с десериализацией. Забавно, что сами представители Microsoft в своем блоге не рекомендуют использовать подобные методы обработки данных - однако сами же его и используют:

Всё это приводит к тому, что при запуске проекта VS (даже такого, в котором не содержится ни строчки кода), будет запускаться пейлоуд, что содержится в SUO-файле. Сам же файл будет перезаписываться новыми пресетами настроек пользователя, что может усложнять в дальнейшем расследование цепочки атаки, если не знать подобные сведения. PoC подобной техники можно найти здесь.
Ловим малвару
Чтобы обнаружить и предотвратить такую атаку ещё до начала её действия, нужно рассмотреть этот пейлоуд в деталях. SUO имеет OLE-структуру, где наc интересует содержание элемента VsToolboxService:

Внутри этого элемента мы как раз и можем обнаружить вредоносный пейлоуд, закодированный в base64:

Для детектирования такого подозрительного файла можно воспользоваться следующим YARA-правилом:
rule suo_deserialization
{
strings:
$header = { D0 CF 11 E0 A1 B1 1A E1 }
$s = "VsToolboxService" wide
$a1 = "AAEAAAD"
$a2 = "ew0KICAgICckdHl"
$a3 = "yAoFZNmAU3l"
$a4 = "kscDYs0KCcYAAAP"
$a5 = "PFByb3BlcnR5R3J"
$a6 = "PD94bWwgdm"
condition:
$header at 0 and $s and any of ($a*)
}
При применении данного правила на практике мы смогли обнаружить следующий интересный файл на VirusTotal:

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

Данный файл является малварным и относится к семейству Backdoor.MSIL.XWorm. Запустив его в песочнице, можно увидеть его поведение - он закрепляется в системе через задачи в планировщике и выполняется каждую минуту:

Кроме того, малвара общается с различными pastebin-сервисами в ожидании команд от атакующих (T1102):

Чтобы обезопасить себя от подобного рода атаки, рекомендуем воспользоваться нашим YARA-правилом, а также постоянно удалять “ненужные” файлы - такие, как SUO (их отсутствие никак не повредит вашему проекту).
Помимо этого, стоит постоянно проводить код-ревью всего, что содержится в проекте, скачанном из недоверенных источников. А также, следуя указаниям в блоге Microsoft, настроить “trusted location” для VS IDE.