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:resetPassword() verifies that the proposed password was checked against the password policy:
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:
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 isSilverAdmin in domain 0:
GET request:
302 redirect to the application, and sets an authenticated JSESSIONID:

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. TargetingSilverAdmin 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-policycheckId should not authorize a password change and should not be reusable across accounts.

