Someone left the template engine's eval() wide open and put a welcome mat on the internet
CVE-2026-61511 is an eval injection flaw in vBulletin's template runtime engine (vb5/template/runtime.php). An unauthenticated remote attacker can inject arbitrary PHP code through the template parsing pipeline, which the runtime evaluates via eval(), achieving full remote code execution as the web server user (typically www-data or apache). Officially patched versions span vBulletin 6.1.6 through 6.2.1 via patch-level updates; the vulnerable code also exists in older 6.x, 5.x, and 4.x releases per community analysis. The definitive fix ships in vBulletin 6.2.2.
The vendor rates this CRITICAL at 9.3 and noisgate agrees — the score is accurate. This is an unauthenticated, low-complexity, no-interaction RCE on software that is internet-facing by design. vBulletin's template engine has been the site of at least four prior RCE vulnerabilities (CVE-2019-16759, CVE-2020-17496, CVE-2025-48827, CVE-2025-48828), every one of which was exploited in the wild within days of disclosure. The bug class is deeply understood by attackers, the attack surface is a public HTTP endpoint, and there are zero meaningful friction points to justify any downgrade.
5 steps from start to impact.
Target discovery via Shodan/Censys
http.component:vBulletin) or Censys queries. Censys has previously cataloged ~45,000 exposed vBulletin instances globally. Version fingerprinting is trivial via HTML meta tags, X-Powered-By headers, or the presence of /core/install/ and /admincp/ paths.- Target runs vBulletin < 6.2.2 on a public IP
- None — vBulletin is internet-facing by design and easily fingerprinted
Craft eval injection payload for runtime.php
eval() call in the runtime. Prior vBulletin template RCE exploits used payloads like <vb:if condition='"passthru"($_POST["cmd"])'></vb:if> to bypass function-name filters using PHP's variable-function call syntax. This vulnerability follows the identical eval injection pattern in the runtime layer. No authentication required.- Knowledge of the injection point (public after advisory)
- No WAF blocking PHP code injection in POST body
- A properly tuned WAF with PHP code-injection signatures may block common payloads
- Attackers can trivially obfuscate — concat, base64, chr() — to bypass naive WAF rules
passthru, system, exec, eval, shell_exec) in POST parameters; IDS/IPS signatures for vBulletin template injection patterns; Nuclei template available from prior CVEsTemplate runtime eval() executes attacker code
eval() pipeline. The PHP code executes with the privileges of the web server process — www-data on Linux or IUSR/IIS_IUSRS on Windows. The attacker achieves arbitrary code execution. A typical first payload is a web shell (e.g., c99, b374k) or a reverse shell callback to attacker infrastructure.- The payload passes any remaining input sanitization in the template engine
- PHP
disable_functionsmay block some shell execution functions - SELinux/AppArmor in enforcing mode can restrict web server process capabilities
- PHP
open_basedircan limit filesystem traversal
Credential harvesting and database exfiltration
config.php to obtain MySQL/MariaDB credentials. The vBulletin database contains user credentials (hashed passwords), email addresses, IP logs, private messages, and session tokens — high-value data for credential stuffing, social engineering, and regulatory breach notifications. Bulk export via mysqldump or direct SQL queries is trivial.- Database credentials in config.php (default vBulletin behavior)
- Network path from web server to database server
- Network segmentation between DMZ web tier and database tier
- Database credentials may use least-privilege accounts
- Password hashes may use bcrypt (slow to crack offline)
Lateral movement from DMZ foothold
- Web server has network connectivity to internal segments
- Lack of microsegmentation between DMZ and internal networks
- Proper DMZ segmentation with strict egress filtering
- Internal network detection (NDR, IDS)
- MFA on internal services prevents reuse of harvested credentials
The supporting signals.
| In-the-wild exploitation | Not yet confirmed for CVE-2026-61511 specifically. However, every prior vBulletin template engine RCE (CVE-2019-16759, CVE-2020-17496, CVE-2025-48827/48828) was exploited within 1–4 days of disclosure. CVE-2025-48827 saw exploitation within 72 hours per KEVIntel honeypot data. Treat in-the-wild exploitation as imminent. |
|---|---|
| Proof-of-concept availability | No public PoC confirmed for CVE-2026-61511 as of 2026-07-27. The bug class has extensive prior art: Metasploit module exploit/multi/http/vbulletin_widget_template_rce, Nuclei templates, and standalone PHP exploit scripts from EgiX/Karma(In)Security all target the identical template eval injection pattern. Adaptation to this new endpoint is trivial for a skilled attacker. |
| EPSS score | Not yet scored (newly assigned CVE). Historical reference: CVE-2019-16759 scored 0.975 (97th percentile) and CVE-2025-48827 scored in the 97th+ percentile — pre-auth RCE in vBulletin consistently ranks among the most-likely-to-be-exploited CVEs. |
| KEV status | Not listed on CISA KEV as of 2026-07-27. Given the historical pattern, KEV addition is probable once in-the-wild exploitation is confirmed. |
| CVSS vector interpretation | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N — Worst-case web attack profile: network-reachable, low complexity, no attack requirements, no privileges, no user interaction, full CIA impact on the vulnerable system. Subsequent-system impact is None (limits automatic score to 9.3 vs 10.0). |
| Affected version ranges | Officially patched: vBulletin 6.1.6, 6.2.0, 6.2.1. Community analysis confirms vulnerable code in older 6.x (6.0.x–6.1.5), 5.x (5.0.0+), and 4.x. Versions below 6.1.6 are unsupported — no vendor patch available. |
| Fixed versions | vBulletin 6.2.2 (full release) or patch-level updates: 6.2.1 PL1, 6.2.0 PL1, 6.1.6 PL1 — available at members.vbulletin.com/patches.php. |
| Scanning / exposure data | Censys: ~45,000 exposed vBulletin instances globally (Censys advisory). TechnologyChecker: ~8,900 active domains running vBulletin. 6sense reports ~1,691 enterprise customers, 64% US-based. vBulletin's historical patching velocity is poor — many instances remained vulnerable to CVE-2019-16759 for *years*. |
| Disclosure date | Approximately early July 2026 based on vendor advisory and community discussion timing. vBulletin 6.2.2 release followed shortly after the patch-level updates. |
| Reporting researcher / org | Not publicly credited in available advisories. The vulnerability is in the same template engine attack surface extensively researched by Egidio Romano (EgiX) of Karma(In)Security for CVE-2025-48827/48828. |
noisgate verdict.
Pre-auth RCE on software that is internet-facing by design, with zero prerequisite friction — no authentication, no user interaction, no special configuration. The single most decisive factor is the complete absence of attacker prerequisites: any internet-reachable vBulletin instance below 6.2.2 is exploitable with a single HTTP request against the template runtime, and this exact bug class has been weaponized within days of disclosure in four prior instances (2019, 2020, 2025×2).
Why this verdict
- Zero friction in the attack chain: Unauthenticated, low-complexity, no-interaction RCE. Every prerequisite evaluates to 'freely available to any internet attacker.' There is no compounding downward pressure because there are no real-world narrowing factors — no auth gate, no race condition, no unusual configuration.
- Internet-facing by design: vBulletin is forum software — 100% of production deployments are internet-facing. Unlike internal-only software where exposure is a configuration mistake, exposure here is the intended operating model. Censys shows ~45,000 instances on the public internet. This is the opposite of the 'only 1% are exposed' downgrade factor.
- Historical weaponization precedent: Four prior vBulletin template engine RCE vulnerabilities were all exploited within 1–4 days. Metasploit modules, Nuclei templates, and standalone exploit scripts exist for the identical bug class. The attacker community treats vBulletin template eval injection as a solved problem — adaptation to a new injection point requires minimal effort.
- Role multiplier: vBulletin occupies the (b) typical role of an internet-facing application tier. It is not a canonical high-value-role component (not IdP, hypervisor, backup, CI/CD, etc.). However, compromise yields: (1) web server shell → initial-access foothold in DMZ, (2) database credentials via
config.php→ mass PII and credential exfiltration (emails, hashed passwords, IPs, private messages), (3) potential lateral-movement pivot to internal networks from the DMZ. The blast radius is host-to-tenant-to-DMZ scale. While this does not automatically trigger the CRITICAL floor via the high-value-role catalog, the pre-auth RCE profile with zero friction independently justifies CRITICAL — no floor override needed because friction alone does not push below CRITICAL. - Bug class maturity and poor patch adoption: Eval injection in PHP template engines is a thoroughly documented vulnerability class (CWE-95). vBulletin's installed base has a historically abysmal patching velocity — instances remained vulnerable to CVE-2019-16759 for years after patches were available. The combination of easy exploitation and slow patching makes real-world impact near-certain.
Why not higher?
The score is already at 9.3 CRITICAL. The only gap to a perfect 10.0 is that subsequent-system impact (SC/SI/SA) is scored None in the CVSS 4.0 vector — compromise is contained to the vBulletin host and its database without automatic chaining to adjacent systems. This accurately reflects that lateral movement requires additional attacker effort beyond the initial RCE.
Why not lower?
There are zero friction points in the attack chain. No authentication, no user interaction, no complex race condition, no unusual configuration prerequisite. The software is internet-facing by design with ~45,000 exposed instances globally. Every prior bug in this exact attack surface was weaponized within days. vBulletin's patching velocity is historically poor, meaning a large fraction of the installed base will remain vulnerable for months. Downgrading would require identifying at least one meaningful real-world constraint that narrows the exploitable population — none exists.
What to do — in priority order.
- Deploy WAF rules blocking PHP code injection on vBulletin template endpoints — Configure your WAF (Cloudflare, AWS WAF, F5 ASM, ModSecurity) to block HTTP requests containing PHP function names (
passthru,system,exec,eval,shell_exec,popen,proc_open,pcntl_exec) and template injection patterns (<vb:if,condition=) in POST body parameters targeting/vb5/template/,/ajax/render/,/ajax/api/endpoints. Deploy within the noisgate mitigation SLA of 3 days. This is a bypassable stopgap — obfuscation techniques (concatenation, base64, chr()) can evade naive string matching. - Apply the vendor patch or upgrade to vBulletin 6.2.2 immediately — Download the security patch for your version from members.vbulletin.com/patches.php — available for 6.2.1 PL1, 6.2.0 PL1, and 6.1.6 PL1. Alternatively, upgrade to vBulletin 6.2.2 which includes the fix natively. This is the definitive remediation. Target within the noisgate remediation SLA of 90 days, but given pre-auth RCE with imminent weaponization, push for this week.
- IP-restrict vBulletin admin and internal template endpoints — At the reverse proxy or WAF layer, restrict access to
/admincp/,/modcp/,/vb5/template/runtime.php, and AJAX API endpoints to known administrator IP ranges. The public-facing forum pages can remain open. Deploy within 3 days to shrink the attack surface while patching proceeds. - Take unsupported versions (< 6.1.6, any 5.x or 4.x) offline — The vendor only patches supported versions 6.1.6+. If you run vBulletin 5.x or 4.x, the vulnerable code exists but no vendor fix is available. Take these instances offline, put them behind an authenticated reverse proxy (e.g., Cloudflare Access, Tailscale Funnel with SSO), or begin emergency migration to 6.2.2+.
- Audit existing instances for indicators of compromise — Before patching, check for web shells in the vBulletin webroot (
find /path/to/vbulletin -name '*.php' -newer /path/to/vbulletin/config.php -mtime -30), unexpected modifications to template files, anomalous outbound connections from the web server process, and bulk database queries. Given the historical exploitation cadence, assume scanning has already begun.
- Network segmentation alone — vBulletin must be internet-facing to serve its purpose. Segmentation limits post-exploitation lateral movement but does not prevent the initial RCE on the web server itself.
- PHP
disable_functions— can restrict some shell execution functions but does not prevent theeval()injection itself. Attackers can fall back to PHP-native file I/O, socket functions, andmail()for data exfiltration, which are rarely disabled on vBulletin hosts. - Rate limiting / CAPTCHA — slows automated mass-scanning but does not prevent a targeted single-request exploit. CVE-2026-61511 is exploitable with one crafted HTTP POST.
- Upgrading PHP version alone — the vulnerability is in vBulletin's own template runtime code (
runtime.php), not a PHP engine bug. Running PHP 8.3 instead of 8.1 does not remediate the eval injection.
Crowdsourced verification payload.
Run on the vBulletin web server as any user with read access to the installation directory. Invoke: bash check_cve_2026_61511.sh /var/www/vbulletin. No root required — just filesystem read access. Outputs VULNERABLE, PATCHED, or UNKNOWN with exit codes 1, 0, 2 respectively.
#!/usr/bin/env bash
# check_cve_2026_61511.sh — Detect CVE-2026-61511 (vBulletin template runtime eval injection)
# Usage: bash check_cve_2026_61511.sh /path/to/vbulletin
# Exit: 0=PATCHED 1=VULNERABLE 2=UNKNOWN
set -euo pipefail
VB_PATH="${1:-}"
if [[ -z "$VB_PATH" ]]; then
echo "Usage: $0 /path/to/vbulletin"
exit 2
fi
# --- Locate version file ---
VERSION_FILE=""
for f in "$VB_PATH/core/packages/vbulletin/version.php" \
"$VB_PATH/packages/vbulletin/version.php" \
"$VB_PATH/includes/class_core.php" \
"$VB_PATH/core/includes/class_core.php"; do
[[ -f "$f" ]] && { VERSION_FILE="$f"; break; }
done
if [[ -z "$VERSION_FILE" ]]; then
echo "UNKNOWN — cannot locate vBulletin version file in $VB_PATH"
exit 2
fi
# --- Extract version ---
VERSION=$(grep -oP "(?:VERSION_BNUMBER|FILE_VERSION|\\\$version)\\s*=\\s*['\"]\\K[0-9]+\\.[0-9]+\\.[0-9]+" "$VERSION_FILE" 2>/dev/null | head -1)
if [[ -z "$VERSION" ]]; then
echo "UNKNOWN — cannot parse version from $VERSION_FILE"
exit 2
fi
echo "[*] Detected vBulletin version: $VERSION"
IFS='.' read -r MAJ MIN PAT <<< "$VERSION"
# --- 6.2.2+ is patched ---
if (( MAJ > 6 )) || (( MAJ == 6 && MIN > 2 )) || (( MAJ == 6 && MIN == 2 && PAT >= 2 )); then
echo "PATCHED — vBulletin $VERSION (>= 6.2.2) includes fix for CVE-2026-61511"
exit 0
fi
# --- Check for patched runtime.php on 6.1.6–6.2.1 ---
for rf in "$VB_PATH/core/vb5/template/runtime.php" \
"$VB_PATH/vb5/template/runtime.php"; do
if [[ -f "$rf" ]]; then
# Patch adds input sanitization before eval; check for patch marker
if grep -qE '(template_safe_eval|preg_replace.*eval.*sanitize|vb_template_verify)' "$rf" 2>/dev/null; then
MTIME=$(stat -c '%Y' "$rf" 2>/dev/null || stat -f '%m' "$rf" 2>/dev/null || echo 0)
MDATE=$(date -d "@$MTIME" '+%Y-%m-%d' 2>/dev/null || date -r "$MTIME" '+%Y-%m-%d' 2>/dev/null || echo 'unknown')
echo "PATCHED — vBulletin $VERSION with runtime.php patched (modified $MDATE)"
exit 0
fi
echo "[!] Found runtime.php at $rf — no patch signature detected"
break
fi
done
# --- Unsupported versions ---
if (( MAJ <= 4 )); then
echo "VULNERABLE — vBulletin $VERSION (v4.x, unsupported, NO vendor patch)"
exit 1
elif (( MAJ == 5 )); then
echo "VULNERABLE — vBulletin $VERSION (v5.x, unsupported, NO vendor patch)"
exit 1
elif (( MAJ == 6 && MIN == 0 )); then
echo "VULNERABLE — vBulletin $VERSION (v6.0.x, below supported patch range)"
exit 1
elif (( MAJ == 6 && MIN == 1 && PAT < 6 )); then
echo "VULNERABLE — vBulletin $VERSION (below supported patch range 6.1.6+)"
exit 1
fi
# --- 6.1.6–6.2.1 without patch ---
echo "VULNERABLE — vBulletin $VERSION (in affected range, no patch-level update detected)"
echo " -> Apply patch from https://members.vbulletin.com/patches.php or upgrade to 6.2.2"
exit 1If you remember one thing.
Sources
- vBulletin Official Security Patch Advisory (6.2.1, 6.2.0, 6.1.6)
- vBulletin 6.2.2 Release Discussion
- Karma(In)Security — vBulletin Template Engine RCE Technical Analysis
- Censys Advisory — vBulletin Exposure Data (~45,000 instances)
- CyberPress — Critical vBulletin Vulnerabilities Under Active Exploit
- Qualys ThreatPROTECT — vBulletin RCE Exploited in the Wild
- 6sense — vBulletin Market Share and Deployment Data
- vBulletin CVE History — CVEDetails
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.