Twitch Enhanced Viewer | JeetBot — OAuth Token Forwarding Hunt Pack

Malicious cross-store browser extension forwarding Twitch OAuth bearer tokens to Russian view-bot proxy infrastructure
Threat
Twitch Enhanced Viewer | JeetBot
Severity
HIGH
Type
Malicious browser extension / OAuth token exfil
Access
Public research, cross-store distribution
Version
v0.1 Draft · 2026-09-14
Author
HuntPack
Confidence
High (core facts, 3-source corroborated) / Medium (single-sourced atomics, flagged)
01

Executive Summary

“Twitch Enhanced Viewer | JeetBot” is a cross-store browser extension (Chrome Web Store ID pnhhdhhcadcjfckjhpmjneldiegbojfb, ~30,000 installs; Firefox add-on ID twitchenhancedviewer@example.com, ~552-604 installs) that markets itself as an ad-blocking, 1080p-forcing, region-unlocking Twitch quality-of-life tool and auto-collects channel points. That functionality is real, and it is the cover. To deliver it, the extension redirects Twitch video-playlist requests through operator-controlled proxy servers, and current builds (v85.2.2 and later, current v85.6.1) append the user’s live Twitch OAuth bearer token inline as an &auth= query parameter on that redirect, exposing it in plaintext in the proxy operator’s request logs.

Socket’s Threat Research Team attributes the proxy infrastructure (jeetbot.cc, morphilina.me) to a Russian commercial view-botting service, with roughly 30,000-31,000 affected users across both stores. Ten Russian-language streamer channels are hardcoded as exempt from token forwarding — an attribution signal, not a hunt indicator. Anyone holding a forwarded token can read chat, send whispers, spend channel points, and change account settings on the victim’s Twitch account with no password and no two-factor authentication.

Defender priority: the token capture and the query-parameter forwarding happen inside the browser’s own process and TLS-encrypted network stack, which is largely invisible to endpoint telemetry. The durable, actionable signal on a managed fleet is on-disk extension presence and DNS/network egress to jeetbot.cc and morphilina.me infrastructure — treat this primarily as a browser-extension governance problem, not a process-based malware hunt.

02

Source Review & Web Hunter Notes

Three sources were fetched in full and saved verbatim as plain-text snapshots before any content in this pack was written. No fetched source contained text directed at an automated reader (no instructions to change tooling, fetch further URLs, skip steps, or claim prior authorization); all three were treated strictly as data to analyze, per standing security policy.

TierSourceKey FindingCarry Forward
Tier 1 — primary researchSocket.dev Threat Research Team, 2026-09-11Full technical breakdown: both extension IDs, both package hashes, all proxy/config domains, three proxy IPs with ASN/hosting, version history (v4.8 → v85.6.1), the 10-channel allowlist, developer/store attributionYes
Tier 2 — security press, corroboratingThe Hacker News, 2026-09-14Corroborates extension IDs, user counts, publish dates, the &auth= mechanism, the allowlist, and adds the post-disclosure remediation version (85.8.7)Yes
Tier 2 — security press, corroboratingCyberInsider, 2026-09-14Corroborates domains, mechanism, allowlist, and Socket as the originating researcherYes

Provenance decisions

  • Both SHA-256 package hashes and all three proxy IP addresses (152.53.177.186, 132.243.113.25, 80.74.26.162) appear only in the Socket.dev snapshot among the three saved sources. Per standing policy that anything shipping at prevent/critical severity needs two independent sources, these ship in the IOC table and the CSV appendix at severity: high (not critical) with an explicit single-source note, not as auto-block entries.
  • Config endpoint URL paths (/api/v1/proxies, /api/v1/forced-proxy, /api/v2/public/extension_helper/, the legacy /set-token) are documented in the IOC table as context only. Falcon CQL cannot inspect URL paths inside encrypted HTTPS traffic, so these are never shipped as CQL regex targets — only the domains are.
  • The deno.dev / deno.net backup endpoints referenced for the retired v4.x build are shared multi-tenant developer platforms. They are noted in prose for historical context only and are deliberately not shipped as blockable indicators — blocking them would collaterally break unrelated legitimate applications.
  • The 10-channel allowlist (pch3lk1n, fasoollka, flamie, dosia, fander, almazer, forzorezor, akyuliych, lagoda1337, lagoda) is carried forward as an attribution/context signal only, per the seed intel’s explicit instruction, never as a detection or block indicator.
03

Hunt Brief & Attack Chain

