Malicious browser extensions — это вредоносные или подозрительные расширения браузера, которые могут читать данные со страниц, менять поисковую систему, подсовывать рекламу, перехватывать введённые пароли или открывать доступ к аккаунтам. Проблема в том, что обычная проверка антивирусом не всегда помогает: браузер считает расширение «установленным», а пользователь видит только безобидное название вроде “PDF Tool”, “Coupon Helper” или “Search Manager”.
PowerShell здесь удобен тем, что позволяет быстро собрать список расширений по профилям, найти одинаковые ID в нескольких браузерах, выгрузить результат в CSV и удалить расширения вручную или пакетно. Ниже — практичный порядок действий: как проверить Chrome, Edge, Brave, Opera, Vivaldi, Yandex Browser и Firefox, что считать подозрительным, как удалить расширение безопасно и что сделать после чистки.
- Что именно делает вредоносное расширение
- Где браузеры хранят расширения
- Подготовка: что сделать до запуска скриптов
- Скрипт поиска расширений в Chromium-браузерах
- Как понять, какое расширение подозрительное
- Удаление расширения из одного Chromium-профиля
- Пакетное удаление одного ID из всех профилей
- Что делать, если расширение возвращается после удаления
- Проверка Firefox
- Как выбрать способ удаления
- Практические рекомендации после удаления
- Частые ошибки при удалении
- Как лучше сделать, чтобы не возвращаться к проблеме
- Когда одного PowerShell недостаточно
- Итог
Что именно делает вредоносное расширение
Не каждое плохое расширение одинаково опасное. Часть из них просто навязывает рекламу и меняет стартовую страницу. Более неприятные расширения умеют читать содержимое открытых вкладок, воровать токены сессий, менять данные в формах, подменять поисковую выдачу или перенаправлять пользователя на фишинговые сайты.
Самая частая ситуация выглядит так: человек ставит расширение для скачивания файлов, проверки скидок, конвертации PDF или «ускорения браузера», а через неделю замечает странный поиск, рекламу в Google, новые вкладки или вход в аккаунты слетает чаще обычного. В такой ситуации расширение может уже быть синхронизировано через аккаунт браузера, поэтому простое удаление из одного профиля иногда возвращает проблему снова.
Поэтому задача не только «удалить папку». Нужно:
- найти ID расширений;
- проверить, где они установлены;
- понять, кто их поставил — пользователь, политиками компании или вредоносной программой;
- удалить из профилей;
- заблокировать повторную установку, если нужно;
- проверить настройки браузера и аккаунта.
Где браузеры хранят расширения
У браузеров на движке Chromium расширения обычно лежат в папке профиля:
...\User Data\<Profile>\Extensions\<extension-id>\
ID расширения — это строка вроде abcdefghijklmnopqrstuvwxyz123456. Она важнее названия. Название можно поменять, а ID остаётся основным идентификатором.
Метаданные расширений чаще всего находятся в файле Preferences внутри профиля. Там есть раздел extensions.settings. Если расширение активно, рядом обычно есть каталог с тем же ID в папке Extensions.
Для Firefox всё иначе: там расширения находятся в профиле пользователя, но надёжнее искать их через сам браузер или через файл базы данных. В PowerShell проще собрать данные из каталогов Firefox, а удаление лучше делать через интерфейс Firefox или через очистку политики, если расширение поставлено централизованно.
Подготовка: что сделать до запуска скриптов
Перед тем как удалять расширения, не стоит сразу чистить всё подряд. Сначала соберите список. Это поможет понять, что именно установлено, и не удалить рабочий корпоративный плагин, который нужен для VPN, антивируса или входа в сервисы.
Минимальный безопасный порядок:
- Закройте браузеры: Chrome, Edge, Chromium, Brave, Opera, Vivaldi, Yandex, Firefox.
- Откройте PowerShell от имени пользователя, чьи профили проверяете.
- Создайте папку для отчётов, например
C:\Temp\BrowserExtensions. - Выполните скрипт поиска расширений.
- Проверьте CSV-файл и только потом удаляйте подозрительные ID.
Если вы не администратор компьютера, PowerShell всё равно может проверить расширения текущего пользователя. Администраторские права могут понадобиться, если нужно чистить политики в HKEY_LOCAL_MACHINE или удалять файлы из системных каталогов.
Скрипт поиска расширений в Chromium-браузерах
Этот скрипт ищет расширения в Chrome, Edge, Brave, Opera, Vivaldi и Yandex Browser. Он читает файлы Preferences из профилей и выгружает результат в CSV.
$outDir = "$env:TEMP\BrowserExtensions"
New-Item -ItemType Directory -Path $outDir -Force | Out-Null
$browserPaths = @(
@{ Name = "Google Chrome"; Path = "$env:LOCALAPPDATA\Google\Chrome\User Data" },
@{ Name = "Microsoft Edge"; Path = "$env:LOCALAPPDATA\Microsoft\Edge\User Data" },
@{ Name = "Brave"; Path = "$env:LOCALAPPDATA\BraveSoftware\Brave-Browser\User Data" },
@{ Name = "Opera"; Path = "$env:APPDATA\Opera Software\Opera Stable" },
@{ Name = "Vivaldi"; Path = "$env:LOCALAPPDATA\Vivaldi\User Data" },
@{ Name = "Yandex Browser"; Path = "$env:LOCALAPPDATA\Yandex\YandexBrowser\User Data" }
)
$results = New-Object System.Collections.Generic.List[object]
foreach ($browser in $browserPaths) {
$userDataSet = $browser.Path
if (-not (Test-Path $userDataSet)) {
continue
}
$profiles = Get-ChildItem -Path $userDataSet -Directory |
Where-Object { $_.Name -match "^(Default|Profile [0-9]+)$" }
foreach ($profile in $profiles) {
$prefsPath = Join-Path $profile.FullName "Preferences"
if (-not (Test-Path $prefsPath)) {
continue
}
try {
$prefs = Get-Content $prefsPath -Raw -ErrorAction Stop |
ConvertFrom-Json -ErrorAction Stop
}
catch {
$results.Add([pscustomobject]@{
Browser = $browser.Name
Profile = $profile.Name
ExtensionId = ""
ExtensionName = ""
ExtensionVersion = ""
ExtensionPath = ""
Source = "Preferences read error: $($_.Exception.Message)"
}) | Out-Null
continue
}
if ($null -eq $prefs.extensions -or $null -eq $prefs.extensions.settings) {
continue
}
foreach ($extId in $prefs.extensions.settings.PSObject.Properties.Name) {
$ext = $prefs.extensions.settings.$extId
$extensionDir = Join-Path $profile.FullName "Extensions\$extId"
$results.Add([pscustomobject]@{
Browser = $browser.Name
Profile = $profile.Name
ExtensionId = $extId
ExtensionName = $ext.name
ExtensionVersion = $ext.version
ExtensionPath = $extensionDir
Source = "Preferences"
}) | Out-Null
}
}
}
$outFile = Join-Path $outDir "chromium-extensions.csv"
$results | Sort-Object Browser, Profile, ExtensionId | Export-Csv $outFile -NoTypeInformation -Encoding UTF8
Write-Host "Готово. Список расширений:"
Write-Host $outFile
После запуска откройте CSV. Если одно и то же расширение стоит в Chrome и Edge — это не всегда плохо: пользователь мог установить его в обоих браузерах. Но если одинаковый неизвестный ID встречается в нескольких браузерах, особенно после установки одной сомнительной программы, это уже повод проверить его отдельно.
Как понять, какое расширение подозрительное
Сам по себе PowerShell не всегда скажет: «вот это вредоносное расширение». Он показывает факты: ID, имя, версию и путь. Дальше нужно принять решение по признакам.
| Признак | Что это может означать | Что делать |
|---|---|---|
| Расширение установлено в нескольких профилях одного браузера | Пользователь ставил его во все профили, либо оно попало через синхронизацию | Проверить ID, удалить из всех профилей, если не используется |
| Один и тот же ID найден в Chrome, Edge и Brave | Частый признак установки через стороннюю программу или вредоносный установщик | Искать ID в интернете, проверить дату установки и удалить |
| Название вроде “Search”, “Coupon”, “PDF Converter”, “Weather”, “Shopping Assistant” | Само название не доказывает вред, но такие расширения часто используются для рекламы | Сравнить с тем, что вы реально ставили |
| Расширение есть в файле Preferences, но папки Extensions нет | Может быть остаточная запись или повреждённая установка | Очистить запись из Preferences через скрипт |
| Расширение возвращается после удаления | Его ставит политика браузера, синхронизация или вредоносная программа | Проверить политики и автозагрузку |
ID расширения можно проверить в интернете: введите его в поиске вместе со словом extension. Иногда по ID сразу находится страница Chrome Web Store или отчёты о вредоносном расширении. Но не доверяйте одному источнику: название может совпадать, а ID — быть подменённым.
Удаление расширения из одного Chromium-профиля
Если вы точно знаете ID вредоносного расширения, можно удалить его из конкретного браузера и профиля. Самый надёжный способ — закрыть браузер, удалить папку расширения и очистить запись из файла Preferences.
Ниже пример для Chrome, профиль Default. Замените браузер, профиль и ID под свою ситуацию.
$browser = "Chrome"
$profileName = "Default"
$extensionId = "abcdefghijklmnopqrstuvwxyz123456"
$paths = @{
"Chrome" = "$env:LOCALAPPDATA\Google\Chrome\User Data"
"Edge" = "$env:LOCALAPPDATA\Microsoft\Edge\User Data"
"Brave" = "$env:LOCALAPPDATA\BraveSoftware\Brave-Browser\User Data"
"Opera" = "$env:APPDATA\Opera Software\Opera Stable"
"Vivaldi" = "$env:LOCALAPPDATA\Vivaldi\User Data"
"Yandex" = "$env:LOCALAPPDATA\Yandex\YandexBrowser\User Data"
}
if (-not $paths.ContainsKey($browser)) {
throw "Неизвестный браузер: $browser"
}
$profilePath = Join-Path $paths[$browser] $profileName
$extensionDir = Join-Path $profilePath "Extensions\$extensionId"
$prefsPath = Join-Path $profilePath "Preferences"
if (-not (Test-Path $profilePath)) {
throw "Профиль не найден: $profilePath"
}
$backupDir = "$env:TEMP\BrowserExtensionBackups\$browser-$profileName-$((Get-Date).ToString('yyyyMMdd-HHmmss'))"
New-Item -ItemType Directory -Path $backupDir -Force | Out-Null
if (Test-Path $extensionDir) {
Copy-Item -Path $extensionDir -Destination $backupDir -Recurse -Force
Remove-Item -Path $extensionDir -Recurse -Force
Write-Host "Папка расширения удалена: $extensionDir"
}
else {
Write-Host "Папка расширения не найдена: $extensionDir"
}
if (Test-Path $prefsPath) {
Copy-Item -Path $prefsPath -Destination $backupDir -Force
$json = Get-Content $prefsPath -Raw
$prefs = $json | ConvertFrom-Json
if ($prefs.extensions.settings.PSObject.Properties.Name -contains $extensionId) {
$prefs.extensions.settings.PSObject.Properties.Remove($extensionId)
$prefs | ConvertTo-Json -Depth 20 | Set-Content $prefsPath -Encoding UTF8
Write-Host "Запись расширения удалена из Preferences"
}
else {
Write-Host "Записи расширения в Preferences не найдено"
}
}
else {
Write-Host "Файл Preferences не найден: $prefsPath"
}
Почему я убираю не только папку, но и запись из Preferences? Потому что браузер может оставить старую запись, а при следующем запуске попытаться восстановить данные расширения или показать странное состояние в настройках. Для вредоносного расширения лучше убрать оба следа.
Пакетное удаление одного ID из всех профилей
Если вы нашли один и тот же подозрительный ID в нескольких профилях, удобнее удалить его везде. Этот скрипт проходит по Chromium-браузерам и удаляет указанный ID из профилей Default, Profile 1, Profile 2 и так далее.
$extensionId = "abcdefghijklmnopqrstuvwxyz123456"
$browserPaths = @(
@{ Name = "Chrome"; Path = "$env:LOCALAPPDATA\Google\Chrome\User Data" },
@{ Name = "Edge"; Path = "$env:LOCALAPPDATA\Microsoft\Edge\User Data" },
@{ Name = "Brave"; Path = "$env:LOCALAPPDATA\BraveSoftware\Brave-Browser\User Data" },
@{ Name = "Opera"; Path = "$env:APPDATA\Opera Software\Opera Stable" },
@{ Name = "Vivaldi"; Path = "$env:LOCALAPPDATA\Vivaldi\User Data" },
@{ Name = "Yandex"; Path = "$env:LOCALAPPDATA\Yandex\YandexBrowser\User Data" }
)
$removed = New-Object System.Collections.Generic.List[object]
foreach ($browser in $browserPaths) {
if (-not (Test-Path $browser.Path)) {
continue
}
$profiles = Get-ChildItem -Path $browser.Path -Directory |
Where-Object { $_.Name -match "^(Default|Profile [0-9]+)$" }
foreach ($profile in $profiles) {
$extensionDir = Join-Path $profile.FullName "Extensions\$extensionId"
$prefsPath = Join-Path $profile.FullName "Preferences"
$changed = $false
if (Test-Path $extensionDir) {
Remove-Item -Path $extensionDir -Recurse -Force
$changed = $true
}
if (Test-Path $prefsPath) {
try {
$prefs = Get-Content $prefsPath -Raw | ConvertFrom-Json
if ($prefs.extensions.settings.PSObject.Properties.Name -contains $extensionId) {
$prefs.extensions.settings.PSObject.Properties.Remove($extensionId)
$prefs | ConvertTo-Json -Depth 20 | Set-Content $prefsPath -Encoding UTF8
$changed = $true
}
}
catch {
Write-Warning "Не удалось обработать Preferences: $prefsPath"
}
}
if ($changed) {
$removed.Add([pscustomobject]@{
Browser = $browser.Name
Profile = $profile.Name
ExtensionId = $extensionId
Action = "Removed extension files and Preferences entry"
}) | Out-Null
}
}
}
$outFile = "$env:TEMP\removed-extension-$extensionId.csv"
$removed | Export-Csv $outFile -NoTypeInformation -Encoding UTF8
if ($removed.Count -eq 0) {
Write-Host "Расширение $extensionId не найдено или уже удалено."
}
else {
Write-Host "Готово. Отчёт:"
Write-Host $outFile
}
Перед запуском обязательно замените $extensionId на реальный ID. Не вставляйте сюда имя расширения. Если ошибиться, скрипт может удалить не то.
Что делать, если расширение возвращается после удаления
Если расширение снова появляется после перезапуска браузера, значит, его ставит не сам пользователь. Вариантов несколько: политики браузера, синхронизация, вредоносная программа в автозагрузке или корпоративная настройка.
Сначала проверьте политики Chrome и Edge:
reg query HKLM\SOFTWARE\Policies\Google\Chrome /s 2>$null
reg query HKCU\SOFTWARE\Policies\Google\Chrome /s 2>$null
reg query HKLM\SOFTWARE\Policies\Microsoft\Edge /s 2>$null
reg query HKCU\SOFTWARE\Policies\Microsoft\Edge /s 2>$null
Ищите параметры вроде:
ExtensionInstallForcelist;ExtensionSettings;ExtensionInstallBlocklist;ExtensionInstallAllowlist.
Если это рабочий компьютер, не удаляйте политики самостоятельно. В корпоративной среде расширение может быть установлено отделом ИТ. На личном компьютере подозрительная политика — плохой признак.
Для личной машины можно проверить и удалить явные вредоносные политики. Делайте это аккуратно: сначала экспортируйте раздел реестра.
$regPaths = @(
"HKLM:\SOFTWARE\Policies\Google\Chrome",
"HKCU:\SOFTWARE\Policies\Google\Chrome",
"HKLM:\SOFTWARE\Policies\Microsoft\Edge",
"HKCU:\SOFTWARE\Policies\Microsoft\Edge"
)
foreach ($path in $regPaths) {
if (Test-Path $path) {
Write-Host "Найдена политика: $path"
Get-ItemProperty -Path $path
}
}
Если вы видите ExtensionInstallForcelist с неизвестным ID, можно удалить конкретное значение. Например, для Chrome:
$path = "HKCU:\SOFTWARE\Policies\Google\Chrome"
$valueName = "ExtensionInstallForcelist"
if (Test-Path $path) {
$props = Get-ItemProperty -Path $path
if ($props.PSObject.Properties.Name -contains $valueName) {
Remove-ItemProperty -Path $path -Name $valueName -Force
Write-Host "Значение $valueName удалено из $path"
}
}
Не удаляйте весь раздел Policies, если не понимаете, что там находится. В рабочем домене это может сломать нормальные настройки.
Проверка Firefox
Firefox хранит расширения иначе. Расширения обычно находятся в профиле пользователя, например:
%APPDATA%\Mozilla\Firefox\Profiles\<profile>\extensions\
Файлы расширений могут иметь вид .xpi или папки с ID. Для быстрой проверки можно собрать список расширений Firefox через PowerShell:
$firefoxProfiles = "$env:APPDATA\Mozilla\Firefox\Profiles"
$profilesPath = "$env:TEMP\firefox-extensions.csv"
if (Test-Path $firefoxProfiles) {
Get-ChildItem -Path $firefoxProfiles -Directory | ForEach-Object {
$profile = $_.FullName
$extDir = Join-Path $profile "extensions"
if (Test-Path $extDir) {
Get-ChildItem -Path $extDir | ForEach-Object {
[pscustomobject]@{
Profile = $_.Directory.Parent.Name
ExtensionFile = $_.Name
FullName = $_.FullName
}
}
}
} | Export-Csv $profilesPath -NoTypeInformation -Encoding UTF8
Write-Host "Список расширений Firefox:"
Write-Host $profilesPath
}
else {
Write-Host "Профили Firefox не найдены."
}
Если расширение Firefox выглядит подозрительно, я бы не рекомендовал удалять его только через PowerShell без проверки. Надёжнее открыть Firefox, перейти в Дополнения и темы и удалить расширение из интерфейса. Так браузер корректнее обновит свои внутренние базы.
Как выбрать способ удаления
| Ситуация | Лучший способ | Почему |
|---|---|---|
| Нужно просто посмотреть, какие расширения установлены | Скрипт поиска расширений в CSV | Быстро видно браузер, профиль, ID и путь |
| Нужно удалить одно подозрительное расширение | Скрипт удаления одного ID из всех профилей | Не нужно вручную искать папки в каждом профиле |
| Расширение возвращается после удаления | Проверить политики браузера и автозагрузку | Удаление файлов не поможет, если источник установки остался |
| Компьютер рабочий, в домене компании | Не чистить политики самостоятельно, обратиться в ИТ | Можно удалить легитимную корпоративную настройку |
| Расширение в Firefox | Удалять через интерфейс Firefox или аккуратно через профиль | Firefox хранит данные иначе, чем Chromium |
Практические рекомендации после удаления
После удаления malicious browser extensions я бы сделал ещё несколько вещей. Они занимают немного времени, но сильно снижают шанс, что проблема вернётся.
- Перезапустите браузер и снова запустите скрипт поиска расширений.
- Проверьте стартовую страницу, поисковую систему и домашнюю страницу.
- Зайдите в аккаунт браузера и отключите синхронизацию расширений, если не уверены, что она чистая.
- Смените пароли от важных сервисов, если подозрительное расширение имело доступ к вкладкам.
- Включите двухфакторную аутентификацию там, где это возможно.
- Проверьте автозагрузку Windows:
Диспетчер задач → Автозагрузка. - Если расширение было установлено вместе с бесплатной программой, удалите эту программу из «Установки и удаления программ».
- Не включайте обратно расширения, которые не используете каждый день.
Особенно обратите внимание на разрешения. Расширение для заметок не должно читать все сайты. Расширение для работы с PDF не должно иметь доступ ко всем вкладкам. Если расширение требует слишком много прав, это не доказательство вреда, но хороший повод задуматься.
Частые ошибки при удалении
С PowerShell можно быстро навести порядок, но можно и усложнить ситуацию. Вот ошибки, которые я чаще всего вижу на практике.
- Удаляют по названию, а не по ID. Название легко подделать, а ID точнее показывает, что именно установлено.
- Чистят только папку Extensions. Запись в
Preferencesможет остаться, и браузер продолжит вести себя странно. - Удаляют всё подряд. В списке могут быть расширения VPN, антивируса, менеджера паролей или корпоративные плагины.
- Не закрывают браузер перед удалением. Файлы могут быть заняты, а изменения — не примениться корректно.
- Игнорируют политики. Если расширение ставится через
ExtensionInstallForcelist, оно вернётся. - Работают без резервной копии. Файлы
Preferencesлучше копировать перед редактированием. - Не проверяют синхронизацию. Удаление в одном браузере может быть отменено аккаунтом Google, Microsoft или другим профилем синхронизации.
Как лучше сделать, чтобы не возвращаться к проблеме
Самый разумный подход — не пытаться «вылечить» браузер одним скриптом, а пройти цепочку: найти, проверить, удалить, заблокировать повторную установку, проверить аккаунт.
Если вы администрируете свой компьютер, сделайте так:
- Соберите список расширений в CSV.
- Отметьте расширения, которые точно не ставили.
- Проверьте неизвестные ID в интернете.
- Удалите подозрительные расширения через скрипт.
- Проверьте политики Chrome и Edge.
- Перезапустите браузеры и повторите поиск.
- Отключите синхронизацию расширений на время проверки.
- Смените пароли, если расширение могло читать данные на сайтах.
Если это компьютер организации, лучше ограничиться сбором отчёта и передать его администратору. В корпоративной среде расширение может быть установлено через групповые политики, Intune или MDM. Самостоятельное удаление может нарушить рабочие сервисы.
Когда одного PowerShell недостаточно
PowerShell хорошо справляется с файлами, папками, реестром и JSON-настройками браузера. Но он не всегда видит всё. Например, вредоносная программа может ставить расширение каждый раз после запуска, а источник может находиться в автозагрузке, планировщике задач или сервисе Windows.
Если после чистки расширения снова появляются, проверьте:
- автозагрузку Windows;
- планировщик задач;
- установленные программы;
- политики Chrome и Edge;
- синхронизацию расширений в аккаунте браузера;
- новые расширения после установки недавних программ.
В такой ситуации PowerShell-скрипт — это инструмент диагностики и точечной чистки, а не полная замена антивирусной проверки или анализа системы.
Итог
Чтобы удалить malicious browser extensions через PowerShell, начните не с удаления, а со сбора списка. Найдите расширения в профилях Chromium-браузеров, проверьте ID, сравните их с тем, что вы реально устанавливали, и только потом удаляйте.
Для большинства случаев достаточно двух действий: удалить папку расширения из Extensions и убрать запись из Preferences. Если расширение возвращается, ищите причину в политиках браузера, синхронизации или вредоносной программе, которая ставит его снова.
Самый безопасный сценарий: сначала CSV-отчёт, потом проверка ID, затем точечное удаление и повторная проверка. Так вы не удалите лишнее, не сломаете рабочий профиль и поймёте, решена проблема или её источник всё ещё активен.
