Содержание статьи
info
Это близкий к тексту пересказ поста Windows Shortcut (LNK) Malware Strategies из блога подразделения Unit 42 компании Palo Alto Networks. Весь текст статьи доступен для чтения без платной подписки.
Итак, файлы ярлыков в Windows имеют расширение .lnk и служат виртуальными ссылками, которые позволяют быстро добираться до других файлов без нужды копаться в папках. Эта гибкость делает ярлыки мощным оружием в руках хакеров: ярлык можно заставить исполнять вредоносный контент или маскироваться под легитимные файлы, чтобы обмануть пользователей и заставить их случайно запустить малварь.
В 2023 году специалисты Unit 42 при исследовании малвари насчитали 21 098 зловредных файлов LNK, а в 2024 эта цифра подскочила до 68 392. По своим действиям LNK-вредоносы делятся на четыре категории:
- запуск эксплоитов;
- запуск файлов с диска;
- запуск скриптов из аргументов;
- запуск оверлеев.
Мы детально разберем все эти техники с примерами.
Простейшая проверка
Быть начеку сейчас нужно не только администраторам, но и простым пользователям, особенно когда из интернета был скачан неизвестный файл LNK.
Файлы вредоносного ПО в формате LNK могут иметь знакомые значки либо названия, которые имитируют доверенные приложения или документы, чтобы обмануть пользователей и заставить их открыть файл. Чтобы выявить такие угрозы, внимательно изучи свойства файла, особенно его расположение.
Для этого щелкни правой кнопкой мыши на LNK-файле и выбери «Свойства». Если путь к цели выглядит необычно (например, указывает на неизвестные директории или слишком длинный, возможно, с подозрительными аргументами), избегай выполнения этого файла.
Что такое файлы LNK?
Windows использует файлы LNK, также известные как shell links или ярлыки, чтобы быстро создавать ссылки на файлы, папки или приложения, разбросанные по разным местам на компьютере. Отличить их проще простого благодаря маленькой стрелочке в нижнем левом углу.

Файлы LNK позволяют запускать программы без необходимости ковыряться в папках в поисках экзешника, запрятанного глубоко где‑нибудь в C:\
. Но LNK может ссылаться не только на программы — он без проблем открывает и другие файлы, например, PDF-документы или JPEG-картинки. Двойной клик по ярлыку LNK равносилен двойному клику по самому файлу. Удобно, правда?
Хотя файлы LNK имеют расширение .lnk, которое видно в командной строке, Windows никогда не покажет это расширение на рабочем столе или в «Проводнике». Например, файл LNK с именем Invoice.
будет отображаться просто как Invoice.
Создать LNK-файл в Windows можно разными способами. Самый простой — кликнуть в «Проводнике» правой кнопкой по файлу или папке, затем в контекстном меню выбрать «Показать дополнительные параметры» и «Создать ярлык».
Появляется окно «Создать ярлык», где можно выбрать местоположение объекта.
Можно пойти и другим путем: скопировать файл и воспользоваться опцией «Вставить ярлык», что создаст LNK, ведущий к нужному файлу.
Еще можно кликнуть правой кнопкой мыши на файле, выбрать «Отправить», а потом «Рабочий стол (создать ярлык)».
Если щелкнуть правой кнопкой мыши по фону «Проводника», можно выбрать «Создать» и «Ярлык». Появится окно создания ярлыка, где можно указать путь к нужной тебе программе.

На скрине выше ты видишь основные параметры и поля LNK-файла. Самое важное поле — это Target, где хранится значение:
C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
Таким образом, этот LNK-файл позволяет запустить Microsoft Edge.
На первый взгляд LNK-файлы могут показаться простыми, но их гибкость открывает поле для разных злоупотреблений.

Формат LNK может включать аргументы командной строки для выполнения целей (отсюда и название shell links). Как видно в поле «Цель» на скриншоте выше, злоумышленники могут использовать эти аргументы, чтобы скачать и запустить вредоносный код.
Кроме того, значки LNK-файлов настраиваются, из‑за чего можно легко ошибиться и кликнуть на зловредный LNK. На скриншоте выше показано, что хотя LNK указывает на batch-файл, его иконка выглядит как текстовый файл.
При этом файл с названием PASSWORD_HERE.
отображается на рабочем столе или в «Проводнике» просто как PASSWORD_HERE.
.
Ключевые для LNK-вредоносов структуры
Файлы LNK используют бинарный формат. Давай разберем их структуру.

