Безопасность
Карта опасных расширений: 60 форматов, которые нельзя открывать двойным кликом
Интерактивная карта 60 форматов с уровнем риска и проверкой файла — полный справочник опасных расширений.
Файл с расширением .bat, .cmd или .vbs выглядит безобидно — просто текстовый скрипт, не «настоящая» программа. Но именно скрипты часто используют для доставки вредоносного кода: внутри несколько строк могут незаметно скачать и запустить что угодно, а антивирус распознаёт это не всегда и не сразу. Прежде чем решать, какие расширения вообще считаются рискованными, полезно сверить файл с картой опасных расширений — а в этой статье разберём именно скрипты: как малварь прячется внутри .bat/.vbs/.ps1-файла и как проверить его перед запуском, не полагаясь на одну иконку или один антивирус.
Коротко: скрипт нельзя оценивать по иконке или расширению — вредоносный код внутри .bat/.vbs/.ps1 часто скрыт через шифрование и обфускацию и срабатывает только при запуске. Перед тем как дважды кликнуть по файлу, посчитайте его хэш (Get-FileHash), проверьте хэш или сам файл на VirusTotal, посмотрите, есть ли цифровая подпись (Get-AuthenticodeSignature), и при малейшем сомнении — откройте скрипт в Блокноте или прогоните в песочнице (Windows Sandbox, ANY.RUN), а не запускайте вслепую.

