用于 CVE-2026-41940(SessionScribe)的检测、缓解与逆向工程工具集:该 cPanel/WHM 未认证会话伪造漏洞于 2026-04-28 披露。包含纵深防御主动缓解垫片、ModSec 规则包、远程探针、主机内 IOC 扫描器以及分层 RE 快照收集器。GPL v2。
cPanel 和 WHM 中的严重未认证 RCE。 四个 HTTP 请求即可通过向预认证会话的密码字段注入 CRLF 来伪造 root 会话。 无需认证、无需任何前置条件,所有受支持的版本分支均受影响。 由 Sina Kheirkhah 于 2026-04-28 披露 / watchTowr Labs。
[!IMPORTANT] 112、114、116、120、122、128 分支没有供应商补丁。 这些 分支上的每个构建版本都存在漏洞;升级或迁移是唯一 持久的修复方案。在此之前:将 TCP/2082、2083、2086、2087、2095、2096 通过防火墙限制到管理网段(
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`。
---
## 工具
按操作优先级排列。每个工件都会输出结构化结果(`--json` / `--jsonl` / `--csv`),并以 `host`、`os`、`cpanel_version`、`ts` 作为键,便于机群汇总。
| 工具 | 作用 | 运行位置 |
|---|---|---|
| **[`sessionscribe-ioc-scan.sh`](#sessionscribe-ioc-scansh---ioc-ladder--kill-chain)** | 一流的分类排查。IOC 阶梯、代码状态 + 主机状态判定、杀伤链重建、IR 捆绑包。 | 在 cPanel 主机上 |
| **[`sessionscribe-mitigate.sh`](#sessionscribe-mitigatesh---mitigation-orchestrator)** | 关闭攻击窗口。分阶段缓解:补丁检查、防火墙、proxysub、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` 即可内联运行取证阶段(防御时间线、攻击
输入、对账、杀伤链渲染器、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 破坏探测。已修补的主机如果之前的利用在磁盘上留下了 IOC,仍可能以退出码 4 退出。
| 退出码 | 代码状态 | 主机状态 | 分流处置 |
|---|---|---|---|
| 0 | CLEAN/PATCHED | CLEAN | 无 |
| 1 | VULNERABLE | (任意) | 修补 cpsrvd |
| 2 | INCONCLUSIVE | (任意) | 手动代码状态审查(也指:工具错误) |
| 3 | (任意) | SUSPICIOUS | 审查会话/访问日志 |
| 4 | (任意) | COMPROMISED | 全面 IR;打包 + 上传 |
带有 nxesec_canary_<nonce> 标签(由远程探测留下)的会话会被归类为 PROBE_ARTIFACT,不会升级为 COMPROMISED。
--full 将每个 IOC 与防御激活情况进行比对,将每个 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` | 在 `Cpanel/Session/*.pm` 中 grep 补丁后的哨兵模式(`no-ob:` 解码分支) |
| `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-wipe、BTC 索引、`nuclear.x86`、`sptadm` 经销商、`__S_MARK__` 收割器、可疑 SSH 密钥(可用 `--no-destruction-iocs` 跳过) |
| `probe`(可选) | 向 `127.0.0.1:2087` 发送单个标记 GET - 确认 cpsrvd 可响应。**不**尝试绕过 |
**`--full` 取证阶段**(检测后内联运行):