~/f4n6 $ grep -r "Dissecting the JWR phishing framework" ./investigations/ --include="*.md"

Dissecting the JWR phishing framework

Jeff Davies 13 Aug 2026 9 min read

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)

  1. 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.
  2. 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.
  3. Session initialization: The engine assigns a unique session token. It checks persistent storage for an existing JWRCID value (reuses if present for cross-visit correlation). If none exists, it generates JWRCVV-{Date.now()}-{random1}-{random2} (two 13-character base-36 strings). A Web Worker is spawned from static/js/ws-worker.js to maintain the WebSocket independently of page navigation.
  4. 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 the JwrCrypto module (or plaintext JSON if DEV_MODE flag is set).
  5. Victim fingerprinting: On DOM ready, Vue executes mounted(), calling getIPInfo() (IP geolocation) and getSyncSettings() (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 to api/open/addClick with IP, country, landing page, referring URL, and OS metadata.
  6. 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.
  7. Operator puppeteering: The actor sends instructions from the C2 console. The client engine checks each against JwrExecutedInstructions in 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).
  8. 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.
  9. Exfiltration: When the actor closes the session, the WebSocket and worker are terminated. The entire cvvform object is POSTed to api/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/*/khkjsahfjkwhakjlsdwdddddd88 at web gateway / WAF level. Block HTTP requests to paths api/open/addClick, api/open/getSyncSettings, api/open/pollInstruction, api/open/the_final_interface, api/open/addCvv on 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.js served from non-verified domains. Alert on pages setting window.__HOST_MODE or instantiating window.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_fail harvest loop.
  • Credential monitoring: Check for customer credentials appearing in JWR exfiltration patterns — specifically, watch for cvvform-structured data or JWRCVV- 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_data parameter 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 JWRCID or JWRCVV- 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.


Read the original source →

Published via PulseTrace — Adverse Trace threat intelligence.

Post this to LinkedIn
Formatting is converted automatically — headings, bullets, a link back & hashtags. Paste straight in.
J
Jeff Davies