Rückrufe (RPC)

Häufig erfordert das Programmiermodell einen Serverrückruf an einen Client über einen Remoteprozeduraufruf (RPC) oder Clientaufrufe an einen nicht vertrauenswürdigen Server. Dies führt zu vielen potenziellen Fallstricken.

Zunächst muss der Rückruf an den Client mit einer ausreichend niedrigen Identitätswechselebene erfolgen. Wenn es sich bei dem Server um einen Systemdienst mit hohen Berechtigungen handelt, kann der Aufruf eines lokalen Clients mit einer Identitätswechselstufe oder höher dem Client ausreichende Berechtigungen für die Übernahme des Systems gewähren. Das Zurückrufen eines Remoteclients mit höherer Identitätswechselebene als erforderlich kann ebenfalls zu unerwünschten Folgen führen.

Zweitens: Wenn ein Angreifer Ihren Dienst dazu veranlasst, einen Rückruf durchzuführen, kann er ein sogenanntes schwarzes Loch auslösen – einen Denial-of-Service-Angriff. Solche Angriffe sind nicht spezifisch für RPC; bei diesen Angriffen bewirkt ein Computer, dass Sie Datenverkehr an ihn senden, aber er reagiert nicht auf Ihre Anforderungen. Sie versenken immer mehr Ressourcen beim Aufrufen des schwarzen Lochs, aber sie kommen nie zurück. Ein generisches Beispiel für einen solchen Angriff ist ein Angriff auf TCP-Ebene, der als TCP/IP SYN-Floodangriff bezeichnet wird.

Auf RPC-Ebene tritt ein einfacher Black Hole-Angriff auf, wenn ein Angreifer eine Schnittstelle aufruft und den Server auffordert, die Schnittstelle zurückzurufen. Die Schnittstelle entspricht, aber der Angreifer gibt den Aufruf nie zurück: Ein Thread auf dem Server ist gebunden. Der Angreifer tut dies 100 Mal und bindet 100 Threads auf dem Server. Schließlich ist auf dem Server nicht mehr genügend Arbeitsspeicher vorhanden. Beim Debuggen des Servers kann möglicherweise die Identität des Black-Hole-Aufrufers offengelegt werden, aber oft wird der Server neu gestartet, ohne dass ein fehlerhaftes Spiel vermutet wird, oder es ist möglicherweise nicht genügend Fachwissen verfügbar, um den Angreifer zu ermitteln.

Der dritte Fall liegt auf dem Client. Häufig führt ein Client einen Aufruf an den Server durch, der den Server darüber informiert, wie er ihn zurückruft (in der Regel eine Zeichenfolgenbindung), und wartet dann, bis ein Anruf vom Server eingeht, und akzeptiert blind jeden Aufruf an diesem Endpunkt, der vom Server kommen soll. Das Rückrufprotokoll vom Server zum Client sollte einen Überprüfungsmechanismus enthalten, um sicherzustellen, dass der Rückruf tatsächlich vom Server stammt, wenn er an den Client kommt.