Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-34828 — listmonk’s Session Persistence After Password Reset and Password Change | Kitploit
Tools/GitHubGitHub/0xmrma/cve-2026-34828
Vulnerability AnalysisExploitationWeb SecurityPenetration TestingAuthentication
GitHub0xmrma/cve-2026-34828

CVE-2026-34828

listmonk’s Session Persistence After Password Reset and Password Change

View Repository
156 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-34828

listmonk’s Session Persistence After Password Reset and Password Change

Intro

I found this issue while reviewing listmonk, an open-source newsletter and mailing list manager, with a simple security question in mind:

When a user changes or resets a password, does the application actually terminate already-issued sessions?

In this case, the answer was no.

Previously issued authenticated sessions remained valid after both:

  • password reset
  • password change

That meant a stolen session cookie could survive the exact security events that users rely on to recover their account.

The issue was accepted and assigned CVE-2026-34828.

Project: listmonk on GitHub
CVE: CVE-2026-34828

This affected listmonk, a widely adopted project with 5M+ Docker pulls.

photo0

Attack Chain

stolen authenticated session → victim resets or changes password → old session remains valid → attacker retains account access after credential recovery


What listmonk Does

listmonk is a self-hosted mailing list and newsletter manager.

It provides:

  • admin authentication
  • user management
  • campaign creation
  • subscriber management
  • SMTP and operational settings
  • browser-based administration

That means its session model is a real security boundary.

The important question here was not whether listmonk supports password reset.

The real question was:

Does password reset or password change actually revoke attacker persistence if a session has already been stolen?

In this case, it did not.


Why This Bug Was Worth Looking At

A lot of security reviews focus too narrowly on login bypasses and obvious privilege escalation.

That misses an important class of weaknesses:

recovery failures

If a user changes or resets a password, that action is supposed to be meaningful.
It is supposed to reduce trust in older credentials and old authentication state.

If an attacker already has a valid session and that session survives the recovery event, then the victim has not actually recovered the account fully.

That was the issue here.

This was not a login validation bug. It was not a crypto issue. It was not a password hashing failure.

It was a session lifecycle failure:

  • password state changed,
  • account recovery occurred,
  • but old sessions were still trusted.

That is enough to create a real vulnerability.


The Boundary I Focused On

I did not approach listmonk by randomly hitting endpoints and hoping one would fall over.

The stronger path was to identify the highest-value trust boundary first.

For authentication-heavy software, one of the best boundaries to test is this:

Do security-sensitive account changes revoke previously trusted sessions?

That question usually becomes interesting around:

  • password reset
  • password change
  • 2FA changes
  • account recovery flows

In listmonk, the strongest signal came from the first two.

That is where the issue became clear.


Root Cause

The bug was not that password changes failed.

The bug was that sessions outlived them.

From source review, the password reset flow:

  • generated and validated a one-time reset token,
  • updated the password,
  • created a new session,

but there was no visible revocation of older sessions.

The same pattern appeared in the authenticated password change flow:

  • the password was updated,
  • but older already-issued sessions were not invalidated.

That behavior matched the live results exactly.

Relevant code areas I reviewed were:

  • cmd/auth.go for forgot/reset behavior
  • cmd/users.go for authenticated profile updates
  • internal/core/users.go for password update handling

Why this is exploitable

Because session theft is a real attack condition.

Once an attacker obtains a valid authenticated session cookie through any means such as:

  • browser compromise
  • malware
  • shared workstation access
  • XSS in another component
  • proxy or debugging leakage
  • accidental cookie exposure

the victim should be able to terminate that attacker persistence by changing or resetting the password.

Here, they could not.

The attack chain was straightforward:

  • attacker has a valid session cookie
  • victim performs password reset or password change
  • old password becomes invalid
  • new password works
  • attacker’s old session still authenticates successfully

That is the whole vulnerability.


What Makes This a Security Issue, Not Just Application Behavior

The important distinction is persistence after recovery.

Plenty of applications treat password change as a purely credential-level event. That is not enough.

The real question is not:

“Did the password value change in storage?”

The real question is:

“Did the trust relationship attached to older sessions get revoked?”

In listmonk, it did not.

That turns what could have been ordinary account maintenance into incomplete security recovery.

That is the difference between:

  • ordinary session continuity
  • and a real security weakness

PoC

I validated the issue in two separate flows.

Case 1: Password reset does not revoke existing sessions

First, I created a normal test user and logged in, saving the authenticated session cookie.

Then I triggered the forgot-password flow, captured the reset link, and reset the password.

After reset:

  • the old password no longer worked
  • the new password worked
  • but the old pre-reset session cookie still authenticated successfully

A representative validation request looked like this:

GET /api/profile HTTP/1.1
Host: 127.0.0.1:9000
Cookie: session=<old_pre_reset_session>

And the server still returned:

HTTP/1.1 200 OK
Content-Type: application/json

with the authenticated profile.

That established the core claim:

  • recovery completed,
  • credentials changed,
  • but existing session trust remained intact.

Case 2: Password change does not revoke parallel active sessions

I then validated the same class of bug in the authenticated password change flow.

I logged in twice as the same user and saved two valid authenticated sessions:

  • session A
  • session B

Using session A, I changed the password through the profile update endpoint.

Example request:

PUT /api/profile HTTP/1.1
Host: 127.0.0.1:9000
Cookie: session=<session_A>
Content-Type: application/json

{
  "name":"victim1",
  "email":"[email protected]",
  "password":"VictimChanged123"
}

After that:

  • the old password no longer worked
  • the new password worked
  • but session B remained valid

A follow-up request using session B still returned authenticated data from /api/profile.

That proved the issue was not limited to the forgot/reset path.
It affected normal authenticated password changes too.


Why the Two Reproductions Matter

One reproduction would already have been enough to show a problem.

But validating both flows mattered for two reasons.

First

It showed the bug was not isolated to one edge-case recovery path.

The same security property failed in:

  • unauthenticated recovery-driven password reset
  • authenticated in-session password change

Second

It made the issue harder to dismiss as accidental business logic.

This was clearly a broader session management weakness:

  • password state changed,
  • but existing sessions remained trusted.

That gave the issue much stronger security weight.


TOTP Validation

I also tested the reset flow on a TOTP-enabled account because I wanted to know whether password reset would silently weaken or bypass 2FA expectations.

What I confirmed was:

Download Tool