{"id":"CVE-2026-82840","kind":"vulnerability","aliases":["CVE-2026-82840"],"related":[],"title":"Apache Wicket: session id not renewed on repeat sign-in, enabling fixation","description":"Session fixation in Apache Wicket.\n\norg.apache.wicket.authroles.authentication.AuthenticatedWebSession is the authentication base class of Wicket's role-based security module, and its signIn(String, String) method is the entry point through which an application authenticates a session. Renewing the container session id at that point is the standard defence against an attacker who has fixed a session id in a victim's browser, and Wicket provides that renewal as org.apache.wicket.Session#changeSessionId(), whose documentation directs callers to invoke it on login for exactly that reason.\n\nAuthenticatedWebSession#signIn(String, String) calls it inside a guard that succeeds only on the first transition of the session's signed-in flag. The session id is therefore renewed when a session first signs in, and is not renewed when a session that is already signed in authenticates again. signIn(String, String) returns true either way, so neither the caller nor the application can tell that the renewal did not happen.\n\nAn application is affected where it authenticates through AuthenticatedWebSession, which AuthenticatedWebApplication requires and which the shipped UsernamePasswordPanel uses, and where a session that is already signed in can authenticate again: a step-up prompt before a sensitive action, an account switch, or simply a sign-in form that stays reachable once the user is signed in. Nothing in the module hides that form from a signed-in session. Reaching the defect also requires an attacker to place a session id of their choosing in the victim's browser. JSESSIONID is set by the servlet container rather than by Wicket, so that needs a position Wicket does not grant, such as control of a host under the same registrable domain or a container configured to carry the session id in the URL, and the planted session has to be one the attacker has already signed in on, because a session that is not yet signed in does have its id renewed by the victim's authentication. An authentication attempt that fails signs the session out and closes the window. Applications that renew the session id in their own code after a successful authentication are not affected.\n\nAs a workaround, renew the session id from the application's own code on every successful authentication, by calling Session#changeSessionId() at the end of the authenticate(String, String) implementation.\n\nThis issue affects Apache Wicket: from 8.18.0 through 8.19.0, from 9.23.0 through 9.24.0, from 10.9.0 through 10.11.0.\n\nUsers are recommended to upgrade to version 8.20.0, 9.25.0 or 10.12.0, which fix the issue.","summary":"Apache Wicket's role-based authentication base class renews the session id only on the first sign-in, so a session that is already signed in and authenticates again keeps its id. An attacker who has planted a session id they already signed in on in a victim's browser can then retain access to the victim's authenticated session.","severity":"high","cvss":7.2,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["apache-wicket","java","package","web-applications"],"not_affected_if":["auth-required","default-config"],"how_to_check":"- Check the Wicket version in the project's build file (for example `mvn dependency:tree | grep wicket` or the Gradle dependency report) against the affected ranges.\n- Look for applications that extend `AuthenticatedWebApplication` or use `AuthenticatedWebSession` and whether their `authenticate(String, String)` code calls `Session#changeSessionId()`.\n- Check whether a sign-in form stays reachable for an already signed-in session, such as a step-up prompt or account switch.","fix":"- Apache Wicket 8.x: upgrade to `8.20.0`\n- Apache Wicket 9.x: upgrade to `9.25.0`\n- Apache Wicket 10.x: upgrade to `10.12.0`","status":"open","published_at":"2026-11-01T22:17:48+00:00","first_seen_at":"2026-11-01T22:22:25+00:00","triaged_at":"2026-11-01T22:22:50+00:00","updated_at":"2026-11-01T22:22:50+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-01T22:22:50Z","model":"claude-haiku-5-5","output":{"fix":"- Apache Wicket 8.x: upgrade to `8.20.0`\n- Apache Wicket 9.x: upgrade to `9.25.0`\n- Apache Wicket 10.x: upgrade to `10.12.0`","reach":"internet","title":"Apache Wicket: session id not renewed on repeat sign-in, enabling fixation","impact":"high","summary":"Apache Wicket's role-based authentication base class renews the session id only on the first sign-in, so a session that is already signed in and authenticates again keeps its id. An attacker who has planted a session id they already signed in on in a victim's browser can then retain access to the victim's authenticated session.","audience":"developers","category":"package","nicknames":[],"who_cares":["apache-wicket","java","web-applications"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"attacker keeps access to a victim's signed-in session","analyst_note":"","how_to_check":"- Check the Wicket version in the project's build file (for example `mvn dependency:tree | grep wicket` or the Gradle dependency report) against the affected ranges.\n- Look for applications that extend `AuthenticatedWebApplication` or use `AuthenticatedWebSession` and whether their `authenticate(String, String)` code calls `Session#changeSessionId()`.\n- Check whether a sign-in form stays reachable for an already signed-in session, such as a step-up prompt or account switch.","plain_action":"","needs_analyst":false,"not_affected_if":["auth-required","default-config"],"who_is_affected":"Applications built on Wicket's AuthenticatedWebSession that authenticate users and allow sign-in again while already signed in, such as step-up prompts, account switches, or a login form left reachable after sign-in. Applications that call Session#changeSessionId() themselves after every successful authentication are not affected, and an attacker must be able to plant a session id in the victim's browser.","user_interaction":"yes","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000833,"input_tokens":4805,"output_tokens":704,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':15A,18A '-82840':16A,19A '10.11.0':489C '10.12.0':500C '10.9.0':487C '8.18.0':479C '8.19.0':481C '8.20.0':497C '9.23.0':483C '9.24.0':485C '9.25.0':498C 'access':83B 'account':285C 'action':283C 'affect':248C,442C,475C 'alreadi':53B,71B,218C,269C,390C 'also':319C 'apach':1A,21B,28B,93C,476C 'apache-wicket':20B 'applic':27B,122C,236C,246C,426C,452C 'attack':63B,140C,322C,388C 'attempt':415C 'authent':34B,57B,88B,98C,123C,221C,251C,273C,412C,414C,439C,459C,469C 'authenticatedwebappl':255C 'authenticatedwebsess':173C,253C 'base':33B,35B,99C,106C 'browser':79B,151C,335C 'call':177C,461C 'caller':163C,233C 'carri':372C 'changesessionid':159C,463C 'choos':330C 'class':36B,100C 'close':423C 'code':435C,455C 'configur':370C 'contain':128C,342C,369C 'control':358C 'cve':14A,17A 'defect':318C 'defenc':137C 'direct':162C 'document':161C 'domain':366C 'either':228C 'enabl':12A 'end':466C 'entri':117C 'everi':457C 'exact':170C 'fail':417C 'first':44B,187C,206C 'fix':143C,502C 'fixat':13A,91C 'flag':196C 'form':293C,309C 'grant':355C 'guard':181C 'happen':244C 'hide':307C 'host':361C 'id':4A,40B,61B,69B,130C,146C,199C,327C,375C,406C,431C,449C 'implement':472C 'insid':179C 'invok':165C 'issu':474C,504C 'java':23B 'jsessionid':336C 'keep':59B 'login':168C 'method':114C 'modul':108C,306C 'need':349C 'neither':231C 'noth':303C 'one':386C 'org.apache.wicket.authroles.authentication.authenticatedwebsession':95C 'org.apache.wicket.session':158C 'packag':24B 'place':324C 'plant':66B,381C 'point':118C,133C 'posit':351C 'prompt':279C 'provid':154C 'rather':343C 'reach':316C 'reachabl':296C 'reason':172C 'recommend':492C 'registr':365C 'renew':6A,37B,126C,156C,202C,212C,241C,407C,428C,446C 'repeat':8A 'requir':256C,320C 'retain':82B 'return':226C 'role':32B,105C 'role-bas':31B,104C 'secur':107C 'sensit':282C 'servlet':341C 'session':3A,39B,50B,68B,89B,90C,125C,129C,145C,191C,198C,205C,215C,266C,315C,326C,374C,382C,396C,420C,430C,448C,462C 'set':338C 'ship':260C 'sign':10A,46B,54B,72B,194C,207C,219C,270C,291C,301C,313C,391C,401C,418C 'sign-in':9A,45B,290C 'signed-in':193C,312C 'signin':111C,174C,223C 'simpli':288C 'standard':136C 'stay':295C 'step':277C 'step-up':276C 'string':112C,113C,175C,176C,224C,225C,470C,471C 'succeed':183C 'success':438C,458C 'switch':286C 'tell':238C 'therefor':201C 'transit':188C 'true':227C 'upgrad':494C 'url':378C 'use':262C 'user':299C,490C 'usernamepasswordpanel':261C 'version':496C 'victim':77B,86B,149C,333C,410C 'way':229C 'web':26B 'web-appl':25B 'whose':160C 'wicket':2A,22B,29B,94C,102C,153C,346C,352C,477C 'window':425C 'workaround':445C 'yet':400C","nicknames":[],"mitigations":[],"who_affected":"Applications built on Wicket's AuthenticatedWebSession that authenticate users and allow sign-in again while already signed in, such as step-up prompts, account switches, or a login form left reachable after sign-in. Applications that call Session#changeSessionId() themselves after every successful authentication are not affected, and an attacker must be able to plant a session id in the victim's browser.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"first_public_at":"2026-11-01T22:17:48+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"security@apache.org","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-82840","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-82840","severity":null,"published_at":"2026-11-01T22:17:48+00:00","modified_at":"2026-11-01T22:17:48+00:00","first_seen_at":"2026-11-01T22:22:25+00:00","fetched_at":"2026-11-01T22:22:25+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}