Back to Intelligence

Malicious Browser Extensions Can Hijack AI Assistants in Chrome, Edge, Comet, Opera Neon and Claude — Enterprise Defense Guide

SA
Security Arsenal Team
September 17, 2026
11 min read

Security researchers at Forever Security have demonstrated something that should unsettle every enterprise security team: one ordinary, garden-variety browser extension can take control of the AI assistants built into five Chromium-based products — Gemini Live in Google Chrome, Perplexity Comet, Microsoft Edge's Copilot, Opera Neon, and the Claude in Chrome extension. No zero-day. No memory corruption. No kernel exploit. Just a standard extension, installed through normal means, leveraging the trust that browser-integrated AI agents place in the extension ecosystem.

Why does this matter so much in 2026? Because AI assistants embedded in browsers are no longer chat toys. They browse on the user's behalf, read authenticated session content, summarize internal documents, draft and send messages, and increasingly execute actions across SaaS platforms. An extension that can drive the assistant inherits all of that agency — with the user's credentials, inside the user's session, on the user's machine. This is a privilege-escalation-by-design problem, and it collapses the boundary between 'user installed a shady extension' and 'attacker operates an autonomous agent inside your corporate SaaS estate.'

The attack surface here is not theoretical. Malicious extensions have a long, well-documented history of passing store review, being acquired by threat actors after reaching a large install base, and lying dormant before weaponization. What Forever Security's research adds is a force multiplier: the extension no longer needs to steal cookies or inject ads itself. It simply commands the AI to do the work — read the page, extract the data, exfiltrate it, take actions — using natural-language instructions that are far harder to signature than malicious JavaScript.

Technical Analysis

Affected Products

Based on the Forever Security research reported by The Hacker News, the technique was demonstrated against:

  • Google Chrome — Gemini Live integration
  • Perplexity Comet — the agentic AI browser
  • Microsoft Edge — Copilot integration
  • Opera Neon — Opera's AI-centric browser
  • Claude in Chrome — Anthropic's official Chrome extension

No CVE has been assigned to this research as of publication, and no CVSS score exists — this is an architectural weakness class in how Chromium-based browsers mediate trust between extensions and embedded AI assistants, not a single patched-and-done bug. Defenders should treat it as a technique disclosure, not a vendor patch cycle.

