Apprendre la cryptographie par lattaque - Devoxx FR 2016

Preview:

Citation preview

#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 <alice@victime.com>”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 alice@victime.com

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 <alice@victime.com>"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 <alice@victime.com>"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