The core of the vulnerability lies in the password reset process, specifically within the Idno\Pages\Account\Password\Reset class. The getContent() method was responsible for a critical information leak. It would fetch the secret password reset token directly from the database and embed it within a hidden input field on the password reset page. This meant that any attacker could request a password reset for a victim and then simply view the HTML source of the reset page to steal the token.
The postContent() method in the same class compounded the issue. It failed to properly validate the token provided by the user. Instead of comparing the user's token with the stored one, it would fetch the stored token and proceed if one existed, effectively bypassing the check. This allowed an attacker, armed with the leaked token, to set a new password for the account, leading to a full account takeover.
A secondary, less severe vulnerability was also addressed in the same patch within Idno\Pages\Account\Password::postContent(). This function's behavior differed based on whether a requested email existed, allowing attackers to confirm valid user accounts (user enumeration). The patch remediated these issues by introducing timing-safe token comparison (hash_equals) and ensuring the sensitive token is never exposed to the client. It also standardized the response for password reset requests to prevent user enumeration.