- Aufgrund einer Race Condition im Signal-Handler des OpenSSH-Servers
sshdkann ein nicht authentifizierter Client innerhalb der AuthentifizierungsfristLoginGraceTimeauf Servern mit Standardkonfiguration Remote Code Execution auslösen - Diese Schwachstelle ist eine Regression von CVE-2006-5051 und trat abermals in Versionen ab 8.5p1 bis vor 9.8p1 auf, nachdem ein OpenSSH-8.5p1-Commit im Oktober 2020 die Schutzmaßnahme in
sigdie()entfernt hatte - Auf glibc-basierten Linux-Systemen ruft
syslog()async-signal-unsafe Funktionen wiemalloc()undfree()auf, was im nicht sandboxed privilegierten Code vonsshdzu unauthentifizierter Root-RCE führen kann - Die Tests wurden auf einer i386-VM und in einem stabilen Netzwerk mit etwa 10 ms Paket-Jitter durchgeführt; auf Debian 12.5.0 mit OpenSSH 9.2p1 dauerte es bei durchschnittlich etwa 10.000 Versuchen sowie
MaxStartups=100undLoginGraceTime=120ungefähr 6 bis 8 Stunden bis zur Root-Shell - OpenSSH hat das Problem am 6. Juni 2024 mit Commit
81c1099behoben; wenn ein Update oder eine Neukompilierung schwierig ist, kannLoginGraceTime 0RCE verhindern, allerdings bleibt dann das Risiko einer DoS durch Erschöpfung derMaxStartups-Verbindungen bestehen
Wo die Schwachstelle entsteht
- Das Problem in OpenSSH
sshdbeginnt im SIGALRM-Handler, der vor der Authentifizierung aktiv ist- Wenn ein Client sich nicht innerhalb von
LoginGraceTimeauthentifiziert, wird derSIGALRM-Handler asynchron aufgerufen - Dieser Handler ruft Funktionen wie
syslog()auf, die nicht async-signal-safe sind - Der Standardwert ist
LoginGraceTime=120Sekunden; in älteren OpenSSH-Versionen waren es 600 Sekunden
- Wenn ein Client sich nicht innerhalb von
- Die Schwachstelle ist eine Regression von CVE-2006-5051
- CVE-2006-5051 ist eine 2006 von Mark Dowd gemeldete Race Condition im Signal-Handler von OpenSSH-Versionen vor 4.4
- Ein Commit
752250cin OpenSSH 8.5p1 entfernte im Oktober 2020 versehentlich#ifdef DO_LOG_SAFE_IN_SIGHANDaussigdie()
- Der betroffene Versionsbereich ist klar abgegrenzt
- OpenSSH vor 4.4p1: verwundbar, falls Patches zu CVE-2006-5051 oder CVE-2008-4109 nicht zurückportiert wurden
- OpenSSH ab 4.4p1 bis vor 8.5p1: für diese Race Condition nicht verwundbar, da
sigdie()auf den sicheren Aufruf_exit(1)umgestellt wurde - OpenSSH ab 8.5p1 bis vor 9.8p1: durch Entfernung der Schutzmaßnahme erneut verwundbar
Betroffene Umgebungen und Ausnahmen
- Ziel für Remote-Ausnutzung ist glibc-basiertes Linux
syslog()in glibc ruft intern async-signal-unsafe Funktionen wiemalloc()undfree()auf- Der verwundbare Code befindet sich im privilegierten Teil von
sshdund läuft ohne Sandbox mit vollen Rechten - Dadurch wird unauthentifizierte Remote-Code-Ausführung als root möglich
- Andere libc-Implementierungen oder Betriebssysteme wurden nicht untersucht
- OpenBSD ist nicht verwundbar
- Der
SIGALRM-Handler von OpenBSD ruft stattsyslog()die Funktionsyslog_r()auf syslog_r()ist eine von OpenBSD im Jahr 2001 eingeführte async-signal-sicherere Variante
- Der
Voraussetzungen der Remote-Ausnutzungsforschung
- Um diese Race Condition remote auszunutzen, mussten drei Probleme gelöst werden
- Es wird ein Codepfad benötigt, der
sshdin einem inkonsistenten Zustand hinterlässt, wennSIGALRMzum richtigen Zeitpunkt dazwischenfunkt - Dieser Codepfad muss erreichbar sein, und die Wahrscheinlichkeit einer Unterbrechung zum richtigen Zeitpunkt muss erhöht werden
- Das Timing muss auch über ein entferntes Netzwerk hinweg getroffen werden können
- Es wird ein Codepfad benötigt, der
- Die Forschung begann nicht direkt mit aktuellen Schutzmechanismen, sondern zunächst in einer älteren i386-OpenSSH-Umgebung und wurde dann auf neuere Versionen ausgeweitet
- Die Testbedingungen hatten klare Grenzen
- Es wurden nur virtuelle Maschinen getestet, keine Bare-Metal-Server
- Das Netzwerk war ein relativ stabiler Link mit etwa 10 ms Paket-Jitter
- Mehrere Teile des Exploits lassen sich noch verbessern
- Arbeiten an einem amd64-Exploit haben begonnen, sind wegen stärkerem ASLR jedoch deutlich schwieriger
Experimente mit älteren OpenSSH-Zielen
-
Debian 3.0r6, OpenSSH 3.4p1
- Das Ziel war
SSH-2.0-OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3, also eine Debian-3.0r6-Umgebung aus dem Jahr 2005 - Diese Debian-Version war die erste mit standardmäßig aktivierter Privilege Separation, und wichtige damalige Sicherheits-Patches waren bereits eingespielt
- Die Ausnutzung nutzte die Unterbrechung von
free()und einen inkonsistenten Heap-Zustand- Ein Aufruf von
free()im Public-Key-Parsing-Code wurde durchSIGALRMunterbrochen - Anschließend wurde der inkonsistente Heap-Zustand bei einem weiteren
free()inpacket_close()ausgenutzt
- Ein Aufruf von
- glibc 2.2.5 enthielt noch keine Härtung gegen Solar Designers
unlink()-Technik - Der Angriff überschreibt
__free_hookund lenkt den Kontrollfluss auf die Adresse von Shellcode im Heap um - Diese Debian-Version hatte weder ASLR noch NX
- Nach Timing-Optimierungen waren im Mittel etwa 10.000 Versuche nötig
- Mit
MaxStartups=10undLoginGraceTime=600dauerte es im Durchschnitt etwa eine Woche bis zur Remote-Root-Shell
- Das Ziel war
-
Ubuntu 6.06.1, OpenSSH 4.2p1
- Das Ziel war
SSH-2.0-OpenSSH_4.2p1 Debian-7ubuntu3, also eine Ubuntu-6.06.1-Umgebung aus dem Jahr 2006 - Es war die letzte Ubuntu-Version, die noch für CVE-2006-5051 verwundbar war
- glibc 2.3.6 nimmt beim Eintritt in die malloc-Funktionsfamilie einen Mandatory Lock; daher führt das Unterbrechen eines
malloc()und anschließende Ausnutzen eines weiterenmalloc()zu einem Deadlock - Der endgültige Ausnutzungspfad nutzte PAM
pam_start()setzt den globalensshpam_handle-Zeiger vonsshd- Wenn
_pam_add_handler()unterbrochen wird, kann ein nicht initialisiertesnext-Feld zurückbleiben - Wenn
pam_end()imSIGALRM-Handler aufgerufen wird, kann ein beliebiger Zeiger anfree()übergeben werden
- Da die alte
unlink()-Technik in glibc blockiert war, wurde die Fastbin-Variante von House of Mind aus Malloc Maleficarum verwendet - Eine Fake-Arena wurde auf
.got.pltvonsshdausgerichtet, und der_exit()-Eintrag wurde mit der Adresse von Heap-Shellcode überschrieben - Der Heap dieses Ubuntu war standardmäßig ausführbar
- Im Durchschnitt waren etwa 10.000 Versuche erforderlich
- Mit
MaxStartups=10undLoginGraceTime=120dauerte es im Mittel etwa 1 bis 2 Tage bis zur Remote-Root-Shell - Bei Pech kann ein Angreifer alle 10
MaxStartups-Verbindungen in einen Deadlock bringen, bevor eine Root-Shell erreicht wird
- Das Ziel war
Debian 12.5.0, OpenSSH 9.2p1
-
syslog()- und glibc-malloc-Pfad- Das Ziel war
SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2, also die 2024 aktuelle Stable-Umgebung von Debian 12.5.0 - Diese Umgebung ist für die Regression von CVE-2006-5051 verwundbar
- Der
SIGALRM-Handler dieser Version ruft wederpacket_close()nochpam_end()auf, sondern läuft über densyslog()-Pfadgrace_alarm_handler()ruftsigdie()aufsigdie()ruft übersshlogv()unddo_log()schließlichsyslog()auf
syslog()in Debian glibc 2.36 ruft beim ersten Aufrufmalloc()auf- Über
__localtime64_r()wird__tzfile_read()aufgerufen fopen()ruftmalloc(304)für eine FILE-Struktur auf- Für den internen Read-Buffer wird außerdem
malloc(4096)aufgerufen
- Über
- Seit Oktober 2017 setzt glibc malloc in Single-Thread-Szenarien keinen Mandatory Lock mehr
- In Single-Thread-Prozessen wie
sshdentsteht dadurch wieder eine Möglichkeit, malloc-Konkurrenz auszunutzen
- Das Ziel war
-
ASLR-Bedingungen und i386-Einschränkungen
- Die Debian-12.5.0-i386-Umgebung weist eine ASLR-Schwäche auf
- PIE von
sshd, Heap, die meisten Bibliotheken und der Stack werden normalerweise randomisiert - glibc selbst wird jedoch immer bei
0xb7200000oder0xb7400000gemappt - Die glibc-Adresse lässt sich damit mit 50-prozentiger Wahrscheinlichkeit erraten
- Der Exploit geht davon aus, dass glibc bei
0xb7400000gemappt ist - Diese Adresse trat etwas häufiger auf als
0xb7200000
-
Heap-Inkonsistenz und Ausnutzung der FILE-Struktur
- Der gewählte malloc-Pfad ist der Split-Pfad, bei dem ein großer Free-Chunk in zwei Teile geteilt wird
- Dabei entstehen ein zurückgegebener Chunk und ein Remainder-Chunk
- Wenn
SIGALRMgenau dann dazwischenfunkt, nachdem der Remainder-Chunk in die Unsorted List verkettet wurde, aber bevor sein Größenfeld initialisiert wurde, entsteht eine Heap-Inkonsistenz - Der Angreifer kontrolliert das Größenfeld des Remainder-Chunks über Restdaten einer vorherigen Heap-Allokation
- Dadurch kann der Remainder-Chunk größer erscheinen als er tatsächlich ist und sich mit anderen Heap-Chunks überlappen
- Wenn
mallocimSIGALRM-Handler diesen Chunk nutzt, wird Heap-Speicher korrumpiert - Ziel ist die FILE-Struktur, die
fopen()in__tzfile_read()auf dem Heap allokiert- Mit der begrenzten Heap-Korruption wird 1 Byte des
_vtable_offsetder FILE-Struktur überschrieben - Dadurch sucht eine glibc-libio-Funktion den Vtable-Zeiger nicht an der Standardposition, sondern an einem anderen Offset
- Den dort liegenden Fake-Vtable-Zeiger sowie den
_codecvt-Zeiger kontrolliert der Angreifer über Restdaten früherer Heap-Allokationen
- Mit der begrenzten Heap-Korruption wird 1 Byte des
- In i386-glibc kann diese Technik dazu führen, dass in
__fread_unlocked()ein beliebiger Funktionszeiger__fctaufgerufen wird - amd64-glibc scheint
_vtable_offsetnicht zu verwenden
-
Heap-Layout und 27 Race Windows
- Da ein einzelnes kleines Race Window kaum ausreicht, werden 27 Paare aus großem und kleinem Hole erzeugt
- 28 Paare würden
PACKET_MAX_SIZEvon 256 KB überschreiten - Das finale Paket erzwingt die Reihenfolge
malloc(~4KB), malloc(304), malloc(~4KB), malloc(304) - Wenn die Aufteilung eines großen Hole im richtigen Moment unterbrochen wird, allokiert
fopen()imSIGALRM-Handler das zugehörige kleine Hole als FILE-Struktur - Für den Aufbau des Heap-Layouts wird der Public-Key-Parsing-Code von
sshdgenutzt- Über die Pfade
cert_parse()undcert_free()werden nahezu beliebige Sequenzen vonmalloc()undfree()ausgeführt - Da kein Memory Leak gefunden wurde, werden tcache-Chunks vorübergehend als Barrier Chunks genutzt
- Über die Pfade
- Es werden fünf Typen von Public-Key-Paketen gesendet
- a/ unkontrollierbare Heap-Allokationen werden in tcache-Chunks gelenkt
- b/ 27 Paare aus großem/kleinem Hole sowie Barrier Chunks werden erzeugt
- c/ Fake-Header, Fake-Footer, Fake-Vtable und
_codecvt-Zeiger werden geschrieben - d/ ein großer String von fast 256 KB wird allokiert und freigegeben, um die Holes aus der Unsorted List in die jeweiligen malloc-Bins zu verschieben
- e/ die letzte malloc-Sequenz wird erzwungen, um 27 kleine Race Windows zu öffnen
-
Timing-Strategie für aktuelle Versionen
- Die feedbackbasierte Timing-Strategie aus älteren Versionen funktionierte gegen OpenSSH 9.2p1 nicht
- Das fünfte Public-Key-Parsing dauerte etwa 10 ms, wodurch das große Race Window zu groß wurde
user_specific_delay(), eingeführt in OpenSSH 7.8p1, verzögert Antworten um bis zu etwa 9 ms und zerstörte damit das bisherige Feedback-Verfahren- Die neue Strategie vergleicht Antwortzeiten von zwei Arten absichtlich ausgelöster Fehler
- Ein Paket wird gesendet, das direkt vor dem Public-Key-Parsing einen Fehler auslöst
- Ein weiteres Paket wird gesendet, das direkt nach dem Public-Key-Parsing einen Fehler auslöst
- Aus der Differenz der Antwortzeiten wird die Dauer des letzten Public-Key-Parsings geschätzt
- Mit dieser Strategie wurde die Race Condition im Mittel nach etwa 10.000 Versuchen gewonnen
- Mit
MaxStartups=100undLoginGraceTime=120dauerte es im Durchschnitt etwa 3 bis 4 Stunden, die Race Condition zu gewinnen - Wegen ASLR waren bis zur Remote-Root-Shell im Mittel etwa 6 bis 8 Stunden nötig
Fortschritt beim amd64-Exploit
- Als amd64-Ziel wurde Rocky Linux 9 gewählt
- Das Ziel-Image war
Rocky-9.4-x86_64-minimal.iso - OpenSSH 8.7p1 ist für diese Race Condition im Signal-Handler verwundbar
- Wegen einer ASLR-Schwäche wird glibc auf Vielfachen von 2 MB gemappt, wodurch Partial Pointer Overwrite leistungsfähiger wird
- Das Ziel-Image war
syslog()in glibc 2.34 von Rocky Linux 9 ruft intern__open_memstream()auf- Dabei wird eine FILE-Struktur auf dem Heap per
malloc()angelegt - Außerdem werden
calloc(),realloc()undfree()aufgerufen, was zusätzliche Möglichkeiten eröffnet
- Dabei wird eine FILE-Struktur auf dem Heap per
- Auf Basis der Heap-Korruptionsprimitive, zweier auf dem Heap allokierter FILE-Strukturen und 21 fixer Bits der glibc-Adresse wird eine Ausnutzbarkeit auch auf amd64 für möglich gehalten
- Die erwartete Dauer soll länger sein als die 6 bis 8 Stunden auf i386, aber unter einer Woche bleiben
- Es gibt auch eine separate Beobachtung zu Ubuntu 24.04
- Ubuntu 24.04 randomisiert ASLR für
sshd-Child-Prozesse nicht neu, sondern nur einmal beim Booten - Als Ursache wurde
systemd-socket-activation.patchidentifiziert, dasrexec_flagdeaktiviert - Das ist generell keine gute Entscheidung, verhindert hier aber die Ausnutzung, weil
syslog()imSIGALRM-Handler dann nicht der erstesyslog()-Aufruf ist und deshalb keine malloc-Funktionen aufruft - Zugehöriger Patch: https://git.launchpad.net/ubuntu/+source/…
- Ubuntu 24.04 randomisiert ASLR für
Patch und Gegenmaßnahmen
- OpenSSH hat diese Race Condition am 6. Juni 2024 mit Commit
81c1099behoben- 81c1099:
sshd(8)erhält eine Funktion, die problematisches Client-Verhalten sanktioniert - Async-signal-unsafe Code wurde aus dem SIGALRM-Handler von
sshdin den Listener-Prozess verlagert und dort synchron verarbeitet
- 81c1099:
- Diese Korrektur basiert auf dem großen Commit
81c1099sowie dem noch größeren Defense-in-Depth-Commit03e3de4, was Backports erschweren kann - Wenn ein Backport schwierig ist, kann man den async-signal-unsafe Code in
sshsigdie()entfernen oder auskommentieren, sodass nur noch_exit(1)aufgerufen wird - Falls weder Update noch Neukompilierung möglich sind, kann in der Konfiguration
LoginGraceTimeauf0gesetzt werden- Das verhindert die Remote-Code-Ausführung aus diesem Advisory
- Dafür bleibt eine DoS-Anfälligkeit durch Erschöpfung aller
MaxStartups-Verbindungen bestehen
Offenlegungszeitplan
- 2024-05-19: Kontaktaufnahme mit den OpenSSH-Entwicklern; danach mehrere Runden aus Patches und Reviews
- 2024-06-20: Kontaktaufnahme mit
distros@openwall - 2024-07-01: Veröffentlichung zum koordinierten Release-Datum
1 Kommentare
Meinungen auf Hacker News
Interessanterweise sah es so aus, als sei der RCE-Fix schon vor fast einem Monat öffentlich „untergemischt“ worden.
Wenn PerSourcePenalties aktiviert ist, überwacht sshd(8) den Exit-Status von Child-Session-Prozessen vor der Authentifizierung und vermerkt Bedingungen wie wiederholte Authentifizierungsfehler oder sshd-Crashes für eine bestimmte Zeit als Penalty für die Client-Adresse.
https://github.com/openssh/openssh-portable/commit/81c1099d2...
Das wirkt ziemlich clever: weniger wie ein Patch, der sich rückwärts analysieren lässt und einem Angreifer etwas verrät, sondern eher wie eine Änderung an der Binary-Struktur, die die konkrete Schwachstelle beseitigt und als Nebeneffekt auch die gesamte Exploit-Familie abschwächt.
Die obige Änderung ist ein bereits angekündigtes Feature, um Müll-Verbindungen zu behandeln, und erschwert lediglich das Gewinnen der Race Condition, wodurch auch diese Schwachstelle abgeschwächt wird.
Frühere Diskussion: https://news.ycombinator.com/item?id=40610621
Ich frage mich, ob Leute nur den ersten Kommentar im Thread lesen, ihn upvoten und dann mit einem falschen Eindruck weiterziehen.
Eine Passage in den OpenSSH-Release-Notes ist interessant:
„Eine erfolgreiche Ausnutzung wurde auf 32-Bit-Linux/glibc-Systemen mit aktiviertem ASLR demonstriert. Unter Laborbedingungen muss der Angriff im Durchschnitt 6 bis 8 Stunden lang kontinuierlich Verbindungen bis zum vom Server erlaubten Maximum aufrechterhalten. Es wird angenommen, dass dies auch auf 64-Bit-Systemen möglich ist, wurde aber noch nicht demonstriert. Solche Angriffe werden sich wahrscheinlich verbessern.“
https://www.openssh.com/releasenotes.html
Wenn man sich das Diff [1] ansieht, mit dem der Bug eingeführt wurde, scheint das Problem der Analyse zufolge darin zu liegen, dass
sigdie()von einer Form, die mit#ifdef DO_LOG_SAFE_IN_SIGHANDumschlossen war, zusshsigdie()refaktoriert wurde, das direktsshlogv()aufruft, wobei das #ifdef wegfiel.Was hätte das verhindern können? Hätte es mehr Pull-Request-Review geben müssen? Es ist erstaunlich, dass Software, auf die sich die ganze Welt für sichere Verbindungen verlässt, offenbar faktisch von zwei Leuten [2] gewartet wird.
[1] https://github.com/openssh/openssh-portable/commit/752250caa...
[2] https://github.com/openssh/openssh-portable/graphs/contribut...
In diesem Fall hätte ein Kommentar dazu helfen können, warum das
#ifdefnötig ist. Zum Beispiel etwa: „Der Code hier muss async-signal-safe sein, und der Lock-Zustand kann unbestimmt sein.“Allerdings steht
getrlimitehrlich gesagt auch nicht auf dieser Liste: https://man7.org/linux/man-pages/man7/signal-safety.7.htmlTrotzdem wäre es bei einem Review möglicherweise aufgefallen, wenn Code mit einem Kommentar zur async-signal-safety entfernt oder geändert worden wäre. Im zitierten Code deutet nur etwas wie
SAFE_IN_SIGHANDdarauf hin, dass dieser Code innerhalb eines Signal-Handlers sicher sein muss.syslog-Funktion verwendet, hat der Autor dieses Codes möglicherweise einfach angenommen, dass die Änderung sicher sei.Vielleicht hat er vergessen oder nicht gewusst, dass auf anderen Plattformen, von denen die OpenBSD-ssh-Entwickler nicht wirklich behaupten, sie zu unterstützen, weiterhin Funktionen verwendet werden, die nicht async-signal-safe sind.
Man hat keinen Anspruch darauf, von Open-Source-Entwicklern etwas zu bekommen. Auch sie können Fehler machen, und sie können selbst entscheiden, wie viele Maintainer oder Reviewer sie haben wollen.
https://gist.github.com/richhickey/1563cddea1002958f96e7ba95...
#ifdefentfernt haben.Auch die Release Notes sind lesenswert: https://www.openssh.com/releasenotes.html
Das ist eigentlich eine Variante eines interessanten Signal-Race-Condition-Bugs. Dem Schwachstellenbericht zufolge ist „OpenBSD insbesondere nicht anfällig, weil der SIGALRM-Handler
syslog_r()aufruft, eine von OpenBSD 2001 erstellte, für asynchrone Signale sicherere Version vonsyslog()“Mit anderen Worten: Die Signal-Safety-Abmilderung hat die OpenBSD-Entwickler dazu gebracht, nichttrivialen Code in den Signal-Handler zu packen, und als dieser Code auf andere Systeme portiert wurde, wurde er unsicher. Hätte man, entsprechend der üblichen Weisheit und Unix-Code-Konvention, den Code im Signal-Handler auf ein Minimum refaktoriert, wäre dieser Bug vermieden worden
Denn mit der Zeit ist es allzu leicht, dass sich irgendwo in transitiven Aufrufen ein nicht für asynchrone Signale sicherer Aufruf einschleicht, und es ist auch nicht immer offensichtlich, dass dieser Pfad aus einem Signal-Kontext erreichbar ist
Nachdem ich meine OpenSSH-Instanzen aktualisiert hatte, habe ich, da sie gegen musl und nicht glibc gelinkt sind, nachgesehen, ob musls
syslog(3)ebenfalls Allokationen vornimmt und damit auf dieselbe Weise leicht ausnutzbar istSieht nicht so aus: https://github.com/bminor/musl/blob/master/src/misc/syslog.c
Alles dort sind entweder Stack-Variablen oder statische Variablen, bei denen ein Lock Reentrancy verhindert. Die
{d,sn,vsn}printf()-Aufrufe allozieren in musl ebenfalls nicht, könnten es aber in glibc tun. Übersehe ich etwas?Ein Deadlock in
sigalrmkönnte dennoch das Aufräumen von Verbindungen verhindern und so zu einem Denial of Service führenEin Patch für FreeBSD ist erschienen
Ob es betroffen ist, ist unklar. Die bekannten Exploits waren nur unter glibc möglich, und FreeBSD nutzt kein glibc, aber es ist besser, auf Nummer sicher zu gehen
https://www.freebsd.org/security/advisories/FreeBSD-SA-24:04...
Dem Bericht zufolge kann man, wenn man sshd nicht aktualisieren oder neu kompilieren kann, diese Signal-Handler-Race-Condition allein dadurch beheben, dass man in der Konfigurationsdatei
LoginGraceTimeauf 0 setztIn diesem Fall wird sshd zwar anfällig für einen Denial of Service, bei dem alle
MaxStartups-Verbindungen ausgeschöpft werden, ist aber vor der in dieser Empfehlung beschriebenen Remote Code Execution sicherEs scheint also eine Abmilderung zu sein,
LoginGraceTime 0insshd_configzu setzenIst das dann nicht noch schlimmer?
Für Debian 12 ist ein Patch erschienen, Debian 11 ist nicht betroffen
https://security-tracker.debian.org/tracker/CVE-2024-6387
apt updateundupgradeausgeführt, und das einzige aktualisierte Paket war OpenSSHEine wirklich gute Entdeckung
Ich bin zwar nicht selbst in dieser Rolle tätig, aber in der Sicherheitsforschung hat man oft den Eindruck: Um „zu gewinnen“, reicht es nicht, ein einzelnes Problem zu finden und zu beheben oder dafür belohnt zu werden, sondern man muss die gesamte Kette bis hin zum Remote-Zugriff finden.
Eigentlich sollte es doch ausreichen, nur eine einzelne Lücke zu finden, etwa eine Memory Corruption oder einen Sandbox-Escape. Heute gibt es aber so viele kleine Probleme, dass man vielleicht erst einen Hack bis zum Ende demonstrieren muss, damit die Leute ihn wirklich ernst nehmen oder ein Bug Bounty zahlen.
Wenn zum Beispiel eine App bei falsch vertrauenswürdig behandelten Eingaben abstürzt, sie aber ihrer Natur nach gar nicht dafür gedacht ist, Angreifern ausgesetzt zu sein, und das realistisch auch nicht passieren wird, sehen die meisten das einfach als Bug, nicht als Sicherheits-Bug. Es wäre gut, ihn zu beheben, aber es ist nicht dasselbe Niveau, und solche Dinge sind auch nicht besonders schwer zu finden.
Deshalb muss man zwischen „echten“ Sicherheits-Bugs wie in diesem Fall und Bugs ohne Sicherheitsauswirkung unterscheiden, und es ist sehr wichtig, nachzuweisen, dass ein Problem ausnutzbar ist.
Bugs ohne Sicherheitsauswirkung wird es endlos geben, daher wird diese Nachweisanforderung wohl nicht so bald verschwinden.
Das ist so designt; Nutzer können alles serialisieren und deserialisieren, bis hin zu Lambda-Funktionen. Meine Bibliothek ist nur für die Verarbeitung von Daten aus vertrauenswürdigen Quellen gedacht.
Soweit ich weiß, verwendet niemand diese Bibliothek zur Verarbeitung nicht vertrauenswürdiger Daten. Eine populäre Bibliothek nutzt meine Bibliothek zum Lesen von Konfigurationsdateien, aber sie betrachten Konfigurationsdateien als vertrauenswürdige Daten. Und es ist nicht meine Aufgabe zu kontrollieren, wie andere meine Bibliothek verwenden.
Wäre es in so einem Fall richtig, für mein Projekt eine CVE mit höchster Priorität zu registrieren, weil es darin eine Remote-Code-Execution-Schwachstelle gibt?
Belohnungen werden immer für die erste Kategorie gezahlt. Berichte der zweiten Kategorie können ohne Proof of Concept oder Nachweis der Ausnutzbarkeit sogar dem eigenen Ruf oder Signal schaden.
Schwächen, die erst ausnutzbar werden, wenn bestimmte Bedingungen erfüllt sind, gibt es fast immer. Auch bei Wettbewerben wie Pwn2Own sieht man häufig, dass mehrere Schwachstellen verkettet werden, um am Ende ein Gerät zu übernehmen, und dass sie jahrelang ungepatcht bleiben. Forscher lassen solche Schwächen mitunter lange liegen, um die Wirkung zu maximieren.
Traurig, aber so ist die Realität.
OpenSSH-Release-Notes: https://www.openssh.com/txt/release-9.8
Minimaler Patch für alle, die nicht upgraden können oder wollen: https://marc.info/?l=oss-security&m=171982317624594&w=2