Security Advisories (1)
CVE-2026-15689 (2026-08-15)

Dancer2::Plugin::Auth::Extensible versions through 0.713 for Perl allow password reset link poisoning via the request Host header in _default_email_password_reset and _default_welcome_send. Both default emails emit a link of the form `$base/login/$code`, whose authority comes from the request Host header, or from X-Forwarded-Host under behind_proxy (obtained from Dancer2's request->base function). A POST to /login carrying submit_reset and a username needs no authentication: it stores a fresh reset code against that account and mails the account holder a link to a host of the sender's choosing. The welcome mail takes the same path when the application calls create_user with email_welcome set. Through 0.711 the handlers read `request->uri_base` and `request->base` directly; Versions 0.712 and later provide an uri_base configuration key that defaults to the untrusted `request->uri_base` when unset. The default configuration with reset_password_handler enabled and the default message text, a recipient who follows the link hands a working reset code to the sender's host, which is enough to take over the account.

NAME

Dancer2::Plugin::Auth::Extensible::Role::Provider - base role for authentication providers

DESCRIPTION

Base Moo::Role for authentication providers.

Also provides secure password matching which automatically handles crypted passwords via Crypt::SaltedHash.

ATTRIBUTES

plugin

The calling Dancer2::Plugin::Auth::Extensible object.

Required.

disable_roles

Defaults to the value of "disable_roles" in Dancer2::Plugin::Auth::Extensible.

encryption_algorithm

The encryption_algorithm used by "encrypt_password".

Defaults to 'SHA-512';

METHODS

match_password $given, $correct

Matches $given password with the $correct one.

encrypt_password $password

Encrypts password $password with "encryption_algorithm" and returns the encrypted password.

METHODS IMPLEMENTED BY PROVIDER

The following methods must be implemented by the consuming provider class.

required methods

  • authenticate_user $username, $password

    If either of $username or $password are undefined then die.

    Return true on success.

optional methods

The following methods are optional and extend the functionality of the provider.

  • get_user_details $username

    Die if $username is undefined. Otherwise return a user object (if appropriate) or a hash reference of user details.

  • get_user_roles $username

    Die if $username is undefined. Otherwise return an array reference of user roles.

  • create_user %user

    Create user with fields specified in %user.

    Method should croak if username key is empty or undefined. If a user with the specified username already exists then we would normally expect the method to die though this is of course dependent on the backend in use.

    The new user should be returned.

  • get_user_by_code $code

    Try to find a user which has pw_reset_code field set to $code.

    Returns the user on success.

  • set_user_details $username, %update

    Update user with $username according to %update.

    Passing an empty or undefined $username should cause the method to die.

    The update user should be returned.

  • set_user_password $username, $password

    Set the password for the user specified by $username to <$password> encrypted using "encrypt_password" or via whatever other method is appropriate for the backend.

  • password_expired $user

    The $user should be as returned from "get_user_details". The method checks whether the user's password has expired and returns 1 if it has and 0 if it has not.