historias de la cripta usos indebidos de la criptografía

72
historias de la cripta Javi Moreno twitter tag: #cripta

Upload: eventos-creativos

Post on 17-Jun-2015

1.418 views

Category:

Technology


1 download

DESCRIPTION

Charla de Javier Moreno impartida durante el III Curso de verano de Seguridad Informatica de la UEM de Valencia.

TRANSCRIPT

Page 1: Historias de la cripta usos indebidos de la criptografía

historiasde lacripta

Javi Morenotwitter tag: #cripta

Page 2: Historias de la cripta usos indebidos de la criptografía

2 3

456

7 8

1ESCENARIO

FALLOS QUE DESMONTAN UN SISTEMA COMPLETO

FALLOS EN CIFRADOS

FALLOS EN LA PROTECCIÓN DE LA INTEGRIDAD

FALLOS EN FIRMASFALLOS CON CRIPTOGRAFÍA DE CLAVE PÚBLICA

SIDE CHANNELCONCLUSIÓN

Page 3: Historias de la cripta usos indebidos de la criptografía

escenarioponiéndonos en situación

1

Page 4: Historias de la cripta usos indebidos de la criptografía

ESC

ENA

RIO

» Disponible para todo el público

» No es complicado entender lo básico.

» [Ya casi] nadie implementa sus algoritmos.

» Disponemos de muchas librerías de bajo nivel.

Criptografía simple y atractiva

¿128 ó 256 bits?

OpenSSLJava crypto APIMicrosoft CryptoAPI

Page 5: Historias de la cripta usos indebidos de la criptografía

ESC

ENA

RIO

» Extremadamente frágil. Especialmente la criptografía de clave pública.

» Revisar el código cuesta mucho más que desarrollarlo. (además lo debe revisar otro)

» Cuando falla algo… falla todo.

Pero la realidad es otra

Page 6: Historias de la cripta usos indebidos de la criptografía

ESC

ENA

RIO

Para no implementar criptografía

No uses directa-mente las de

bajo nivel:

SSL para las comunicacionesGPG para el resto

GPGME, keyzcar, u otras comerciales

OpenSSL, Crypto++, Java crypto, BouncyCastle, .NET System.Security.Cryptography

Solución simple

Si no puedes, usa una librería de

alto nivel:

Page 7: Historias de la cripta usos indebidos de la criptografía

ESC

ENA

RIO

Piensa mal y acertarás

» Confusiones evidentes uso de MAC para firmar “descifrar” una firma para comprobarla confusión de términos

» Seguridad basada en usar SALTs

» Argumentos que defienden lo no estándar seguridad por oscuridad la clave es muy grande lo leí en un blog

Page 8: Historias de la cripta usos indebidos de la criptografía

ESC

ENA

RIO

Piensa mal y acertarás

» Cifrado de varios bloques con RSA

» Insistencia en mantener los IVs secretos

» Uso de diagramas que no vienen del estándar

» Y una de las mejores: Criptografía y Javascript ¡no tiene sentido! Dispones SSL en el cliente y en el servidor

Page 9: Historias de la cripta usos indebidos de la criptografía

ESC

ENA

RIO

Un pequeño detalle que lo

derrumba todo

ESC

ENA

RIO

Page 10: Historias de la cripta usos indebidos de la criptografía

2fallos que desmontan un sistema completola fortaleza de una cadena es la de su eslabón más débil

Page 11: Historias de la cripta usos indebidos de la criptografía

FALL

OS

QUE

DES

MO

NTA

N U

N S

ISTE

MA

CO

MPL

ETO

Compatiblidad hacia atrás

» Tenemos un esquema antiguo una cookie, hash SHA1 con un cifrado CBC, sin integridad lo mejoramos: HMAC, integridad

» Lo implantamos no adecuadamente se detecta una cookie antigua se migra al nuevo formato ¡!

» Seguir usando ambos esquemas desgraciadamente demasiado común

Page 12: Historias de la cripta usos indebidos de la criptografía

FALL

OS

QUE

DES

MO

NTA

N U

N S

ISTE

MA

CO

MPL

ETO

PRNGs no adecuados

no uses: random (python) java.util.Random (java) System.Random (.NET)

usa: random.SystemRandom (python) java.security.SecureRandom (java) System.Security.Cryptography.RandomNumberGenerator (.NET)

nunca: time() ^ getpid() y sus hermanos

el “por defecto” no es suficiente

Page 13: Historias de la cripta usos indebidos de la criptografía