Hunt hypotheses

  • H1 (high confidence). Any endpoint issuing DNS resolutions for jeetbot.cc or morphilina.me infrastructure has the extension installed and active. MITRE T1090.002/T1041. Telemetry: DnsRequest. FP: low — domains are unique to this campaign. → Q1.
  • H2 (medium confidence). A browser process holding an outbound connection to 152.53.177.186 / 132.243.113.25 / 80.74.26.162 is proxying Twitch traffic through JeetBot infrastructure. MITRE T1090.002. Telemetry: NetworkConnectIP4. FP: medium — the underlying hosts (netcup GmbH, CLODO Cloud) are shared infrastructure that can be reassigned. → Q2.
  • H3 (high confidence). Scoping H1 to a confirmed browser process (chrome/msedge/firefox/brave/opera) rules out unrelated infrastructure scanning and raises confidence to IOA-candidate level. MITRE T1176/T1090.002. Telemetry: DnsRequest joined to ProcessRollup2. FP: low. → Q3.
  • H4 (medium confidence). Fleet-wide prevalence of H1 hits should be a small, actionable list, not background noise, given the domains are campaign-specific. Telemetry: DnsRequest, 30-day lookback. FP: low. → Q4.
  • H5 (medium confidence). Repeated/recurring connections from a browser process to the proxy IPs (not a single connection) indicate persistent, ongoing extension activity rather than a one-off. Telemetry: NetworkConnectIP4 joined to ProcessRollup2, 7-day lookback. FP: medium (see H2). → Q5.

Two attack-chain steps have no mappable Falcon telemetry and are carried forward as explicit gaps rather than silently dropped: the in-browser Authorization-header capture (step 2 below) and the query-string token forwarding itself (step 5). Both are addressed in Section 15.

Attack chain

#StepTelemetryHunt angle
1User installs “Twitch Enhanced Viewer | JeetBot” from the Chrome Web Store or Firefox Add-ons, drawn by the ad-block / 1080p / region-unlock / auto-channel-points pitchBrowser extension inventory (non-Falcon)Section 7 + Section 12
2Content script captures the Authorization header (Twitch OAuth bearer token) during normal use and hands it to the background service workerNone — in-browser JS executionGAP — Section 15
3Extension queries config endpoints for proxy assignmentDnsRequest, NetworkConnectIP4Q1, Q4
4Video-playlist requests redirected through an operator proxy (enhanced.jeetbot.cc, enhanced-1.jeetbot.cc, ext-03.jeetbot.cc, proxy.morphilina.me)DnsRequest, NetworkConnectIP4 (browser-process-scoped)Q1, Q2, Q3, Q5
5Token appended inline as &auth= parameter on the redirect; logged in cleartext at the proxy (10 allowlisted RU channels exempted)None — query-string content inside TLSGAP — Section 15
6Operator, or anyone with proxy-log access, holds a live bearer token: read chat, send whispers, spend channel points, change account settingsTwitch account activity log (non-enterprise)GAP — user remediation, Section 14
04

Consolidated IOC Table

Confidence reflects source corroboration across the three saved snapshots; action follows the pack’s standard vocabulary (detect = block/alert, hunt = investigate, enrich = context only, pivot = investigation expansion). Rows marked single-source stay below detect/critical per standing two-source policy.

TypeValueConfidenceActionContextExpiry
Chrome extension IDpnhhdhhcadcjfckjhpmjneldiegbojfbHigh (3 sources)hunt“Twitch Enhanced Viewer | JeetBot”, ~30,000 installs; block via ExtensionInstallBlocklist2026-12-14
Firefox add-on IDtwitchenhancedviewer@example.comHigh (2 sources)hunt~552-604 installs2026-12-14
SHA-256 (Chrome package)e17e1e671b597da19b89c5b2d0fa821e90e627860e756ae4947ed27c035330a8Medium (single-source: Socket.dev)detectPackaged CRX hash2027-03-14
SHA-256 (Firefox package)141c35607dc0e8e400deb380126b3052bd0495b4d37c8dd979c6aa0204b142fcMedium (single-source: Socket.dev)detectPackaged XPI hash2027-03-14
Domain (apex)jeetbot[.]ccHigh (2 sources)detectUmbrella domain; hosts jeetbot.cc, api.jeetbot.cc, enhanced.jeetbot.cc2027-03-14
Domainenhanced[.]jeetbot[.]ccHigh (2 sources)detectDefault OAuth-token-forwarding proxy2027-03-14
Domainenhanced-1[.]jeetbot[.]ccMedium (single-source)huntSecondary proxy2026-12-14
Domainext-03[.]jeetbot[.]ccMedium (single-source)huntAlternate proxy; resolves 80.74.26.1622026-12-14
Domainext-styles[.]jeetbot[.]ccHigh (2 sources)detectConfig API: /api/v1/proxies, /api/v1/forced-proxy2027-03-14
Domainapi[.]jeetbot[.]ccMedium (single-source)huntConfig API: /api/v2/public/extension_helper/2026-12-14
Domainproxy[.]morphilina[.]meHigh (2 sources)detectToken-strip proxy2027-03-14
Domainalexue4[.]devMedium (single-source)enrichAttribution: copyright holder in extension metadata2026-10-14
Emailsupport@jeetbot[.]ccMedium (2 sources)enrichOperator support contact / attribution2026-10-14
IPv4152.53.177.186Medium (single-source)huntnetcup GmbH, AS197540; hosts jeetbot.cc, api.jeetbot.cc, enhanced.jeetbot.cc2026-12-14
IPv4132.243.113.25Medium (single-source)huntCLODO Cloud, AS216154; hosts ext-styles.jeetbot.cc, morphilina.me2026-12-14
IPv480.74.26.162Medium (single-source)huntCLODO Cloud, AS216154; hosts ext-03.jeetbot.cc2026-12-14
Behavioral (context, not a hunt indicator)10-channel allowlist: pch3lk1n, fasoollka, flamie, dosia, fander, almazer, forzorezor, akyuliych, lagoda1337, lagodaHigh (2 sources)enrichHardcoded exemption from token forwarding; attribution signal per seed intel, explicitly not shipped as a detection indicator2026-10-14
05

