1. Executive summary
Cisco Talos has published a detailed analysis of "JWR," an undocumented, real-time phishing-as-a-service (PhaaS) framework that harvests payment card data, credentials, PII documents, and 2FA codes via live operator-puppeteered sessions. JWR impersonates checkout and login flows for Shopify, PayPal, Apple, Klarna, and banks across 44 phishing pages, exfiltrating data over AES-CTR encrypted WebSocket channels. Talos assesses with medium confidence that JWR is a variant of "The Outsider" PhaaS platform operated by the Chinese-speaking actor "Outsider Enterprise" — attribution that remains unconfirmed (no MITRE ATT&CK profile exists for this actor). Active smishing campaigns impersonating toll authorities and postal services in Southeast Asia and the Middle East are delivering the JWR client. EMEA financial services face direct risk: the kit's multi-brand bank and payment-gateway templates, live OTP interception, and Shopify/WooCommerce cart-reconstruction integrations are purpose-built to defeat standard anti-fraud and 3DS challenge controls.
2. Regulatory framing
No specific DORA/NIS2 article is directly engaged by this item. The JWR framework constitutes an external phishing threat targeting customers of financial institutions, but the trigger facts — a phishing campaign exists, customers may be defrauded, payment data may be stolen — are generic to any customer-facing phishing operation and do not distinctively engage any article in the provided regulatory reference in a way that changes client obligations.
3. Technical analysis & attack chain
Attribution caveat: Talos assesses with medium confidence that JWR is a variant of "The Outsider" PhaaS platform, based on client-engine code and functional similarities. The actor "Outsider Enterprise" has no MITRE ATT&CK profile; attribution to this actor is unconfirmed. The FBI announced a June 2026 takedown ("Ghost Hook") of the Outsider platform, but the kit was sold as a self-service product via Telegram, meaning variants are likely operated by other Chinese-speaking actors. The following technical detail is single-sourced (Cisco Talos); verify before enforcement.
Attack chain (confirmed steps)
- Initial access via smishing: The actor sends SMS lures impersonating national land transport authorities (Singapore toll/road-pricing), postal services (parcel/customs fee), and courier brands (Southeast Asia, UAE). The SMS contains a malicious URL.
- Phishing page load: The victim clicks the URL, opening a fake webpage that executes embedded JavaScript, which loads the JWR client-side engine. The engine checks the global flag
window.__HOST_MODE. - Host Mode (flag set): The Host Bridge module (an IIFE) operates within the parent page, relaying commands into a child iframe containing the phishing form. It establishes a persistent WebSocket to the C2. - Content Mode (flag not set): A Vue.js 2.X application (window.vm = new Vue({el: '#app', ...})) renders the phishing pages, collects input, and handles C2 instructions. Content Mode has three sub-modes: standalone, pluginIframe, and hostIframe. - Session initialization: The engine assigns a unique session token. It checks persistent storage for an existing
JWRCIDvalue (reuses if present for cross-visit correlation). If none exists, it generatesJWRCVV-{Date.now()}-{random1}-{random2}(two 13-character base-36 strings). A Web Worker is spawned fromstatic/js/ws-worker.jsto maintain the WebSocket independently of page navigation. - C2 connection: A binary WebSocket connection is established at path
webSocket/QT/{sessionId}/khkjsahfjkwhakjlsdwdddddd88(trailing suffix likely a server-side auth token). Communication is AES-CTR encrypted via theJwrCryptomodule (or plaintext JSON ifDEV_MODEflag is set). - Victim fingerprinting: On DOM ready, Vue executes
mounted(), callinggetIPInfo()(IP geolocation) andgetSyncSettings()(pulls actor-controlled config from C2). Device fingerprint (device type, browser, language, timezone, geolocation, user agent, cookies) is encrypted and sent to C2. An arrival beacon is sent toapi/open/addClickwith IP, country, landing page, referring URL, and OS metadata. - Live keystroke streaming: Each input element transmits to the actor in near-real-time as the victim types — partial card numbers, passwords, and verification codes are visible to the operator before form submission.
- Operator puppeteering: The actor sends instructions from the C2 console. The client engine checks each against
JwrExecutedInstructionsin sessionStorage (JSON array, max 50 entries, trimmed to 30) to prevent duplicate execution. New instructions are acknowledged via{type:"instructionAck", instruction_id:, cvv_id:}. Over 40 instructions are available (see table below). - Data collection loop: The actor directs the victim through pages:
to_info(PII) →to_card(card entry) →tip_fail/tip_change_card(fake card-declined to harvest additional cards) →to_sms/to_2fa/to_pin/to_app(verification) →to_success(final). The actor can loop the card-decline cycle indefinitely. - Exfiltration: When the actor closes the session, the WebSocket and worker are terminated. The entire
cvvformobject is POSTed toapi/open/the_final_interface. The victim is redirected to the real website.
Exfiltration schema (cvvform object): Credit card number, CVV, PIN, expiry date, card brand, issuer, issuing country, front/back card images, SSN, passport, driver's license, medical record number, name, gender, date of birth, address, email, email password, up to three sets of website credentials, PayPal login, 2FA codes, and full device fingerprint (IP, device, language, timezone, user agent, cookies, geolocation).
C2 instruction set (40+ commands)
| Instruction | Purpose |
|---|---|
to_index |
Send victim to landing/entry page |
to_login |
Send victim to site-login page |
to_password |
Prompt for account password |
to_info |
Collect PII |
to_card |
Send victim to card-entry page |
to_qr |
Show QR code for scan-based verification |
to_sms / to_sms_login / to_sms_bank |
Request SMS OTP (generic / login / bank) |
to_2fa |
Request 2FA code |
to_text_verify |
Request custom text/code verification |
to_email |
Request email OTP |
to_pin |
Request card PIN |
to_app / to_login_app |
Request bank-app push approval / app-based login |
to_bank_login1 / to_bank_login2 / to_bank_login3 |
Multi-stage bank login |
to_custompage |
Route to custom/template-defined page |
to_shop |
Show fake storefront |
to_paypal_login / to_paypal_card / to_paypal_card_verify / to_paypal_sms / to_paypal_email / to_paypal_pin / to_paypal_app |
PayPal-branded flows |
to_apple_login / to_apple_sms / to_apple_email / to_apple_card / to_apple_verify |
Apple-branded flows |
to_klarna_login / to_klarna_sms / to_klarna_email / to_klarna_pay / to_klarna_pin |
Klarna-branded flows |
to_success |
Send full data to C2, redirect to real site |
to_redirect |
Redirect to operator-supplied URL |
tip_fail |
Fake declined/invalid error, force re-entry |
tip_custom_fail |
Operator-authored custom error message |
to_page_custom_fail |
Route to custom failure page |
tip_change_card |
Fake card-declined to extract second card |
updata_img |
Push new image (e.g., refreshed QR code) |
updata_2fa |
Silently inject/display OTP code from operator |
text_updata_verify |
Push custom verification text |
submitResult |
Operator pushes corrected/enriched form data back into session |
REST API endpoints
| Endpoint | Purpose |
|---|---|
api/open/addClick |
Victim arrival beacon with fingerprint data |
api/open/getSyncSettings |
Pulls actor-controlled settings from C2 |
api/open/pollInstruction |
HTTP long-poll fallback for operator instructions |
api/open/the_final_interface |
Terminal exfiltration POST (full cvvform) |
api/open/addCvv |
Exfiltration endpoint |
E-commerce integrations: For Shopify deployments, the client reads the cart_data URL parameter (a signed JSON blob Shopify passes between checkout steps) and extracts the checkout domain as the WebSocket base URL, making the connection appear to originate from a legitimate Shopify domain. initShopifyProductInfo() and initWordPressProductInfo() reconstruct the victim's cart (product names, quantities, prices, totals) to make the fake checkout indistinguishable from the real one.
Anti-analysis: A one-time execution guard performs a self-referential .toString().search() call against a backtracking regex to detect debugger attachment. A decoy variable is scattered throughout the code to mislead static analysis.
Operator interface: Status messages are in Simplified Chinese (e.g., "正在填写PayPal登录账号" — filling in PayPal login account; "进入2FA验证页, 请发送验证, 等待用户提交" — entering 2FA verification page, please send verification, waiting for user submission; "均失败" — all failed).
Comparative assessment: JWR shares no code-level implementation with Lucid, Darcula, or Lighthouse kits. Its C2 protocol, encryption module, and message envelope are independently engineered. Behavioral alignment exists: all four share live operator puppeteering, card capture with OTP/2FA interception, and multi-brand templating.
4. Mitigation & containment
P1 — Within 24 hours
- Block known C2 infrastructure: Block WebSocket paths matching
webSocket/QT/*/khkjsahfjkwhakjlsdwdddddd88at web gateway / WAF level. Block HTTP requests to pathsapi/open/addClick,api/open/getSyncSettings,api/open/pollInstruction,api/open/the_final_interface,api/open/addCvvon non-verified domains. - Deploy Snort/ClamAV signatures: Talos has published Snort2/Snort3 SID rules and a ClamAV signature for this threat. Retrieve from the Talos GitHub IOC repository and deploy on applicable IDS/endpoint gateways.
- SMS gateway filtering: Coordinate with mobile security / SMS firewall providers to block smishing lures impersonating toll authorities, postal services, and courier brands. Focus on URLs delivered via SMS that impersonate government transport portals.
- Customer alert: If your institution is impersonated by any of the JWR brand templates (PayPal, Apple, Klarna, Shopify checkout, or bank login flows), issue a customer advisory warning of SMS-based toll/postal phishing lures directing to fake checkout pages.
P2 — Within 72 hours
- Web proxy / WAF rules: Block or flag JavaScript files matching
static/js/ws-worker.jsserved from non-verified domains. Alert on pages settingwindow.__HOST_MODEor instantiatingwindow.vm = new Vue({el: '#app', ...})in combination with WebSocket connections to non-corporate hosts. - Fraud monitoring tuning: Alert on transactions where the card was authorized but the customer's session exhibited rapid page transitions inconsistent with normal checkout flow (JWR's instruction-driven navigation creates a distinctive multi-page pattern: PII → card → OTP → redirect). Review recent transactions for patterns where multiple card attempts were followed by a successful OTP verification — this matches the
tip_change_card/tip_failharvest loop. - Credential monitoring: Check for customer credentials appearing in JWR exfiltration patterns — specifically, watch for
cvvform-structured data orJWRCVV-prefixed session tokens in outbound traffic logs.
P3 — Within 7 days
- Anti-phishing takedown: Establish or escalate takedown workflows for domains impersonating your brand that serve JWR phishing pages. Prioritise domains using Shopify
cart_dataparameter spoofing, as these are the most convincing checkout replicas. - 3DS / SCA control review: JWR's live OTP interception (
to_sms,to_2fa,to_app) defeats SMS-based and app-push-based 2FA when the victim is socially engineered in real time. Review whether additional friction (e.g., transaction risk analysis, device binding anomalies, callback verification for high-value transactions) can be applied to sessions exhibiting JWR-like navigation patterns. - Threat hunt: Search web access logs and proxy logs for the five REST API paths and the WebSocket path pattern. Hunt for
JWRCIDorJWRCVV-in cookie values or localStorage references in page content.
5. Indicators of compromise
No atomic indicators (domains, IPs, hashes, URLs) are available in the source material. Talos references a GitHub IOC repository but does not enumerate specific indicators in the blog post. The following are behavioural and structural indicators derived from the technical analysis.
Behavioural indicators
| Behaviour | Where to observe | Confidence |
|---|---|---|
WebSocket connection to path webSocket/QT/{sessionId}/khkjsahfjkwhakjlsdwdddddd88 |
Web proxy logs, browser DevTools, network IDS | High (single-sourced; Talos) |
HTTP requests to api/open/addClick, api/open/getSyncSettings, api/open/pollInstruction, api/open/the_final_interface, api/open/addCvv |
Web proxy logs, WAF logs, network IDS | High (single-sourced; Talos) |
JavaScript file loaded from path static/js/ws-worker.js on non-legitimate domains |
Web proxy logs, WAF, browser EDR | High (single-sourced; Talos) |
Session token format JWRCVV-{timestamp}-{random1}-{random2} in cookies or storage |
Browser DevTools, web proxy logs (cookie/header inspection) | High (single-sourced; Talos) |
window.__HOST_MODE flag set in page JavaScript |
Browser EDR, web content analysis, JS sandbox | High (single-sourced; Talos) |
JwrExecutedInstructions key in sessionStorage |
Browser DevTools, endpoint EDR with browser telemetry | High (single-sourced; Talos) |
JWRCID persistent storage key |
Browser DevTools, endpoint EDR | High (single-sourced; Talos) |
Vue 2.X instance mounted as window.vm = new Vue({el: '#app', ...}) on non-legitimate domains |
Web content analysis, JS sandbox | Medium (pattern is common; combined with other indicators raises confidence) |
| Operator status messages in Simplified Chinese in C2 traffic | Network IDS (DPI on WebSocket/HTTP), threat intel feeds | Medium (single-sourced; Talos) |
| Rapid page transitions: PII → card entry → OTP → redirect, with multiple card-attempt loops | Fraud monitoring, session analytics, RBA tools | High (single-sourced; Talos) |
6. Detection
rule JWR_Phishing_Framework_Client_Engine {
meta:
author = "Adverse Trace"
date = "2026-08-13"
reference = "https://blog.talosintelligence.com/dissecting-the-jwr-phishing-framework/"
description = "Detects JWR phishing framework client-side JavaScript engine based on artefacts from Talos analysis"
strings:
$host_mode = "window.__HOST_MODE"
$vue_mount = "window.vm = new Vue"
$ws_worker = "static/js/ws-worker.js"
$ws_path = "khkjsahfjkwhakjlsdwdddddd88"
$exec_log = "JwrExecutedInstructions"
$session_key = "JWRCID"
$token_prefix = "JWRCVV-"
$ack_msg = "instructionAck"
$api_addclick = "api/open/addClick"
$api_sync = "api/open/getSyncSettings"
$api_poll = "api/open/pollInstruction"
$api_final = "api/open/the_final_interface"
$api_addcvv = "api/open/addCvv"
$shopify_init = "initShopifyProductInfo"
$woo_init = "initWordPressProductInfo"
$cart_data = "cart_data"
$cvvform = "cvvform"
$jwr_crypto = "JwrCrypto"
$dev_mode = "DEV_MODE"
$to_success = "to_success"
$tip_fail = "tip_fail"
$tip_change_card = "tip_change_card"
$to_bank_login1 = "to_bank_login1"
$to_paypal_login = "to_paypal_login"
$to_klarna_pay = "to_klarna_pay"
$to_apple_card = "to_apple_card"
condition:
6 of them
}
title: JWR Phishing Framework WebSocket C2 Connection
id: 7a3c1f2e-8b4d-4a6e-9c5f-1d2e3f4a5b6c
status: experimental
description: >
Detects WebSocket connections matching the JWR phishing framework C2 path pattern.
The path format webSocket/QT/{sessionId}/khkjsahfjkwhakjlsdwdddddd88 is unique to JWR.
author: Adverse Trace
date: 2026/08/13
references:
- https://blog.talosintelligence.com/dissecting-the-jwr-phishing-framework/
logsource:
product: proxy
category: websocket
detection:
selection:
c-uri|contains:
- "webSocket/QT/"
- "khkjsahfjkwhakjlsdwdddddd88"
condition: selection
falsepositives:
- None known; the trailing token is a hard-coded JWR artefact
level: critical
title: JWR Phishing Framework REST API Endpoints
id: 8b4d2g3f-9c5e-4b7f-0d6g-2e3f4a5b6c7d
status: experimental
description: >
Detects HTTP requests to JWR phishing framework REST API endpoints.
These five paths are specific to the JWR C2 communication protocol.
author: Adverse Trace
date: 2026/08/13
references:
- https://blog.talosintelligence.com/dissecting-the-jwr-phishing-framework/
logsource:
product: proxy
category: webserver
detection:
selection:
c-uri|contains:
- "api/open/addClick"
- "api/open/getSyncSettings"
- "api/open/pollInstruction"
- "api/open/the_final_interface"
- "api/open/addCvv"
condition: selection
falsepositives:
- Unlikely; these API paths are not known to be used by legitimate applications
level: high
7. Sources
- Cisco Talos, "Dissecting the JWR phishing framework," https://blog.talosintelligence.com/dissecting-the-jwr-phishing-framework/, 2026-08-13
8. Adverse Trace position
JWR is a technically sophisticated, operator-driven phishing framework whose live keystroke streaming, real-time OTP interception, and e-commerce cart reconstruction pose a direct and elevated threat to EMEA financial services — particularly institutions whose brands are templated (PayPal, Klarna, Apple Pay, bank login flows) and merchants using Shopify or WooCommerce checkout. The kit's ability to loop victims through multiple card-entry attempts and harvest identity documents goes well beyond credential theft, enabling downstream account takeover, card-not-present fraud, and identity crime. Attribution to "Outsider Enterprise" is unconfirmed (no MITRE profile); the FBI's June 2026 "Ghost Hook" takedown of the Outsider platform does not eliminate the threat, as the kit was sold as a self-service product and variants are likely operated by other actors. All technical detail in this advisory is single-sourced (Cisco Talos); clients should retrieve the IOC set from the Talos GitHub repository and verify before enforcement. We will monitor for JWR infrastructure targeting EMEA financial brands and update clients if IOCs emerge or if additional sources corroborate the Outsider variant assessment.
Published via PulseTrace — Adverse Trace threat intelligence.