FALL

OS

QUE

DES

MO

NTA

N U

N S

ISTE

MA

CO

MPL

ETO

PRNGs no adecuados

» Son la fortaleza de los cifrados de flujo creación de claves! IVs, contadores, PIDs, …

» El caso OpenSSL y Debian, ¡return 4! entropía reducida a menos de 15bits claves comprometidas peligro de MITM tablas precalculadas RSA, DSA

indispensables para

un sistemacriptográfico

Page 14: Historias de la cripta usos indebidos de la criptografía

FALL

OS

QUE

DES

MO

NTA

N U

N S

ISTE

MA

CO

MPL

ETO

PRNGs no adecuados

» Relacionado, mismo concepto: el ataque DNS de Kaminsky acertar un valor con 16 bits de entropía

» Con un servidor recién arrancado poca entropía disponible repetición de IVs, valores de desafios...

Page 15: Historias de la cripta usos indebidos de la criptografía

FALL

OS

QUE

DES

MO

NTA

N U

N S

ISTE

MA

CO

MPL

ETO

PRNGs no adecuados

» Mifare Classic reconstruyeron el circuito a base de fotografías microscópicas.

» Su RNG Semilla 16 bits, basado en un LFSR. Valor derivado del tiempo de lectura desde el encendido.

Page 16: Historias de la cripta usos indebidos de la criptografía

FALL

OS

QUE

DES

MO

NTA

N U

N S

ISTE

MA

CO

MPL

ETO

PRNGs no adecuados

crypto1 Vs. crapto1

Page 17: Historias de la cripta usos indebidos de la criptografía

3fallos en cifrados

cuando no es tu propia implementación

Page 18: Historias de la cripta usos indebidos de la criptografía

FALL

OS

CIF

RAN

DO

Modos de encadenamiento

» ¿ECB? Sin realimentación

» El típico conocido CBC

» OFB, CFB, CTR convierten de bloque a uno flujo sin integridad, se pueden cambiar bits no reusar: IVs, realimentación, contadores...

» CCM, EAX, GCM, OCB CCM == Counter with CBC-MAC cifrado autenticación tampoco se debe reusar IVs FA

LLO

S C

IFRA

ND

O

Page 19: Historias de la cripta usos indebidos de la criptografía

4fallos en la pro-tección de la integridad

colega, éste no es mi coche

Page 20: Historias de la cripta usos indebidos de la criptografía

FALL

OS

EN L

A P

ROTE

CC

IÓN

DE

LA IN

TEG

RID

AD

Hashing

»Mismo ejemplo, una cookie: SHA1(data) => replay attacks

SHA1(key || data) => basado en oscuridad

»Usa HMAC!

» Problema: granularidad, parámetros configurables

FALL

OS

EN L

A P

ROTE

CC

IÓN

DE

LA IN

TEG

RID

AD

Page 21: Historias de la cripta usos indebidos de la criptografía

FALL

OS

EN L

A P

ROTE

CC

IÓN

DE

LA IN

TEG

RID

AD

Hashing

<SignatureMethod Algorithm=”…xmldsig#hmac-sha1”> <HMACOutputLength> 160 </HMACOutputLength></SignatureMethod>

Estándar XMLDsig.Disponible desde alto nivel.

¿y por qué no existe

únicamente SHA1?

Page 22: Historias de la cripta usos indebidos de la criptografía

FALL

OS

EN L

A P

ROTE

CC

IÓN

DE

LA IN

TEG

RID

AD

Dar más información de la cuenta

» plaintext -> HMAC -> relleno -> cifrado CBC

» El servidor devuelve diferentes errores padding_incorrect

integrity_failure

» ¿CBC? empezamos por el final bruteforce en el último byte

si es correcto -> integrity_failure

iteramos hacia atrás

por la boca muere el pez

Page 23: Historias de la cripta usos indebidos de la criptografía

5fallos en firmas

¿no te han dicho que nunca firmes algo sin leerlo primero?

Page 24: Historias de la cripta usos indebidos de la criptografía

FALL

OS

EN F

RIM

AS

Un ejemplo real con una firma RSA

1º Se calcula una simple exponenciación

2º - caso correcto: verificamos todos los datos (relleno incluído)

- pero Nintendo hace: return (0 == strncmp(userHash, myHash, 20));

¿dónde estáel error?

Page 25: Historias de la cripta usos indebidos de la criptografía

FALL

OS

EN F

RIM

AS

