Twitch Enhanced Viewer | JeetBot — OAuth Token Forwarding Hunt Pack
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.
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.
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| Tier 1 — primary research | Socket.dev Threat Research Team, 2026-09-11 | Full 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 attribution | Yes |
| Tier 2 — security press, corroborating | The Hacker News, 2026-09-14 | Corroborates 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, corroborating | CyberInsider, 2026-09-14 | Corroborates domains, mechanism, allowlist, and Socket as the originating researcher | Yes |
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.netbackup 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.
Hunt Brief & Attack Chain
Hunt hypotheses
- H1 (high confidence). Any endpoint issuing DNS resolutions for
jeetbot.ccormorphilina.meinfrastructure 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:
DnsRequestjoined toProcessRollup2. 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:
NetworkConnectIP4joined toProcessRollup2, 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
| # | Step | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | User 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 pitch | Browser extension inventory (non-Falcon) | Section 7 + Section 12 |
| 2 | Content script captures the Authorization header (Twitch OAuth bearer token) during normal use and hands it to the background service worker | None — in-browser JS execution | GAP — Section 15 |
| 3 | Extension queries config endpoints for proxy assignment | DnsRequest, NetworkConnectIP4 | Q1, Q4 |
| 4 | Video-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 |
| 5 | Token appended inline as &auth= parameter on the redirect; logged in cleartext at the proxy (10 allowlisted RU channels exempted) | None — query-string content inside TLS | GAP — Section 15 |
| 6 | Operator, or anyone with proxy-log access, holds a live bearer token: read chat, send whispers, spend channel points, change account settings | Twitch account activity log (non-enterprise) | GAP — user remediation, Section 14 |
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.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| Chrome extension ID | pnhhdhhcadcjfckjhpmjneldiegbojfb | High (3 sources) | hunt | “Twitch Enhanced Viewer | JeetBot”, ~30,000 installs; block via ExtensionInstallBlocklist | 2026-12-14 |
| Firefox add-on ID | twitchenhancedviewer@example.com | High (2 sources) | hunt | ~552-604 installs | 2026-12-14 |
| SHA-256 (Chrome package) | e17e1e671b597da19b89c5b2d0fa821e90e627860e756ae4947ed27c035330a8 | Medium (single-source: Socket.dev) | detect | Packaged CRX hash | 2027-03-14 |
| SHA-256 (Firefox package) | 141c35607dc0e8e400deb380126b3052bd0495b4d37c8dd979c6aa0204b142fc | Medium (single-source: Socket.dev) | detect | Packaged XPI hash | 2027-03-14 |
| Domain (apex) | jeetbot[.]cc | High (2 sources) | detect | Umbrella domain; hosts jeetbot.cc, api.jeetbot.cc, enhanced.jeetbot.cc | 2027-03-14 |
| Domain | enhanced[.]jeetbot[.]cc | High (2 sources) | detect | Default OAuth-token-forwarding proxy | 2027-03-14 |
| Domain | enhanced-1[.]jeetbot[.]cc | Medium (single-source) | hunt | Secondary proxy | 2026-12-14 |
| Domain | ext-03[.]jeetbot[.]cc | Medium (single-source) | hunt | Alternate proxy; resolves 80.74.26.162 | 2026-12-14 |
| Domain | ext-styles[.]jeetbot[.]cc | High (2 sources) | detect | Config API: /api/v1/proxies, /api/v1/forced-proxy | 2027-03-14 |
| Domain | api[.]jeetbot[.]cc | Medium (single-source) | hunt | Config API: /api/v2/public/extension_helper/ | 2026-12-14 |
| Domain | proxy[.]morphilina[.]me | High (2 sources) | detect | Token-strip proxy | 2027-03-14 |
| Domain | alexue4[.]dev | Medium (single-source) | enrich | Attribution: copyright holder in extension metadata | 2026-10-14 |
| support@jeetbot[.]cc | Medium (2 sources) | enrich | Operator support contact / attribution | 2026-10-14 | |
| IPv4 | 152.53.177.186 | Medium (single-source) | hunt | netcup GmbH, AS197540; hosts jeetbot.cc, api.jeetbot.cc, enhanced.jeetbot.cc | 2026-12-14 |
| IPv4 | 132.243.113.25 | Medium (single-source) | hunt | CLODO Cloud, AS216154; hosts ext-styles.jeetbot.cc, morphilina.me | 2026-12-14 |
| IPv4 | 80.74.26.162 | Medium (single-source) | hunt | CLODO Cloud, AS216154; hosts ext-03.jeetbot.cc | 2026-12-14 |
| Behavioral (context, not a hunt indicator) | 10-channel allowlist: pch3lk1n, fasoollka, flamie, dosia, fander, almazer, forzorezor, akyuliych, lagoda1337, lagoda | High (2 sources) | enrich | Hardcoded exemption from token forwarding; attribution signal per seed intel, explicitly not shipped as a detection indicator | 2026-10-14 |
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Managed Windows/macOS endpoints running Chrome, Edge, or Firefox | DnsRequest, NetworkConnectIP4, ProcessRollup2 (default sensor policy) | High | Query-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-Falcon | High | Falcon has no native browser-extension-inventory event type; RTR spot-checks are point-in-time, not continuous |
| Perimeter DNS / secure web gateway | DNS/SWG logs (non-Falcon: Umbrella, Zscaler, firewall) | Medium | Requires separate tooling and manual correlation with EDR hits |
| Twitch SaaS account activity | Twitch 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 |
ATT&CK Mapping
| Tactic | Technique ID | Technique name | Observed behavior |
|---|---|---|---|
| Persistence | T1176 | Browser Extensions | Malicious extension installed from official stores, providing persistent code execution in the browser context across restarts |
| Credential Access | T1528 | Steal Application Access Token | Content script captures the Twitch OAuth Authorization header used by the site’s own web client |
| Command and Control | T1090.002 | Proxy: External Proxy | Video-playlist requests redirected through operator-controlled proxy servers to deliver the ad-block/region-unlock feature set |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | HTTPS traffic to jeetbot.cc / morphilina.me infrastructure blends with normal Twitch streaming traffic |
| Exfiltration | T1041 | Exfiltration Over C2 Channel | OAuth token appended as an &auth= query parameter on the same proxied redirect used for legitimate video delivery |
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
pnhhdhhcadcjfckjhpmjneldiegbojfbacross 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#jsonin-browser, or inspectdistribution/policies.jsondirectly, for theExtensionSettingsblock coveringtwitchenhancedviewer@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.
CrowdStrike LogScale CQL Hunt Queries
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)
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)
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)
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)
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)
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.
| Control | Mechanism | Patterns / scope | Deployment path |
|---|---|---|---|
| Custom IOC — domain | Falcon IOC Management | jeetbot.cc (apex + subdomains), morphilina.me — action: detect | IOC Management → Add indicator → type: domain; see Section 10 CSV block |
| Custom IOC — hash | Falcon IOC Management | Both package SHA-256 hashes — action: detect | IOC Management → Add indicator → type: sha256 |
| Scheduled Search | NG-SIEM Scheduled Search | Q1 (DNS to campaign domains), Q3 (browser-scoped correlation) | Promote Q1 and Q3 directly; both are CONF high / FP low |
| Investigate-only | Ad hoc hunt query | Q2, Q4, Q5 — medium-confidence or IP-based, needing periodic re-validation | Run manually on the recommended cadence in Section 11; do not auto-promote |
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.
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
# 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
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
# 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
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.
Hardening — Tiered
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.
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.
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.
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.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| 1. Identify / Triage | Confirm extension presence via RTR/browser-policy inventory (Section 7/10); confirm DNS/network hits via Q1-Q3 | SOC / Detection Engineering | RTR output, Q1/Q3 hit lists |
| 2. Contain | Push emergency GPO/policies.json blocklist fleet-wide (Playbooks 1-2); consider Falcon network containment on hosts showing active, repeated connections (Q5) pending investigation | Endpoint / Browser Management | Deployment ticket, containment log |
| 3. Eradicate | Confirm auto-removal by the blocklist policy; re-run the RTR sweep (Playbook 3) to verify no remaining on-disk instances | Endpoint / Browser Management | Second RTR sweep output |
| 4. Recover / Remediate identity | Instruct 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 elsewhere | User / Security Awareness | User attestation, Twitch activity log review notes |
| 5. Evidence & Reporting | Preserve Q1-Q5 hit lists, RTR inventory output, and the affected-user list for the incident record; report to security leadership | SOC | Incident ticket with attached query outputs |
| 6. Post-incident | Add 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 items | Network / Detection Engineering | Perimeter blocklist change record |
Detection Coverage Map
| Technique | Behavior | CQL | IOA/Control | Coverage |
|---|---|---|---|---|
| T1176 Browser Extensions | Malicious 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 inventory | Partial |
| T1528 Steal Application Access Token | Content script captures Authorization header; background worker holds bearer token | — | — | Gap |
| T1090.002 Proxy: External Proxy | Video-playlist requests redirected through operator proxy with &auth= parameter | Q2, Q5 | Custom IOC (domain/IP) | Partial |
| T1071.001 Web Protocols / DNS | DNS resolution and HTTPS connection to jeetbot.cc / morphilina.me infrastructure | Q1, Q3, Q4 | Custom IOC + Scheduled Search | Good |
| T1041 Exfiltration Over C2 Channel | Token rides along the same proxied redirect used for video delivery | Q1-Q5 (indirect, via infrastructure signal only) | — | Partial |
| Post-compromise account abuse | Attacker uses the stolen bearer token against Twitch’s own servers (chat, whispers, settings) | — | — | Gap |
| Fleet-wide extension governance | Any user can install a similarly-scoped high-permission extension | — (not a detection problem) | Section 12 hardening tiers | Gap (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.
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
Changelog
References
| ID | Publisher | Version/date | Accessed | Use | URL |
|---|---|---|---|---|---|
| S01 | Socket (Threat Research Team) | 2026-09-11 | 2026-09-14 | Primary technical research: extension IDs, hashes, domains, IPs/ASNs, version history, allowlist, attribution | https://socket.dev/blog/malicious-twitch-browser-extension |
| S02 | The Hacker News | 2026-09-14 | 2026-09-14 | Corroboration: extension IDs, user counts, mechanism, remediation version | https://thehackernews.com/2026/09/malicious-twitch-browser-extension.html |
| S03 | CyberInsider | 2026-09-14 | 2026-09-14 | Corroboration: domains, mechanism, allowlist, Socket attribution | https://cyberinsider.com/malicious-twitch-extension-exposed-oauth-tokens-of-30000-users/ |