Skip to navigation

Threat reportMalwareTL-2026-5330

CWPdoor: Trojanized Control Web Panel cwpsrv binary backdoors Linux servers

highACTIVE

CWPdoor is a passive backdoor embedded in trojanized builds of the Control Web Panel (CWP) cwpsrv web server (1.15.10 and 1.24.0), delivered by a root-run script masquerading as a cwpsrv update. It executes RSA-signed, AES-256-CBC-encrypted commands received via HTTP headers, suppresses access logging, and wipes traces.

Key facts for CWPdoor Control Web Panel backdoor

IdentifiersTL-2026-5330
Also known ascwpdoor
SeverityHIGH
First disclosed
Exploitation statusExploited in the wild
Affected productsControl Web Panel (CWP) cwpsrv web server (nginx-based)
Weaknesses (CWE)CWE-506
MalwareCWPdoor, Ebury
ToolsFakeUpdates
MITRE ATT&CK techniquesT1027 Obfuscated Files or Information, T1036 Masquerading, T1059.004 Unix Shell, T1070.003 Clear Command History, T1070.004 File Deletion, T1070.006 Timestomp, T1071.001 Web Protocols, T1140 Deobfuscate/Decode Files or Information, T1195.002 Compromise Software Supply Chain, T1205 Traffic Signaling, T1554 Compromise Host Software Binary, T1573.001 Symmetric Cryptography and 2 more in the attack flow
MotivationUNKNOWN
Target sectorshosting providers, technology, small business
Target regionsGlobal
Detection rules9 (1 shown free)
Sources6 cited sources

Detection coverage for CWPdoor Control Web Panel backdoor

As of 2026-11-05, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-5330 across Splunk SPL, Microsoft KQL and Sigma, covering 17 indicator(s) of compromise. The whole corpus is readable without an account. Every threat comes with one complete detection in Splunk SPL, Microsoft KQL and Sigma, free for everyone; a free account adds daily TL Creds to unlock the rest. Paid plans add a larger daily allowance, correlation and the MCP server. Threadlinqs MCP server · View plans.

Free detection: CWPdoor — Fake cwpsrv Update Script Execution and cwpsrv Binary Replacement

Detects the CWPdoor installation chain on Linux Control Web Panel hosts: execution of the masquerading cwpsrv_update.sh script, any command line touching the CWPdoor staging server 136.0.141.71, and cp/mv/install/curl/wget writing to /usr/local/cwpsrv/bin/cwpsrv (the trojanized cwpsrv_1.15.10 / cwpsrv_1.24.0 builds). Behaviour-first: fires on the replacement of the panel web server binary, not on a single hash.

  • Languages: Splunk SPL, Microsoft KQL, Sigma
  • ATT&CK: T1195.002, T1554, T1105, T1036, T1059.004
  • Data sources: sysmon_for_linux, index=linux sourcetype=sysmon:linux EventID=1
  • Severity: high
  • Confidence: high

Splunk SPL

index=linux sourcetype="sysmon:linux" EventID=1 earliest=-24h | eval cmd=coalesce(CommandLine,""), img=coalesce(Image,"") | where like(cmd,"%cwpsrv_update.sh%") OR like(cmd,"%136.0.141.71%") OR (match(img,"/(cp|mv|install|curl|wget)$") AND like(cmd,"%/usr/local/cwpsrv/bin/cwpsrv%")) | stats count min(_time) as first_seen max(_time) as last_seen values(cmd) as commands values(ParentImage) as parent_images by host, User | convert ctime(first_seen) ctime(last_seen)

Microsoft KQL

DeviceProcessEvents
| where Timestamp > ago(24h)
| where ProcessCommandLine has_any ('cwpsrv_update.sh', '136.0.141.71')
    or (FileName in~ ('cp', 'mv', 'install', 'curl', 'wget') and ProcessCommandLine has '/usr/local/cwpsrv/bin/cwpsrv')
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine
| order by Timestamp desc

Sigma

title: CWPdoor Fake cwpsrv Update Script or Binary Replacement
id: 7c1d3a52-4b8e-4f0a-9d21-6e5a0b3c8f11
status: experimental
description: Detects execution of the cwpsrv_update.sh installer, references to the CWPdoor staging server 136.0.141.71, or tools overwriting /usr/local/cwpsrv/bin/cwpsrv.
references:
  - https://blog.xlab.qianxin.com/cwpdoor-the-invisible-backdoor-living-inside-control-web-panel/
  - https://www.bleepingcomputer.com/news/security/hackers-backdoor-linux-servers-using-trojanized-cwp-web-server/
