1 Punkte von GN⁺ 2024-07-02 | 1 Kommentare | Auf WhatsApp teilen

Zusammenfassung

  • Sicherheitslücke in OpenSSH entdeckt: Im OpenSSH-Server (sshd) wurde eine RCE-Sicherheitslücke gefunden, die durch eine Race Condition im Signal-Handler verursacht wird. Diese Schwachstelle betrifft sshd in der Standardkonfiguration.
  • Ursprung der Schwachstelle: Die Schwachstelle ist eine Regression von CVE-2006-5051, das 2006 gemeldet wurde, und entstand durch eine Codeänderung, die im Oktober 2020 in OpenSSH 8.5p1 eingeführt wurde.
  • Auswirkungen der Schwachstelle: Sie kann auf glibc-basierten Linux-Systemen aus der Ferne ausgenutzt werden, betrifft privilegierten Code in sshd und ermöglicht Remote Code Execution mit Root-Rechten.
  • Methode zur Ausnutzung: Um die Schwachstelle auszunutzen, muss ein bestimmter Codepfad gefunden und im richtigen Moment unterbrochen werden. Dafür wurde mit älteren OpenSSH-Versionen begonnen und die Technik anschließend auf neuere Versionen ausgeweitet.
  • Patch und Abmilderung: Es werden ein Patch und Maßnahmen zur Abmilderung der Schwachstelle bereitgestellt.

SSH-2.0-OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3 (Debian 3.0r6, 2005)

Theorie

  • SIGALRM-Handler: Der SIGALRM-Handler dieser Version ruft packet_close() auf, das wiederum buffer_free() aufruft, das schließlich xfree() und free() aufruft. free() ist nicht asynchron-signal-sicher.
  • Analyse des malloc-Codes: In der malloc-Implementierung wurde ein Pfad gefunden, bei dem ein free()-Aufruf durch SIGALRM unterbrochen und anschließend im SIGALRM-Handler erneut aufgerufen wird, sodass sich die Schwachstelle ausnutzen lässt.

Praxis

  • Angriffsmethode: Ein free()-Aufruf im Code zum Parsen eines DSA-Public-Keys wird unterbrochen und anschließend im SIGALRM-Handler ausgenutzt, um Remote Code Execution zu erreichen.
  • Gewinn der Race Condition: Um diese Race Condition zu gewinnen, sind etwa 10.000 Versuche nötig; im Durchschnitt dauert es ungefähr eine Woche.

Timing

  • Timing-Strategie: Um die Netzwerklatenz zu minimieren, wird das letzte Byte im letzten Moment gesendet und die Round-Trip-Time verfolgt, um das Timing anzupassen. Dadurch steigt die Wahrscheinlichkeit, die Race Condition zu gewinnen.

SSH-2.0-OpenSSH_4.2p1 Debian-7ubuntu3 (Ubuntu 6.06.1, 2006)

Theorie 1

  • SIGALRM-Handler: Der SIGALRM-Handler dieser Version ruft packet_close() nicht auf, und da malloc immer sperrt, wird eine andere Lösung benötigt.
  • Verwendung von PAM: Es wurde festgestellt, dass pam_end() nicht asynchron-signal-sicher ist, und ein ausnutzbarer Pfad dafür wurde untersucht.

Theorie 2

  • Analyse von pam_start(): Wenn pam_start() unterbrochen wird, kann die PAM-Struktur in einem inkonsistenten Zustand verbleiben, der sich im SIGALRM-Handler ausnutzen lässt.
  • House-of-Mind-Technik: Für den Angriff wurde die House-of-Mind-Technik verwendet, um Speicherallokationen zu manipulieren und Remote Code Execution mit Root-Rechten zu erreichen.

Praxis

  • Angriffsmethode: Durch die Verwendung langer Benutzernamen werden Speicherallokationen manipuliert, und durch mehrere pam_start()-Aufrufe wird die Wahrscheinlichkeit erhöht, die Race Condition zu gewinnen.

Timing

  • Timing-Strategie: Die Timing-Strategie aus der vorherigen Debian-Version wird wiederverwendet, um die Wahrscheinlichkeit zu erhöhen, die Race Condition zu gewinnen. Im Durchschnitt dauert dies 1 bis 2 Tage.

SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2 (Debian 12.5.0, 2024)

