SOC Prime Bias: Medium

05 Jan 2026 19:10

New VVS Stealer Malware Targets Discord Accounts via Obfuscated Python Code

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
New VVS Stealer Malware Targets Discord Accounts via Obfuscated Python Code
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Summary

VVS Stealer is a newly observed Python‑based information stealer sold on Telegram. It is obfuscated with Pyarmor, packaged with PyInstaller and persists via the Windows Startup folder. The malware harvests Discord tokens, browser credentials, cookies, history, passwords and screenshots. It can also inject a malicious JavaScript payload to hijack active Discord sessions.

Investigation

Palo Alto Networks Unit 42 disclosed the malware, noting it has been offered for sale since April 2025. Researchers described its obfuscation technique, distribution model, and functionality including credential theft and Discord injection. The report links the tool to French‑speaking threat actors active in stealer‑focused Telegram groups.

Mitigation

Organizations should monitor for unknown PyInstaller executables and unexpected shortcuts in the Startup folder. Deploy endpoint detection rules for obfuscated Python scripts and suspicious JavaScript payloads. Enforce multi‑factor authentication for Discord and browser accounts and limit administrative privileges that could be abused for credential harvesting.

Response

If VVS Stealer is detected, isolate the affected endpoint, collect memory and file artifacts, and extract IOCs. Remove the malicious startup entry, terminate any injected Discord processes, and force a password reset for compromised accounts. Conduct a full forensic investigation to locate additional stolen credentials and ensure the remote C2 infrastructure is blocked.

"graph TB %% Class definitions classDef action fill:#99ccff classDef malware fill:#ff9999 classDef tool fill:#cccccc classDef technique fill:#ffff99 %% Nodes mal_vvs_stealer["<b>Malware</b> – <b>VVS Stealer</b><br/><b>Description</b>: Information stealer packaged with PyInstaller and obfuscated with PyArmor."] class mal_vvs_stealer malware tool_pyinstaller["<b>Tool</b> – <b>PyInstaller</b><br/><b>Description</b>: Bundles Python applications into standalone executables."] class tool_pyinstaller tool tool_pyarmor["<b>Tool</b> – <b>PyArmor</b><br/><b>Description</b>: Obfuscates Python bytecode to hide malicious logic."] class tool_pyarmor tool tech_T1027["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/><b>Description</b>: Adversaries use obfuscation to conceal malicious code."] class tech_T1027 technique action_download_js["<b>Action</b> – Download additional JavaScript payload"] class action_download_js action tech_T1027_006["<b>Technique</b> – <b>T1027.006 HTML Smuggling</b><br/><b>Description</b>: Embed malicious code in HTML to bypass defenses."] class tech_T1027_006 technique tech_T1505["<b>Technique</b> – <b>T1505 Server Software Component</b><br/><b>Description</b>: Install additional serveru2011side components to support malicious activity."] class tech_T1505 technique action_persistence["<b>Action</b> – Establish persistence via Startup folder"] class action_persistence action tech_T1037_005["<b>Technique</b> – <b>T1037.005 Startup Items</b><br/><b>Description</b>: Place executables in the useru2019s startup folder to run at logon."] class tech_T1037_005 technique tech_T1547["<b>Technique</b> – <b>T1547 Boot or Logon Autostart Execution</b><br/><b>Description</b>: Register programs to execute automatically on boot or logon."] class tech_T1547 technique action_fake_error["<b>Action</b> – Display fake fatal error popu2011up"] class action_fake_error action tech_T1562_011["<b>Technique</b> – <b>T1562.011 Spoof Security Alerting</b><br/><b>Description</b>: Show counterfeit security alerts to deceive users."] class tech_T1562_011 technique action_screenshot["<b>Action</b> – Capture screen"] class action_screenshot action tech_T1113["<b>Technique</b> – <b>T1113 Screen Capture</b><br/><b>Description</b>: Record screenshots of the victimu2019s desktop."] class tech_T1113 technique action_browser_harvest["<b>Action</b> – Harvest browser data (cookies, passwords, history)"] class action_browser_harvest action tech_T1555_003["<b>Technique</b> – <b>T1555.003 Credentials from Web Browsers</b><br/><b>Description</b>: Extract saved credentials and cookies from browsers."] class tech_T1555_003 technique action_discord_hijack["<b>Action</b> – Terminate Discord client and inject malicious JavaScript"] class action_discord_hijack action tech_T1539["<b>Technique</b> – <b>T1539 Steal Web Session Cookie</b><br/><b>Description</b>: Obtain active web session cookies from browsers."] class tech_T1539 technique tech_T1134_003["<b>Technique</b> – <b>T1134.003 Access Token Manipulation</b><br/><b>Description</b>: Steal or impersonate authentication tokens."] class tech_T1134_003 technique action_c2_exfil["<b>Action</b> – Exfiltrate data via webu2011based C2"] class action_c2_exfil action tech_T1071_001["<b>Technique</b> – <b>T1071.001 Application Layer Protocol: Web Protocols</b><br/><b>Description</b>: Use standard web traffic for command and control."] class tech_T1071_001 technique tech_T1102["<b>Technique</b> – <b>T1102 Web Service</b><br/><b>Description</b>: Communicate with remote servers via web services for data exfiltration."] class tech_T1102 technique %% Connections mal_vvs_stealer –>|uses| tech_T1027 mal_vvs_stealer –>|packaged with| tool_pyinstaller mal_vvs_stealer –>|obfuscated with| tool_pyarmor mal_vvs_stealer –>|downloads| action_download_js action_download_js –>|uses| tech_T1027_006 action_download_js –>|uses| tech_T1505 action_download_js –>|establishes persistence via| action_persistence action_persistence –>|uses| tech_T1037_005 action_persistence –>|leverages| tech_T1547 action_persistence –>|displays| action_fake_error action_fake_error –>|uses| tech_T1562_011 action_fake_error –>|captures| action_screenshot action_screenshot –>|uses| tech_T1113 action_screenshot –>|harvests| action_browser_harvest action_browser_harvest –>|uses| tech_T1555_003 action_browser_harvest –>|targets Discord and injects JS| action_discord_hijack action_discord_hijack –>|uses| tech_T1539 action_discord_hijack –>|uses| tech_T1134_003 action_discord_hijack –>|exfiltrates via| action_c2_exfil action_c2_exfil –>|uses| tech_T1071_001 action_c2_exfil –>|uses| tech_T1102 "