Affected Surface & Telemetry Matrix

SurfaceRequired telemetryPriorityGap risk
Managed Windows/macOS endpoints running Chrome, Edge, or FirefoxDnsRequest, NetworkConnectIP4, ProcessRollup2 (default sensor policy)HighQuery-string/payload content (the exposed token itself) is not visible
Browser extension inventory (Chrome/Edge/Firefox)Chrome Enterprise / Chrome Browser Cloud Management, Firefox enterprise policy reporting — both non-FalconHighFalcon has no native browser-extension-inventory event type; RTR spot-checks are point-in-time, not continuous
Perimeter DNS / secure web gatewayDNS/SWG logs (non-Falcon: Umbrella, Zscaler, firewall)MediumRequires separate tooling and manual correlation with EDR hits
Twitch SaaS account activityTwitch account security log (non-Falcon, non-enterprise, user-facing only)Medium (user impact)Entirely outside enterprise/EDR visibility — this is where the actual account abuse happens
06

ATT&CK Mapping

TacticTechnique IDTechnique nameObserved behavior
PersistenceT1176Browser ExtensionsMalicious extension installed from official stores, providing persistent code execution in the browser context across restarts
Credential AccessT1528Steal Application Access TokenContent script captures the Twitch OAuth Authorization header used by the site’s own web client
Command and ControlT1090.002Proxy: External ProxyVideo-playlist requests redirected through operator-controlled proxy servers to deliver the ad-block/region-unlock feature set
Command and ControlT1071.001Application Layer Protocol: Web ProtocolsHTTPS traffic to jeetbot.cc / morphilina.me infrastructure blends with normal Twitch streaming traffic
ExfiltrationT1041Exfiltration Over C2 ChannelOAuth token appended as an &auth= query parameter on the same proxied redirect used for legitimate video delivery
07

Native Audit-Log Hunts

These checks require no CQL and directly cover the extension-governance gap noted in Section 15.

Chrome / Edge (Chromium) — managed browser extension inventory

  • Google Admin console → Chrome browser cloud management → Apps & extensions → Users & Browsers report — search extension ID pnhhdhhcadcjfckjhpmjneldiegbojfb across all managed browsers (Edge honors the same Chromium extension ID space if the extension was sideloaded from the Chrome Web Store).
  • Microsoft Intune / Edge Business inventory — same extension ID, if Edge extension reporting is configured.

Firefox — enterprise policy inventory

  • about:policies#json in-browser, or inspect distribution/policies.json directly, for the ExtensionSettings block covering twitchenhancedviewer@example.com.

RTR one-time fleet sweep (read-only, point-in-time)

Run via Falcon Real Time Response across the fleet to confirm on-disk presence. See the Browser Policy Audit quick-copy block in Section 10 for the exact commands.

Perimeter DNS / secure web gateway logs

Query Umbrella / Zscaler / firewall logs for jeetbot.cc and morphilina.me. Unlike Falcon, a web gateway typically logs the full request path, so this is the only telemetry source that can confirm whether the specific config endpoints (/api/v1/proxies, /api/v1/forced-proxy, /api/v2/public/extension_helper/, the legacy /set-token) actually fired.

User-facing remediation (not enterprise telemetry)

Any user confirmed to have installed the extension should sign out of Twitch on all devices and sign back in — this invalidates the exposed OAuth token — and review the Twitch account security/activity log for unauthorized whispers, chat activity, or settings changes.

08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Q1 · DNS resolution to JeetBot / morphilina.me infrastructure
CONF HIGHFP LOWCOST LOW

Looks for: any endpoint resolving jeetbot.cc or morphilina.me infrastructure domains. Strongest, lowest-noise signal in this pack.

