
Para solicitudes de pull de Metasploit
Esto puede resolver el issue #8571, que solicita módulos Phoenix Talon.
En la máquina objetivo, se desencadena un double-free debido a que el kernel mantiene una copia extra de mc_list en el momento de accept().
Una máquina que ejecuta un kernel 4.10.15 o inferior está en riesgo si ejecuta la siguiente rutina:
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()
El socket padre, sockfd, es creado. Se añade al grupo multicast con la opción MCAST_JOIN_GROUP.
Al añadir el socket al grupo multicast en la interfaz local, el kernel asigna memoria. En este punto,
mc_list existe en el socket padre.
Después de asignar una dirección al socket con bind(), listen() para la conexión y accept().
accept() crea un nuevo socket, newsockfd, al cual se copian todos los campos necesarios del padre,
incluido el valor del puntero mc_list. En este punto, hay múltiples punteros apuntando
al mismo bloque de memoria, de ahí el double free.
Cuando se establece la conexión, el kernel crea un socket hijo que hereda el objeto mc_list del socket padre.
Esta falla de herencia está en inet_csk_clone_lock en la línea 648 del archivo net/ipv4/inet_connection_sock.c.
Vea el parche para ver la solución de una línea para esta herencia no intencionada.
A continuación, cierre el socket hijo. Como se explicó anteriormente, esto no libera el objeto mc_list.
Pasa por la estructura RCU (remote-copy-update) para liberar memoria.
sleep() durante unos segundos para asegurarse de que la transferencia RCU tenga suficiente tiempo para llamar a kfree().
Finalmente, cierre el socket padre, lo que desencadenará el segundo free.
DoS simple. Desencadena remotamente un double-free en una máquina objetivo conocida que ejecuta la rutina de servidor requerida (explicada anteriormente). Esto causa un pánico del kernel.