Здесь опциональные поля заключены в квадратные скобки. Все структуры, кроме EXTRA_DATA
, начинаются с указания их размера, за которым следует содержимое. Поле STRING_DATA
делится на пять подполей, два из которых жизненно важны для вредоносов, работающих с LNK.
Что интересно, для валидного LNK-файла нужен только заголовок. Следуя логике, файл LNK с одним лишь заголовком не должен причинять вреда, ведь без содержимого он не сможет ничего запустить. По данным Unit 42, основанным на анализе 30 000 зловредных LNK-файлов, те, что содержат только заголовок, с большой вероятностью безопасны.
В файлах LNK три поля, напрямую связанные с разрешением и выполнением цели, выделены на схеме выше зеленым фоном:
-
LINKTARGET_IDLIST
— список элементов в оболочке, указывающих на цель; -
RELATIVE_PATH
— относительный путь к цели от места, где находится этот LNK; -
COMMAND_LINE_ARGUMENTS
— аргументы, которые передаются цели.
Большинство вредоносных файлов LNK можно вычислить, проверяя три ключевые поля. Анализ Unit 42 это подтверждает.

В строке LTList
поле LINKTARGET_IDLIST
присутствует почти всегда — оно встречается в 99,53% вредоносных LNK. Это основное поле, которое используется при поиске цели.
RP или RELATIVE_PATH
(относительный путь) — это тоже популярная штука, засветившаяся в 75,49% злодейских LNK. Если LINKTARGET_IDLIST
вдруг отсутствует или битый, RELATIVE_PATH
всегда поможет найти нужную цель.
Поле COMMAND_LINE_ARGUMENTS
(обозначено как CLA) встречается не так уж и часто — всего в 35,52% вредоносных LNK. Это поле может применяться для передачи аргументов и распространения зловредных скриптов. Однако, как видишь, процент вредоносных LNK, содержащих хотя бы один из подобных элементов, поразительно высок.
Давай поближе посмотрим на те три поля, которыми пользуются злоумышленники.
Идентификатор списка целей (LINKTARGET_IDLIST)
Поле LINKTARGET_IDLIST
имеет следующую структуру:
Размер поля
Shell Item [0]
Shell Item [1]
Shell Item [2]
...
LINKTARGET_IDLIST
указывает, где находится цель (то есть объект, на который ссылается файл LNK). Как намекает название этого поля, его структура — это список элементов оболочки Windows.