How the Attack Works (Defender's View)

The attack chain, as demonstrated, is deceptively simple:

  1. Installation: The user installs a seemingly benign extension — from the Chrome Web Store, Edge Add-ons store, or sideloaded. Standard extension permissions (which users and even IT teams routinely approve) are sufficient. No elevated or flagged permissions are necessarily required, which is precisely what makes this dangerous: it doesn't trip the 'this extension can read and change all your data' alarm bells in an obvious way.

  2. Single-click activation: Once installed, the extension can invoke and drive the product's built-in AI assistant with a single user interaction — or in some flows, programmatically. The extension effectively gains a 'remote control' over the assistant's session.

  3. Inherited agency: The assistant runs with the user's authenticated context — Gmail, Google Workspace, Microsoft 365, internal wikis, CRMs, whatever the browser session can reach. Instructions issued through the extension are executed by the assistant as if the user asked.

  4. Abuse outcomes: Data exfiltration via assistant-generated summaries sent to attacker infrastructure, prompt-injection against the assistant using page content the extension controls, credential and session-data harvesting, and automated actions (sending mail, creating calendar invites, modifying documents) performed under the victim's identity.

From a detection engineering standpoint, this is a nightmare shift in the observability plane: the 'malicious' behavior may be executed by a legitimate, signed browser process (chrome.exe, msedge.exe) and a vendor-signed AI component. The instruction channel is natural language, not shellcode. That means traditional process-ancestry and command-line detection largely fails, and the burden shifts to extension governance, behavioral monitoring of AI-assistant activity, and network egress analytics.

Exploitation Status

As of this writing, the Forever Security findings are a demonstrated proof-of-concept by researchers, not confirmed in-the-wild exploitation, and the technique does not appear in CISA's Known Exploited Vulnerabilities catalog. However, the barrier to weaponization is trivially low — the extension ecosystem already has a mature criminal supply chain for acquiring or publishing extensions at scale. Treat this as 'imminent technique adoption,' not a distant academic concern.

Detection & Response

Detection for this threat class rests on three pillars: knowing what extensions are installed, catching suspicious extension installation events in real time, and watching for anomalous browser-driven egress. Below are production-oriented rules. Note that I am deliberately not publishing a rule that fires on all AI-assistant traffic — that would be disabled within a week. These target the extension-control vector, which is the observable choke point.

Sigma Rules

YAML
---
title: Suspicious Chromium Extension Installed Outside Managed Policy
id: 3f8a2b14-7c91-4d52-9e06-2a7c5d1f8b33
status: experimental
description: Detects Chromium-based browser extension registration in user-writable profile paths where the extension ID is not present in enterprise force-install or allowlist policy. Malicious extensions that hijack browser AI assistants must first land in the profile Extensions directory.
references:
  - https://thehackernews.com/2026/09/one-extension-could-hijack-ai.html
  - https://attack.mitre.org/techniques/T1176/
author: Security Arsenal
date: 2026/09/15
tags:
  - attack.persistence
  - attack.t1176
logsource:
  category: file_event
  product: windows
detection:
  selection_path:
    TargetFilename|contains:
      - '\AppData\Local\Google\Chrome\User Data\Default\Extensions\'
      - '\AppData\Local\Microsoft\Edge\User Data\Default\Extensions\'
      - '\AppData\Roaming\Opera Software\'
      - '\AppData\Local\Comet\User Data\Default\Extensions\'
  selection_file:
    TargetFilename|endswith:
      - '\manifest.json'
  condition: selection_path and selection_file
falsepositives:
  - Legitimate user-installed extensions from official stores
  - Extensions deployed by developer tooling (React DevTools etc.)
level: medium
---
title: Chromium Browser Launched With Extension Load or Debugging Flags
id: 8c1e5f72-3a40-4b89-a1d7-6e2c9f04b7d5
status: experimental
description: Detects Chrome, Edge, Comet, or Opera Neon processes started with flags used to sideload unpacked extensions or enable remote debugging - both of which can be abused to inject extension-level control of built-in AI assistants outside the store review process.
references:
  - https://thehackernews.com/2026/09/one-extension-could-hijack-ai.html
  - https://attack.mitre.org/techniques/T1176/
author: Security Arsenal
date: 2026/09/15
tags:
  - attack.persistence
  - attack.defense_evasion
  - attack.t1176
logsource:
  category: process_creation
  product: windows
detection:
  selection_img:
    Image|endswith:
      - '\chrome.exe'
      - '\msedge.exe'
      - '\opera.exe'
      - '\neon.exe'
      - '\comet.exe'
  selection_flags:
    CommandLine|contains:
      - '--load-extension'
      - '--disable-extensions-except'
      - '--remote-debugging-port'
      - '--remote-debugging-pipe'
  filter_legit_dev:
    CommandLine|contains:
      - 'ms-playwright'
      - 'puppeteer'
      - 'selenium'
      - 'chromedriver'
  condition: selection_img and selection_flags and not filter_legit_dev
falsepositives:
  - QA automation frameworks and developer workstations - tune per-host baseline
level: high
---
title: Registry-Based Chromium Extension Policy Tampering
id: 5b2d9e61-8f34-4a17-b2c8-9d0e3f6a1c44
status: experimental
description: Detects modification of Chromium ExtensionInstallForceList or ExtensionInstallBlocklist policy registry keys. Attackers and malicious installers use force-list entries to silently persist extensions that can drive built-in AI assistants.
references:
  - https://thehackernews.com/2026/09/one-extension-could-hijack-ai.html
  - https://attack.mitre.org/techniques/T1112/
author: Security Arsenal
date: 2026/09/15
tags:
  - attack.persistence
  - attack.defense_evasion
  - attack.t1112
  - attack.t1176
logsource:
  category: registry_set
  product: windows
detection:
  selection:
    TargetObject|contains:
      - '\Policies\Google\Chrome\ExtensionInstallForcelist'
      - '\Policies\Microsoft\Edge\ExtensionInstallForcelist'
      - '\Policies\Google\Chrome\ExtensionInstallBlocklist'
      - '\Policies\Microsoft\Edge\ExtensionInstallBlocklist'
  filter_mgmt:
    Image|endswith:
      - '\gpscript.exe'
      - '\GroupPolicyMgmt.exe'
      - '\IntuneManagementExtension.exe'
  condition: selection and not filter_mgmt
falsepositives:
  - Managed GPO/Intune policy deployment outside filtered processes
level: high

KQL (Microsoft Sentinel / Defender)

KQL — Microsoft Sentinel / Defender
// Hunt: New browser extension manifests appearing on endpoints, correlated against known-good baseline
// Covers Chrome, Edge, Opera Neon, and Comet profile paths
let ExtensionPaths = dynamic([
    "\\AppData\\Local\\Google\\Chrome\\User Data\\",
    "\\AppData\\Local\\Microsoft\\Edge\\User Data\\",
    "\\AppData\\Roaming\\Opera Software\\",
    "\\AppData\\Local\\Comet\\User Data\\"
]);
let KnownGoodExtensions = externaldata(ExtensionId:string)[@"https://your-storage/known-good-extension-ids.csv"] with (format="csv");
DeviceFileEvents
| where TimeGenerated > ago(14d)
| where FileName =~ "manifest.json"
| where FolderPath has_any (ExtensionPaths)
| where FolderPath has "\\Extensions\\"
| extend ExtensionId = extract(@"\\Extensions\\([a-p]{32})\\", 1, FolderPath)
| where isnotempty(ExtensionId)
| summarize FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated), Devices = dcount(DeviceName), DeviceList = make_set(DeviceName, 25) by ExtensionId, InitiatingProcessFileName
| where ExtensionId !in (KnownGoodExtensions)
| order by FirstSeen desc;