author: AII-Detector — ThreadLinqs Intelligence
date: 2026-11-05
tags:
  - attack.initial-access
  - attack.t1195.002
  - attack.persistence
  - attack.t1554
  - attack.command-and-control
  - attack.t1105
  - attack.defense-evasion
  - attack.t1036
logsource:
  category: process_creation
  product: linux
detection:
  selection_script:
    CommandLine|contains: 'cwpsrv_update.sh'
  selection_ip:
    CommandLine|contains: '136.0.141.71'
  selection_replace:
    Image|endswith:
      - '/cp'
      - '/mv'
      - '/install'
      - '/curl'
      - '/wget'
    CommandLine|contains: '/usr/local/cwpsrv/bin/cwpsrv'
  condition: 1 of selection_*
falsepositives:
  - Legitimate administrator manually upgrading or restoring cwpsrv from the vendor
level: high

Known false positives:

  • Administrator manually upgrading or restoring the cwpsrv binary from the official CWP vendor
  • Configuration-management or backup jobs that copy files under /usr/local/cwpsrv/bin

Tuning notes: Adjust index/sourcetype to your Sysmon-for-Linux or auditd execve ingestion. Allow-list the official CWP updater parent process and known change-window admin accounts; keep the 136.0.141.71 and cwpsrv_update.sh clauses unfiltered since they are near-zero-FP.

8 more detection rules (Splunk SPL, Microsoft KQL, Sigma) · unlock with TL Creds. Sign up free to unlock the detection rules or query them with the Threadlinqs MCP server (Purple)
  • CWPdoor — Trojanized cwpsrv Binary and Installer File Writes (Defender for Endpoint) · unlock with TL Creds
  • CWPdoor — cwpsrv Spawning Shells or Helper Executing Commands (Defender for Endpoint) · unlock with TL Creds
  • CWPdoor — Connections to Staging Server [indicator] or cwpsrv Public Outbound (Defender for Endpoint) · unlock with TL Creds
  • CWPdoor — curl/wget Download of [indicator] or Trojanized cwpsrv from [indicator] · unlock with TL Creds
  • CWPdoor — Trojanized cwpsrv Process Started with Known MD5 Hash · unlock with TL Creds
  • CWPdoor — Successful Backdoor Command Exchange (All Three Headers plus octet-stream Response) · unlock with TL Creds
  • CWPdoor — Post-Install Anti-Forensics (Timestomp, Installer Cleanup, History Wipe) · unlock with TL Creds
  • CWPdoor — X-Ngx-Integrity Trigger Headers in HTTP Traffic · unlock with TL Creds

Indicators of compromise for CWPdoor Control Web Panel backdoor

As of 2026-11-05, Threadlinqs Intelligence tracks 17 indicators of compromise for TL-2026-5330.

Sample indicators (3 of 17)

  • IP address: 136.0.141[.]71
  • File hash: e505d4ffa21cf494a5dc2d7c8f4f1236
  • File hash: 965aea67fb40de1bab5169ada993349f

Defanged, TLP:CLEAR. Full set of 17 indicators: unlock with TL Creds.

17 indicators of compromise · unlock with TL Creds. Compare plans

How CWPdoor Control Web Panel backdoor works

XLab reports 340,000+ CWP instances exposed on the public web.

XLab (QiAnXin) documented CWPdoor, a parasitic backdoor living inside the cwpsrv binary of Control Web Panel (formerly CentOS Web Panel), an nginx-based Linux hosting control panel. The malicious script cwpsrv_update.sh, captured on 2026-06-29, masquerades as a legitimate cwpsrv version update. It requires root, backs up the original binary, replaces /usr/local/cwpsrv/bin/cwpsrv with a trojanized build downloaded from 136.0.141.71 (variants cwpsrv_1.15.10 and cwpsrv_1.24.0), restores the new binary's atime/mtime and its parent directory's timestamp, deletes temporary files and runs history -d to erase command history.

The trojanized cwpsrv behaves as the legitimate service until it receives an HTTP/HTTPS request carrying three headers: X-Ngx-Integrity-Time (timestamp, validated within a +/-300 second window), X-Ngx-Integrity-Data (Base64 AES-256-CBC ciphertext holding the command, IV in the first 16 bytes) and X-Ngx-Integrity-Sig (Base64 RSA signature over '<timestamp>:<ciphertext>'). A 2048-bit RSA public key is embedded in the binary XOR-encrypted with 0x55; the AES key is derived from the SHA-256 digest of the RSA public key string. Because commands must be signed with the operator's private key, the backdoor cannot be triggered by third parties, and signature binding of timestamp plus ciphertext provides replay protection.

