Professional Documents
Culture Documents
de la
cripta
Javi Moreno
ESCENARIO
FALLOS EN CIFRADOS
FALLOS EN LA PROTECCIN
DE LA INTEGRIDAD
FALLOS EN FIRMAS
SIDE CHANNEL
CONCLUSIN
1
escenario
ponindonos en situacin
ESCENARIO
Extremadamente frgil.
Revisar el cdigo cuesta mucho ms que desarrollarlo.
(adems lo debe revisar otro)
ESCENARIO
Si no puedes, usa
una librera de
alto nivel:
No uses directamente las de
bajo nivel:
GPGME, keyzcar, u
otras comerciales
OpenSSL, Crypto++,
Java crypto, BouncyCastle,
.NET System.Security.Cryptography
ESCENARIO
Solucin simple
Confusiones evidentes
ESCENARIO
ESCENARIO
ESCENARIO
Un pequeo
detalle que lo
derrumba todo
fallos que
desmontan un
sistema completo
Lo implantamos no adecuadamente
no uses:
random (python)
java.util.Random (java)
System.Random (.NET)
usa:
el por defecto
no es suficiente
random.SystemRandom (python)
java.security.SecureRandom (java)
System.Security.Cryptography.RandomNumberGenerator (.NET)
nunca:
PRNGs no adecuados
indispensables
para
un sistema
criptogrfico
creacin de claves!
PRNGs no adecuados
PRNGs no adecuados
Mifare Classic
reconstruyeron el circuito a base de fotografas microscpicas.
Su RNG
PRNGs no adecuados
PRNGs no adecuados
fallos en
cifrados
cuando no es tu propia implementacin
Modos de encadenamiento
ECB? Sin realimentacin
El tpico conocido CBC
convierten de bloque a uno flujo
sin integridad, se pueden cambiar bits
no reusar: IVs, realimentacin, contadores...
FALLOS CIFRANDO
fallos en la proteccin de la
integridad
Mismo
Usa
HMAC!
Problema:
granularidad, parmetros configurables
FALLOS
FALLOS
ENEN
LALA
PROTECCIN
PROTECCIN
DEDE
LALA
INTEGRIDAD
INTEGRIDA
Hashing
Hashing
<SignatureMethod Algorithm=xmldsig#hmac-sha1>
<HMACOutputLength>
160
</HMACOutputLength>
</SignatureMethod>
Estndar XMLDsig.
Disponible desde alto nivel.
y por qu
no existe
nicamente
SHA1?
padding_incorrect
integrity_failure
por la boca
muere el pez
fallos en
firmas
no te han dicho que nunca firmes algo sin leerlo primero?
2
- caso correcto:
verificamos todos los datos (relleno includo)
FALLOS EN FRIMAS
1
Se calcula una simple exponenciacin
FALLOS EN FRIMAS
FALLOS EN FRIMAS
FALLOS EN FRIMAS
fallos usando
criptografa de
clave pblica
Revela
la clave
privada
r = gk mod p mod q
Con k conocido:
DSA conociendo k?
no tiene sentido
7
side channel
Servidores remotos
no
operamos en
Eventos
que
filtran
informacin:
una caja negra
estados de la cache de la CPU
ideal bfer de prediccin de saltos
datos en la pila
uso de recursos
planificacin
SIDE CHANNEL
Nuestro ordenador
SIDE CHANNEL
Qu ms podemos medir?
Principalmente
Incluso
temperatura
sonidos
patrones de acceso a discos
SIDE CHANNEL
temporizacin
consumo de potencias
radiacin EM
Entonces?
SIDE CHANNEL
s=1;while(y) {
if (y&1)
s = (s*x) mod n; y>>=1;
x = (x*x) mod n;
}
SIDE CHANNEL
Exponenciaciones modulares
SIDE CHANNEL
Si combinamos la temporizacin
con un anlisis de potencia consumida.
Anlisis de potencia
ataques estadsticos
diferencias de medias
correlaciones
relacin entre potencia y datos
SIDE CHANNEL
SIDE CHANNEL
Anlisis de potencia
Inyeccin de fallos
usando lser
podemos:
SIDE CHANNEL
power glitching
clock glitching
s = md (mod n)
SIDE CHANNEL
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)
SIDE CHANNEL
sage:
sage:
sage:
sage:
sage:
sage:
q = gcd(s1-s2,n)
p = n / q
G1 = IntegerModRing(lcm(q-1,p-1))
private_key = G1(e)^-1
G2 = IntegerModRing(n)
message = G2(encrypted)^G2(private_key)
SIDE CHANNEL
Cmo protegernos?
SIDE CHANNEL
SIDE CHANNEL
Ejemplo
Ejemplo
= 0
+= tmp
SIDE CHANNEL
if (a
tmp
else
tmp
total
Ejemplo
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
SIDE CHANNEL
Ejemplo
Solucin:
y si x, y negativos?
realmente conocemos como funciona internamente zip()?
hace previamente una comparacin de la longitud?
SIDE CHANNEL
A otros niveles
Cache timming attack
dependiente de la microarquitectura
ver artculo de djb sobre openssl AES-256
optimizaciones fuera
auditar el cdigo compilado
SIDE CHANNEL
SIDE CHANNEL
tarden lo mismo
misma estructura de
instrucciones
SIDE CHANNEL
Evitar saltos en
decisiones importantes.
SIDE CHANNEL
SIDE CHANNEL
va de LSB a MSB
comprobar que es un 1 tarda ms que un 0
SIDE CHANNEL
Si sabemos que:
solucin?
usar una tabla de paridad
consultarla en un orden aleatorio
SIDE CHANNEL
SIDE CHANNEL
Ejemplo ms adecuado:
SIDE CHANNEL
Ejemplo negativo:
SIDE CHANNEL
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;
SIDE CHANNEL
Posible implementacin:
SIDE CHANNEL
No hacerlo secuencialmente
Una inyeccin
de fallos puede
hasta revelar
una clave.
Pueden ser medidas implementadas en hardware pero
tambin muchas son lgicas.
SIDE CHANNEL
Mismo concepto:
result = no
if ( equal )
result = yes
Vs.
result = yes
if ( notequal)
result = no
SIDE CHANNEL
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();
}
SIDE CHANNEL
shadow stack/PC
comprobar el estado despus de los saltos
if (conditionalValue == (byte)0xA5)
// then part
else if (conditionalValue == (byte)0xC3)
// else part
SIDE CHANNEL
SIDE CHANNEL
SIDE CHANNEL
ataques repetidos
datos suficientemente sensibles
SIDE CHANNEL
En caso de:
Necesitamos un lmite
SIDE CHANNEL
8
conclusin
Resumen
Si de verdad no puedes
SIDE CHANNEL
La criptografa es frgil.
Cuando falla, falla del todo.
Javi Moreno
<vierito5@gmail.com>
http://vierito.es/wordpress
http://twiiter.com/vierito5
hashtag #cripta
preguntas