// Hunt: Chromium processes launched with extension sideloading or remote debugging flags
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where FileName in~ ("chrome.exe", "msedge.exe", "opera.exe", "neon.exe", "comet.exe")
| where ProcessCommandLine has_any ("--load-extension", "--disable-extensions-except", "--remote-debugging-port", "--remote-debugging-pipe")
| where ProcessCommandLine !has_any ("selenium", "puppeteer", "ms-playwright", "chromedriver")
| project TimeGenerated, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine
| order by TimeGenerated desc;

// Hunt: Anomalous egress volume from browser processes to rare first-seen domains
// (AI-assistant-driven exfiltration inherits the browser's network stack)
let Lookback = 14d;
let Baseline = DeviceNetworkEvents
| where TimeGenerated > ago(30d) and TimeGenerated < ago(Lookback)
| where InitiatingProcessFileName in~ ("chrome.exe", "msedge.exe", "opera.exe", "neon.exe", "comet.exe")
| summarize by RemoteUrl;
DeviceNetworkEvents
| where TimeGenerated > ago(Lookback)
| where InitiatingProcessFileName in~ ("chrome.exe", "msedge.exe", "opera.exe", "neon.exe", "comet.exe")
| where RemoteUrl !in (Baseline)
| summarize Connections = count(), Devices = dcount(DeviceId), DeviceList = make_set(DeviceName, 15) by RemoteUrl, RemoteIP
| where Devices <= 3
| order by Connections desc;

Velociraptor VQL

VQL — Velociraptor
-- Artifact: SecurityArsenal.Chromium.ExtensionInventory
-- Enumerate all installed Chromium extensions across Chrome, Edge, Opera, and Comet profiles
-- and flag extensions with high-risk permission sets capable of driving embedded AI assistants.

LET profiles = SELECT FullPath AS ProfileDir,
      parse_string_with_regex(string=FullPath,
        regex="(?i)(Chrome|Edge|Opera Software|Comet)").g1 AS Browser
   FROM glob(globs=[
     "C:/Users/*/AppData/Local/Google/Chrome/User Data/*/Extensions/*/*/manifest.json",
     "C:/Users/*/AppData/Local/Microsoft/Edge/User Data/*/Extensions/*/*/manifest.json",
     "C:/Users/*/AppData/Roaming/Opera Software/*/Extensions/*/*/manifest.json",
     "C:/Users/*/AppData/Local/Comet/User Data/*/Extensions/*/*/manifest.json"
   ])

LET parsed = SELECT ProfileDir, Browser, FullPath,
      parse_json(filename=FullPath) AS Manifest
   FROM profiles

SELECT Browser,
       FullPath AS ManifestPath,
       Manifest.name AS ExtensionName,
       Manifest.version AS Version,
       Manifest.permissions AS Permissions,
       Manifest.host_permissions AS HostPermissions,
       timestamp(epoch=stat(filename=FullPath).Mtime) AS ManifestModified
FROM parsed
WHERE Permissions =~ "(?i)(tabs|activeTab|scripting|webRequest|cookies|nativeMessaging|<all_urls>)"
   OR HostPermissions =~ "(?i)(<all_urls>|\\*://\\*/)"

Remediation / Audit Script

PowerShell
# SecurityArsenal - Chromium Extension Audit & AI-Assistant Exposure Assessment
# Run elevated for machine-wide coverage. Outputs CSV for SIEM ingestion.
# Tested: Windows 10/11, Chrome/Edge/Opera/Comet profiles

$ErrorActionPreference = 'SilentlyContinue'
$report = @()

$browserPaths = @{
    'Chrome'    = "$env:SystemDrive\Users\*\AppData\Local\Google\Chrome\User Data\*\Extensions"
    'Edge'      = "$env:SystemDrive\Users\*\AppData\Local\Microsoft\Edge\User Data\*\Extensions"
    'Opera'     = "$env:SystemDrive\Users\*\AppData\Roaming\Opera Software\*\Extensions"
    'Comet'     = "$env:SystemDrive\Users\*\AppData\Local\Comet\User Data\*\Extensions"
}

# High-risk permissions that enable AI-assistant manipulation or broad page access
$highRisk = @('tabs','activeTab','scripting','webRequest','webRequestBlocking','cookies','nativeMessaging','debugger','<all_urls>')