В этом поле могут прятаться разные типы элементов оболочки Windows, но в файлах LNK чаще всего встречается ROOT
, VOLUME
и FILE
.
-
ROOT — встречается почти всегда и содержит в себе CLSID (он же GUID) для какой‑нибудь системной папки, играя роль отправной точки пути к цели. В нашем примере
IDList[
— это ROOT.0] -
VOLUME — часто указывает на том диска, например, букву диска в Windows, и может также задавать системную папку через ее CLSID. У нас это
VOLUME
. -
FILE ENTRY — представляет собой отдельный компонент пути к цели. В нашем примере все от
IDList[
до1] IDList[
— это6] FILE
.ENTRY
Короче говоря, корректный LINKTARGET_IDLIST
обычно состоит из цепочки объектов оболочки, включающей ROOT
, VOLUME
и/или элементы FILE
, которые точно укажут на цель.
Относительный путь
RELATIVE_PATH
имеет следующую структуру:
Количество символов
Строка относительного пути
RELATIVE_PATH
— это часть поля STRING_DATA
, представляющая собой строку в формате ASCII или Unicode. Это путь к цели относительно файла LNK, который помогает определить цель, если LINKTARGET_IDLIST
не срабатывает (например, если цель недействительна).
Аргументы командной строки
STRUCTURE_COMMAND_LINE_ARGUMENTS
имеет следующую структуру:
Количество символов
Аргумент командной строки
Строка
COMMAND_LINE_ARGUMENTS
— это еще один компонент поля STRING_DATA
. Он отвечает за передачу аргументов командной строки для исполняемого файла. В этом поле может быть обычная ASCII-строка или Unicode-строка. Это значение добавляется к пути цели, чтобы собрать полную команду для выполнения.
Категории LNK-вредоносов и примеры
Атаки через файлы LNK можно поделить на четыре категории:
- эксплоиты LNK;
- запуск вредоносных файлов;
- выполнение скриптов через аргументы;
- запуск контента через наложение.
Эксплоиты LNK
Первая большая разновидность LNK-малвари — это эксплоиты. Такие зловреды представляют собой специально поврежденные файлы LNK, созданные для эксплуатации конкретных уязвимостей Windows.
Как только система открывает папку, содержащую файл LNK, она тут же начинает его обрабатывать. Это значит, что LNK, созданные на базе эксплоитов, могут сразу атаковать систему — еще до запуска. Конечно, в Microsoft уже залатали большинство таких дыр, так что зловредные LNK стали редкостью. Но вирусы все еще иногда целятся в старые уязвимые версии Windows, к тому же битые LNK вызывают проблемы при анализе использующей их малвари. Так что важно уметь отличать боевой LNK от других поврежденных экземпляров.
По наблюдениям Unit 42 за малварью, использующей LNK-файлы, самой популярной у злоумышленников оказалась уязвимость CVE-2010-2568. Хакеры используют сразу два вида эксплоитов, чтобы выжать из нее максимум.
Вариант 1
Первый вариант эксплоитов прячется в недрах ROOT (
внутри LINKTARGET_IDLIST
, а точнее — в блоке расширений (ExtraBlock
) узла ROOT
.

Тут сразу бросаются в глаза два странных момента. Во‑первых, наличие блока расширения в ROOT-узле — явление редкое, так что размер под slDLlist
должен быть примерно 20 байт. Если больше — это уже подозрительно. Мы же видим значение 55 — вот это и вызывает вопросы.
Во‑вторых, размер ExtraBlock
настолько велик, что на фоне обычного LNK он выглядит просто гигантским. В нашем случае размер ExtraBlock
даже больше, чем размер самого корневого узла, что, естественно, приводит к крашу. У нас эта цифра достигла 57 312 байт.
Вариант 2
Этот вариант компрометации прячется в узле VOLUME
списка LINKTARGET_IDLIST
.

Значение IDListSize
под LINKTARGET_IDLIST
в этом примере заметно больше, чем у IDListSize
в нормальных LNK. В данном случае значение превышает размер самого файла. Здесь IDListSize
составляет 65 280 байт, тогда как сам файл занимает всего 198 байт. Такая аномалия может привести либо к падению системы, либо к эксплуатации уязвимостей.
Хакеры обычно используют эксплоиты в виде LNK-малвари, чтобы открывать «Панель управления» и обойти белый список разрешенных файлов «Панели управления» (он же CPL allow list). В этом примере под узлом VOLUME
значится такой CLSID:
{21EC2020-3AEA-1069-A2DD-08002B30309D}
Это CLSID для «Всех элементов Панели управления».

Запуск вредоносных файлов
Вместо того чтобы скрывать вредоносный код в себе, LNK-малварь может запускать вредоносные файлы (будь то скрипты или бинарники), которые злоумышленники уже сохранили на диске жертвы. Такой тип малвари либо указывает на вредоносный файл, либо направляет на системную цель, которая помогает выполнить этот файл.
Зловредные цели
Цель у такого рода LNK-вредоносов проста: запустить код малвари, размещенный на диске.

Этот образец предназначен для выполнения вредоносного файла с названием desktop.
, который поселился в папке «Загрузки» пользователя. В данном случае сам по себе LNK не несет вирусной угрозы, но ведет к вредоносному содержимому.
Цели в системе
Вредоносные LNK часто запускают вредоносные скрипты или другие файлы, которые невозможно запустить напрямую. В таких случаях файл LNK ссылается на системный инструмент Windows (системную цель), который может выполнить вредоносный код.

Этот LNK-файл запускает через wscript.
, лежащий в той же папке, что и сам LNK, текстовый файл Video.
с закодированным скриптом VBS. Сам LNK здесь не вредоносный — опасность представляет именно содержимое Video.
.
Выбор цели в системе зависит от типа файла с вредоносным содержимым. Например, если используется вредоносная DLL, в бой пойдет rundll32.
. Данные Unit 42 показывают, что LNK-малварь чаще всего использует следующие системные цели:
-
powershell.
;exe -
cmd.
;exe -
rundll32.
;exe -
conhost.
;exe -
wscript.
;exe -
forfiles.
;exe -
mshta.
.exe

Системные цели также часто используются при выполнении скриптов, скрытых в аргументах.
Выполнение скриптов прямо в параметрах
Поле COMMAND_LINE_ARGUMENTS
может содержать строки любого размера, в том числе туда можно запихнуть целый вредоносный скрипт. Целью LNK можно установить интерпретатор скриптов или утилиту, которая умеет исполнять команды. Тогда вирусописатель сможет заставить LNK выполнить вредоносный код из поля COMMAND_LINE_ARGUMENTS
.
Вот основные цели, которые злоумышленники могут атаковать для внедрения своих скриптов.
Цель 1: PowerShell или Командная строка
Самые популярные инструменты, которые такой LNK-вредонос использует для выполнения команд, — это командная строка (cmd.
) и PowerShell (powershell.
). Они обычно идут в комплекте с Windows. Кроме того, они могут косвенно вызывать другие системные цели (например, команду start
в cmd.
).
Исследование Unit 42 показало, что cmd.
и powershell.
вместе составляют более 80% целей для исполнения скриптов через аргументы в злонамеренных LNK.
Чтобы усложнить анализ, зловреды зачастую обфусцированы. Эта маскировка включает в себя сборку команд, кодирование команд, случайное добавление управляющих символов и использование переменных окружения Windows в командах.
Ниже показан пример малвари, замаскированной под файл LNK, который запускает команду PowerShell для выполнения вредоносного скрипта через поле COMMAND_LINE_ARGUMENTS
.

Этот образец косвенно запускает PowerShell через выполнение cmd.
. Полная строка вредоносного PowerShell-скрипта закодирована в Base64.

После расшифровки получится скрипт PowerShell.

Запуск этого LNK загрузит и запустит вредоносную DLL. Команда rundll32
здесь выглядит подозрительно, и, заглянув в DLL, можно убедиться, что мы имеем дело с малварью.
Цель 2: Conhost
Инструмент Console Window Host (conhost), известный как conhost.
, управляет вводом/выводом командных инструментов вроде cmd.
. Хакеры могут использовать conhost как родительский процесс, чтобы скрыть выполнение вредоносного кода от глаз пользователя. Иногда можно наткнуться на вредоносные LNK, которые запускают скрипты через conhost.
.


Этот запутанный скрипт командной строки собирает и выполняет код на JavaScript. Ниже — расшифрованный код.

На этом этапе аналитик может определить, вредоносен ли файл, глянув на домен или содержимое, которое тянется из сети.
Цель 3: Forfiles
Команда forfiles
в Windows напоминает команду find
в UNIX. Она занимается поиском файлов по заданным шаблонам названий. Но ее фишка в том, что с помощью аргумента /
можно выполнять произвольные команды — forfiles
запустит указанную команду для каждого найденного файла.

Этот LNK применяет forfiles
, чтобы запустить вредоносный скрипт на PowerShell, который спрятан в переменной COMMAND_LINE_ARGUMENTS
.

Команда PowerShell запускает удаленный файл HTA с помощью mshta.
.
Исполнение наложенного контента
Специалисты Unit 42 отмечают, что часто видят зловредные LNK-файлы с «хвостом» из дополнительных данных после официального конца файла. Так как добавление данных никак не мешает парсингу, замутить LNK-малварь можно, просто пристегнув туда вредоносные скрипты или другие полезные нагрузки. Это можно назвать «оверлей‑контентом». Windows на такие довески не обращает внимание, поэтому чтобы скрипты сработали как надо, вирусописатели шаманят с параметрами командной строки в поле COMMAND_LINE_ARGUMENTS
.
Способ 1: команды Find и Findstr
Утилиты командной строки Windows find
и findstr
применяются для поиска определенных текстовых строк в файлах, как grep в UNIX. Зловредные LNK могут хитро использовать эти команды, чтобы отыскать точное местоположение вредоносного контента в оверлее.
Ниже — пример LNK-вредоноса, который использует команду findstr
рекурсивно, чтобы спрятать и запустить зловредный код.

Этот вредоносный LNK называется 2023_Annual_Report.
, поэтому для пользователя, который не догадается посмотреть подробности в «Проводнике», он будет выглядеть как документ PDF. Вот так выглядит его структура:
P1: Содержимое LNK
P2: PDF в Base64
P3: Скрипт в Base64
Секции P2 и P3 — добавленный малварью контент.
Поле COMMAND_LINE_ARGUMENTS
содержит командный скрипт. Его код — ниже.

В расшифрованном скрипте findstr
ищет строку CiRFcnJvckFjdGlvbl
прямо в зловредном LNK. Совпадение найдется в блоке P3, который представляет собой закодированный скрипт PowerShell.

Этот скрипт скачивает данные с сервера злоумышленника по адресу pdf-online[.]
. Причем, прежде чем активировать вредоносный код, он сначала раскодирует и открывает PDF-файл в P2. Сам по себе PDF никакой угрозы не несет.

Хотя этот пример выполняет вредоносный PowerShell-скрипт, метод с findstr
будет работать и с другим вредоносным содержимым, например, с VBS или командным скриптом. Этот метод сработает и с вредоносным бинарным кодом, закодированным в Base64 и записанным в оверлей.
Способ 2: MSHTA
Переходим ко второму способу наложения контента. Злоумышленники часто используют вредоносные файлы HTML Application (HTA) для распространения малвари, и в случае с LNK-вредоносами приемы с HTA тоже часто идут в ход. Windows доверчиво запускает такие файлы через mshta.
, причем mshta.
настолько терпелив, что пропустит любое содержимое, пока не наткнется на искомый пролог hta:
.
Когда зловредный HTA прикреплен к LNK как накладное содержимое, не нужно ломать голову, с какого места начинается HTA. Достаточно одной простой команды: mshta [
.

Структура здесь простая:
P1: Содержимое LNK
P2: HTA-скрипт
Ниже — COMMAND_LINE_ARGUMENTS
этого примера.

Он просто запускает mshta, передавая самого себя в качестве аргумента для mshta.
Способ 3: Команды и фишки PowerShell
Команды PowerShell и встроенные возможности вроде Select-String
, Get-Content
и .
отлично подходят для поиска или извлечения контента. Причем эти команды можно закодировать так, чтобы их было сложнее засечь.
Давай рассмотрим пример малвари в формате LNK, которая использует трюк с PE-файлом, закодированным в Base64 и вставленным в качестве оверлея.

Структура:
P1: Содержимое LNK
P2: PE, закодированный в Base64
Поле COMMAND_LINE_ARGUMENTS
содержит скрипт PowerShell с контентом, закодированным в Base64.

Содержимое переводится из Base64 в текст.

Вот что делает эта команда:
- Ищет файл, заканчивающийся на
.
.lnk - Ищет в тексте паттерн
BS:
с помощью командыD Select-String
. - Раскодирует из Base64 все, что идет после паттерна
BS:
.D - Сохраняет раскодированный текст в файл в директории
TEMP
и запускает его с помощью командыStart-Process
.
Ниже — единственный паттерн BS:
в файле LNK.

После BS:
идет текстовый шаблон в кодировке Base64, который очень часто составляет первые три байта исполняемого (PE) файла (4d
). Содержимое, начинающееся с TVqQ
, — это P2-оверлей, не являющийся частью содержания LNK. Декодируешь эту строку из Base64 — получаешь вредоносный PE-файл.
Сравнение способов выполнения оверлей-контента
У каждой из этих трех техник выполнения наложенного контента свои плюсы. Конкретнее:
-
find/findstr — универсальная и простая в освоении техника. Поддерживает разные шаблоны‑разделители и разнообразные полезные нагрузки. Плюс ко всему, команду
find
можно шифровать стандартными методами обфускации скриптов. -
mshta — реализовать проще простого, ведь
mshta.
настолько всеяден, что проигнорирует любой не-HTA контент. Достаточно запустить mshta, чтобы выполнить файл LNK. Минус — полезная нагрузка должна быть HTA-скриптом.exe - PowerShell (команды/встроенные возможности) — реализация посложнее, зато можно использовать хардкорную обфускацию, чтобы скрыть или замаскировать вредоносное содержание в накладке.
Эти три методики составляют примерно 95% от всех, которые специалисты Unit 42 видели при наборе данных. На диаграмме ниже все наглядно разложено.

Остальные 5,6% — это разнообразные техники для поиска и исполнения оверлей‑контента. Тут тебе и фиксированные смещения, и запуск программ‑загрузчиков. Мощь PowerShell позволяет хакерам применять целый арсенал методов для выполнения вредоносного кода в оверлее — границы тут только в фантазии самого злоумышленника.
Выводы
Итак, мы разобрали четыре типа малвари LNK. Эти знания пригодятся не только специалистам по безопасности, но и аналитикам данных. Если ты используешь Windows, проверяй любой подозрительный .lnk, прежде чем кликнуть два раза. Не дай малвари тебя провести!