The master process hooks the request path at the ngx_http_process_request entry point. Valid commands are handed to a helper child process over a Unix domain socket named ngx_http_integrity_helper, which executes them and returns the encrypted output as an HTTP 200 response with Content-Type application/octet-stream. To remain invisible, the backdoor copies and tampers with the request's module context array, replacing the context pointer of the logging module so triggering requests never reach access logs. The sample was uploaded to VirusTotal from Brazil on 2026-09-30 (as evidencia.tgz / cwpsrv.suspeito) with zero detections.

The archive also contained the Ebury backdoor; the relationship between CWPdoor and Ebury is unclear and XLab suggests it may reflect separate actors compromising the same systems. Ebury operators previously abused CWP in November 2020 to deploy Ebury. No CVE or CVSS has been assigned; severity is analyst-assigned. The initial infection vector used to run the update script on victim hosts is not described in the available sources. Defenders should check for the ngx_http_integrity_helper socket, X-Ngx-Integrity strings in the cwpsrv binary and unexpected helper processes, replace the binary with a legitimate one, upgrade CWP, rotate panel credentials and hunt for additional malware (including Ebury).

MITRE ATT&CK techniques by tactic:

Defense Evasion

T1027 Obfuscated Files or Information; T1036 Masquerading; T1070.003 Clear Command History; T1070.004 File Deletion; T1070.006 Timestomp; T1140 Deobfuscate/Decode Files or Information

Execution

T1059.004 Unix Shell

Command and Control

T1071.001 Web Protocols; T1205 Traffic Signaling; T1573.001 Symmetric Cryptography; T1573.002 Asymmetric Cryptography

Initial Access

T1195.002 Compromise Software Supply Chain

Persistence

T1554 Compromise Host Software Binary

defense-impairment

T1685 Disable or Modify Tools

Remediation for CWPdoor Control Web Panel backdoor

Patches

  • Upgrade Control Web Panel to the latest version from the official vendor

Immediate actions

  • Check for the ngx_http_integrity_helper Unix socket: ss -axp | grep integrity
  • Search the server binary for backdoor strings: strings /usr/local/cwpsrv/bin/cwpsrv | grep X-Ngx-Integrity
  • Inspect cwpsrv processes for suspicious helper child processes: ps aux | grep cwpsrv
  • Block outbound and inbound traffic to 136.0.141.71
  • Replace the compromised cwpsrv binary with a legitimate version

Workarounds

  • Rotate control panel credentials and any credentials accessible from the affected host
  • Alert on HTTP requests containing X-Ngx-Integrity-Data, X-Ngx-Integrity-Time or X-Ngx-Integrity-Sig headers where traffic is inspectable

Longer-term hardening

  • Restrict CWP admin and user panel ports to trusted networks or a VPN rather than exposing them to the internet
  • Verify integrity of cwpsrv and other panel binaries against known-good hashes and vendor sources only
  • Investigate hosts for additional malware, including Ebury, and consider rebuilding compromised servers
  • Do not run update scripts from unofficial sources as root

Affected and fixed versions

  • Control Web Panel (CWP) — cwpsrv web server (nginx-based)
    Vulnerable versions: Trojanized cwpsrv builds 1.15.10 and 1.24.0 installed via cwpsrv_update.sh
    Fixed in: Replace with legitimate cwpsrv binary / upgrade to latest CWP release

Timeline of CWPdoor Control Web Panel backdoor

  • locked-ioc-17 backdoor/credential-stealer botnet active since at least 2009 (year-level date per BleepingComputer); later found alongside locked-ioc-16 in the same VirusTotal archive.
  • locked-ioc-17 operators exploited Control Web Panel to deliver and execute a Perl script installing locked-ioc-17 (per ESET); a prior precedent of CWP abuse for server backdooring (month-level date per source).
  • ESET report 'locked-ioc-17 is alive but unseen' stated locked-ioc-17 had infected nearly 400,000 servers since it emerged (month-level date per BleepingComputer).
  • XLab captured the malicious locked-ioc-12 script that installs the trojanized cwpsrv binary from locked-ioc-15.
  • Archive locked-ioc-14 containing the sample (locked-ioc-13) was uploaded to VirusTotal from Brazil with zero detections; the archive also included locked-ioc-17.
  • XLab (QiAnXin) published its locked-ioc-16 analysis, reporting 340,000+ exposed CWP instances; BleepingComputer covered the findings the same day.

Sources cited for CWPdoor Control Web Panel backdoor

Drafted by the Threadlinqs research pipeline from 6 sources; published ; last updated —.

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Live intelligence console

Threat level

Latest Threats