25

Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

  • Upload
    vongoc

  • View
    226

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Parsifal, ou comment écrire rapidement des parsers

robustes et e�caces

Olivier Levillain

ANSSI

5 juin 2013

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 1 / 13

Page 2: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Contexte

I Pour comprendre un format ou un protocole, le mieux est del'implémenter

I Comme souvent, le diable se cache dans les détailsI encodage des entiers en ASN.1 ou en protobufI endianness des champs, jusqu'à l'ordre de remplissage d'un octet

bit-à-bitI sémantique des protocoles et spéci�cations �oues

I Les parsers binaires sont une brique de base de toute implémentationI Quelques vulnérabilités liées à des parsers

I libpng : CVE-2011-3045 et CVE-2011-3026I libtiff : CVE-2012-5581, CVE-2012-4447 et CVE-2012-1173I wireshark : CVE-2012-4048, CVE-2012-4296...

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 2 / 13

Page 3: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Outils existants pour analyser des formats binaires

I WiresharkI ScapyI Hachoir

I AvantagesI outils existantsI de nombreux protocoles réseau et formats de �chiers déjà implémentésI Scapy (et Hachoir) facilement extensible

I LimitationsI deux outils sont limités au réseauI Wireshark di�cile à étendreI lenteur du python

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 3 / 13

Page 4: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Cas réel : analyse de données SSL

I Analyse de mesures SSL (article publié à ACSAC 2012)I pour chaque hôte contacté, réponse du serveur à un ClientHello TLS

sur le port 443I 140 Go de données brutes

I Problème pour disséquer toutes ces donnéesI données corrompuesI protocole autre que SSL/TLS (en général HTTP ou SSH)I erreurs plus subtiles dans les messages

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 4 / 13

Page 5: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Interlude concernant SSL

Que répond un serveur si vous lui proposez les suites crypto AES128-SHA etDHE-RSA-AES128-SHA ?

A AES128-SHA

B DHE-RSA-AES128-SHA

C une alerte

D la réponse D (RC4_MD5)

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 5 / 13

Page 6: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Interlude concernant SSL

Que répond un serveur si vous lui proposez les suites crypto AES128-SHA etDHE-RSA-AES128-SHA ?

A AES128-SHA

B DHE-RSA-AES128-SHA

C une alerte

D la réponse D (RC4_MD5)

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 5 / 13

Page 7: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Interlude concernant SSL

Que répond un serveur si vous lui proposez les suites crypto AES128-SHA etDHE-RSA-AES128-SHA ?

A AES128-SHA

B DHE-RSA-AES128-SHA

C une alerte

D la réponse D (RC4_MD5)

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 5 / 13

Page 8: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Interlude concernant SSL

Que répond un serveur si vous lui proposez les suites crypto AES128-SHA etDHE-RSA-AES128-SHA ?

A AES128-SHA

B DHE-RSA-AES128-SHA

C une alerte

D la réponse D (RC4_MD5)

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 5 / 13

Page 9: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Interlude concernant SSL

Que répond un serveur si vous lui proposez les suites crypto AES128-SHA etDHE-RSA-AES128-SHA ?

A AES128-SHA

B DHE-RSA-AES128-SHA

C une alerte

D la réponse D (RC4_MD5)

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 5 / 13

Page 10: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Historique des outils

Pour traiter ce volume de données, plusieurs parsers TLS ont étédéveloppés

I Python : rapide à écrire, mais lent à l'exécution

I C++ (avec templates et des objets) : �exible, rapide, mais verbeux etpénible à mettre au point

I OCaml avec un préprocesseur : tous les indicateurs au vert

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 6 / 13

Page 11: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Parsifal : plaquette publicitaire

I Écriture de parsers grâce à du code concisI E�cacité des programmes produitsI Robustesse des outils développésI Méthodologie de développement adaptée à l'écriture incrémentale de

parsers �exibles

I Parsifal permet aussi de dumper les objets décritsI Exemple : client DNS en 200 lignes

I Objectifs de ParsifalI outils d'analyse maîtrisésI brique de base pour des outils de dépollution

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 7 / 13

Page 12: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Parsifal : plaquette publicitaire

I Écriture de parsers grâce à du code concisI E�cacité des programmes produitsI Robustesse des outils développésI Méthodologie de développement adaptée à l'écriture incrémentale de

parsers �exibles

I Parsifal permet aussi de dumper les objets décritsI Exemple : client DNS en 200 lignes

I Objectifs de ParsifalI outils d'analyse maîtrisésI brique de base pour des outils de dépollution

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 7 / 13

Page 13: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Parsifal : plaquette publicitaire

I Écriture de parsers grâce à du code concisI E�cacité des programmes produitsI Robustesse des outils développésI Méthodologie de développement adaptée à l'écriture incrémentale de

parsers �exibles

I Parsifal permet aussi de dumper les objets décritsI Exemple : client DNS en 200 lignes

I Objectifs de ParsifalI outils d'analyse maîtrisésI brique de base pour des outils de dépollution

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 7 / 13

Page 14: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (1/3)

s t r u c t png_f i l e = {png_magic : magic ( "\x89\x50\ x4e \x47\x0d\x0a\x1a\x0a" ) ;png_content : b i n s t r i n g ;

}

l e t i n pu t = input_of_f i l ename " s s t i c . png" i n

l e t png = par s e_png_f i l e i n pu t i n

p r i n t_va l u e ( va lue_of_png_f i l e png )

Démo : notre premier parser PNG

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 8 / 13

Page 15: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (1/3)

s t r u c t png_f i l e = {png_magic : magic ( "\x89\x50\ x4e \x47\x0d\x0a\x1a\x0a" ) ;png_content : b i n s t r i n g ;

}

