Skip to content

CVE-2026-48611: Verified Reproduction

CVE-2026-48611: phpBB authentication bypass/account hijacking via OAuth login-link flow with arbitrary auth provider=apache

CVE-2026-48611 is verified against phpbb/phpbb · github. Affected versions: phpBB 3.3.0 through 3.3.16 and 4.0.0-a2 (default configuration, auth_method=db). Fixed in phpBB 3.3.17 released 2026-06-06. Vulnerability class: Auth Bypass. This critical reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00223.

REPRO-2026-00223 phpbb/phpbb · github Auth Bypass Jul 4, 2026 CVE entry .txt
Severity
CRITICAL
CVSS
9.8
Confidence
HIGH
Reproduced in
22m 9s
Tool calls
214
Spend
$4.83
01 · Overview

What Is CVE-2026-48611?

CVE-2026-48611 is a critical authentication-bypass vulnerability (CWE-305) in phpBB that lets an unauthenticated attacker hijack any known user account, including administrators, via the UCP login-link OAuth flow. Pruva reproduced it (reproduction REPRO-2026-00223).

02 · Severity & CVSS

CVE-2026-48611 Severity & CVSS Score

CVE-2026-48611 is rated critical severity, with a CVSS base score of 9.8 out of 10.

CRITICAL threat level
9.8 / 10 CVSS base
Weakness CWE-305: Authentication Bypass by Primary Weakness

Critical — the most severe class — typically remotely exploitable with severe impact. Treat as an emergency.

03 · Affected Versions

Affected phpbb/phpbb Versions

phpbb/phpbb · github versions phpBB 3.3.0 through 3.3.16 and 4.0.0-a2 (default configuration, auth_method=db) are affected.

How to Reproduce CVE-2026-48611

$ pruva-verify REPRO-2026-00223
or curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00223/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for CVE-2026-48611

Authorization bypass — reproduced
  • reached the target end-to-end
  • full exploit chain demonstrated
  • on the real production code path
  • high confidence
  • the upstream fix blocks the same trigger
Trigger

auth_provider=apache request parameter plus HTTP Basic Authorization header (PHP_AUTH_USER set to any existing username, e.g. admin); password deliberately wrong (x)

Attack chain
  1. Single unauthenticated POST to ucp.php?mode=login_link&auth_provider=apache&login_link_aikido=1 with header Authorization: Basic base64(admin:x) and body login_username=admin&login_password=x&login=Login
  2. apache provider returns LOGIN_SUCCESS without password check
  3. session_create(admin user_id=2)
How the agent worked 506 events · 214 tool calls · 22 min
22 minDuration
214Tool calls
130Reasoning steps
506Events
2Dead-ends
Agent activity over 22 min
Support
22
Hypothesis
2
Repro
238
Judge
19
Variant
115
Coding
105
0:0022:09

Root Cause and Exploit Chain for CVE-2026-48611

Versions: phpBB 3.3.0 through 3.3.16, and 4.0.0-a2. Default

CVE-2026-48611 is a critical unauthenticated authentication-bypass in phpBB 3.3.0–3.3.16 (and 4.0.0-a2). The UCP "login-link" flow (ucp.php?mode=login_link) lets an attacker choose which authentication provider handles the login via a fully attacker-controlled auth_provider request parameter. By selecting the bundled apache provider and sending an HTTP Basic Authorization header that carries any existing username (e.g. admin), an unauthenticated remote attacker obtains a valid phpBB session as that user — including administrators — without knowing the password. The apache provider trusts PHP_AUTH_USER from the Basic header and returns LOGIN_SUCCESS after a database lookup without ever validating the password, after which ucp_login_link calls $user->session_create(). The flaw is present in the default auth_method=db installation; OAuth does not need to be configured. Fixed in phpBB 3.3.17 (2026-06-06).

  • Package/component affected: phpBB/includes/ucp/ucp_login_link.php (attacker-controlled provider selection) combined with phpBB/phpbb/auth/provider/apache.php (password-less login()).
  • Affected versions: phpBB 3.3.0 through 3.3.16, and 4.0.0-a2. Default auth_method=db boards are vulnerable out of the box.
  • Risk level and consequences: Critical (CVSS 9.8). A single unauthenticated HTTP request hijacks any known account. Logging in as an administrator yields full board control (ACP access, user management, extension installation, persisted backdoors). Usernames are public on phpBB boards, so admin/moderator accounts are trivially targetable.