Скриптовые файлы — .bat, .cmd, .vbs, .ps1, а также смежные с ними .js, .wsf и .hta — объединяет одно: это не скомпилированная программа, а текст с командами, который операционная система выполняет построчно через свой интерпретатор. Именно поэтому их так часто используют для доставки вредоносного кода: написать и изменить такой скрипт проще, чем собрать полноценный исполняемый файл, а часть пользователей по-прежнему считает «просто текстовый файл» безопаснее .exe.
Все перечисленные форматы запускаются не самостоятельно, а через конкретный интерпретатор Windows, и у каждого — свой типичный способ использования во вредоносных кампаниях.
| Расширение | Чем исполняется | Типичный риск | Что проверить первым |
|---|---|---|---|
| .bat / .cmd | cmd.exe | Простые команды-загрузчики: скачать файл, запустить программу, изменить реестр | Открыть в Блокноте, искать команды скачивания и запуска |
| .vbs | WScript / CScript | Запуск других программ через COM-объекты, часто с обфускацией кода | Искать Base64-строки и вызовы WScript.Shell |
| .ps1 | PowerShell | Полноценный доступ к системе, загрузка кода прямо в память без записи на диск | Искать флаги -enc / -EncodedCommand, -WindowStyle Hidden |
| .js / .wsf | WScript (Windows Script Host) | То же, что у .vbs — часто запускается двойным кликом по умолчанию | Проверить, не ассоциирован ли файл с WScript вместо браузера |
| .hta | mshta.exe | HTML-приложение с полным доступом к скриптам Windows, в обход ограничений браузера | Не открывать из писем и мессенджеров без проверки |
Разница в интерпретаторе важна практически: .bat-файл ограничен возможностями командной строки, а .ps1 через PowerShell может сделать с системой почти всё — от скачивания файлов до загрузки кода прямо в память процесса. Поэтому проверять скрипт перед запуском нужно именно по его реальному расширению, а не по тому, как он выглядит на иконке.
Чтобы понимать, что именно искать при проверке, полезно разобрать один зафиксированный случай — опубликованный на Habr технический разбор реального VBS-скрипта с многослойной обфускацией. Это разбор одного конкретного образца, а не статистика по всем вредоносным скриптам, но он хорошо показывает логику, которую используют и другие похожие угрозы.
Скрипт был устроен так, что сам читал собственное содержимое через WScript.ScriptFullName — то есть открывал себя как обычный файл и извлекал из своего же текста зашифрованные данные. Дальше эти данные проходили цепочку расшифровки: сначала простое XOR, затем AES в режиме CBC — комбинация, которая усложняет статический анализ, потому что реальная полезная нагрузка не видна в самом файле до момента выполнения.
После расшифровки скрипт не записывал итоговый код на диск, а загружал .NET-сборку прямо в память процесса через [Reflection.Assembly]::Load — это значит, что на жёстком диске не оставалось отдельного «вирусного файла», который можно было бы просто найти и удалить. Запуск дальнейшего кода маскировался под легитимный процесс — через MSBuild.exe, стандартный инструмент сборки .NET, который редко попадает под подозрение у пользователя и части защитных решений.
Отдельно в разборе отмечены типичные флаги PowerShell, которые использовались на следующих этапах: -WindowStyle Hidden (запуск без видимого окна) и Set-ExecutionPolicy Bypass (временное снятие ограничения на запуск неподписанных скриптов). Скрипт также проверял LanguageMode PowerShell — это способ определить, не запущен ли он в ограниченной среде вроде песочницы или корпоративной политики безопасности, и изменить поведение, если обнаружено наблюдение.
Снаружи такой файл выглядит как обычный «безопасный» текстовый документ: несколько строк комментариев вида 'DATA:, за которыми следует длинный бессмысленный на вид набор символов — тот самый зашифрованный и закодированный в Base64 полезный код. Человек, открывший файл просто посмотреть, скорее всего решит, что это «какой-то технический мусор», и закроет его, не распознав угрозу — именно на эту реакцию и рассчитана обфускация.
Прежде чем запускать незнакомый .bat, .vbs или .ps1-файл, его стоит сначала прочитать — но не двойным кликом (это сразу его выполнит), а через контекстное меню «Изменить» или явное открытие в Блокноте.
-enc или -EncodedCommand. Это прямой признак того, что PowerShell должен выполнить закодированную, то есть скрытую от беглого просмотра команду.WindowStyle Hidden и Set-ExecutionPolicy Bypass. Легитимным административным скриптам обычно незачем прятать своё окно и обходить политику выполнения.http:///https:// и явными числовыми IP в теле скрипта — повод насторожиться, особенно если скрипт пришёл не от разработчика ПО.'DATA: или похожие самодельные метки часто используются именно для того, чтобы скрипт мог найти и расшифровать свою же полезную нагрузку — обычным скриптам такие маркеры не нужны.Если в тексте скрипта вы заметили хотя бы два признака из списка выше — длинные Base64-строки, флаги кодирования/скрытия окна или обращения к незнакомым адресам — не запускайте файл. Переходите к пошаговой проверке в следующем разделе.
Даже если при просмотре в Блокноте ничего подозрительного не нашлось, это не стопроцентная гарантия — короткий легитимный на вид скрипт тоже может скачивать и запускать что-то дальше. Поэтому перед запуском любого незнакомого скрипта стоит пройти несколько быстрых технических проверок.
Get-FileHash <путь к файлу> -Algorithm SHA256 — команда вернёт контрольную сумму, по которой можно однозначно идентифицировать конкретный файл, независимо от его названия. Подробнее о том, как и зачем это делать, — в статье как проверить контрольную сумму файла. Документация команды — у Microsoft Learn.Get-AuthenticodeSignature <путь к файлу> в PowerShell покажет, подписан ли скрипт и кем именно (документация — у Microsoft Learn). Подпись от известного и доверенного издателя — хороший сигнал; статус «не подписан» сам по себе не доказывает вредоносность (многие безобидные административные скрипты тоже не подписаны), но в сочетании с другими признаками повышает осторожность.Хэш и VirusTotal — быстрая проверка «уже известен ли этот файл как опасный». Подпись — проверка происхождения. Песочница — самый надёжный, но и самый медленный шаг: его стоит делать именно тогда, когда первые две проверки не дали однозначного ответа, а не каждый раз подряд.
Даже когда скрипт прислал коллега, скачан с сайта разработчика ПО или идёт в комплекте с легальной программой, стоит соблюдать несколько правил запуска — они не требуют отдельной проверки, но снижают ущерб, если источник всё же оказался скомпрометирован.
ExecutionPolicy PowerShell в Unrestricted глобально. Если конкретный доверенный скрипт требует обхода политики, делайте это разово для одного запуска, а не меняйте политику для системы целиком.Если скрипт уже был запущен и после этого появились сомнения в его безопасности, действовать нужно быстро и по порядку.
Run и RunOnce — туда часто добавляют записи для повторного запуска при каждой загрузке системы.
1. Источник файла ожидаемый и проверенный, а не случайное вложение?
2. Реальное расширение видно (включены расширения файлов в проводнике), а не спрятано за двойным расширением?
3. Хэш файла посчитан через Get-FileHash?
4. Хэш или файл проверены на VirusTotal?
5. Цифровая подпись проверена через Get-AuthenticodeSignature?
6. При сомнениях — скрипт прогнан в Windows Sandbox или онлайн-песочнице?
7. Запуск планируется под обычным пользователем, без отключения Defender и SmartScreen?
Не полностью. Обфусцированный и зашифрованный код — именно так, как в разобранном выше случае — может не распознаваться антивирусом на статическом этапе, потому что реальная полезная нагрузка расшифровывается только в момент выполнения. Отсутствие детектов снижает вероятность угрозы, но не исключает её — для скриптов из непроверенных источников стоит дополнительно проверить содержимое и подпись.
.bat-файл выполняется через cmd.exe и ограничен возможностями командной строки — скачать файл, запустить программу, изменить несколько настроек. .ps1-скрипт работает через PowerShell, который имеет гораздо более широкий доступ к системе: может загружать код прямо в память процесса, управлять сетевыми подключениями и взаимодействовать с .NET напрямую. При прочих равных .ps1-файл потенциально опаснее.
Да, открытие текстового содержимого файла через «Изменить» или явный выбор Блокнота не запускает скрипт — это просто просмотр текста. Опасность возникает только при двойном клике или явном запуске через интерпретатор WScript/CScript.
Цифровая подпись подтверждает, кто именно подписал файл и что его содержимое не менялось после подписания. Для скрипта от известного издателя это хороший дополнительный сигнал доверия. Но отсутствие подписи — не приговор: многие легитимные административные и пользовательские .ps1/.vbs-скрипты никогда не подписываются, поэтому этот признак стоит оценивать вместе с остальными, а не отдельно.
Если скрипт выглядит стандартно и пришёл из надёжного источника — обычно нет. Но если в тексте файла при этом есть признаки обфускации (длинные Base64-строки, флаги -enc, скрытие окна), песочница всё равно оправдана: мультисканер на VirusTotal проверяет файл статически, а обфусцированный вредоносный код часто не детектируется именно на этом этапе и проявляет себя только при реальном выполнении.
В проводнике откройте вкладку «Вид» → «Показать» → включите «Расширения имён файлов» (в более старых версиях — через «Параметры папок» → вкладка «Вид» → снимите галочку «Скрывать расширения для зарегистрированных типов файлов»). После этого двойное расширение вроде .jpg.vbs станет видно целиком, а не только как «.jpg».