Niedrig

Contao crawler leaks auth credentials to external hosts

  • Veröffentlicht: 06.08.2026
  • Aktualisiert: 11.10.2026 10:22

Summary

Contao's crawler tries to prevent confidential HTTP client options from being sent to external domains by creating a scoped client: full options for root page origins, cleaned options for everything else. The cleaner removes Cookie and Authorization headers, but it removes the non-Symfony option names basic_auth and bearer_auth instead of Symfony HttpClient's real auth_basic and auth_bearer options.

When contao.crawl.default_http_client_options contains Basic or Bearer authentication for a protected staging/production site, those credentials remain in the "clean" client used for external links or configured additional URIs. An attacker who can get an external URL crawled, for example through a link on a crawled page while the broken-link checker is enabled, can receive the crawler credentials.

Technical Detail

Root Cause

php
// core-bundle/src/Crawl/Escargot/Factory.php:175-209 @ e550b92a01ef625bd546e6c3956dd200af05ebf0
private function createHttpClient(array $options = []): HttpClientInterface
{
    $options = array_merge_recursive(
        [
            'headers' => [
                'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                'user-agent' => self::USER_AGENT,
            ],
            'max_duration' => 10,
        ],
        array_merge_recursive($this->getDefaultHttpClientOptions(), $options),
    );

    $cleanOptions = $this->cleanOptionsFromConfidentialData($options);

    if ($options === $cleanOptions) {
        return ($this->httpClientFactory)($options);
    }

    $scopedOptionsByRegex = [];

    foreach ($this->getRootPageUriCollection()->all() as $rootPageUri) {
        $scopedOptionsByRegex[preg_quote($this->getOriginFromUri($rootPageUri))] = $options;
    }

    return new ScopingHttpClient(($this->httpClientFactory)($cleanOptions), $scopedOptionsByRegex);
}
php
// core-bundle/src/Crawl/Escargot/Factory.php:226-247 @ e550b92a01ef625bd546e6c3956dd200af05ebf0
foreach ($options as $k => $v) {
    if ('headers' === $k) {
        foreach ($v as $header => $value) {
            if (\in_array(strtolower($header), ['authorization', 'cookie'], true)) {
                continue;
            }

            $cleanOptions['headers'][$header] = $value;
        }

        continue;
    }

    if ('basic_auth' === $k || 'bearer_auth' === $k) {
        continue;
    }

    $cleanOptions[$k] = $v;
}

Symfony HttpClient authentication options are auth_basic and auth_bearer; Contao's own manual documents auth_basic for crawler Basic Authentication. Because the cleaner only strips basic_auth and bearer_auth, the "clean" default client for non-root-page hosts still carries the real auth options. The existing factory test intends to assert that Authorization is not sent to www.foreign-domain.com, but its mock client factory ignores the $defaultOptions argument, so it does not catch auth options that survive into HttpClient::create($cleanOptions).

Suggested Mitigation

Strip the actual Symfony HttpClient authentication option keys from the clean client. Include NTLM as a defensive extension because Symfony documents it as another auth option.