// HUNT: DNS resolution to JeetBot / morphilina.me OAuth-proxy infrastructure
// MITRE: T1090.002, T1041
// CONF: high  FP: low  COST: low
// REQUIRES: DnsRequest telemetry (default sensor policy)
// FALSE POSITIVES: none expected -- domains are unique to this campaign's infrastructure
#event_simpleName=DnsRequest
| DomainName=/(^|\.)jeetbot\.cc$/i or DomainName=/(^|\.)morphilina\.me$/i
| table([@timestamp, ComputerName, UserName, DomainName, ContextProcessId])
| sort(@timestamp, order=desc)
Q2 · Outbound connection to JeetBot proxy IPs
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: browser (or any process) connections to the three known proxy IPs. FP: shared hosting (netcup/CLODO) can be reassigned after remediation -- investigate before blocking.

// HUNT: Outbound connection to JeetBot proxy IP addresses
// MITRE: T1090.002, T1041
// CONF: medium  FP: medium  COST: low
// REQUIRES: NetworkConnectIP4 telemetry
// FALSE POSITIVES: netcup GmbH (AS197540) and CLODO Cloud (AS216154) are shared hosting; these IPs can be reassigned to unrelated tenants once this campaign's infrastructure is remediated
// TUNING: treat a hit as investigate-first, not auto-block; re-validate current IP ownership via passive DNS before promoting to a prevent action
#event_simpleName=NetworkConnectIP4
| in(RemoteAddressIP4, values=["152.53.177.186","132.243.113.25","80.74.26.162"])
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort])
| sort(@timestamp, order=desc)
Q3 · Browser-process-scoped DNS correlation (IOA candidate)
CONF HIGHFP LOWCOST MEDIUM

Looks for: the Q1 DNS hit correlated to a confirmed browser process (chrome/msedge/firefox/brave/opera), ruling out unrelated infrastructure scanning.