l e t i n pu t = input_of_f i l ename " s s t i c . png" i n

l e t png = par s e_png_f i l e i n pu t i n

p r i n t_va l u e ( va lue_of_png_f i l e png )

Démo : notre premier parser PNG

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 8 / 13

Page 16: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (1/3)

s t r u c t png_f i l e = {png_magic : magic ( "\x89\x50\ x4e \x47\x0d\x0a\x1a\x0a" ) ;png_content : b i n s t r i n g ;

}

l e t i n pu t = input_of_f i l ename " s s t i c . png" i n

l e t png = par s e_png_f i l e i n pu t i n

p r i n t_va l u e ( va lue_of_png_f i l e png )

Démo : notre premier parser PNG

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 8 / 13

Page 17: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (2/3)

s t r u c t png_f i l e = {png_magic : magic ( "\x89\x50\ x4e \x47\x0d\x0a\x1a\x0a" ) ;chunks : l i s t o f png_chunk ;

}

s t r u c t png_chunk = {chunk_s ize : u i n t 32 ;chunk_type : s t r i n g ( 4 ) ;data : b i n s t r i n g ( chunk_s ize ) ;c r c : u i n t 32 ;

}

Démo : résultat du préprocesseur

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 9 / 13

Page 18: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (2/3)

s t r u c t png_f i l e = {png_magic : magic ( "\x89\x50\ x4e \x47\x0d\x0a\x1a\x0a" ) ;chunks : l i s t o f png_chunk ;

}

s t r u c t png_chunk = {chunk_s ize : u i n t 32 ;chunk_type : s t r i n g ( 4 ) ;data : b i n s t r i n g ( chunk_s ize ) ;c r c : u i n t 32 ;

}

Démo : résultat du préprocesseur

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 9 / 13

Page 19: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (2/3)

s t r u c t png_f i l e = {png_magic : magic ( "\x89\x50\ x4e \x47\x0d\x0a\x1a\x0a" ) ;chunks : l i s t o f png_chunk ;

}

s t r u c t png_chunk = {chunk_s ize : u i n t 32 ;chunk_type : s t r i n g ( 4 ) ;data : b i n s t r i n g ( chunk_s ize ) ;c r c : u i n t 32 ;

}

Démo : résultat du préprocesseur

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 9 / 13

Page 20: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (2/3)

s t r u c t png_chunk = {chunk_s ize : u i n t 32 ;chunk_type : s t r i n g ( 4 ) ;data : c o n t a i n e r ( chunk_s ize ) o f chunk_content ( chunk_type ) ;c r c : u i n t 32 ;

}

union chunk_content [ e n r i c h ] ( UnparsedChunkContent ) =| "IHDR" −> ImageHeader o f image_header| "IDAT" −> ImageData o f b i n s t r i n g| "IEND" −> ImageEnd| "PLTE" −> ImagePa l e t t e o f l i s t o f a r r a y (3 ) o f u i n t 8

s t r u c t image_header = {. . .

}

Démo : parser enrichi.

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 10 / 13

Page 21: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (2/3)

s t r u c t png_chunk = {chunk_s ize : u i n t 32 ;chunk_type : s t r i n g ( 4 ) ;data : c o n t a i n e r ( chunk_s ize ) o f chunk_content ( chunk_type ) ;c r c : u i n t 32 ;

}

union chunk_content [ e n r i c h ] ( UnparsedChunkContent ) =| "IHDR" −> ImageHeader o f image_header| "IDAT" −> ImageData o f b i n s t r i n g| "IEND" −> ImageEnd| "PLTE" −> ImagePa l e t t e o f l i s t o f a r r a y (3 ) o f u i n t 8

s t r u c t image_header = {. . .

}

Démo : parser enrichi.

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 10 / 13

Page 22: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Exemple : structure d'une image PNG (2/3)

s t r u c t png_chunk = {chunk_s ize : u i n t 32 ;chunk_type : s t r i n g ( 4 ) ;data : c o n t a i n e r ( chunk_s ize ) o f chunk_content ( chunk_type ) ;c r c : u i n t 32 ;

}

union chunk_content [ e n r i c h ] ( UnparsedChunkContent ) =| "IHDR" −> ImageHeader o f image_header| "IDAT" −> ImageData o f b i n s t r i n g| "IEND" −> ImageEnd| "PLTE" −> ImagePa l e t t e o f l i s t o f a r r a y (3 ) o f u i n t 8

s t r u c t image_header = {. . .

}

Démo : parser enrichi.

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 10 / 13

Page 23: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Parsifal : présent...

Fonctionnalités non présentéesI Conteneurs (base64, zlib, etc.)I Manipulation simple des objets

I x509show -g "**.extnID" cert.pem

Formats implémentés :

X.509 description assez complèteSSL/TLS beaucoup de messages décritsPE code à intégrerKerberos messages PKINIT à intégrerTAR tutorielDNS tutoriel + picodig

PNG tutoriel + stage en coursPCAP support rudimentaire PCAP/IP/TCP/UDP

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 11 / 13

Page 24: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Parsifal :... et futur

I Stabilisation v0.2 en cours

I Consolider la documentation

I PerspectivesI assainissement PDFI animation des protocoles (TLS)

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 12 / 13

Page 25: Parsifal, ou comment écrire rapidement des parsers ... · Parsifal : plaquette publicitaire I Écriture de parsers grâce à du code concis I E cacité des programmes produits I

Questions ?

Merci de votre attention.

  Vu sur GitHub !

*

* mais ne protège pas des XSS

https://github.com/ANSSI-FR/parsifal

Olivier Levillain (ANSSI) https://github.com/ANSSI-FR/parsifal 5 juin 2013 13 / 13