foreach ($browser in $browserPaths.Keys) {
    $extRoots = Get-Item $browserPaths[$browser]
    foreach ($root in $extRoots) {
        foreach ($extIdDir in Get-ChildItem $root.FullName -Directory) {
            $manifest = Get-ChildItem $extIdDir.FullName -Recurse -Filter manifest.json |
                        Sort-Object LastWriteTime -Descending | Select-Object -First 1
            if ($manifest) {
                try { $m = Get-Content $manifest.FullName -Raw | ConvertFrom-Json } catch { continue }
                $perms = @($m.permissions) + @($m.host_permissions)
                $riskHits = ($perms | Where-Object { $highRisk -contains $_ }) -join ';'
                $report += [PSCustomObject]@{
                    Browser        = $browser
                    ExtensionId    = $extIdDir.Name
                    Name           = ($m.name -replace '^__MSG_.*__$','<localized>')
                    Version        = $m.version
                    Profile        = $root.Parent.Parent.FullName
                    RiskyPerms     = $riskHits
                    RiskFlag       = [bool]$riskHits
                    ManifestPath   = $manifest.FullName
                    LastModified   = $manifest.LastWriteTime
                }
            }
        }
    }
}

# Check for force-installed extensions via policy (machine + user, both vendors)
$policyKeys = @(
    'HKLM:\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist',
    'HKCU:\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist',
    'HKLM:\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallForcelist',
    'HKCU:\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallForcelist'
)
foreach ($k in $policyKeys) {
    if (Test-Path $k) {
        Get-Item $k | Select-Object -ExpandProperty Property | ForEach-Object {
            $report += [PSCustomObject]@{
                Browser='Policy'; ExtensionId=(Get-ItemProperty $k).$_; Name='<force-installed via policy>'
                Version='-'; Profile=$k; RiskyPerms='POLICY-FORCED'; RiskFlag=$true
                ManifestPath='-'; LastModified=Get-Date
            }
        }
    }
}

$out = "$env:ProgramData\SecurityArsenal\ExtensionAudit_$(Get-Date -Format yyyyMMdd_HHmmss).csv"
New-Item (Split-Path $out) -ItemType Directory -Force | Out-Null
$report | Sort-Object RiskFlag -Descending | Export-Csv $out -NoTypeInformation
Write-Host "[+] $($report.Count) extensions enumerated. High-risk: $(($report | Where-Object RiskFlag).Count). Report: $out"

Remediation

Because no CVE or vendor patch exists for this technique, remediation is a governance and architecture problem, not a patch-tuesday event. Prioritize the following, in order:

  1. Enforce an extension allowlist — today. This is the single highest-leverage control. For Chrome, deploy ExtensionInstallBlocklist set to * and permit only vetted extension IDs via ExtensionInstallAllowlist (or force-install required tools via ExtensionInstallForcelist). Mirror the same policy for Edge under HKLM\SOFTWARE\Policies\Microsoft\Edge. On macOS, use configuration profiles; on Linux, managed policy JSON under /etc/opt/chrome/policies/managed/. If users can install arbitrary extensions, nothing else on this list matters.

  2. Treat browser AI assistants as privileged service accounts. Inventory where Gemini Live, Copilot in Edge, Comet's agent, Opera Neon's AI, and Claude in Chrome are enabled in your fleet. Where the business case is weak, disable them via policy — Chrome and Edge both expose AI-feature controls through enterprise policy (e.g., Edge's Copilot/GenAI policy surface and Chrome's AI settings). An assistant that can act on authenticated SaaS sessions is an identity, not a feature.

  3. Audit the existing extension estate. Run the PowerShell audit above (or equivalent via your EDR/Velociraptor) and remove anything not business-justified. Pay special attention to extensions with tabs, scripting, cookies, or <all_urls> permissions and to recently modified manifests — extension takeover-by-acquisition remains an active criminal supply-chain pattern.

  4. Constrain egress from browser processes. AI-assistant abuse ultimately phones home. Proxy and inspect browser traffic, alert on first-seen domains from browser processes with low device prevalence (see KQL above), and block uncategorized destinations for managed endpoints.

  5. Monitor the stores and the research pipeline. Watch for vendor responses from Google, Microsoft, Opera, Perplexity, and Anthropic — expect permission-model or mediation changes in upcoming Chromium releases, and apply browser updates on an expedited cadence given Chromium's rapid release cycle. Track the original disclosure at thehackernews.com for follow-on technical detail and any assigned identifiers.

  6. Update user guidance. 'Only install extensions you trust' is dead advice when trust is the vulnerability. The new guidance: extensions are installed only through IT request, full stop.

The uncomfortable truth this research surfaces is that the industry spent two years racing AI assistants into the browser without re-deriving the trust model for an agent that acts on the user's behalf. Until the vendors close that architectural gap, the extension layer is your control plane. Own it.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.