Devoluciones de llamada (RPC)

A menudo, el modelo de programación requiere una devolución de llamada de servidor a un cliente a través de una llamada a procedimiento remoto (RPC) o llamadas de cliente a un servidor que no es de confianza. Esto presenta muchos posibles problemas.

En primer lugar, la devolución de llamada al cliente debe realizarse con un nivel de suplantación suficientemente bajo. Si el servidor es un servicio de sistema con privilegios elevados, llamar a un cliente local con un nivel de suplantación de suplantación o superior puede proporcionar al cliente privilegios suficientes para asumir el sistema. Llamar a un cliente remoto con un nivel de suplantación superior al necesario también puede dar lugar a consecuencias no deseadas.

En segundo lugar, si un atacante induce al servicio a realizar una devolución de llamada, puede iniciar lo que se denomina agujero negro: ataque por denegación de servicio. Estos ataques no son específicos de RPC; en estos ataques, una máquina le induce a enviar tráfico a él, pero no responde a sus solicitudes. Se hundin más y más recursos en llamar al agujero negro, pero nunca vuelven. Un ejemplo genérico de este tipo de ataque es un ataque de nivel TCP denominado ataque de inundación TCP/IP SYN.

En el nivel RPC, se produce un ataque simple de agujero negro cuando un atacante llama a una interfaz y solicita al servidor que vuelva a llamar a la interfaz. La interfaz cumple, pero el atacante nunca devuelve la llamada: un subproceso del servidor está vinculado. El atacante hace esto 100 veces, con 100 subprocesos en el servidor. Finalmente, el servidor se queda sin memoria. La depuración del servidor puede revelar potencialmente la identidad del autor de la llamada del agujero negro, pero a menudo se reiniciará el servidor sin sospechar la falta de juego o puede que no haya suficiente experiencia disponible para determinar el atacante.

El tercer problema está en el cliente. A menudo, un cliente realiza una llamada al servidor que informa al servidor de cómo llamarlo (normalmente un enlace de cadena) y, a continuación, espera a que llegue una llamada desde el servidor, aceptando ciegamente cualquier llamada en ese punto de conexión que notificaciones provenga del servidor. El protocolo de devolución de llamada del servidor al cliente debe incluir algún mecanismo de comprobación para asegurarse de que cuando la devolución de llamada llega al cliente, realmente se originó en el servidor.