Un ejemplo real con una firma RSA

Page 26: Historias de la cripta usos indebidos de la criptografía

FALL

OS

EN F

RIM

AS

Un ejemplo real con una firma RSA

creamos 256 mensajes ligera-mente distintos, seguro que al menos 1 hash empieza por \x00.

return (0 == memcmp(userHash, myHash, 20));

saltarnos la comprobación permite: 1. software, IOS y menu de sistema 2. cambiar gran parte del bootloader

FALL

OS

EN F

RIM

AS

Page 27: Historias de la cripta usos indebidos de la criptografía

FALL

OS

EN F

RIM

AS

La importancia del relleno

» usando RSA directamente permitimos: sig(a*b) = (siga * sigb) mod n

» ataques de parejas de texto plano/cifrado específicas.

» comprobad cada byte, incluyendo el relleno.

» puede ser usado en tu contra para buscar colisiones en las firmas.

Page 28: Historias de la cripta usos indebidos de la criptografía

6fallos usando criptografía de clave pública

a veces muchos bits nunca serán suficientes

Page 29: Historias de la cripta usos indebidos de la criptografía

FALL

OS

USA

ND

O C

RIPT

OG

RAFÍ

A D

E C

LAV

E PÚ

BLIC

A

¿DSA conociendo k?

» ¡Debian! Conociendo la salida del PRNG

» Firma DSA (r, s): r = gk mod p mod q s = k-1 (H(m) + x*r) mod q

» Con k conocido: x = ((s*k) – H(m)) * r-1 mod q

» En realidad sólo con parte de los bits de k sería posible con suficientes firmas

Revelala claveprivada

Page 30: Historias de la cripta usos indebidos de la criptografía

FALL

OS

USA

ND

O C

RIPT

OG

RAFÍ

A D

E C

LAV

E PÚ

BLIC

A

¿Cifrar usando la clave privada?

» escenario: RSA, verificar actualizaciones mantenemos la clave publica secreta usada para descifrar actualizaciones

» no tiene sentido no podemos mantener secreta la pública

for e in [3, 5, 7, … 65537]: n ~= gcd(sig1e–m1, sig2e–m2) if m1e mod n == sig1: break

dos firmas = clave pública

Page 31: Historias de la cripta usos indebidos de la criptografía

FALL

OS

USA

ND

O C

RIPT

OG

RAFÍ

A D

E C

LAV

E PÚ

BLIC

A

Uso de valores no adecuados

» Son problemas matemáticos que asumen ciertas condiciones

casos particulares claves débiles cambios en algunos parámetros no permitir que sean cero exponentes pequeños

Page 32: Historias de la cripta usos indebidos de la criptografía

7side channel

la implementación es el enemigo del diseño

Page 33: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

¿Side channel has dicho?

» Hasta ahora hemos pensando en: Servidores remotos Nuestro ordenador

» Eventos que filtran información: estados de la cache de la CPU búfer de predicción de saltos datos en la pila uso de recursos planificación

no operamos en

una caja negra ideal

Page 34: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Page 35: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

¿Qué más podemos medir?

» Principalmente temporización consumo de potencias radiación EM

» Incluso temperatura sonidos patrones de acceso a discos

Page 36: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

¿Entonces?

» Veamos un par de ejemplos de ataques

» Pensemos en posibles protecciones

necesitamos ser paranoicos

Page 37: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ataque de temporización a RSA

» Exponenciaciones modulares

s=1;while(y) { if (y&1) s = (s*x) mod n; y>>=1; x = (x*x) mod n; }

» El tiempo de cálculo depende del valor de la clave

t_producto > t_cuadrado

Page 38: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ej. Ataque de temporización a RSA

Si combinamos la temporizacióncon un análisis de potencia consumida.

Page 39: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Análisis de potencia

» SPA (simple), observar varias medidas ver el path de ejecución conocer de antemano el resultado de una comparación

» DPA (diferencial), muchas medidas ataques estadísticos diferencias de medias correlaciones relación entre potencia y datos

Page 40: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Análisis de potencia

Page 41: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Inyección de fallos

» provocando un fallo temporal usando láser power glitching clock glitching

» podemos: introducir un fallo en un cálculo variación el camino de ejecución

Page 42: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ej. Inyección de fallos en RSA-CRT

» Implementación eficiente en memoria exponenciaciones modulares de modulos más pequeños recombinación

Con un fallo en la exponenciaciónobtenemos una firma una defectuosa

