Callback (RPC)

Spesso il modello di programmazione richiede un callback del server a un client tramite una chiamata di routine remota (RPC) o le chiamate client in un server non attendibile. Questo introduce molte potenziali insidie.

Prima di tutto, il callback al client deve essere eseguito con un livello di rappresentazione sufficientemente basso. Se il server è un servizio di sistema con privilegi elevati, la chiamata a un client locale con un livello di rappresentazione o superiore può fornire al client privilegi sufficienti per acquisire il sistema. La chiamata a un client remoto con un livello di rappresentazione superiore a quello necessario può anche causare conseguenze indesiderate.

In secondo luogo, se un utente malintenzionato induce il servizio a eseguire un callback, può avviare ciò che viene chiamato buco nero- attacco denial of service. Tali attacchi non sono specifici di RPC; in questi attacchi, un computer provoca l'invio del traffico a esso, ma non risponde alle richieste. Si affondano più e più risorse per chiamare il buco nero, ma non tornano mai. Un esempio generico di tale attacco è un attacco a livello TCP denominato attacco di inondazioni TCP/IP SYN.

A livello RPC, si verifica un semplice attacco a buco nero quando un utente malintenzionato chiama un'interfaccia e richiede al server di chiamare nuovamente l'interfaccia. L'interfaccia è conforme, ma l'utente malintenzionato non restituisce mai la chiamata: un thread sul server è collegato. L'utente malintenzionato esegue questa operazione 100 volte, legando 100 thread nel server. Alla fine il server non è disponibile in memoria. Il debug del server può potenzialmente rivelare l'identità del chiamante del buco nero, ma spesso il server verrà riavviato senza sospettare la riproduzione del fallo o potrebbe non essere disponibile un'esperienza sufficiente per determinare l'utente malintenzionato.

La terza insodità è sul client. Spesso un client effettua una chiamata al server che informa il server come chiamarlo di nuovo (in genere un'associazione di stringhe) e quindi attende l'arrivo di una chiamata dal server, accettando in modo cieco qualsiasi chiamata su tale endpoint che attestazioni provenienti dal server. Il protocollo di callback dal server al client deve includere un meccanismo di verifica per assicurarsi che quando il callback arriva al client, ha effettivamente origine nel server.