// HUNT: Browser process resolving JeetBot / morphilina.me infrastructure
// MITRE: T1176, T1090.002
// CONF: high  FP: low  COST: medium
// REQUIRES: DnsRequest + ProcessRollup2 telemetry
// FALSE POSITIVES: none expected once scoped to a confirmed browser process; a non-browser process resolving these domains would itself be the more interesting finding
#event_simpleName=DnsRequest
| DomainName=/(^|\.)jeetbot\.cc$/i or DomainName=/(^|\.)morphilina\.me$/i
| rename(field=ContextProcessId_decimal, as=TargetProcessId_decimal)
| join(query={#event_simpleName=ProcessRollup2 | FileName=/^(chrome|msedge|firefox|brave|opera)(\.exe)?$/i}, field=TargetProcessId_decimal, include=[FileName, ComputerName, UserName])
| table([@timestamp, ComputerName, UserName, FileName, DomainName])
| sort(@timestamp, order=desc)
Q4 · Fleet-wide prevalence / rare-endpoint pivot
CONF MEDIUMFP LOWCOST MEDIUM

Looks for: which endpoints across the fleet have resolved campaign infrastructure at all, ranked by hit count. Run with a 30-day console lookback.

// HUNT: Fleet-wide prevalence of JeetBot / morphilina.me DNS resolutions (rare-endpoint pivot)
// MITRE: T1176, T1090.002
// CONF: medium  FP: low  COST: medium
// REQUIRES: DnsRequest telemetry
// FALSE POSITIVES: low -- domains are campaign-specific; a short first-seen list is expected, not noise
// LOOKBACK: 30d
#event_simpleName=DnsRequest
| DomainName=/(^|\.)jeetbot\.cc$/i or DomainName=/(^|\.)morphilina\.me$/i
| groupBy([aid, ComputerName], function=[count(as=Hits), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=1000)
| sort(Hits, order=desc)
Q5 · Recurring browser connections to proxy IPs (beacon-like persistence)
CONF MEDIUMFP MEDIUMCOST MEDIUM

Looks for: repeated connections (not a single session) from a browser process to the proxy IPs, over a 7-day window. FP: a single connection during normal viewing is expected; only repeat hits matter here.

// HUNT: Recurring browser connections to JeetBot proxy IPs (beacon-like persistence)
// MITRE: T1090.002, T1041
// CONF: medium  FP: medium  COST: medium
// REQUIRES: NetworkConnectIP4 + ProcessRollup2 telemetry
// FALSE POSITIVES: a single connection during active Twitch viewing is expected with the extension installed; this query surfaces REPEATED connections across sessions/days, which is the stronger signal. Shared-hosting IP churn applies here too (see Q2).
// TUNING: raise the Hits threshold in high-Twitch-usage populations; re-validate IP ownership via passive DNS before alerting on aged hits
// LOOKBACK: 7d
#event_simpleName=NetworkConnectIP4
| in(RemoteAddressIP4, values=["152.53.177.186","132.243.113.25","80.74.26.162"])
| rename(field=ContextProcessId_decimal, as=TargetProcessId_decimal)
| join(query={#event_simpleName=ProcessRollup2 | FileName=/^(chrome|msedge|firefox|brave|opera)(\.exe)?$/i}, field=TargetProcessId_decimal, include=[FileName])
| groupBy([aid, ComputerName, FileName], function=[count(as=Hits), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=1000)
| Hits > 3
| sort(Hits, order=desc)
09

CrowdStrike Custom IOA Recommendations

Honesty note: this threat's actionable signal is domain/IP infrastructure, not a distinctive process command-line or image-path pattern. A classic Falcon Custom IOA (behavioral, process-tree/command-line based) is a poor fit here — the browser process itself (chrome.exe, firefox.exe) is completely legitimate and unmodified. The correct Falcon-native controls are Custom IOC entries and promoted Scheduled Searches, not a bespoke Custom IOA rule.

ControlMechanismPatterns / scopeDeployment path
Custom IOC — domainFalcon IOC Managementjeetbot.cc (apex + subdomains), morphilina.me — action: detectIOC Management → Add indicator → type: domain; see Section 10 CSV block
Custom IOC — hashFalcon IOC ManagementBoth package SHA-256 hashes — action: detectIOC Management → Add indicator → type: sha256
Scheduled SearchNG-SIEM Scheduled SearchQ1 (DNS to campaign domains), Q3 (browser-scoped correlation)Promote Q1 and Q3 directly; both are CONF high / FP low
Investigate-onlyAd hoc hunt queryQ2, Q4, Q5 — medium-confidence or IP-based, needing periodic re-validationRun manually on the recommended cadence in Section 11; do not auto-promote
10

Machine-Readable IOC Appendix

The Falcon IOC Management CSV below is the only block whose atomic indicators are mechanically traced to the saved source snapshots. The other three blocks are practical quick-copy references (extension IDs, mechanism, attribution, audit commands) that are not Falcon-importable IOC types.

Falcon IOC Management CSV13 rows
type,value,action,severity,expiration,description,tags
sha256,e17e1e671b597da19b89c5b2d0fa821e90e627860e756ae4947ed27c035330a8,detect,high,2027-03-14,JeetBot Chrome extension package (single-source: Socket.dev),campaign:jeetbot ext:chrome
sha256,141c35607dc0e8e400deb380126b3052bd0495b4d37c8dd979c6aa0204b142fc,detect,high,2027-03-14,JeetBot Firefox add-on package (single-source: Socket.dev),campaign:jeetbot ext:firefox
domain,jeetbot.cc,detect,high,2027-03-14,JeetBot umbrella domain (apex + subdomains host proxy/config infra),campaign:jeetbot
domain,enhanced.jeetbot.cc,detect,high,2027-03-14,Default OAuth-token-forwarding proxy,campaign:jeetbot
domain,enhanced-1.jeetbot.cc,hunt,medium,2026-12-14,Secondary proxy (single-source: Socket.dev),campaign:jeetbot
domain,ext-03.jeetbot.cc,hunt,medium,2026-12-14,Alternate proxy; resolves 80.74.26.162,campaign:jeetbot
domain,ext-styles.jeetbot.cc,detect,high,2027-03-14,Config API (/api/v1/proxies /api/v1/forced-proxy),campaign:jeetbot
domain,api.jeetbot.cc,hunt,medium,2026-12-14,Config API (/api/v2/public/extension_helper/),campaign:jeetbot
domain,proxy.morphilina.me,detect,high,2027-03-14,Token-strip proxy,campaign:jeetbot
domain,alexue4.dev,enrich,medium,2026-10-14,Attribution: copyright holder in extension metadata,campaign:jeetbot
ipv4,152.53.177.186,hunt,medium,2026-12-14,netcup GmbH AS197540 -- shared hosting; re-validate ownership before block,campaign:jeetbot
ipv4,132.243.113.25,hunt,medium,2026-12-14,CLODO Cloud AS216154 -- shared hosting; re-validate ownership before block,campaign:jeetbot
ipv4,80.74.26.162,hunt,medium,2026-12-14,CLODO Cloud AS216154 -- shared hosting; re-validate ownership before block,campaign:jeetbot
Behavioral Signaturesmechanism + attribution
# Extension identifiers (not Falcon IOC-Management-importable types -- track via browser policy, see Section 12/13)
chrome_extension_id: pnhhdhhcadcjfckjhpmjneldiegbojfb
firefox_addon_id: twitchenhancedviewer@example.com

# Exfil pattern -- network-layer redirect, current builds v85.2.2+
query_param: &auth=${encodeURIComponent(authToken)}

# Legacy mechanism (v4.x, Jan 2026, superseded by v85.2.2)
legacy_endpoint: POST enhanced.jeetbot.cc/set-token

# Attribution allowlist -- exempted from token forwarding, NOT a hunt indicator
allowlisted_channels: pch3lk1n, fasoollka, flamie, dosia, fander, almazer, forzorezor, akyuliych, lagoda1337, lagoda
Named Toolingextension + version history
Extension name:      Twitch Enhanced Viewer | JeetBot
Chrome Web Store ID: pnhhdhhcadcjfckjhpmjneldiegbojfb (~30,000 users)
Firefox Add-on ID:   twitchenhancedviewer@example.com (~552-604 users)
Store handle:        HISHIMIRO
Attributed developer: Popov Aleksandr Alekseevich (as reported by Socket / The Hacker News)
Operator contact:    support@jeetbot.cc

Version history:
  v4.x     (Jan 2026)   direct POST token exfil to /set-token, backups on deno.dev/deno.net
  v7.2.6   (Apr 2026)
  v85.2.2  (May 2026)   switched to inline &auth= query-parameter forwarding
  v85.6.1               current version at publication (Sep 2026)
  v85.8.7 (Firefox)/equiv. Chrome -- post-disclosure remediation per THN reporting
Browser Policy Auditquick-copy commands
# Chrome/Edge (Windows) -- ExtensionInstallBlocklist registry check
reg query "HKLM\SOFTWARE\Policies\Google\Chrome\ExtensionInstallBlocklist"
reg query "HKLM\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallBlocklist"

# Firefox -- enterprise policy check
# open about:policies#json in-browser, or inspect distribution/policies.json for ExtensionSettings

# RTR fleet sweep for on-disk presence (read-only, point-in-time)
Get-ChildItem "$env:LOCALAPPDATA\Google\Chrome\User Data\*\Extensions\pnhhdhhcadcjfckjhpmjneldiegbojfb" -ErrorAction SilentlyContinue
Get-ChildItem "$env:APPDATA\Mozilla\Firefox\Profiles\*\extensions\twitchenhancedviewer@example.com.xpi" -ErrorAction SilentlyContinue
11

Detection Validation Gates

Telemetry ready

DnsRequest and NetworkConnectIP4 must be enabled and flowing for endpoints that run a browser (default Falcon sensor policy covers both on Windows/macOS). Confirm with #event_simpleName=DnsRequest | groupBy(ComputerName, function=count(), limit=10) against a small pilot group before relying on Q1-Q5.

Benign baseline

Run Q1 and Q4 with a 30-day console lookback and confirm a zero (or near-zero, fully explained) baseline before enabling Q1/Q3 as a Scheduled Search. Any pre-existing hits should be triaged as already-compromised endpoints, not tuned away.

Positive tests

Validate Q1 and Q3 against a controlled DNS lookup to a lab-owned host resolving through the actual jeetbot.cc/morphilina.me domains (or, safer, a synthetic domain following the same regex) before trusting the query in production. Do not resolve the live campaign domains from a production endpoint for testing.

Promotion

Q1 and Q3 are the IOA/Scheduled-Search candidates (CONF high, FP low). Q2, Q4, and Q5 remain investigate-only pending periodic IP-ownership revalidation, per the shared-hosting caveat in Section 8.

12

Hardening — Tiered

Immediate — deploy this week

1. Block both extension IDs fleet-wide. Add pnhhdhhcadcjfckjhpmjneldiegbojfb to Chrome/Edge ExtensionInstallBlocklist and twitchenhancedviewer@example.com to Firefox’s ExtensionSettings blocked policy. MITRE M1021 (Restrict Web-Based Content); CIS Control 2 (Inventory and Control of Software Assets). No compatibility risk — this removes a single named extension, not a category of software.

2. Fleet-wide inventory sweep. Run the RTR commands in Section 10’s Browser Policy Audit block across all endpoints to find existing installs before the blocklist policy propagates and auto-removes them. Notify any confirmed-affected user to sign out of Twitch on all devices and sign back in, invalidating the exposed token.

Near term — 1 to 4 weeks

3. Move from single-ID blocklist to a documented extension governance policy. Pilot an allowlist (ExtensionInstallForcelist / ExtensionInstallAllowlist) model for higher-risk populations (streaming/community-facing staff) rather than reactively blocking one ID at a time. CIS Control 2.3 (Software Inventory); M1021. ⚠ best-practice, no formal CIS Benchmark section covers this specific deny/allow-list ratio — the control itself (extension allow-listing) is CIS/MS-Baseline documented.

4. Perimeter DNS/web-gateway block. Add jeetbot.cc and morphilina.me to the organization’s DNS security or secure web gateway blocklist (Umbrella/Zscaler/firewall). This is explicitly not a Falcon control — it complements the endpoint-visibility gap noted in Section 15 and is the only layer that can confirm the specific config-endpoint paths were reached.

Strategic — 1 to 3 months

5. Enterprise browser-extension risk-scoring program. Extend the governance model from item 3 to all installed extensions fleet-wide (e.g., Chrome Enterprise Recommended, or a third-party extension risk-scoring feed), folded into the existing software asset management process. CIS Control 2; M1021.

6. Formal high-permission-extension / SaaS-token-exposure runbook. The token-theft pattern here (a browser extension with broad host permissions silently forwarding a bearer credential) generalizes to any SaaS platform an extension can request permissions for, not just Twitch. Extend the containment runbook in Section 14 into a standing incident-response playbook for this class of exposure.

13

Deployable Playbooks

Playbook 1 — Chrome/Edge ExtensionInstallBlocklist (Windows, GPO/registry)

Prerequisites: local admin or GPO/Intune push rights to HKLM\SOFTWARE\Policies. Reboot required: no — Chrome/Edge re-read policy on next browser restart. Rollback: remove the registry value (or the whole ExtensionInstallBlocklist key) to restore installability; note that Chrome does not automatically reinstall an extension it already force-removed under this policy — a user would need to manually reinstall if the block is later lifted, which is not recommended.

New-Item -Path "HKLM:\SOFTWARE\Policies\Google\Chrome\ExtensionInstallBlocklist" -Force | Out-Null
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Google\Chrome\ExtensionInstallBlocklist" -Name "1" -Value "pnhhdhhcadcjfckjhpmjneldiegbojfb" -PropertyType String -Force

New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallBlocklist" -Force | Out-Null
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallBlocklist" -Name "1" -Value "pnhhdhhcadcjfckjhpmjneldiegbojfb" -PropertyType String -Force

Verify: Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Google\Chrome\ExtensionInstallBlocklist" returns the extension ID, and chrome://policy / chrome://extensions on a test endpoint show the extension blocked and removed.

Playbook 2 — Firefox enterprise policy (cross-platform)

Prerequisites: write access to distribution/policies.json (Windows: %ProgramFiles%\Mozilla Firefox\distribution\policies.json; macOS: /Applications/Firefox.app/Contents/Resources/distribution/policies.json; Linux: /etc/firefox/policies/policies.json), or an equivalent MDM/GPO push. Reboot required: no — restart Firefox to pick up the policy. Rollback: remove the twitchenhancedviewer@example.com entry from ExtensionSettings and restart Firefox.

{
  "policies": {
    "ExtensionSettings": {
      "twitchenhancedviewer@example.com": {
        "installation_mode": "blocked",
        "blocked_install_message": "This extension is blocked by IT security policy."
      }
    }
  }
}

Verify: about:policies#json shows the block entry; about:addons no longer allows installing or re-enabling the add-on ID.

Playbook 3 — Fleet-wide RTR inventory sweep (read-only)

Prerequisites: Falcon RTR enabled and admin rights to run a batch RTR script. Reboot required: no. Rollback: none required — this is a read-only inventory check, not a configuration change.

Get-ChildItem "$env:LOCALAPPDATA\Google\Chrome\User Data\*\Extensions\pnhhdhhcadcjfckjhpmjneldiegbojfb" -ErrorAction SilentlyContinue | Select-Object FullName
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Edge\User Data\*\Extensions\pnhhdhhcadcjfckjhpmjneldiegbojfb" -ErrorAction SilentlyContinue | Select-Object FullName
Get-ChildItem "$env:APPDATA\Mozilla\Firefox\Profiles\*\extensions\twitchenhancedviewer@example.com.xpi" -ErrorAction SilentlyContinue | Select-Object FullName

Verify: RTR batch output lists any endpoint where a path was returned; cross-reference against Q1/Q3 network hits to prioritize remediation order.

14

Containment Runbook

PhaseActionsOwnerEvidence
1. Identify / TriageConfirm extension presence via RTR/browser-policy inventory (Section 7/10); confirm DNS/network hits via Q1-Q3SOC / Detection EngineeringRTR output, Q1/Q3 hit lists
2. ContainPush emergency GPO/policies.json blocklist fleet-wide (Playbooks 1-2); consider Falcon network containment on hosts showing active, repeated connections (Q5) pending investigationEndpoint / Browser ManagementDeployment ticket, containment log
3. EradicateConfirm auto-removal by the blocklist policy; re-run the RTR sweep (Playbook 3) to verify no remaining on-disk instancesEndpoint / Browser ManagementSecond RTR sweep output
4. Recover / Remediate identityInstruct affected users to sign out of Twitch on all devices and sign back in (invalidates the token); review Twitch account security log for unauthorized whispers, chat activity, or settings changes; rotate any credentials the user may have reused elsewhereUser / Security AwarenessUser attestation, Twitch activity log review notes
5. Evidence & ReportingPreserve Q1-Q5 hit lists, RTR inventory output, and the affected-user list for the incident record; report to security leadershipSOCIncident ticket with attached query outputs
6. Post-incidentAdd jeetbot.cc/morphilina.me and the three proxy IPs to perimeter DNS/firewall blocklists with a review reminder (shared-hosting IPs may be reassigned); formalize the Section 12 near-term and strategic hardening itemsNetwork / Detection EngineeringPerimeter blocklist change record
15

Detection Coverage Map

TechniqueBehaviorCQLIOA/ControlCoverage
T1176 Browser ExtensionsMalicious extension installed via official stores— (extension files are JS/JSON/CSS, not PE/ELF/ZIP/Doc, so streaming Falcon file-write telemetry does not cover them)RTR + Chrome Enterprise/Firefox policy inventoryPartial
T1528 Steal Application Access TokenContent script captures Authorization header; background worker holds bearer tokenGap
T1090.002 Proxy: External ProxyVideo-playlist requests redirected through operator proxy with &auth= parameterQ2, Q5Custom IOC (domain/IP)Partial
T1071.001 Web Protocols / DNSDNS resolution and HTTPS connection to jeetbot.cc / morphilina.me infrastructureQ1, Q3, Q4Custom IOC + Scheduled SearchGood
T1041 Exfiltration Over C2 ChannelToken rides along the same proxied redirect used for video deliveryQ1-Q5 (indirect, via infrastructure signal only)Partial
Post-compromise account abuseAttacker uses the stolen bearer token against Twitch’s own servers (chat, whispers, settings)Gap
Fleet-wide extension governanceAny user can install a similarly-scoped high-permission extension— (not a detection problem)Section 12 hardening tiersGap (CQL) / mitigated by policy

Validation gates (Section 11, summarized): telemetry readiness confirmed via a pilot DnsRequest/NetworkConnectIP4 check; benign baseline required before promoting Q1/Q3; positive-test against a lab host, never the live campaign domain, before production use; Q1 and Q3 promote to Scheduled Search, Q2/Q4/Q5 stay investigate-only pending periodic IP revalidation.

16

Hunt Summary Ticket

TITLE:        Twitch Enhanced Viewer | JeetBot malicious browser extension -- OAuth token forwarding
SEVERITY:     HIGH -- ~31,000 users' live Twitch OAuth bearer tokens exposed to Russian view-bot proxy infrastructure; no password or 2FA required to abuse
SCOPE:        Managed Windows/macOS endpoints running Chrome, Edge, or Firefox; DNS/network egress; browser extension inventory
HYPOTHESIS:   Endpoints with the extension installed generate DNS/network signal to jeetbot.cc / morphilina.me infrastructure from a browser process
QUERIES:      Q1-Q5 (Q1 and Q3 promoted to Scheduled Search / IOA candidates)
DO FIRST:     Q1 (DNS to campaign domains), then Q3 (browser-scoped correlation), then the RTR/browser-policy inventory sweep in Section 7
FINDINGS:
GAPS:         Token capture and &auth= forwarding are invisible to EDR (in-browser JS / TLS-encrypted content); on-disk extension files are not a monitored file category so streaming file-write telemetry does not cover them; post-compromise Twitch account abuse is entirely outside enterprise visibility
ACTIONS:      Block both extension IDs via ExtensionInstallBlocklist / Firefox policies.json (Section 12/13); run fleet-wide RTR inventory; instruct any confirmed-affected user to sign out of Twitch on all devices and sign back in
OWNER:        SOC / Detection Engineering / Endpoint & Browser Management
VERSION:      v0.1 Draft · 2026-09-14 · STATIC REVIEW PASSED
17

Changelog

v0.1 Draft2026-09-14Initial pack: 5 hunt queries (2 promoted to Scheduled Search/IOA candidates), 17-row IOC table (13 rows in the importable CSV), tiered hardening across Chrome/Edge/Firefox enterprise policy, 6-phase containment runbook, honest EDR coverage gaps for token capture and on-disk extension artifacts.
18

References

IDPublisherVersion/dateAccessedUseURL
S01Socket (Threat Research Team)2026-09-112026-09-14Primary technical research: extension IDs, hashes, domains, IPs/ASNs, version history, allowlist, attributionhttps://socket.dev/blog/malicious-twitch-browser-extension
S02The Hacker News2026-09-142026-09-14Corroboration: extension IDs, user counts, mechanism, remediation versionhttps://thehackernews.com/2026/09/malicious-twitch-browser-extension.html
S03CyberInsider2026-09-142026-09-14Corroboration: domains, mechanism, allowlist, Socket attributionhttps://cyberinsider.com/malicious-twitch-extension-exposed-oauth-tokens-of-30000-users/