» RSA firma un mensaje mediante s = md (mod n)

Page 43: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

» Sin embargo RSA-CRT hace: s1 = mdq (mod q) s2 = mdp (mod p) s = a*s1 + b*s2 (mod n) = md (mod n) a := 0 (mod p), a := 1 (mod q) b := 1 (mod p), b := 0 (mod q)

» Usando una firma defectuosa: s–s’ = a*s1 – a*s1’ := 0 (mod q) s–s’=b*s2–b*s2’:≠0(modp)

Ej. Inyección de fallos en RSA-CRT

Page 44: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ej. Inyección de fallos en RSA-CRT

» Teniendo s1, s2 (defectuosa), pub(e, n):

sage: q = gcd(s1-s2,n) sage: p = n / q sage: G1 = IntegerModRing(lcm(q-1,p-1)) sage: private_key = G1(e)^-1 sage: G2 = IntegerModRing(n) sage: message = G2(encrypted)^G2(private_key)

Page 45: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

¿Cómo protegernos?

» Muy difícil si programamos en un lenguaje de alto nivel

» Mucho cuidado con optimizaciones de los compiladores

» Necesitamos librerías pensadas para resistir este tipo de ataques

Page 46: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ejemplo

def cmp(s1, s2): total = 0 for a, b in zip(s1, s2) total += (a != b) return not total

» ¿y si las cadenas no tienen la misma longitud?

» ¿y si la longitud es 0?

Page 47: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ejemplo

» Analizando la línea total += ( a !=b ) if (a != b) tmp = 1 else tmp = 0 total += tmp

» Fuga según el tiempo de ejecución Una línea de código en alto nivel no tiene por qué ser atómica

Page 48: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ejemplo

» Podríamos cambiarlo por

if len(userMsg) != len(correctValue) return false result = 0 for x, y in zip(userMsg, correctValue) result |= ord(x)^ord(y) return result

Usamos xor en lugar de !=Fuga por tiempo sobre la longitud correcta

Page 49: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Ejemplo

» Solución: si es un valor criptográfico no importa mucho (teóricamente tiene una longitud conocida) si es un passwd: calcular el hash antes de comparar

» Pero deberíamos seguir dudando de algunos factores: ¿y si x, y negativos? ¿realmente conocemos como funciona internamente zip()? ¿hace previamente una comparación de la longitud?

Page 50: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

A otros niveles

» Cache timming attack dependiente de la microarquitectura ver artículo de djb sobre openssl AES-256

» ¿nos puede jugar una mala pasado el compilador? optimizaciones fuera auditar el código compilado

» ¿podríamos aplicar estos conceptos via red? con 1000 medidas podemos detectar 20 ns en LAN 30 ms en WAN

Page 51: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al acceder a claves

» Usa exclusivamente punteros a la claves

» Evita estar copiando claves de un sitio a otro

Page 52: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al ejecutar saltos

» Evitar saltos endecisiones importantes.

» Que ambos caminos: tarden lo mismo misma estructura de instrucciones

Page 53: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al comprobar la integridad

» Cuidado al comprobar la paridad

» Podríamos estar revelando la clave

» El comportamiento de los algoritmos ha de ser invariable con los datos procesados

Page 54: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al comprobar la integridad

