#DevoxxFR 1 Apprendre la cryptographie par l’attaque ! Thierry Abalea CTO @Fluo @ThierryAbalea
#DevoxxFR 1
Apprendre la
cryptographiepar l’attaque !
Thierry Abalea CTO @Fluo
@ThierryAbalea
#DevoxxFR 2
Cryptographie : le maillon le plus fort
de la chaine
La cryptographie est un problème résolu
“ „ “ „
#DevoxxFR 3
Cryptographie : le maillon le plus fort
de la chaine
La cryptographie est un problème résolu
“ „ “ „ Ces personnes se trompent
#DevoxxFR 4
๏ Algorithmes
๏ Conception des protocoles
๏ Implémentation
๏ Conception des API/Bibliothèques
๏ Déploiement et usage correct
✔
confiance
décroit
#DevoxxFR 5
AES
SHA
RSA
#DevoxxFR 6
AES
SHA
RSA
sûrs mais pas directement
#DevoxxFR 7
Oracle Padding Attack
Démonstration sur AES
“ „
#DevoxxFR 8
La méthode suivante est parfaitement sûre en terme de
cryptographie
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.GeneralSecurityException; public static byte[] decrypt(byte[] cipherText, byte[] iv) throws GeneralSecurityException { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(KEY, "AES"), new IvParameterSpec(iv)); return cipher.doFinal(cipherText); }
#DevoxxFR 9
… mais elle n’est pas sûre si elle est appelée par la méthode
suivante :
public int processEncryptedMessage(byte[] cipherText, byte[]) int httpStatusCode; try { decrypt(cipherText, iv); httpStatusCode = OK_CODE; // 200 process(plaintext); } catch (GeneralSecurityException exc) { httpStatusCode = INTERNAL_ERROR_CODE; // 500 } return httpStatusCode; }
#DevoxxFR 10
Démo
#DevoxxFR 11
Explication de l’attaque
#DevoxxFR 12
https://fr.wikipedia.org/wiki/Mode_d%27op%C3%A9ration_(cryptographie)
#DevoxxFR 13
Problème des modes ECB( Electronic CodeBook )
Image originaleImage chiffrée en mode ECB
Image chiffrée en un autre mode
que ECB
#DevoxxFR 14
Mode d’opération CBC( Cipher Block Chaining )
Chiffrement Déchiffrement
#DevoxxFR 15
Ajout du padding au chiffrement
longueur 1 => … XX XX XX 01longueur 2 => … XX XX 02 02longueur 3 => … XX 03 03 03
#DevoxxFR 16
Padding valide (au déchiffrement)
… XX XX XX 01 => longueur 1… XX XX 02 02 => longueur 2 … XX 03 03 03 => longueur 3… XX XX 01 01 => longueur 1
#DevoxxFR 17
Padding invalide (au déchiffrement)
… XX XX XX 00… XX XX 01 02 … XX FE 03 03
#DevoxxFR 18
xx xx xxxxxx xx
Avant dernier bloc chiffré
xx xx xxxxxx xx
Dernier bloc chiffré
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx xx xx xxxxxx xx
+
Déchiffrement du bloc
+
Bloc intermédiaire
Bloc clair
#DevoxxFR 19
xx xx xxxxxx xx xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx xx xx xxxxxx xx
+
Déchiffrement du bloc
+
ConnuAvant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
#DevoxxFR 20
xx xx xxxxxx xx xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx xx xx xxxxxx xx
+
Déchiffrement du bloc
+
ConnuAvant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
#DevoxxFR 21
xx xx xxxxxx xx xx xx xxxxxx xx
Déchiffrement du bloc
?? ?? ?????? ??
xx xx xxxxxx xx xx xx xxxxxx xx
+
Déchiffrement du bloc
+
Inconnu
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
#DevoxxFR 22
xx xx xxxxxx xx xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx ?? ?? ?????? ??
+
Déchiffrement du bloc
+Inconnu A déterminer
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
?? ?? ?????? ??
#DevoxxFR 23
xx xx xxxxxx xx xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx ?? ?? ?????? ??
+
Déchiffrement du bloc
+
Cible immédiate
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
?? ?? ?????? ??
#DevoxxFR 24
RR RR RRRRRR RR xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx RR RR RRRRRR RR
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
?? ?? ?????? ??
#DevoxxFR 25
RR RR RRRRRR RR xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR RR
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
#DevoxxFR 26
RR RR RRRRRR ?? xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR 01
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Objectif
A déterminer
#DevoxxFR 27
RR RR RRRRRR 00 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Inconnu
#DevoxxFR 28
RR RR RRRRRR 00 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Padding KO ≠ 1
#DevoxxFR 29
RR RR RRRRRR 01 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
2ème essai
#DevoxxFR 30
RR RR RRRRRR 01 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Padding KO
2ème essai
≠ 1
#DevoxxFR 31
RR RR RRRRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
3ème essai
#DevoxxFR 32
RR RR RRRRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Inconnu
Padding OK
3ème essai
#DevoxxFR 33
RR RR RRRRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR RRRRRR 01
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
?
Padding OK
3ème essai
#DevoxxFR 34
RR RR RRRRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR 02RRRR 02
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
?
Padding OK
3ème essai
#DevoxxFR 35
RR RR RRRRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR 0303RR 03
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
?
Padding OK
3ème essai
#DevoxxFR 36
RR RR RR’RRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR XXRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
?
Validation
#DevoxxFR 37
RR RR RR’RRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx 03
xx xx xxxxxx xx RR RR XXRRRR 01
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
= 1
Validation
Padding OK
#DevoxxFR 38
RR RR RR’RRRR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR XXRRRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
≠ 1
Validation
Padding KO
#DevoxxFR 39
RR RR RRRR’RR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx RR RR ??XXRR ??
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Validation
#DevoxxFR 40
RR RR 05RR’RR 02 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx 07xxxx 00
xx xx xxxxxx xx RR RR 02YYRR 02
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
= 2 Padding OK
#DevoxxFR 41
RR RR RRRRRR RR xx xx xxxxxx xx
Déchiffrement du bloc
xx xx 07xxxx 00
xx xx xxxxxx xx RR RR 0303RR 03
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Cible padding de 3
#DevoxxFR 42
RR RR 04??RR 03 xx xx xxxxxx xx
Déchiffrement du bloc
xx xx 07xxxx 00
xx xx xxxxxx xx RR RR 0303RR 03
+
Déchiffrement du bloc
+
Avant dernier bloc chiffré Dernier bloc chiffré
Bloc intermédiaire
Bloc clair
Cible padding de 3
#DevoxxFR 43
xx xx xxxxxx xx
Avant dernier bloc chiffré
xx xx xxxxxx xx
Dernier bloc chiffré
Déchiffrement du bloc
xx xx xxxxxx xx
xx xx xxxxxx xx xx xx xxxxxx xx
+
Déchiffrement du bloc
+
Bloc intermédiaire
Bloc clair
Et ce bloc ?
#DevoxxFR 44
Solution : Authentifier le message
#DevoxxFR 45
MAC : Message Authentication Code
Message MessageMessage
MAC Algorithm
MAC MAC MAC
MAC Algorithm
MAC
=?
Secret Key Secret Key
=?
Message is authentic
Message has bean altered
Y N
#DevoxxFR 46
MAC = SHA-256 (Key || m)
#DevoxxFR 47
MAC = SHA-256 (Key || m)⤬
#DevoxxFR 48
Length Extension Attack
Démonstration sur SHA
“ „
#DevoxxFR 49
Objectif : Authentifier
les requêtes sur une API
#DevoxxFR 50
http://dashboard.fluo.com/?role=admin& user=alice&mac=e3fd4….4D
SHA-256 ( Key || http://dashboard….alice )
#DevoxxFR 51
Les 3 propriétés de cryptanalyse
d’une fonction de hachage cryptographique
(MD5, SHA, …)
#DevoxxFR 52
Résistance à la pré-image
h m, h = hash(m)
impossible *
1
* sur le plan pratique
#DevoxxFR 53
Résistance à la seconde pré-image
m1 m2, hash(m1) = hash(m2)
impossible *
∀
2
* sur le plan pratique
#DevoxxFR 54
Résistance aux collisions
m1, m2 tel que hash(m1) = hash(m2)
impossible *
∃
3
* sur le plan pratique
#DevoxxFR 55
Construction de Merkle–Damgård
F Finalisation
Bloc Message 1
Bloc Message 2
Bloc Message N
Longueur du padding
F F F HashIV
#DevoxxFR 56
http://dashboard...alice%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00
%00 %00%A8&user=eve&mac=5af4...fc
#DevoxxFR 57
HMAC (k,m) = SHA-256 ( k || SHA-256(k || m))
Solution :
#DevoxxFR 58
Revenons sur AES & CBC
#DevoxxFR
SSL / TLS
PaddingTexte Clair MAC
CBC
CléIV
Handshake
59
#DevoxxFR 60
Lucky 13 Attack “ „ attaque temporelle
(timing attack)
Février 2013
#DevoxxFR 61
Solution AEAD
Authentication Encryption with Associated Data
#DevoxxFR 62
Encrypt-then-MAC (EtM)
1
#DevoxxFR 63
Mode d’opération GMC, EAX, …
2
#DevoxxFR 64
3Bibliothèques
au bon niveau d’abstraction (KeyCzar, cryptlib, …)
#DevoxxFR 65
Attaque liée à la compression TLS
#DevoxxFR 66
gzip
#DevoxxFR 67
Site sous le contrôle de l’attaquant
https://www.google.com
Navigateur de la Victime
Vecteur de l’attaque en Javascript
GET /image
#DevoxxFR 68
GET /images/logo.png HTTP/1.1Host: www.google.com(...)Cookie: secret=7xc89f+94/wa(...)
#DevoxxFR 69
GET /images/logo4e8.png HTTP/1.1Host: www.google.com(...)Cookie: secret=7xc89f+94/wa(...)
#DevoxxFR 70
GET /images/logo7xc.png HTTP/1.1Host: www.google.com(...)Cookie: secret=7xc89f+94/wa(...)
#DevoxxFR 71
Solution désactiver la compression
TLS & SPDY
#DevoxxFR 72
2011 BEAST
2013 BREACH
2013 LUCKY 13
2012 CRIME
2013 Attaques sur RC4
2014 Apple’s goto fail
2014 Heartbleed
2014 POODLE
2015 FREAK
2015 logjam
2016 DROWN
Attaques SSL/TLS
#DevoxxFR 73
2011 BEAST
2013 BREACH
2013 LUCKY 13
2012 CRIME
2013 Attaques sur RC4
2014 Apple’s goto fail
2014 Heartbleed
2014 POODLE
2015 FREAK
2015 logjam
2016 DROWN
Attaques SSL/TLSOPA
OPA
OPA & +
Compression
Compression
#DevoxxFR 74
Une attaque pour conclure
#DevoxxFR 75
GnuPG
#DevoxxFR 76
gpg -d your_archive.tar.gpg | tar xz
#DevoxxFR 77
gpg -d your_script.sh.gpg | bash
#DevoxxFR 78
$ gpg -d my_secure_script.sh.gpg | bashgpg: AES encrypted datagpg: encrypted with 1 passphrasegpg: Signature made Sun Apr 17 21:59:14 2016 CEST using RSA key ID E625A4BBgpg: BAD signature from "Alice <[email protected]>”gpg: WARNING: message was not integrity protected… exécution de code “aléatoire” …
#DevoxxFR 79
echo "J'ai hacké la machine de `whoami`"
Script malveillant
#DevoxxFR 80
echo "echo \"J'ai hacké la machine de \`whoami\`\"" | gpg --encrypt -o my_secure_script.sh.gpg --recipient [email protected]
Le Hacker
#DevoxxFR 81
gpg --passphrase=secret --decrypt my_secure_script.sh.gpg| bash
La victime
#DevoxxFR 82
gpg --passphrase=secret --decrypt my_secure_script.sh.gpg| bash
You need a passphrase to unlock the secret key foruser: "Alice <[email protected]>"2048-bit RSA key, ID 7EFCB32A, created 2016-04-17 (main key ID E625A4BB)
gpg: encrypted with 2048-bit RSA key, ID 7EFCB32A, created 2016-04-17 “Alice <[email protected]>"J'ai hacké la machine de alice
La victime
#DevoxxFR 83
Question ?
#DevoxxFR 84
RéférencesLes slides de ce talk: http://bit.ly/crypto-devoxx
Blog de Matthew Green (cryptologue) http://blog.cryptographyengineering.com/
Blog d’Adam Langley (cryptologue), https://www.imperialviolet.org/
Talk de Matthew Green, https://www.youtube.com/watch?v=uP6np_oKVCkTalk d’Adam Langley, https://www.yahoo.com/news/video/yahoo-trust-unconference-
tls-adam-223046696.html?ref=gsPost lié au talk précédent, https://www.imperialviolet.org/2015/05/16/aeads.html
Code de l’Oracle Padding Attack: http://bit.ly/oracle-padding-attack