
Detection, mitigation, and reverse-engineering tooling for CVE-2026-41940 (SessionScribe): the cPanel/WHM unauthenticated session-forgery vulnerability disclosed 2026-04-28. Defense-in-depth active mitigation shim, ModSec rule pack, remote probe, on-host IOC scanner, and per-tier RE snapshot collector. GPL v2.
cPanel और WHM में गंभीर अप्रमाणित RCE। चार HTTP अनुरोध CRLF इंजेक्शन के माध्यम से रूट सत्र बनाते हैं प्रीऑथ सत्र के पासवर्ड फ़ील्ड में। कोई प्रमाणीकरण नहीं, कोई पूर्व शर्त नहीं, सभी समर्थित टियर प्रभावित हैं। 2026-04-28 को Sina Kheirkhah / watchTowr Labs द्वारा प्रकट किया गया।
त्वरित आरंभ · ioc-scan · mitigate · remote-probe · प्रभावित बिल्ड · प्राथमिकता क्रम
[!IMPORTANT] टियर्स 112, 114, 116, 120, 122, 128 के पास विक्रेता पैच नहीं है। हर उन टियर्स पर बिल्ड कमजोर हैं; अपग्रेड या माइग्रेट ही एकमात्र स्थायी समाधान है। तब तक: फायरवॉल TCP/2082, 2083, 2086, 2087, 2095, 2096 प्रबंधन CIDRs पर (
mitigate.sh --applyऐसा करता है) और शेष सतह को ModSec नियम पैक के साथ सुरक्षित करें।
तीन वन-लाइनर्स, ऑपरेटर प्राथमिकता क्रम में:```bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh | bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --apply
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-remote-probe.sh | bash -s -- --target HOST
एक्ज़िट कोड फ्लीट ऑटोमेशन के लिए डिज़ाइन किए गए हैं: `ioc-scan` COMPROMISED पर `4`, VULNERABLE पर `1` एक्ज़िट करता है; `mitigate` `0` साफ / `1` लागू / `2` मैनुअल / `3` टूल त्रुटि पर एक्ज़िट करता है; `remote-probe` किसी भी लक्ष्य के VULN होने पर `2` एक्ज़िट करता है।
---
## Tools
परिचालन प्राथमिकता के क्रम में। प्रत्येक आर्टिफैक्ट फ्लीट रोल-अप के लिए `host`, `os`, `cpanel_version`, `ts` पर की गई संरचित आउटपुट (`--json` / `--jsonl` / `--csv`) उत्सर्जित करता है।
| उपकरण | भूमिका | कहाँ चलता है |
|---|---|---|
| **[`sessionscribe-ioc-scan.sh`](#sessionscribe-ioc-scansh---ioc-ladder--kill-chain)** | प्रथम श्रेणी ट्राइएज। IOC सीढ़ी, कोड-स्टेट + होस्ट-स्टेट निर्णय, किल-चेन पुनर्निर्माण, IR बंडल। | cPanel होस्ट पर |
| **[`sessionscribe-mitigate.sh`](#sessionscribe-mitigatesh---mitigation-orchestrator)** | खिड़की बंद करें। चरणबद्ध शमन: पैच जाँच, फ़ायरवॉल, प्रॉक्सीसब, ModSec। | cPanel होस्ट पर |
| **[`sessionscribe-remote-probe.sh`](#sessionscribe-remote-probesh---non-destructive-fleet-probe)** | सहायक संपार्श्विक। गैर-विनाशकारी 4-चरणीय जांच → प्रति होस्ट VULN/SAFE। | `curl` के साथ कहीं भी |
| [`modsec-sessionscribe.conf`](#supporting-collateral) | `mitigate` द्वारा तैनात ModSec नियम पैक। | Apache फ्रंट-एंड |
| [`sessionscribe-revsnap.sh`](#supporting-collateral) | बाइनरी डिफिंग के लिए प्रति-टियर RE स्नैपशॉट संग्राहक। | cPanel होस्ट पर, `upcp` के आसपास |
GPL v2. सभी आर्टिफैक्ट ऊपर दिए गए रॉ URL के माध्यम से `curl`-रेडी हैं।
---
## `sessionscribe-ioc-scan.sh` - IOC सीढ़ी + किल-चेन
**इसे पहले चलाएँ।** डिफ़ॉल्ट रूप से केवल डिटेक्शन (तेज़, फ्लीट-अनुकूल); फोरेंसिक चरणों को इनलाइन चलाने के लिए `--full` जोड़ें (defense timeline, offense ingest, reconcile, kill-chain renderer, IR बंडल)।```bash
# fast triage (detection only)
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh | bash
# full kill-chain reconstruction inline
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh | bash -s -- --full
# full + ship IR bundle to intake
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh | bash -s -- --full --upload
# JSONL for SIEM ingest
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh | bash -s -- --jsonl --quiet > host.jsonl
# host IOCs only - periodic post-patch sweep, last 7 days
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh | bash -s -- --ioc-only --since 7
# replay forensic phases against a saved envelope (no re-scan)
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh | bash -s -- --replay /var/cpanel/sessionscribe-ioc/<run_id>.json
दो अक्ष स्वतंत्र रूप से रिपोर्ट करते हैं। code_verdict (PATCHED / VULNERABLE / INCONCLUSIVE) संस्करण, Perl स्रोत पैटर्न और cpsrvd बाइनरी फ़िंगरप्रिंट से आता है। host_verdict (CLEAN / SUSPICIOUS / COMPROMISED) सेशन-फ़ाइल IOC सीढ़ी, एक्सेस-लॉग स्कैन और पैटर्न A–G विनाश जांच से आता है। एक पैच किया गया होस्ट अभी भी 4 कोड के साथ बाहर निकल सकता है यदि पिछले शोषण ने डिस्क पर IOC छोड़े हों।
nxesec_canary_<nonce> (रिमोट प्रोब द्वारा छोड़ा गया) से टैग किए गए सत्र PROBE_ARTIFACT के रूप में वर्गीकृत होते हैं और COMPROMISED में नहीं बढ़ते।
--full प्रत्येक IOC को रक्षा सक्रियणों के विरुद्ध संकलित करता है और प्रत्येक को PRE-DEFENSE, POST-DEFENSE, POST-PARTIAL, या UNDEFENDED के रूप में वर्गीकृत करता है, फिर निर्णय + रक्षा-अंतराल शीर्षक के साथ सारांश प्रस्तुत करता है।
PRE-DEFENSE = जब संकेतक आया तब होस्ट शोषण के लिए खुला था;
POST-DEFENSE = संपार्श्विक या पूर्व-शमन शोर।```
+-- CVE-2026-41940 / IC-5790 --------------------------------------------
| host cpanel.example.com ()
| cpanel unknown os unknown
| verdict COMPROMISED score 315 ioc-scan v2.5.0
| defenses patch x absent modsec + up csf + clean mitigate + ran
+------------------------------------------------------------------------
| -- PRE-DEFENSE (32 events) -- | 2026-03-25T09:43:19Z ! pattern X ioc_attacker_ip_2xx_on_cpsess 57 hit(s) (last 90d) from IC-5790 IPs returned 2xx on /cpsess/ paths - real exploitation | 2026-04-28T14:35:56Z ! pattern X ioc_cve_2026_41940_crlf_access_chain 15 CRLF-bypass chain(s) — POST /login 401 then GET /cpsess 2xx as root within 2s | 2026-04-28T16:38:45Z ! pattern E ioc_pattern_e_websocket_shell_hits 45 external IP(s) reached /cpsess*/websocket/Shell with 2xx | 2026-04-29T08:41:22Z ! pattern F ioc_pattern_f_smark_envelope S_MARK/E_MARK harvester envelope in /root/.bash_history | 2026-04-29T16:41:24Z ! pattern A ioc_pattern_a_ransom_readme /home/user1/README.md | … (22 more Pattern A ransom_readme events across customer homedirs) | 2026-04-29T16:42:09Z ! pattern A ioc_pattern_a_sorry_files_present 608 .sorry-encrypted files present | 2026-04-29T17:52:58Z ! pattern D ioc_pattern_d_acctlog_encrypted /var/cpanel/accounting.log.sorry
| -- DEFENSES -- | 2026-04-29T23:48:21Z + DEFENSE mitigate_first sessionscribe-mitigate.sh first run | 2026-04-29T23:48:21Z + DEFENSE csf csf.conf cpsrvd ports stripped | 2026-04-29T23:48:46Z + DEFENSE modsec modsec rule 1500030 installed
| -- POST-PARTIAL (1 event) -- | 2026-04-30T12:23:42Z ! pattern E ioc_pattern_e_handoff_burst_present 3 distinct external IPs each minted cpsess + reached websocket Shell within 15-min window
| HEADLINE | verdict COMPROMISED (score 315) | defense lag 37d 9h LATE (first IOC 2026-03-25T09:43:19Z, defense up 37d 9h later)
<details>
<summary><b>जाँच संदर्भ + फोरेंसिक चरण + बंडल लेआउट</b> (विस्तार करने के लिए क्लिक करें)</summary>
| जाँच | यह क्या करता है |
|---|---|
| `version` | `cpanel -V` बनाम प्रकाशित पैच-बिल्ड सूची - `code_verdict` चलाता है |
| `static-pattern` | पैच के बाद के सेंटिनल पैटर्न (`no-ob:` डिकोड शाखा) के लिए `Cpanel/Session/*.pm` में grep करता है |
| `cpsrvd-fingerprint` | पैच-बिल्ड हस्ताक्षरों के विरुद्ध cpsrvd बाइनरी निरीक्षण |
| `access-log` | शोषण ट्रैफिक आकारों के लिए Apache + cpsrvd लॉग (छोड़ने के लिए `--no-logs`) |
| `session-store` | `/var/cpanel/sessions/raw/` वॉक: विक्रेता IOC + 4-तरह सह-घटना + जाली-टाइमस्टैम्प अनुमान (छोड़ने के लिए `--no-sessions`) |
| `destruction` | पैटर्न A–G जांच: `/root/sshd` एन्क्रिप्टर, mysql-वाइप, BTC इंडेक्स, `nuclear.x86`, `sptadm` रिसेलर, `__S_MARK__` हार्वेस्टर, संदिग्ध SSH कुंजियाँ (छोड़ने के लिए `--no-destruction-iocs`) |
| `probe` (वैकल्पिक) | `127.0.0.1:2087` पर एकल मार्कर GET - cpsrvd की प्रतिक्रियाशीलता की पुष्टि करता है। बाइपास का प्रयास **नहीं** करता |
**`--full` फोरेंसिक चरण** (पता लगने के बाद इनलाइन चलाएं):
| चरण | यह क्या करता है |
|---|---|
| `defense` | प्रत्येक सुरक्षा स्तर जो लागू हुआ, उसकी टाइमस्टैम्प: cpanel पैच, cpsrvd पैच के बाद पुनरारंभ, मिटिगेट रन, ModSec नियम, CSF/APF पोर्ट बंद, proxysub, `upcp` सारांश |
| `offense` | देखे गए प्रत्येक समझौता संकेतक की टाइमस्टैम्प (पैटर्न A–G + पैटर्न X CRLF-बाइपास श्रृंखला) |
| `reconcile` | प्रति-संकेतक: क्या जब यह पहली बार दिखाई दिया तो प्रासंगिक सुरक्षा सक्रिय थी? PRE-DEFENSE / POST-DEFENSE / POST-PARTIAL / UNDEFENDED + समय अंतर |
| `bundle` | `/root/.ic5790-forensic/<TS>-<RUN_ID>/` के अंतर्गत कच्चे आर्टिफैक्ट्स का टारबॉल, मोड `0700` |
**बंडल लेआउट** (`/root/.ic5790-forensic/<TS>-<RUN_ID>/`):```
manifest.txt host/uid/cpv/run_id/window/cap
sessions.tgz /var/cpanel/sessions/{raw,preauth} (filtered)
access-logs.tgz cpsrvd access + incoming_http_requests + error_log
+ global Apache access/error (NO domlogs)
system-logs.tgz /var/log/{secure,messages,audit/audit.log,auth.log}*
cpanel-state.tgz accounting.log + resellers + cpanel.config + api_tokens_v2
cpanel-users.tgz /var/cpanel/users/ (split out, per-account state)
persistence.tgz ssh keys + all cron tiers + systemd/init.d/profile.d
+ rc.local + root histories + passwd/group + sudoers
defense-state.tgz mitigate backups + csf/apf/modsec configs + updatelogs
ps.txt / connections.txt / iptables.txt
pattern-a-binary-metadata.txt only if /root/sshd present (metadata; binary NOT bundled)
user-histories/ per-user .bash_history (gated on --no-history)
व्यस्त होस्ट पर 90-दिवसीय विंडो के साथ सामान्य बंडल: ~250 MB – 2 GB संपीड़ित।
प्रति-टारबॉल 2 GB की सीमा (--max-bundle-mb) अत्यधिक आकार के उम्मीदवारों को व्यक्तिगत रूप से हटा देती है।
एक रन लेजर डिफ़ॉल्ट रूप से /var/cpanel/sessionscribe-ioc/ पर लिखा जाता है
(--no-ledger को अक्षम करने के लिए)। --chain-forensic / --chain-on-critical /
--chain-upload को v1.x बैक-कॉम्पैट उपनामों के रूप में संरक्षित किया गया है।
निकाले गए टारबॉल पर ऑफलाइन फोरेंसिक के लिए स्नैपशॉट-परीक्षण ओवरराइड:
--root DIR, --version-string S, --cpsrvd-path P। पूर्ण फ्लैग सूची के लिए --help देखें
।
sessionscribe-mitigate.sh - शमन ऑर्केस्ट्रेटरडिफ़ॉल्ट रूप से केवल-पढ़ने योग्य (--check). स्थिति बदलने के लिए --apply जोड़ें।
आइडेम्पोटेंट: एक स्वस्थ होस्ट पर पुनः चलाना कोई प्रभाव नहीं डालता। परिवर्तन किसी भी फ़ाइल को छूने से पहले
/var/cpanel/sessionscribe-mitigation/ के अंतर्गत टाइमस्टैम्प्ड बैकअप लिखते हैं।```bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --apply
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --apply --only modsec --probe curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --only patch,preflight # pre-upcp gate
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --csv > host.csv curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --jsonl > host.jsonl
| चरण | यह क्या करता है |
|---|---|
| `patch` | `cpanel -V` बनाम प्रकाशित पैच्ड-बिल्ड सूची (जिसमें EL6 11.86.0.41, EL6/CL6 110.0.103, tier 124, WP² 136.1.7 शामिल हैं) |
| `preflight` | `/etc/yum.repos.d/threatdown.repo` को हटाता है; `epel-release` सुनिश्चित करता है; टूटे हुए गैर-बेस रिपॉजिटरी को अक्षम करता है ताकि `upcp` बीच में ही मर न जाए |
| `upcp` | यदि अनपैच्ड है, तो `/scripts/upcp --force --bg` शुरू करता है |
| `proxysub` | `proxysubdomains` + नए खाता प्रकार को सक्षम करता है; httpd कॉन्फ़िक को पुनर्निर्माण करता है |
| `csf` / `apf` / `runfw` | `TCP_IN`/`TCP6_IN`/`IG_TCP_CPORTS` से cpsrvd पोर्ट (2082/2083/2086/2087/2095/2096) हटाता है; लाइव iptables INPUT चेन को सत्यापित करता है |
| `apache` | `httpd` चल रहा है + `security2_module` लोड किया गया है |
| `modsec` | `modsec2.user.conf` में नियम `1500030` + `1500031` शामिल हैं; यदि अनुपस्थित हों तो तैनात करें (टाइमस्टैम्प्ड बैकअप, `httpd -t` सत्यापन, ग्रेसफुल रीलोड) |
| `probe` (opt-in) | `sessionscribe-remote-probe.sh` को `127.0.0.1` के विरुद्ध चलाता है ताकि व्यवहार में अस्वीकृतियों की पुष्टि हो सके |
CentOS / Alma / Rocky base/appstream/extras/updates/powertools रिपॉजिटरीज़ को `preflight` द्वारा **कभी** अक्षम नहीं किया जाता, भले ही वे वर्तमान में पहुंच योग्य न हों।
### निकास कोड
| निकास कोड | अर्थ |
|---|---|
| 0 | साफ - पैच किया गया + स्थिति ठीक, कोई कार्रवाई आवश्यक नहीं |
| 1 | सुधार सफलतापूर्वक लागू किया गया (`--apply` ने परिवर्तन किए) |
| 2 | मैन्युअल हस्तक्षेप आवश्यक (`--check` में चेतावनी देता है, `--apply` में विफल होता है) |
| 3 | उपकरण त्रुटि (गलत आर्ग्युमेंट्स, गायब निर्भरताएँ, `--apply` के लिए रूट नहीं) |
चरण चयन: `--only LIST`, `--no-PHASE`, `--no-fw` (शॉर्टहैंड `--no-csf --no-apf --no-runfw` के लिए)। आउटपुट: `--json` / `--jsonl` / `--csv`, `-o FILE`। पूर्ण फ्लैग सूची के लिए `--help` देखें।
### साठ-सेकंड स्मोक चेक```bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --list-phases # surface the phase API
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh | bash -s -- --check # safe read-only audit
echo "exit=$?" # 0 on a non-cPanel host
The orchestrator detects a non-cPanel host and exits clean — proving idempotency without needing a lab.
sessionscribe-remote-probe.sh - non-destructive fleet probeSupporting collateral. Runs the four-stage chain non-destructively
against a target: mint preauth → CRLF inject → propagate raw→cache →
verify via /json-api/version, then actively logs out. Verdict-
determining signal is the HTTP code at stage 4: 200, or 5xx with a
license body, is VULN; 401 or 403 is SAFE.
Every test session is tagged with an nxesec_canary_<nonce> attribute
for forensic cleanup, and no state-changing API calls are made.
Forged sessions are root-equivalent for ~1–3s between stage 3 and the
stage 5 logout — see the script header for the full safety model.```bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-remote-probe.sh | bash -s -- --target 1.2.3.4
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-remote-probe.sh | bash -s -- --target 1.2.3.4 --proxy example.com
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-remote-probe.sh
| bash -s -- --csv $(awk '{print "--target "$1}' fleet.txt) > fleet.csv
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-remote-probe.sh | bash -s -- --target 1.2.3.4 --fingerprint-only
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-remote-probe.sh | bash -s -- --cleanup
आउटपुट मोड: pretty (डिफ़ॉल्ट), `-q`/`--quiet`, `--oneline`, `--csv`,
`--json`. निकास कोड: `0` कोई VULN नहीं मिला, `1` केवल अनिर्णायक, `2`
एक या अधिक VULN। पूर्ण फ़्लैग सूची के लिए `--help` देखें जिसमें
`--auto-host-discover`, `--all`, `--fingerprint-only` अर्थ, और
स्टेज-2-केवल `--no-verify` मोड (पुराना, पैच किए गए होस्ट पर FP उत्पन्न करता है) शामिल हैं।
---
## सहायक सामग्री
### `modsec-sessionscribe.conf` - ModSecurity नियम पैक
`mitigate.sh --apply --only modsec` द्वारा स्वचालित रूप से तैनात किया गया। मैन्युअल इंस्टॉल:```bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/modsec-sessionscribe.conf \
| sudo tee /etc/apache2/conf.d/modsec/modsec2.user.conf >/dev/null
sudo apachectl -t && sudo /usr/local/cpanel/scripts/restartsrv_httpd
आरक्षित ID श्रेणी: 1500000–1500099. WHM-टोकन नियम एक संचालक-परिभाषित विश्वसनीय सूची के विरुद्ध @ipMatch का उपयोग करते हैं — तैनात करने से पहले फ़ाइल के शीर्ष पर CIDRs को संपादित करें।
[!IMPORTANT] ये नियम Apache के अंदर चलते हैं।
cpsrvdसीधे 2082/2083/2086/2087/2095/2096 पर सुनता है और Apache से स्वतंत्र रूप से पहुँच योग्य है। नियम पैक को प्रबंधन CIDRs पर cpsrvd-पोर्ट फ़ायरवॉलिंग के साथ जोड़ें।
sessionscribe-revsnap.sh - RE स्नैपशॉट संग्राहकबाइनरी डिफिंग के लिए प्रति-स्तर टारबॉल (बाइनरी, स्ट्रिंग्स, dynsym, disasm, Perl मॉड्यूल, रनटाइम लेआउट) कैप्चर करता है। upcp के आसपास निर्मित प्री/पोस्ट-पैच जोड़े कैप्चर करने के लिए।```bash
curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-revsnap.sh | bash
/scripts/upcp --force curl -fsSL https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-revsnap.sh | bash
Generalises beyond SessionScribe: हर भविष्य का cpsrvd CVE मोटे तौर पर उसी सतह पर उतरेगा, और प्री-पैच और पैच किए गए बिल्ड के लिए एक tarball जोड़ी, घंटों और दिनों के विश्लेषण के बीच का अंतर है। पूर्ण RE वॉकथ्रू के लिए [research article](https://rfxn.com/research/cpanel-sessionscribe-cve-2026-41940) देखें।
---
## Fleet उपयोग
> [!TIP]
> हर आर्टिफैक्ट संरचित आउटपुट (`--json`, `--jsonl`, `--csv`) उत्सर्जित करता है, जिसमें हर रिकॉर्ड पर `host`, `os`, `cpanel_version`, `ts` होता है। एक पास में सैकड़ों होस्टों पर `pdsh | jq` या `ansible -m script` रोल-अप के लिए डिज़ाइन किया गया।
वही curl-piped-bash प्रिमिटिव — प्रत्येक होस्ट नवीनतम स्क्रिप्ट को सीधे fetch और exec करें:```bash
IOC=https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-ioc-scan.sh
MIT=https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-mitigate.sh
PRB=https://raw.githubusercontent.com/rfxn/cpanel-sessionscribe/main/sessionscribe-remote-probe.sh
# IOC scan across fleet, JSONL to SIEM
for h in $(cat fleet.txt); do
ssh "$h" "curl -fsSL $IOC | bash -s -- --jsonl --quiet"
done | jq -c '.' > fleet-ioc.jsonl
# kill-chain reconciliation across fleet (no bundles on broad sweep)
ansible -i hosts cpanel -m shell \
-a "curl -fsSL $IOC | bash -s -- --full --no-bundle --jsonl" > fleet-forensic.jsonl
jq -r 'select(.phase=="summary" and .key=="verdict"
and .note=="COMPROMISED_PRE_DEFENSE") | .host' \
fleet-forensic.jsonl > pre-defense-hosts.txt
# bundle collection on the pre-defense subset
ansible -i pre-defense-hosts.txt all -m shell \
-a "curl -fsSL $IOC | bash -s -- --full --jsonl --bundle-dir /root/.ic5790-forensic"
# mitigation posture roll-up
pdsh -w cpanel-fleet "curl -fsSL $MIT | bash -s -- --jsonl --quiet" \
| jq -c 'select(.severity != "info")' > fleet-mitigate.jsonl
# remote probe sweep - exit 2 on any VULN (run from operator workstation)
curl -fsSL $PRB | bash -s -- --csv --quiet \
$(awk '{print "--target "$1}' fleet.txt) > fleet-probe.csv
प्रोब स्वतंत्र रूप से फ्लीट-सुरक्षित है (कैनरी-टैग किए गए सत्र, सक्रिय लॉगआउट, कोई स्थिति-बदलने वाली API कॉल नहीं). ऑन-होस्ट स्क्रिप्ट्स --quiet + स्ट्रक्चर्ड-आउटपुट फ्लैग्स का सम्मान करती हैं ताकि stdout पार्सर-क्लीन हो।
चार HTTP अनुरोध, कोई प्रमाणीकरण नहीं, कोई पूर्व शर्त नहीं:```mermaid sequenceDiagram autonumber actor A as attacker participant C as cpsrvd participant S as session file A->>C: POST /login/?login_only=1 with user=root, pass=wrong C-->>A: Set-Cookie · whostmgrsession=NAME,OBHEX A->>C: GET / · Authorization Basic b64(root:x + CRLF payload) · Cookie minus OBHEX C->>S: writes pass=x, user=root, hasroot=1, ... (CRLFs land verbatim) C-->>A: HTTP 307 · Location /cpsess[10digits]/ A->>C: GET /scripts2/listaccts · cookie only C->>S: propagate raw to cache · forged keys now readable C-->>A: 401 token denied (side-effect already done) A->>C: GET /cpsess[token]/json-api/version C-->>A: 200 OK means VULN · 403 means SAFE
निर्णय अनुरोध 4 पर HTTP कोड है। डिस्क पर सत्र फ़ाइल `/var/cpanel/sessions/raw/<sessname>` एकमात्र पश्च-घटना फोरेंसिक कलाकृति है। पूर्ण प्रारंभिक (दो रचनात्मक विषमताएँ — `filter_sessiondata` हर लेखन पथ पर नहीं है, एनकोडर `ob_part` के गायब होने पर शॉर्ट-सर्किट करता है) और प्रॉक्सी-एंडपॉइंट प्रवर्तन के लिए आर्किटेक्चरल तर्क [शोध लेख](https://rfxn.com/research/cpanel-sessionscribe-cve-2026-41940) में हैं।
---
## समझौता के संकेतक
जाली सत्र-फ़ाइल आकृति (शोषण के बाद `/var/cpanel/sessions/raw/<sessname>`):```
local_port=2087
hasroot=1
hulk_registered=1
pass=x
origin_as_string=address=127.0.0.1,app=whostmgrd,method=badpass
token_denied=1
local_ip_address=127.0.0.1
external_validation_token=cS9C19OfV0hCA4uD
cp_security_token=/cpsess6844364556
ip_address=127.0.0.1
user=root
tfa_verified=1
successful_internal_auth_with_timestamp=9999999999
port=39040
login_theme=cpanel
एक सामान्य preauth सत्र में कभी भी pass=, hasroot=1, user=root, tfa_verified=1, या successful_internal_auth_with_timestamp= शामिल नहीं होता है। इनमें से कोई भी origin_as_string=…method=badpass के साथ मिलकर नैदानिक है। now+365d से अधिक का नकली टाइमस्टैम्प मान (जैसे 9999999999) स्वतंत्र रूप से नैदानिक है।```bash
for f in /var/cpanel/sessions/raw/*; do
[ -f "$f" ] || continue
if grep -q '^token_denied=' "$f"
&& grep -q '^cp_security_token=' "$f"
&& grep -q '^origin_as_string=.*method=badpass' "$f"; then
echo "IOC0 hit: $f"
fi
done
एक्सेस-लॉग सिग्नल: सफल `200`/`302`/`307` प्रतिक्रियाएँ `/json-api/`, `/execute/`, या `/scripts2/` पथों पर गैर-बेसलाइन स्रोत IP से उसी सत्र विंडो में पूर्ववर्ती `/login/` 200 के बिना।
---
## प्रभावित बिल्ड```
11.86.0.41 (EL6/CL7) 11.110.0.97 11.118.0.63 11.124.0.35
11.126.0.54 11.130.0.19 11.132.0.29 11.134.0.20
11.136.0.5 110.0.103 (EL6/CL6 from .50)
WP Squared: 136.1.7
Tiers excluded from the vendor patch list have no in-place fix: 112, 114, 116, 120, 122, 128. Hosts on those tiers must be upgraded to a patched major series, migrated, or have their cpsrvd listeners firewalled until they are.
11.86.0.41 (EL6/CL7) was added in the 04/29 advisory revision; 11.130
was bumped from .18 to .19 in the same revision. A subsequent
revision added 11.124.0.35 (closing the prior gap on tier 124) and
110.0.103 as a direct upgrade target for EL6/CL6 hosts still on
v110.0.50.
तत्काल
sessionscribe-ioc-scan.sh चलाएं। एक पैच किया हुआ होस्ट अभी भी समझौता किया जा सकता है।आगे की कार्रवाई
modsec-sessionscribe.conf को modsec2.user.conf में @ipMatch विश्वास सूची सेट करके तैनात करें।प्रॉक्सी-एंडपॉइंट प्रवर्तन के लिए वास्तुशिल्प तर्क शोध लेख का समापन तीसरा भाग है।
cpsrvd, cpsrvd.so, या Cpanel/Session/*.pm को संशोधित नहीं करता। आपके टीयर के लिए cpanel-जारी बैक-पोर्ट ही वास्तविक फिक्स है।proxysub + फ़ायरवॉल चरण और ModSec नियम पैक विस्फोट त्रिज्या को कम करते हैं; अपग्रेड या माइग्रेशन ही स्थायी उत्तर है।nxesec_canary_<nonce> विशेषता से टैग करता है, और सक्रिय रूप से लॉग आउट करता है।ioc-scan पिछले शोषण के कलाकृतियों को ढूंढता है; यह उन्हें ठीक नहीं करता। इसके COMPROMISED फैसले को पूर्ण IR के लिए एक ट्रिगर मानें, निष्कर्ष नहीं।[!TIP] कोई बग मिला, छूटा हुआ IOC, गलत सकारात्मक, या ऑप्स फीडबैक है? GitHub issue खोलें - बग रिपोर्ट, जंगल में देखे गए IOC वेरिएंट, पैच/अनपैच होस्ट पर डिटेक्शन मिस, ModSec नियम गलत सकारात्मक, और सामान्य ऑपरेटर फीडबैक सभी का स्वागत है।
संवेदनशील प्रकटीकरण (लाइव शोषण साक्ष्य, ग्राहक डेटा, अभी तक सार्वजनिक नहीं हुए नए शोषण श्रृंखला) को GH Issues के माध्यम से नहीं, बल्कि Keybase या ईमेल के माध्यम से भेजा जाना चाहिए।
GPL v2. अलग-अलग फ़ाइल हेडर देखें।
SessionScribe घटना प्रतिक्रिया के दौरान गढ़ा गया - Ryan MacDonald, R-fx Networks.
| Exit | Code-state | Host-state | Triage कार्रवाई |
|---|
| 0 | CLEAN/PATCHED | CLEAN | कोई नहीं |
| 1 | VULNERABLE | (कोई भी) | cpsrvd पैच करें |
| 2 | INCONCLUSIVE | (कोई भी) | मैन्युअल कोड-स्टेट समीक्षा (साथ ही: टूल त्रुटि) |
| 3 | (कोई भी) | SUSPICIOUS | सेशन/एक्सेस लॉग समीक्षा करें |
| 4 | (कोई भी) | COMPROMISED | पूर्ण IR; बंडल + अपलोड |
| नियम | सतह | कार्रवाई |
|---|
1500030 | डिकोडेड Authorization: Basic पेलोड के अंदर CRLF | अस्वीकार, सभी स्रोत, सभी पथ |
1500031 | whostmgrsession कुकी में वैध ,OBHEX प्रत्यय गायब | अस्वीकार (गहन रक्षा) |
1500010 | /json-api/, /execute/, /acctxfer*/ पर Authorization: WHM | अस्वीकार जब स्रोत विश्वसनीय सूची में न हो |
1500020 | WebSocket डिस्पैच परिवार पर Authorization: WHM | अस्वीकार जब स्रोत विश्वसनीय सूची में न हो |
1500021 | SSE डिस्पैच पथ पर Authorization: WHM | अस्वीकार जब स्रोत विश्वसनीय सूची में न हो |