public static boolean checkParity( byte[]key, int offset){ for (int i = 0; i < DES_KEY_LEN; i++){ byte keyByte = key[i + offset]; int count = 0; while (keyByte != 0){ // loop till no ‘1’ bits left if ((keyByte & 0x01) != 0) count++; keyByte >>>= 1; // shift right} if ((count & 1) == 0) return false; // not odd } return true; // all bytes were odd}

Page 55: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al comprobar la integridad

» Si sabemos que: va de LSB a MSB comprobar que es un “1” tarda más que un “0”

» Podemos obtener la clave bit a bit

Page 56: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al comprobar la integridad

¿solución? usar una tabla de paridad consultarla en un orden aleatorio

Page 57: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al comprobar la integridad

static byte odd_parity[]= { // each table entry represents odd parity of index 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, ..., 248, 248, 251, 251, 253, 253, 254, 254};

public static boolean checkParity( byte[]key, int offset){ int r = random.nextInt() & 7; // random number 0..7 for ( int i=0, j = r; i<8; i++, j = (j+1)&7 ){ if (key[j] != odd_parity[key[j+offset]]) return false; // parity incorrect } return true; // all bytes were odd}

Page 58: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas cuando accedemos a datos

» Evitad lecturas secuenciales --> usar offset aleatorio

» Ejemplo negativo: memcpy( pin, buffer, 4 );

» Ejemplo más adecuado: for(int i = 0, j = (rand() & 3); i < 4; i++, j = ((j+1) & 3)) buffer[j] = pin[j];

Page 59: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al verificar a datos

» Usar strncmp() es un error lógico pero memcmp es secuencial

if ( strcmp( givenPasswd, storedPasswd ) != 0 ) return -1; // combo fail

if ( memcmp( givenPasswd, storedPasswd ) != 0 ) return -1; // time leak fail

» Evitad todo lo secuencial

Page 60: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al verificar a datos

» Posible implementación: char* c1 = givenPasswd; char* c2 = storedPasswd; char error = 0; for (; *c1 != 0 && *c2 != 0; c1++, c2++ ) error |= *c1 ^ *c2; // collect diff in error if (error | *c1 | *c2) // fail if any not zero return -1; return 0;

» Se podría mejorar usando un offset aleatorio.

Page 61: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fugas al sobreescribir datos

» No hacerlo secuencialmente

» No borrar datos sobreescribiendo ceros

» CMOS consume en los cambios de estado

» Borrad con un random(), limpiad con ceros después

escribir un 0 ≠ escribir un 1

Page 62: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Defendernos de inyecciones de fallos

» Una inyección de fallos puede hasta revelar una clave.

» Pueden ser medidas imple-mentadas en hardware pero también muchas son lógicas.

SID

E C

HA

NN

EL

Page 63: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

El caso por defecto

Mismo concepto: result = no if ( equal ) result = yes

result = yesif ( notequal) result = no

Vs.

switch (state) { case STATE_INIT: processInit(apdu); break; case STATE_PERSO: processPerso(apdu); break; case STATE_ISSUED: processIssued(apdu); break; case STATE_LOCKED: processLocked(apdu); break; default: fail();}

Page 64: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fallos en el flujo de ejecución

» Verificaciones del flujo shadow stack/PC comprobar el estado después de los saltos

» Uso de valores no triviales los valores booleanos con fácilmente corrompibles escoger valores con distancia hamming máxima enmascaramiento en las medidas de potencia true = 0xc3 false = 0x3c

Page 65: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fallos en los saltos

» No usar booleanos para comprobar saltos

» Comprobar siempre el valor para acceder a esa zona

if (conditionalValue == (byte)0xA5) // then part else if (conditionalValue == (byte)0xC3) // else part

Page 66: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Fallos en los saltos

» En situaciones decisivas, haced varias veces usan-do una comparación complementaria:

// within then part if (conditionalValue != (byte)0xA5) fail(); if (~conditionalValue != (byte)0x5A) fail();

Page 67: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Respuesta a inyección de fallos

staticfinalbyte[]CONSTANT={0x0F,0x1E,0x2D,0x3C, 0x4B, 0x5A,0x69, 0x78 };

static byte[] copied = new byte[CONSTANT.length];

public void main( Strings[] s ){ System.arraycopy( CONSTANT, 0, copied, 0, CONSTANT.LENGTH );

private void check(){ // call this method repeteadly for (int i = 0; i < CONSTANT.LENGTH; i++) if (CONSTANT [i] != copied[i]) fail();}

Page 68: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Respuesta a inyección de fallos

» En caso de: ataques repetidos datos suficientemente sensibles

» Incluso con el borrado de claves privadas

Page 69: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Necesitamos un límite

» Podríamos ser paranoicos hasta el infinito

» Tenemos que plantearnos ¿hay acceso físico? ¿hay negocio atacando el sistema? ¿hay otras zonas más débiles? ¿necesito esta inversión en seguridad?

Page 70: Historias de la cripta usos indebidos de la criptografía

8conclusión¿Qué nos llevamos de todo esto?

Page 71: Historias de la cripta usos indebidos de la criptografía

SID

E C

HA

NN

EL

Resumen

» La criptografía es frágil. Cuando falla, falla del todo.

» No implementes la tuya propia: Remodela tu arquitectura

» Si de verdad no puedes

» Que el código sea revisado por terceros 10x

SSL para comunicaciones GPG para el resto

usa una librería de alto nivel cryptlib, keyzcar

Page 72: Historias de la cripta usos indebidos de la criptografía

preguntas

Javi Moreno<[email protected]>

http://vierito.es/wordpresshttp://twiiter.com/vierito5

hashtag #cripta

cambio sugus por