
Für Metasploit-Pull-Request
Dies könnte das Problem #8571 beheben, das Phoenix Talon-Module anfordert.
Auf der Zielmaschine wird ein Double-Free ausgelöst, da der Kernel eine zusätzliche Kopie von mc_list zum Zeitpunkt von accept() behält.
Eine Maschine, die einen Kernel 4.10.15 oder niedriger ausführt, ist gefährdet, wenn sie die folgende Routine ausführt:
sockfd = socket(AF_INET, xx, IPPROTO_TCP);
setsockopt(sockfd, SOL_IP, MCAST_JOIN_GROUP, xxxx, xxxx);
bind(sockfd, xxxx, xxxx);
listen(sockfd, xxxx);
newsockfd = accept(sockfd, xxxx, xxxx);
close(newsockfd); // trigger release calls, handoff to RCU
sleep(5); // wait for rcu to free()
close(sockfd); // second free()
Der Eltern-Socket, sockfd, wird erstellt. Er wird mit der Option MCAST_JOIN_GROUP zur Multicast-Gruppe hinzugefügt.
Beim Hinzufügen des Sockets zur Multicast-Gruppe auf dem lokalen Interface allokiert der Kernel Speicher. An diesem Punkt
existiert mc_list im Eltern-Socket.
Nachdem eine Adresse mit bind() an den Socket vergeben wurde, listen() für die Verbindung und accept().
accept() erstellt einen neuen Socket, newsockfd, auf den alle notwendigen Felder des Elternteils kopiert werden,
einschließlich des Werts des mc_list-Zeigers. An diesem Punkt zeigen mehrere Zeiger
auf denselben Speicherblock, daher der Double-Free.
Wenn die Verbindung hergestellt wird, erstellt der Kernel einen Kind-Socket, der das mc_list-Objekt des Eltern-Sockets erbt.
Dieser Vererbungsfehler befindet sich in inet_csk_clone_lock in Zeile 648 der Datei net/ipv4/inet_connection_sock.c.
Sehen Sie sich den Patch an, um die einzeilige Korrektur für diese unbeabsichtigte Vererbung zu sehen.
Als nächstes wird der Kind-Socket geschlossen. Wie oben erklärt, gibt dies das mc_list-Objekt nicht frei.
Es durchläuft die RCU-Struktur (Remote-Copy-Update), um Speicher freizugeben.
sleep() für einige Sekunden, um sicherzustellen, dass die RCU-Übergabe genügend Zeit hat, kfree() aufzurufen.
Schließlich wird der Eltern-Socket geschlossen, was den zweiten Free auslöst.
Einfacher DoS. Remote einen Double-Free auf einer bekannten Zielmaschine auslösen, die die erforderliche Server-Routine ausführt (oben erklärt). Dies verursacht eine Kernel-Panik.