diff
-            if ('basic_auth' === $k || 'bearer_auth' === $k) {
+            if (\in_array($k, ['auth_basic', 'auth_bearer', 'auth_ntlm', 'basic_auth', 'bearer_auth'], true)) {
                 continue;
             }

Also update the factory test so the mock factory records or preserves $defaultOptions; otherwise the test does not verify what HttpClient::create($cleanOptions) receives in production.

Impact

  • Direct primitive: disclosure of crawler Basic/Bearer credentials to an external host reached by the crawler.
  • Chain potential: if those credentials protect a staging or pre-publication environment, an attacker can use them to access that environment. The impact depends on what the leaked credential unlocks.
  • Realistic exploitation: a content editor adds a link to https://attacker.example/probe on a page that the crawler visits. When an administrator or scheduled maintenance run starts the broken-link checker with crawler Basic/Bearer authentication configured, the request to the attacker URL includes the generated Authorization header.

Betroffene Software

Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.

PlattformPaketAnfällige VersionenBehoben in
Composer-Paket contao/contao >= 4.13.0, < 5.3.47, >= 5.4.0, < 5.7.7 5.3.47, 5.7.7
Composer-Paket contao/core-bundle >= 4.13.0, < 5.3.47, >= 5.4.0, < 5.7.7 5.3.47, 5.7.7

Verweise

CVSS-Wert 2.6/10
CVSS-Vektor
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:N/A:N
Schwäche (CWE)
CWE-200
Plattform
Composer
Paket
contao/contao, contao/core-bundle
Veröffentlicht
06.08.2026
Aktualisiert
11.10.2026 10:22

Quellen und Lizenzen

OSV / GitHub Advisory Database - GHSA-3mr9-p497-58f6 - CC BY 4.0

Schwachstellenhistorie: contao/contao

Alle veröffentlichten Schwachstellen dieses Pakets (Composer-Paket), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.

Alle (25) im Archiv
Einträge insgesamt
25
Erste → letzte
12.2019 09.2026
Ohne Fix
0
In Angriffen ausgenutzt
0

Verteilung nach Schweregrad

  • Kritisch 4
  • Hoch 6
  • Mittel 12
  • Niedrig 3

Veröffentlichungen pro Jahr

  1. 2019: 3
  2. 2020: 1
  3. 2021: 4
  4. 2022: 9
  5. 2023: 1
  6. 2024: 0
  7. 2025: 4
  8. 2026: 3
Schweregrad:
  1. Contao crawler leaks auth credentials to external hosts dieser Eintrag
    Niedrig · 2.6 CVE-2026-55824 >= 4.13.0, < 5.3.47, >= 5.4.0, < 5.7.7 5.3.47, 5.7.7
  2. Hoch · 8.8 CVE-2023-29200 >= 4.9.0, < 4.9.40, >= 4.13.0, < 4.13.21, >= 5.1.0, < 5.1.4 4.9.40, 4.13.21, 5.1.4
  3. Kritisch · 9.8 CVE-2019-11512 >= 4.1.0, < 4.4.39, >= 4.5.0, < 4.7.5 4.4.39, 4.7.5
  4. Kritisch · 9.8 CVE-2017-16558 >= 3.0.0, <= 3.5.30, >= 4.0.0, < 4.4.8 4.4.8
  5. Hoch · 7.2 CVE-2022-24899 >= 4.13.0, < 4.13.3 4.13.3
  6. Hoch · 8.8 CVE-2019-10642 >= 4.7.0, < 4.7.3 4.7.3
  7. Kritisch · 9.8 CVE-2019-10641 >= 4.0.0, < 4.4.37, >= 4.5.0, < 4.7.3 4.4.37, 4.7.3
  8. Hoch · 8.8 CVE-2017-10993 >= 4.0.0, < 4.4.1 4.4.1
  9. Kritisch · 9.8 CVE-2019-10643 >= 4.7.0, < 4.7.3 4.7.3
  10. Hoch · 8.0 CVE-2021-37627 >= 4.0.0, < 4.4.56, >= 4.5.0, < 4.9.18, >= 4.10.0, < 4.11.7 4.4.56, 4.9.18, 4.11.7
  11. Hoch · 8.8 CVE-2019-19745 >= 4.0.0, < 4.4.46, >= 4.5.0, < 4.8.6 4.4.46, 4.8.6

Erkennen Sie Schwachstellen in Ihrer Anwendung

Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.

Anwendung verbinden
DockRay Newsletter

Anwendungssicherheit in Ihrem Postfach

Wichtige Schwachstellen, konkrete Empfehlungen und praktische Tipps für Ihre Anwendungen. Wählen Sie Ihre Technologien und verfolgen Sie, was für Ihr Projekt relevant ist.

  • Eine tägliche Zusammenfassung neuer Schwachstellen, auch kritischer.
  • Benachrichtigungen über wichtige Updates.
  • Praktische Tipps zur Sicherheit und Überwachung von Anwendungen.

Leer lassen, um Meldungen zu allen Technologien zu erhalten.

Kostenlos anmelden. In jeder E-Mail mit einem Klick abmelden.