Attack Flow

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic. Abstract or unrelated examples will lead to misdiagnosis.

  • Attack Narrative & Commands:
    The adversary has compromised a low‑privilege user account on a Windows workstation. Using a PowerShell dropper, they launch a malicious PyInstaller‑packed executable (VVS_Stealer.exe) that first spawns a process with the command line containing the string “PyInstaller”. The payload then forcibly terminates the running Discord client to prepare for a token‑stealing injection stage. All actions occur under the current user context, generating a single Process Creation event that matches the rule’s criteria.

    Step‑by‑step:

    1. Copy the malicious PyInstaller bundle to %TEMP%.
    2. Execute it with a command line that explicitly includes the word “PyInstaller”.
    3. The malicious binary internally calls taskkill /IM Discord.exe /F to terminate Discord.
    4. The termination generates a Process Creation event where the Image field resolves to the Discord executable path (C:Users<user>AppDataLocalDiscordapp-... Discord.exe) and the original spawn command line still contains “PyInstaller”.
  • Regression Test Script: The following PowerShell script reproduces the exact telemetry needed to trigger the detection rule. It intentionally avoids any real malicious payload; instead, it launches a harmless notepad.exe process but pretends to be a PyInstaller‑packed executable by embedding the keyword in the command line. It also terminates any running Discord process to mirror the “Image endswith Discord.exe” condition.

    # -------------------------------------------------
    # Simulation Script – Triggers Sigma rule #f63685c4‑feea‑431b‑a749‑55cf8661e6ac
    # -------------------------------------------------
    
    # 1. Ensure Discord is running (optional, to guarantee termination)
    $discordPath = "$env:LOCALAPPDATADiscordapp-1.0.9005Discord.exe"
    if (-Not (Get-Process -Name "Discord" -ErrorAction SilentlyContinue)) {
        Start-Process -FilePath $discordPath -WindowStyle Hidden
        Start-Sleep -Seconds 5
    }
    
    # 2. Launch a dummy process with "PyInstaller" in its command line.
    #    Using notepad.exe as a benign placeholder.
    $dummyCmd = "C:WindowsSystem32notepad.exe"
    $cmdLine = "PyInstaller_dummy_execution -run $dummyCmd"
    Start-Process -FilePath $dummyCmd -ArgumentList $cmdLine -WindowStyle Hidden
    Write-Host "[+] Launched dummy process with PyInstaller keyword."
    
    # 3. Immediately terminate Discord to generate the Discord.exe image event.
    if (Get-Process -Name "Discord" -ErrorAction SilentlyContinue) {
        Stop-Process -Name "Discord" -Force
        Write-Host "[+] Discord.exe terminated."
    }
    
    # 4. Optional: Clean up the dummy notepad window after a short delay.
    Start-Sleep -Seconds 8
    Get-Process -Name "notepad" -ErrorAction SilentlyContinue | Stop-Process -Force
    Write-Host "[+] Cleanup completed."
  • Cleanup Commands: Ensure no residual processes remain.

    # Remove any lingering dummy notepad processes
    Get-Process -Name "notepad" -ErrorAction SilentlyContinue | Stop-Process -Force
    
    # Restart Discord if needed for post‑test continuity
    $discordPath = "$env:LOCALAPPDATADiscordapp-1.0.9005Discord.exe"
    if (-Not (Get-Process -Name "Discord" -ErrorAction SilentlyContinue)) {
        Start-Process -FilePath $discordPath
        Write-Host "[+] Discord restarted for normal operations."
    }