CVE-2026-46227 in Linux
Zusammenfassung
von VulDB • 28.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
sctp: Neugültigkeit des Listenzeigers nach sctp_sendmsg_to_asoc() im SCTP_SENDALL-Pfad überprüfen
Der SCTP_SENDALL-Pfad in sctp_sendmsg() durchläuft ep->asocs mit list_for_each_entry_safe(), wobei der nächste Eintrag in @tmp zwischengespeichert wird, bevor der Schleifenkörper ausgeführt wird. Der Körper ruft sctp_sendmsg_to_asoc() auf, das den Socket-Sperre innerhalb von sctp_wait_for_sndbuf() möglicherweise freigibt.
Während die Sperre freigegeben ist, kann ein anderer Thread die in @tmp zwischengespeicherte Assoziation über SCTP_SOCKOPT_PEELOFF entfernen und sie über sctp_sock_migrate() (list_del_init() + list_add_tail() zu newep->asocs) zu einem neuen Endpunkt migrieren und optional den neuen Socket schließen, wodurch die Assoziation über kfree_rcu() freigegeben wird. Der zwischengespeicherte @tmp kann auch durch einen Netzwerk-ABORT für diese Assoziation freigegeben werden, der im Softirq verarbeitet wird, während die Sperre freigegeben ist.
sctp_wait_for_sndbuf() überprüft @asoc (den aktuellen Eintrag) bei der erneuten Sperre über die Prüfungen "sk != asoc->base.sk" und "asoc->base.dead" auf Neugültigkeit, aber nichts überprüft @tmp auf Neugültigkeit. Nach einer erfolgreichen Rückgabe schreitet der Iterator zum veralteten @tmp vor, was entweder einen Use-After-Free (wenn der abgetrennte Socket geschlossen wurde) oder einen Listen-Durchlauf zum Kopf der Liste des neuen Endpunkts ergibt (Typverwechslung von &newep->asocs als struct sctp_association *).
Beide sind von CapEff=0 aus erreichbar; der Pfad der Typverwechslung ermöglicht einen kontrollierten indirekten Aufruf über den outqueue.sched->init_sid-Zeiger.
Behebung durch erneutes Herleiten von @tmp aus @asoc nach der Rückkehr von sctp_sendmsg_to_asoc(). Zu diesem Zeitpunkt ist bekannt, dass @asoc noch auf ep->asocs steht: Die einzigen Aufrufer, die eine Assoziation von ep->asocs mit list_del entfernen, sind sctp_association_free() (das asoc->base.dead festlegt) und sctp_assoc_migrate() (das asoc->base.sk ändert), und sctp_wait_for_sndbuf() prüft beide unter der Sperre vor jeder erfolgreichen Rückgabe; eine ausgelöste Prüfung wird als err < 0 weitergegeben und die Schleife bricht ab, bevor die erneute Herleitung erfolgt.
Der SCTP_ABORT-Pfad in sctp_sendmsg_check_sflags() gibt 0 zurück und die Schleife trifft auf 'continue', bevor sctp_sendmsg_to_asoc() überhaupt aufgerufen wird, sodass der von list_for_each_entry_safe() zwischengespeicherte @tmp immer noch die Sperre-freigebende Freigabe abdeckt, für die ba59fb027307 ("sctp: walk the list of asoc safely") hinzugefügt wurde.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.