Skip to main content

Summary

ChangePasswordHandler in the Silverpeas CredentialsServlet through version 6.4.6 does not verify the requester’s identity before changing a password. An unauthenticated remote attacker can reset the password of an arbitrary account, including the built-in SilverAdmin administrator account, resulting in complete account takeover.

Technical details

The legacy password-change handler reads the target login, domain, new password, and check identifier directly from the request:
The only gate before resetPassword() verifies that the proposed password was checked against the password policy:
This check does not bind the request to the target account or prove that the caller controls it. The password-policy resource is deliberately reachable without a valid session:
An unauthenticated attacker can therefore obtain a valid checkId for an attacker-chosen password, then pair it with any Login and DomainId in the reset request.

Reproduction

1. Obtain a password-policy check identifier

This request does not require a session:
The service returns a UUID for the checked password:
Unauthenticated password-policy request returning a checkId

Obtaining checkId from the public password-policy endpoint

2. Reset the target account

Supply the check identifier with the target username and domain. The built-in administrator is SilverAdmin in domain 0:
The same parameters also work in a GET request:
The response changes the account’s password, returns a 302 redirect to the application, and sets an authenticated JSESSIONID:
Password reset response setting an authenticated SilverAdmin session

Resetting SilverAdmin and receiving an authenticated session

Complete unauthenticated account-takeover sequence

Impact

An unauthenticated remote attacker needs only the account’s login name and domain identifier to replace its password. Targeting SilverAdmin gives the attacker full administrative access. The same sequence works against other local accounts.

Remediation

Upgrade to Silverpeas 6.4.7 or later. A password reset must require a server-issued, single-use token bound to the target account and a validated recovery session. A password-policy checkId should not authorize a password change and should not be reusable across accounts.

References

Last modified on September 8, 2026