Impact Parity

  • Disclosed/claimed maximum impact: Unauthenticated remote account hijacking of arbitrary known accounts (including administrators) → full board compromise; no password, no prior access, no user interaction.
  • Reproduced impact from this run: Full parity. Against a real running phpBB 3.3.16 (Apache 2.4 + mod_php 8.2 + SQLite, default auth_method=db, installed via the official CLI installer) a single unauthenticated POST to ucp.php?mode=login_link&auth_provider=apache&login_link_aikido=1 with Authorization: Basic admin:x (password x deliberately wrong) returned a 302 response that set the session cookie phpbb3_..._u=2 (the administrator account, user_id=2, user_type=USER_FOUNDER). Reloading index.php with that stolen session rendered the page as the admin user and showed the Administration Control Panel link (adm/index.php) — an admin-only UI element — confirming a genuine administrator session. The same request against phpBB 3.3.17 left the session as anonymous (_u=1) and produced no admin session.
  • Parity: full.
  • Not demonstrated: N/A — the claimed impact (authz bypass / admin account takeover) was demonstrated end-to-end on the real product.

Root Cause

Two cooperating defects form the exploit chain:

  1. Attacker-controlled auth provider. In ucp_login_link::main() the provider is resolved from the request:

    // phpBB/includes/ucp/ucp_login_link.php (3.3.16)
    $provider_collection = $phpbb_container->get('auth.provider_collection');
    $auth_provider = $provider_collection->get_provider($request->variable('auth_provider', ''));
    

    The auth_provider value is taken verbatim from the request (GET or POST), so an attacker can force the use of any registered provider class under phpbb/auth/provider/, not only the board's configured auth_method.

  2. Password-less apache provider. phpbb/auth/provider/apache.php::login() decodes PHP_AUTH_USER/PHP_AUTH_PW from the HTTP Basic Authorization header, requires that PHP_AUTH_USER === $username, looks the user up in the database, and — for an active user — returns LOGIN_SUCCESS without comparing PHP_AUTH_PW to the stored password hash. This is intentional only when Apache itself is the authenticating proxy (.htpasswd); the provider simply trusts the username the proxy forwards. By driving this provider through the login-link flow, the attacker's own HTTP client becomes the "trusted proxy" and supplies any username it wants.

    Back in ucp_login_link::main(), a LOGIN_SUCCESS result with no error leads directly to:

    $user->session_create($login_result['user_row']['user_id'], false, false, true);
    $this->perform_redirect();
    

    i.e. a fully authenticated session for the chosen user is created and the browser is redirected to the index — all from one unauthenticated POST.

The login-link gate (get_login_link_data_array() requiring a non-empty login_link_* GET parameter) is trivially satisfied with dummy data such as login_link_aikido=1, so it provides no meaningful protection.

Fix (phpBB 3.3.17, ticket/17659). The login-link handling was moved out of ucp.php/ucp_login_link.php into a dedicated controller phpbb/ucp/controller/oauth.php. In ucp.php the login_link mode now redirects to that controller (phpbb_redirect_to_controller(...)), and the controller resolves the provider without the attacker-controlled argument:

// phpBB/phpbb/ucp/controller/oauth.php (3.3.17), link_account()
$auth_provider = $this->auth_collection->get_provider();   // no argument -> configured auth_method (db)

With the default db provider, login() actually verifies the password hash, so the wrong password (x) is rejected and no session is created. The auth_provider=apache trick is therefore no longer reachable. Key commits in release-3.3.16..release-3.3.17: 12c4cf6f78, c05603cc3a, 4a2962bfc8 ([ticket/17659] series — "Add new oauth link controller" / "Make account linking work via controller" / "Move login linking for oauth to controller").

Reproduction Steps

  1. Script: bundle/repro/reproduction_steps.sh (self-contained, idempotent; run with PRUVA_ROOT=<bundle dir> bash bundle/repro/reproduction_steps.sh).
  2. What it does:
    • Reuses (or creates) git worktrees of phpBB at release-3.3.16 (vulnerable) and release-3.3.17 (fixed) from the durable project cache mirror.
    • Builds a Docker image per version on php:8.2-apache (gd/intl/zip extensions, mod_rewrite, AllowOverride All) and runs the official phpBB CLI installer (install/phpbbcli.php install) with a SQLite backend and an admin/adminadmin founder account (user_id=2).
    • Starts each image as a running Apache+mod_php service and sends the real exploit through it (HTTP requests are issued from inside each container against 127.0.0.1:80, because the sandbox blocks host→container port publishing; this still crosses the genuine Apache/PHP request boundary and populates PHP_AUTH_USER/PHP_AUTH_PW via mod_php):
      POST /ucp.php?mode=login_link&auth_provider=apache&login_link_aikido=1
      Authorization: Basic base64(admin:x)
      Content-Type: application/x-www-form-urlencoded
      login_username=admin&login_password=x&login=Login
      
    • Asserts the vulnerable build sets the session cookie *_u=2 and that the index page, loaded with the stolen session, shows the admin username and the ACP link. Asserts the fixed build leaves the session anonymous (*_u=1) for the same request (both via ucp.php and directly via the new controller /app.php/user/oauth/link_account).
  3. Expected evidence: The vulnerable response is a 302 Found whose Set-Cookie headers include phpbb3_...._u=2 and a Location to the index; the fixed response is a 301 redirect to the controller (ucp.php path) / a 200 login-link form with a class="error" block and phpbb3_...._u=1 (controller path). The script exits 0 only when the vulnerable build hijacks admin and the fixed build blocks it.

