Bugzilla: Fehler in Zugangskontrolle

Eine Sicherheitslücke in Bugzilla hat zur Folge, dass sich ein entfernter Angreifer unerlaubt auf Bugzilla-Systemen registrieren kann. Ursache hierfür ist eine Schwachstelle in dem E-Mail-basieten Registrierungsprozess. Dieser Prozess setzt voraus, dass der Anwender einen vom System generierten Token geschickt bekommt und diesen dann bereitstellen muss, um zu die E-Mail-Adresse zu verifizieren. Hierbei kann Bugzilla so eingestellt werden, dass es nur E-Mail-Adressen einer bestimmten Domain zulässt, zum Beispiel mozilla.org für bugzilla.mozilla.org. Dies stellt eine einfache Zugangskontrolle dar.
Gibt der Anwender eine E-Mail-Adresse an, so wird diese zusammen mit einem im Bugzilla-Code generierten Token in der Datenbank abgelegt. Die Adresse wird
dabei in eventdata abgelegt. Nach Eingabe der Adresse wird diese zunächst geprüft, bevor sie in die Datenbank geschrieben wird:

sub check_and_send_account_creation_confirmation {
    my ($self, $login) = @_;
# Check the email address of the user
    $login = $self->check_login_name($login);
    if ($login !~ /$creation_regexp/i) {
        ThrowUserError('account_creation_restricted');
    }
    # Create and send a token for this new account.
    require Bugzilla::Token;
    Bugzilla::Token::issue_new_user_account_token($login);
}

Anschließend werden die Daten in die Datenbank eingetragen und eine Mail mit dem Token an den Benutzer geschickt.   

sub issue_new_user_account_token {
    my $login_name = shift; # The email address we entered
    my $template = Bugzilla->template;
    my $vars = {};
# Create the new token in the DB
    my ($token, $token_ts) = _create_token(undef, 'account', $login_name);
# Set the email address, expiration date, and token as the email message variables
# (Bugzilla->params->{'emailsuffix'} is empty by default [and in almost all installations])
    $vars->{'email'} = $login_name . Bugzilla->params->{'emailsuffix'};
    $vars->{'expiration_ts'} = ctime($token_ts + MAX_TOKEN_AGE * 86400);
    $vars->{'token'} = $token;
# Render the email message using the complied variables
    my $message;
    $template->process('account/email/request-new.txt.tmpl', $vars, \$message)
      || ThrowTemplateError($template->error());
# Send the confirmation email
    MessageToMTA($message);
}

Das Problem besteht nun in dem Datenbank-Datentyp unter dem die E-Mail-Adresse in eventdata abgelegt hat. Hierbei wird das tinytext-Format verwendet.
Dieser Datentyp ist auf 255 Zeichen beschränkt, was eigentlich für jede E-Mail-Adresse ausreichen sollte. Allerdings besteht hier nun die Sicherheitslücke. Da Bugzilla zur Registrierung den Domain-Namen heranzieht, kann der Angreifer einfach eine so lange Adresse angeben, dass der wahre Domain-Name jenseits der 255 Zeichen liegt. Dann wird Bugzilla fälschlicherweise davon ausgehen, dass die letzten Zeichen vor dem 255 Zeichen-Limit den Domain-Namen der Adresse darstellen. Der Angreifer kann nun hier prinzipiell jeden beliebigen Namen anlegen und sich so an jedem Bugzilla-System registrieren. Das heißt der Angreifer kann eine E-Mail-Adresse folgender Art angeben:

aaa[...]aaa@mozilla.com.attackerdomain.com

Hiermit könnte er sich dann bei bugzilla.mozilla.com registrieren, obwohl die wahre Domain der E-Mail-Adresse attackerdomain.com ist und nicht mozilla.com. Diese Schwachstelle ist also sehr einfach auszunutzen, und erlaubt es dem Angreifer sich auf jedem Bugzilla-System anzumelden.
Obowohl diese Schwachstelle auf den ersten Blick nicht kritisch klingt, so kann sie doch weitreichende Konsequenzen haben. Denn viele Bugzilla-Systeme enthalten neben Informationen zu allgemeinen Fehler in Software auch sicherheitskritische Lücken, die noch nicht veröffentlicht sein. Potentielle Angreifer können dadurch an Schwachstellen-Informationen gelangen, welche noch gar nicht veröffentlicht oder korrigiert sind.
Betroffen sind die Versionen 2.0 bis 4.2.14, 4.3.1 bis 4.4.9 und 4.5.1 bis 5.0.

Nach oben