Theorie

  • SIGALRM-Handler: Der SIGALRM-Handler dieser Version ruft syslog() auf, das wiederum Funktionen aufruft, die nicht asynchron-signal-sicher sind.
  • Analyse von glibc: syslog() in glibc ruft malloc auf, was nicht asynchron-signal-sicher ist. Außerdem sperrt die malloc-Funktion von glibc im Single-Thread-Modus nicht.

Patch und Abmilderung

  • Patch: Die Schwachstelle wurde den OpenSSH-Entwicklern gemeldet, und es wurde ein Patch zu ihrer Behebung bereitgestellt.

Meinung von GN⁺

  • Bedeutung der Sicherheit: OpenSSH ist eine äußerst wichtige Sicherheitssoftware, und diese Schwachstelle ist ein sehr seltener Fall.
  • Schwierigkeit der Ausnutzung: Um diese Schwachstelle auszunutzen, sind äußerst präzises Timing und sehr viele Versuche erforderlich.
  • Alternative Lösungen: Neben OpenSSH gibt es verschiedene weitere Sicherheitslösungen, und es ist sinnvoll, diese gemeinsam einzusetzen.
  • Technische Herausforderung: Diese Forschung erfordert ein sehr hohes technisches Niveau und kann Sicherheitsforschende stark inspirieren.
  • Abmilderung der Schwachstelle: Es ist wichtig, aktuelle Sicherheitspatches einzuspielen und die Sicherheitseinstellungen zu härten.

1 Kommentare

 
GN⁺ 2024-07-02
Hacker-News-Kommentare
  • Der RCE-Fix wurde vor fast einem Monat öffentlich „heimlich“ vorgenommen

    • Wenn PerSourcePenalties aktiviert ist, überwacht sshd(8) den Beendigungsstatus von Prä-Authentifizierungs-Sitzungsprozessen seiner Kindprozesse
    • Es verzeichnet Strafen, wenn ein Client wiederholt Authentifizierung versucht oder wenn sshd abstürzt
    • Dieser Patch ändert die Binärarchitektur, um eine bestimmte Schwachstelle zu beseitigen und die gesamte Exploit-Klasse abzumildern
  • In dem Diff, das den Bug eingeführt hat, wurde die Funktion wie folgt refaktoriert

    • Ursprüngliche Funktion: sigdie(const char *fmt,...)
    • Refaktorierte Funktion: sshsigdie(const char *file, const char *func, int line, const char *fmt, ...)
    • Ein #ifdef fehlte
    • Wenn mehr Leute den Pull Request geprüft hätten, hätte das verhindert werden können
  • Interessanter Kommentar in den OpenSSH-Release-Notes

    • Ein erfolgreicher Exploit wurde auf 32-Bit-Linux/glibc-Systemen mit ASLR demonstriert
    • Es scheint auch auf 64-Bit-Systemen möglich zu sein
  • OpenBSD ist von dieser Schwachstelle nicht betroffen, da der SIGALRM-Handler syslog_r() aufruft

    • Es verwendet eine asynchron signal-sichere Version von syslog()
    • Eine Refaktorierung war nötig, um die Code-Menge innerhalb des Signal-Handlers zu minimieren
  • Bei der Untersuchung von musls syslog(3) zeigte sich, dass es sich im Gegensatz zu glibc nicht leicht ausnutzen lässt

    • Alles befindet sich auf dem Stack oder in statischen Variablen mit Reentrancy-Schutz
  • Ein Patch für FreeBSD ist erschienen, und da es glibc nicht verwendet, ist es wahrscheinlich nicht betroffen

  • Das Setzen von 'LoginGraceTime 0' in der sshd_config-Datei kann das Problem abmildern

    • Dadurch wird das System zwar anfällig für Denial-of-Service-Angriffe, verhindert aber Remote Code Execution
  • Ein Patch für Debian 12 ist erschienen, Debian 11 ist nicht betroffen

  • Links zu den OpenSSH-Release-Notes und zum Minimal-Patch werden bereitgestellt

  • Aus unabhängiger Sicht sollte es ausreichen, bereits eine einzelne Schwachstelle zu finden

    • Es gibt die Tendenz, dass Leute etwas erst dann ernst nehmen oder Prämien zahlen, wenn die gesamte Kette gefunden wurde