Evidence

  • bundle/logs/reproduction_steps.log — full annotated run log (two consecutive successful runs).
  • bundle/logs/vuln_exploit_response.txt / bundle/logs/vuln_setcookie_summary.txt — vulnerable 3.3.16 exploit response. Excerpt:
    HTTP/1.1 302 Found
    Set-Cookie: phpbb3_c6ct2_u=1; ...; HttpOnly
    Set-Cookie: phpbb3_c6ct2_u=2; ...; HttpOnly          <-- admin user_id=2
    Location: http://localhost/index.php?sid=e7988db9...
    
  • bundle/repro/artifacts/vuln/index_with_session.htmlindex.php loaded with the stolen cookie; contains username-coloured">admin and the admin-only Administration Control Panel / adm/index.php link.
  • bundle/repro/artifacts/vuln/cookies.txt — Netscape cookie jar with phpbb3_..._u = 2.
  • bundle/logs/fixed_exploit_ctrl_response.txt / bundle/logs/fixed_setcookie_summary.txt — fixed 3.3.17 controller response. Excerpt: only Set-Cookie: phpbb3_9wg5u_u=1 (anonymous) and a <div class="error">...not available. Please restart the login process.</div> block; no _u=2, no redirect to the index.
  • bundle/repro/artifacts/fixed/exploit_ucp_response.txt — fixed ucp.php path returns 301 Moved Permanently to /app.php/user/oauth/link_account?... (no apache-provider login).
  • bundle/repro/runtime_manifest.json — runtime evidence manifest (entrypoint_kind=api_remote, service_started=true, healthcheck_passed=true, target_path_reached=true).
  • Environment: Docker php:8.2-apache (Apache/2.4.67, PHP/8.2.32, mod_php), phpBB release-3.3.16 and release-3.3.17, SQLite3 backend, default auth_method=db, board installed via php install/phpbbcli.php install.

