Fragen? Antworten! Siehe auch: Alternativlos
Unter FreeBSD gibt es die Möglichkeit, dem Kernel zu sagen, man möchte erst einen accept kriegen, wenn auch einkommende Daten vorliegen. Das ist eine schlaue Sache für Protokolle, bei denen der Client die ersten Bytes schickt, weil man sich so System Calls spart. Die Windows-Entwickler haben sich das offenbar angeguckt, und wollten sowas auch machen, also haben sie bei AcceptEx die Möglichkeit vorgesehen, daß man einen Buffer übergibt, und dann kommt das AcceptEx erst zurück, wenn auch Daten vorliegen. Klingt auf den ersten Blick richtig schlau, schlauer sogar noch als FreeBSD, weil ich dem System den Buffer gebe, wo die Daten rein sollen, da spart der Kernel sich, wenn sie das gut machen, einmal Kopieren der Daten.
So, nun denkt mal über folgendes Szenario nach. Ich habe einen Webserver gehackt, der dieses API benutzt. Jemand verbindet sich zu dem Webserver, schickt aber keine Daten. Der Kernel assoziiert jetzt die einkommende Verbindung mit dem ausstehenden AcceptEx. Keine Daten kommen auf der Verbindung. Aber eine weitere Verbindung kommt rein, und diese schickt sogar Daten! Für diese Verbindung ist jetzt kein ausstehendes AcceptEx mehr vorhanden. Sehr ihr das Problem? Stellt sich raus, daß man mehr als ein AcceptEx ausstehend haben kann pro Server-Socket, aber das löst ja das Problem nicht. Nehmen wir an, ich habe 4 AcceptEx ausstehend, dann muss ein Angreifer bloß 4 leere Verbindungen aufmachen statt nur einer, und schon ist mein Webserver wieder komplett blockiert. Tja, Microsoft, ein Wort mit X, das war wohl nix.