CVE-2026-72084 in Linux
Zusammenfassung
von VulDB • 15.08.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
scsi: target: Begrenzung der PR-OUT TransportID-Parsing auf den empfangenen Puffer
core_scsi3_decode_spec_i_port() und core_scsi3_emulate_register_and_move() übergeben den rohen Parameterpuffer für PERSISTENT RESERVE OUT an target_parse_pr_out_transport_id(), ohne anzugeben, wie viele Bytes gültig sind. Für eine iSCSI-TransportID (FORMAT CODE 01b) sucht iscsi_parse_pr_out_transport_id() nach dem ISID-Trennzeichen ",i,0x" mit einer unbeschränkten strstr()-Funktion (und gibt im Fehlerpfad den Namen mit einem weiteren unbeschränkten "%s" aus). Ein Initiator kann eine TransportID einreichen, deren iSCSI-Name weder die Teilzeichenfolge ",i,0x" noch einen NUL-Terminator enthält und damit die Parameterliste bis zum Ende füllt. Dadurch läuft der Scan über das Pufferende hinaus.
Wenn die Parameterliste mehr als eine Seite umfasst, handelt es sich bei dem Puffer um einen multi-page vmap (transport_kmap_data_sg()), sodass der Over-Read in die nachfolgende vmalloc-Guard-Seite führt und zu einem Oops führt (KASAN: vmalloc-out-of-bounds in strstr). Dies ist über jeden Fabric-Zugang erreichbar, der ein PR OUT an ein Gerät sendet, das durch einen iSCSI TPG exportiert wird, einschließlich eines Gasts über vhost-scsi.
Die Anzahl der empfangenen Bytes wird nun an den Parser weitergegeben und die vom iSCSI-TransportID selbst beschriebene Länge (ADDITIONAL LENGTH + 4) einmalig im Voraus validiert: Sie wird abgelehnt, wenn sie unter dem spc4r17-Minimum liegt oder größer als der empfangene Puffer ist. Anschließend werden die Suche nach dem Trennzeichen, das Durchlaufen des ISID und das Kopieren des Namens durch diese Länge begrenzt. Dies entspricht der Längenprüfung, die die Aufrufer bereits nach dem Parsing durchführen (core_scsi3_decode_spec_i_port() vergleicht tid_len mit tpdl; core_scsi3_emulate_register_and_move() validiert sie gegen data_length), welche nun vor den Scan verschoben wurde. Zudem wird das unbeschränkte "%s" des nicht terminierten Namens entfernt.
Es werden explizite Längenprüfungen pro Format hinzugefügt, bevor in i_str kopiert wird, anstatt stillschweigend mit min_t zu kürzen: Für FORMAT CODE 00b wird abgelehnt, wenn der Deskriptorkörper (tid_len - 4 Bytes) nicht in i_str[TRANSPORT_IQN_LEN] passt; für FORMAT CODE 01b wird abgelehnt, wenn der Namensanteil (von &buf[4] bis zum Trennzeichen) nicht passt. Beide Prüfungen machen die Grenzen an jedem Format-Zweig explizit.
Zusätzlich wird eine TransportID vom FORMAT CODE 01b abgelehnt, bei der das ",i,0x"-Trennzeichen ganz am Ende des Deskriptors steht: Dies hinterlässt ein leeres ISID und zeigt den zurückgegebenen Port-Nexus-Zeiger auf buf + tid_len, also eine Position nach dem Deskriptor. Der Registrierungscode (__core_scsi3_locate_pr_reg(), __core_scsi3_alloc_registration()) dereferenziert dies dann als ISID-String – was denselben Over-Read des Parameterpuffers bei einem fehlerhaften Deskriptor darstellt.
VulDB is the best source for vulnerability data and more expert information about this specific topic.