Recommendations / Next Steps

  • Patch immediately. Upgrade every phpBB instance to 3.3.17 or later. This is the only complete fix.
  • Temporary workaround (pre-3.3.17, only if Apache/LDAP auth is unused): remove phpbb/auth/provider/apache.php and phpbb/auth/provider/ldap.php from the board root, and disable OAuth in the ACP until upgraded (per the phpBB team's urgent advisory).
  • Defense-in-depth: authentication providers must never be selectable from untrusted request input; provider resolution should always use the board-configured auth_method. The apache provider's trust model (proxy authenticated the user) should be gated to boards that actually configure Apache/LDAP front-auth, and should not be exposed through flows designed for OAuth.
  • Detection: hunt request logs for mode=login_link together with auth_provider=apache (in either query string or POST body); also watch for the body-only variant where mode=login_link and auth_provider=apache are in the POST body while the query string carries login_link_*=1.
  • Testing: add a regression test asserting that ucp.php?mode=login_link never honors an attacker-supplied auth_provider, and that the apache provider cannot grant LOGIN_SUCCESS without external-auth configuration.

Additional Notes

  • Idempotency: reproduction_steps.sh was executed twice consecutively; both runs exited 0 with identical verdicts. The script reuses cached worktrees and Docker images on subsequent runs (only container start/stop and the HTTP exploit are re-executed), so re-runs complete in a few seconds.
  • Surface match: the claimed surface is api_remote (HTTP endpoint). The proof drives the real Apache+mod_php endpoint ucp.php (and the fixed controller) with the actual exploit request, satisfying the api_remote/endpoint requirement; runtime_manifest.json records service_started, healthcheck_passed, and target_path_reached all true.
  • Sandbox networking note: host→container port publishing is blocked in this environment, so the script issues exploit traffic from inside each container via docker exec curl http://127.0.0.1:80/.... This still crosses the genuine Apache + mod_php request boundary (PHP_AUTH_USER/PHP_AUTH_PW are populated by mod_php from the Authorization: Basic header), and is equivalent to an external attacker hitting the deployed forum over HTTP.
  • Negative control: the identical exploit request against 3.3.17 does not create an admin session (_u=1), and ucp.php?mode=login_link is reduced to a redirect to the new OAuth controller, confirming the patch closes the attack path.

CVE-2026-48611 Reproduction Transcript

The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.

Full session Replay every step — scrub the timeline or play it back.

Event 1/40
0:001:17
0:00
session startedaccounts/fireworks/routers/glm-5p2-fast · CVE-2026-48611 · REPRO-20
0:02
0:04
web search
0:06
web search
0:09
0:14
0:16
web search
0:19
0:20
web search
0:22
0:27
0:28
web search
0:30
web search
0:48
0:48
extract_facts
no facts extracted
0:49
0:50
0:50
supportrepro
1:07
1:09
1:09
1:09
1:10
1:10
1:10
1:12
1:12
1:13
1:17

Artifacts and Evidence for CVE-2026-48611

Scripts, logs, diffs, and output captured during the reproduction.

bundle/ticket.md1.1 KB
bundle/ticket.json2.2 KB
bundle/AGENTS.repro.md0.5 KB
bundle/docker/Dockerfile2.3 KB
bundle/docker/apache-site.conf0.3 KB
bundle/docker/install-config.yml0.7 KB
bundle/repro/artifacts/vuln/exploit_response.txt0.8 KB
bundle/repro/artifacts/vuln/cookies.txt0.3 KB
bundle/repro/artifacts/vuln/index_with_session.html15.4 KB
bundle/repro/artifacts/fixed/exploit_ucp_response.txt1.4 KB
bundle/repro/artifacts/fixed/cookies_ucp.txt0.3 KB
bundle/repro/artifacts/fixed/exploit_ctrl_response.txt11.6 KB
bundle/repro/artifacts/fixed/cookies_ctrl.txt0.3 KB
bundle/repro/runtime_manifest.json1.0 KB
bundle/repro/validation_verdict.json1.0 KB
bundle/logs/reproduction_steps.log2.5 KB
bundle/logs/vuln_exploit_response.txt0.8 KB
bundle/logs/fixed_exploit_ctrl_response.txt11.6 KB
bundle/logs/vuln_setcookie_summary.txt0.2 KB
bundle/logs/fixed_setcookie_summary.txt0.2 KB
bundle/logs/vuln_variant.log4.3 KB
bundle/logs/vv_vuln_v5_resp.txt0.8 KB
bundle/logs/vv_fixed_v5ctrl_resp.txt11.6 KB
bundle/logs/vv_fixed_v1_register_resp.txt12.1 KB
bundle/logs/vv_fixed_v3_resp.txt11.7 KB
bundle/logs/vv_fixed_v4_resp.txt9.7 KB
bundle/logs/verify_fix.log1.2 KB
bundle/logs/verify_build_patched.log13.2 KB
bundle/coding/verify_artifacts/testA_response.txt11.6 KB
bundle/coding/verify_artifacts/testA_cookies.txt0.3 KB
bundle/coding/verify_artifacts/testB_response.txt0.8 KB
bundle/coding/verify_artifacts/testB_cookies.txt0.3 KB
bundle/coding/verify_artifacts/testB_index_with_session.html15.5 KB
bundle/coding/verify_artifacts/control_response.txt0.8 KB
bundle/coding/verify_artifacts/control_cookies.txt0.3 KB
bundle/coding/verify_result.json0.7 KB
bundle/repro/reproduction_steps.sh15.0 KB
bundle/repro/rca_report.md12.1 KB
bundle/coding/proposed_fix.diff1.8 KB
bundle/coding/verify_fix.sh13.2 KB
bundle/coding/summary_report.md12.8 KB
08 · How to Fix

How to Fix CVE-2026-48611

Upgrade phpbb/phpbb · github to phpBB 3.3.17 released 2026-06-06 or later.

Coming soon

Step-by-step mitigation and hardening guidance for CVE-2026-48611 — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: CVE-2026-48611

How does the phpBB auth_provider=apache bypass attack work?

An attacker sends a request to ucp.php?mode=login_link&auth_provider=apache with an HTTP Basic Authorization header carrying a known username (e.g. admin). The apache provider matches PHP_AUTH_USER against the submitted username, confirms the user exists in the database, and returns success — after which ucp_login_link calls $user->session_create() for that account, giving the attacker a valid session without knowing the password.

Which phpBB versions are affected by CVE-2026-48611, and where is it fixed?

phpBB 3.3.0 through 3.3.16 and 4.0.0-a2, in the default auth_method=db configuration, are affected. It is fixed in phpBB 3.3.17, released 2026-06-06.

How severe is CVE-2026-48611?

Critical — a single unauthenticated HTTP request hijacks any known account, and logging in as an administrator yields full board control (ACP access, user management, extension installation, persisted backdoors).

How can I reproduce CVE-2026-48611?

Download the verified script from this page and run it in an isolated environment against phpBB 3.3.0-3.3.16 with default auth_method=db. It sends an unauthenticated request to ucp.php?mode=login_link with auth_provider=apache and a Basic Authorization header naming a known username, then confirms a valid session is created for that account.
11 · References

References for CVE-2026-48611

Authoritative sources for CVE-2026-48611 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.