[SLPS] sécurité logicielle et développement sécurisé



Documents pareils
Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

OWASP Open Web Application Security Project. Jean-Marc Robert Génie logiciel et des TI

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Vulnérabilités et sécurisation des applications Web

OWASP Code Review Guide Revue de code. Paris The OWASP Foundation. Victor Vuillard

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Attaques applicatives

Vulnérabilités et solutions de sécurisation des applications Web

Tech-Evenings Sécurité des applications Web Sébastien LEBRETON

Failles XSS : Principes, Catégories Démonstrations, Contre mesures

Création d un «Web Worm»

Introduction aux buffer overflow, CS335

Programmation système de commandes en C

Programmation Web. Madalina Croitoru IUT Montpellier

Sécurité des Applications Web Comment Minimiser les Risques d Attaques les plus Courants

Programmation système I Les entrées/sorties

Programmation défensive

Rapport de certification ANSSI-CSPN-2010/05. ModSecurity v2.5.12

Hébergement de sites Web

PHP CLÉS EN MAIN. 76 scripts efficaces pour enrichir vos sites web. par William Steinmetz et Brian Ward

Expérience d un hébergeur public dans la sécurisation des sites Web, CCK. Hinda Feriani Ghariani Samedi 2 avril 2005 Hammamet

Remote Cookies Stealing SIWAR JENHANI (RT4) SOUHIR FARES (RT4)

Sécurité des applications web. Daniel Boteanu

L3 informatique TP n o 2 : Les applications réseau

DenyAll Detect. Documentation technique 27/07/2015

JAB, une backdoor pour réseau Win32 inconnu

Pratique et administration des systèmes

Sécuriser les applications web

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Maarch Framework 3 - Maarch. Tests de charge. Professional Services. 11, bd du Sud Est Nanterre

Le langage C. Séance n 4

Vulnérabilités logicielles. Jean-Marc Robert

Java DataBaseConnectivity

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Module BD et sites WEB

Architecture Orientée Service, JSON et API REST

laposte.net) Ministère de l'éducation nationale Atelier sécurité Rabat RALL 2007

Mysql. Les requêtes préparées Prepared statements

Analyse statique de code dans un cycle de développement Web Retour d'expérience

Note technique. Recommandations pour la sécurisation des sites web

E-TRANSACTIONS. Guide du programmeur API Plug-in. Version 1.1

Protection des protocoles

Sécuriser les applications web de l entreprise

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

les techniques d'extraction, les formulaires et intégration dans un site WEB

Les formations. ENI Ecole Informatique

Cours Programmation Système

Algorithmique et Programmation, IMA

3IS - Système d'exploitation linux - Programmation système

Programmation système en C/C++

TP Programmation Java / JDBC / Oracle

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Gérer ses environnements de développement avec Vagrant RMLL 2012

Le prototype de la fonction main()

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

Introduction au langage C

INFORMATIQUE & WEB. PARCOURS CERTIFICAT PROFESSIONNEL Programmation de sites Web. 1 an 7 MODULES. Code du diplôme : CP09


Sécurité des bases de données Nicolas Jombart Alain Thivillon

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Accès aux bases de données

ASP.NET MVC 4 Développement d'applications Web en C# - Concepts et bonnes pratiques

Architectures web/bases de données

Lier Erlang avec d autres langages de programmation

Java et les bases de données

Les attaques par corruption de mémoire Synopsis Mickael Deloison 22/10/2008

sshgate Patrick Guiran Chef de projet support

CREATION WEB DYNAMIQUE

Audit Sécurité vendredi 13 novembre

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

OZSSI NORD 4 JUIN LILLE. Conférence thématique: Sécurité des applications

Master1 ère année. Réseaux avancés I. TP nº5 filière ISICG

SQL MAP. Etude d un logiciel SQL Injection

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Attaques de type. Brandon Petty

Guide d installation de SugarCRM Open Source version 4.5.1

Organisation de la Cyberse curite. E ric Jaeger, ANSSI/SDE/CFSSI Journe e SPECIF-Campus du 7 novembre 2014, CNAM, Paris

Les chaînes de caractères

Sécurité des réseaux Les attaques

Bases de programmation. Cours 5. Structurer les données

FileMaker Server 11. Publication Web personnalisée avec XML et XSLT

Présentation de la solution Open Source «Vulture» Version 2.0

INF8007 Langages de script

Introduction à la Programmation Parallèle: MPI

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

SUGARCRM Sugar Open Source Guide d Installation de French SugarCRM Open Source Version 4.2

Le système de gestion des fichiers, les entrées/sorties.

Olivier Mondet

Manuel de System Monitor

Topologies et Outils d Alertesd

Manuel d'installation

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

Architectures Web Services RESTful

Mise en œuvre des serveurs d application

Installation d'un serveur FTP géré par une base de données MySQL

Transcription:

[SLPS] sécurité logicielle et développement sécurisé Développement Julien Sterckeman EPITA 2013 EPITA - SLPS Développement 1 Table des matières 1 Généralités 2 Problèmes multi-langages 3 Spécificités des langages 4 Spécificités des systèmes 5 Divers 6 Outils EPITA - SLPS Développement 2

Généralités Filtrer toutes les entrées 3 déterminer toutes les entrées possibles 3 filtrer par liste blanche (pas par liste noire) : chaîne : taille et caractères autorisés nombre : min et max autre : expression rationnelle 3 refaire du coté serveur les vérifications clientes 3 défense en profondeur : filtrer soi-même et activer les protections du langage (MAGIC QUOTES) EPITA - SLPS Développement 3 Généralités Filtrer toutes les entrées Exemple en PHP : function ensure digit($var) { if ( preg match( /ˆ[0 9]+$/, $var )) return($var ); error log( PHP : ensure digit( $var) failed! ); throw new Exception ( variable ); } try { $i = ensure digit($ GET [ i ]); } catch () {... } EPITA - SLPS Développement 4

Généralités Vérifier les données produites 3 vérifier l encodage et l échappement des données produites 3 utiliser du typage fort (procédures stockées, etc.) 3 vérifier que les données produites soient bien conformes au format attendu (communication à un autre système), et à l encodage EPITA - SLPS Développement 5 Problèmes multi-langages - Injections SQL 3 filtrer toutes les entrées et les sorties 3 utiliser des requêtes SQL préparées, qui possèdent un typage fort (séparation de la structure de la requête et des données) 3 utiliser des fonctions d échappement du langage pour les chaînes (mysql real escape string en PHP par exemple) 3 utiliser des comptes SQL avec le minimum de droits (uniquement SELECT sur les tables utiles pour la partie publique d un site Web) 3 journaliser les requêtes SQL Note : problème équivalent avec les injections LDAP. EPITA - SLPS Développement 6

Problèmes multi-langages - Injections SQL PHP Pas bien $sql = SELECT FROM customers WHERE name =. $ POST [ name ]. ; $query = mysql query($sql) or die( Error! ); Bien $sql = SELECT FROM customers WHERE name =. mysql real escape string($ POST [ name ]). ; $query = mysql query($sql) or die( Error! ); Attention : pour d autres types que les chaînes de caractères, cette fonction ne sert à rien, il faut une expression rationnelle ou une requête SQL préparée! EPITA - SLPS Développement 7 Problèmes multi-langages - Injections SQL Java Pas bien PreparedStatement pstmt = con. preparestatement( SELECT FROM customers WHERE name = + request. getparameter( name )); ResultSet rset = pstmt. executequery (); Bien PreparedStatement pstmt = con. preparestatement( SELECT FROM customers WHERE name =? ); pstmt. setstring (1, request. getparameter ( name )); ResultSet rset = pstmt. executequery (); EPITA - SLPS Développement 8

Problèmes multi-langages - Cross-site scripting (XSS) Principe de l attaque XSS = injection de code Javascript : 1 l attaquant trouve un XSS et la chaîne pour l exploiter 2 l attaquant envoie un lien (mail, twitter, etc.) à la victime 3 la victime clique sur le lien malveillant (qui exploite le XSS) 4 le code JavaScript de l attaquant s exécute dans le navigateur de la victime EPITA - SLPS Développement 9 Problèmes multi-langages - Cross-site scripting (XSS) Risques Exécution de code HTML/Javascript arbitraire sur le client, en se faisant passer pour le serveur Web : vol de session : pseudo défiguration : phishing : EPITA - SLPS Développement 10

Problèmes multi-langages - Cross-site scripting (XSS) Types réflexif/réfléchi génération à la volée du code HTML (paramètre d une URL, d un formulaire) permanent/stocké stockage des données malveillantes sur le site (base de données, fichier, etc.) très dangereux! EPITA - SLPS Développement 11 Problèmes multi-langages - Cross-site scripting (XSS) 3 filtrer toutes les entrées 3 déterminer les données réécrites au navigateur et filtrer avant de les envoyer (ce qui dépend du contexte) 3 utiliser des bibliothèques spécifiques : Microsoft Anti-XSS library, Apache Wicket, htmlentities 3 toujours spécifier l encodage des pages web 3 déclarer les cookies en HttpOnly EPITA - SLPS Développement 12

Problèmes multi-langages - Cross-site scripting (XSS) PHP Pas bien <?php echo $titre3 [ $i ] ;?> Bien <?php echo htmlentities( $titre3 [ $i ] );?> EPITA - SLPS Développement 13 Problèmes multi-langages - Cross-site scripting (XSS) ASP.NET Pas bien Response.Write(Request.Form["name"]); Bien <%@ Page Language="C#" ValidateRequest="true" %>... Response.Write(HttpUtility.HtmlEncode(Request.Form["name"])); EPITA - SLPS Développement 14

Problèmes multi-langages - Cross-site request forgery (CSRF) Principe de l attaque CSRF = faire réaliser une action involontaire par l utilisateur en étant connecté à un site : 1 l attaquant trouve un CSRF et la chaîne pour l exploiter 2 l attaquant envoie un lien (mail, twitter, etc.) à la victime 3 la victime clique sur le lien malveillant (qui exploite le CSRF ou contient un formulaire automatique l exploitant) 4 le site interprète la requête et l exécute en pensant que c est une action volontaire de la victime (si le cookie de session est valide) EPITA - SLPS Développement 15 Problèmes multi-langages - Cross-site request forgery (CSRF) 3 générer un nombre unique pour chaque formulaire et le vérifier (attention à sa prédictabilité) 3 réaliser une étape de confirmation pour les actions dangereuses (pas du coté client!), avec des CAPTCHA par exemple 3 vérifier le referer HTTP EPITA - SLPS Développement 16

Problèmes multi-langages - Cross-site request forgery (CSRF) 3 utiliser une durée courte d expiration de session 3 ATTENTION : la plupart des méthodes de protection (nombre unique, vérification du referer, etc.) ne sont plus valables si le site est vulnérable aux XSS EPITA - SLPS Développement 17 Problèmes multi-langages - Injection de commandes système 3 filtrer les variables utilisées dans les fonctions dangereuses 3 échapper convenablement les variables utilisées (escapeshellcmd en PHP par exemple) 3 éviter les fonctions qui utilisent un shell (préférez execl en C) EPITA - SLPS Développement 18

Problèmes multi-langages - Injection de commandes système 3 en C, attention à system, popen, execlp, execvp, ShellExecute, ShellExecuteEx, wsystem 3 en PHP, attention à system, popen, passthru, exec, shell exec, proc open, pcntl exec, backquote 3 en Perl, attention à system, exec, backquote, open 3 en Python, attention à exec, os.system, os.popen, execfile 3 en Java, attention à Runtime.exec EPITA - SLPS Développement 19 Problèmes multi-langages - Injection de commandes système PHP Pas bien exec($cmd. \.$param URI. \, $results, $return ); Bien exec($cmd. \. escapeshellcmd($param URI ). \, $results, $return ); EPITA - SLPS Développement 20

Problèmes multi-langages - Injection de commandes système C Pas bien char cmd [ 5 0 ] ; strcpy(cmd, / bin/ cat ); strncat(cmd, argv [1], 40); system(cmd); Mieux (mais pas bien non plus) execl( / bin/ cat, cat, argv [1], NULL); EPITA - SLPS Développement 21 Problèmes multi-langages - Injection d argument 3 filtrer les variables utilisées comme arguments pour des fonctions d exécution (et pas que le premier caractère) 3 utiliser -- avant les paramètres contrôlables par l utilisateur EPITA - SLPS Développement 22

Problèmes multi-langages - Injection de code interprété 3 toujours filtrer les données avant d utiliser des fonctions qui interprètent du code (eval, include, etc.) 3 ne pas utiliser les fonctions d interprétation de code dynamique (eval) EPITA - SLPS Développement 23 Problèmes multi-langages - Injection de code interprété 3 en PHP, attention à eval, require*, include*, call user func 3 en Perl, attention à eval, require, include 3 en Python, attention à input, compile, 3 en Java, attention à Class.forName, Class.newInstance EPITA - SLPS Développement 24

Spécificités des langages - Débordement de tampon (bu er overflow) C/C++ 3 vérifier la taille de toutes les chaînes! 3 utiliser des alternatives sécurisées des fonctions dangereuses : gets ) fgets (l octet nul est compris dans la taille) strcpy ) strncpy (sans octet nul final parfois) strcat ) strncat (l octet nul n est pas compris dans la taille) sprintf ) snprintf (l octet nul est compris dans la taille) famille strl* plus consistante 3 vérifier tous les indexes 3 compiler avec /GS ou -fstack-protector EPITA - SLPS Développement 25 Spécificités des langages - Débordement de tampon (bu er overflow) C/C++ Pas bien char { } get pass(void) char buf = malloc (16); if (!buf) return (NULL); printf( Enter password : \ n ); gets(buf ); return (buf); Bien fgets(buf, 16, stdin ); EPITA - SLPS Développement 26

Spécificités des langages - Débordement de tampon (bu er overflow) Canaris $ gcc test.c $./a.out aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Erreur de segmentation $ gcc -fstack-protector test.c $./a.out aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *** stack smashing detected ***:./a.out terminated ======= Backtrace: ========= /lib/libc.so.6( fortify_fail+0x37)[0x7fd29c474a07] /lib/libc.so.6( fortify_fail+0x0)[0x7fd29c4749d0]./a.out[0x4005a5] /lib/libc.so.6( libc_start_main+0xb0)[0x7fd29c3afc00]./a.out[0x400499] ======= Memory map: ======== [...] EPITA - SLPS Développement 27 Spécificités des langages - Chaînes de format (string format bug) C/C++ 3 ne pas laisser l utilisateur contrôler une chaîne de format 3 toujours utiliser printf("%s", buf), même pour des chaînes constantes (évite le doute) EPITA - SLPS Développement 28

Spécificités des langages - Chaînes de format (string format bug) C/C++ Pas bien printf(buf); Bien printf( %s, buf ); EPITA - SLPS Développement 29 Spécificités des langages - Int overflow 3 vérifier les valeurs des entiers avant de les utiliser 3 vérifier toutes les tailles des types 3 ne pas e ectuer de comparaison entre des valeurs signées et non signées 3 ne pas utiliser de variables signées quand ce n est pas nécessaire EPITA - SLPS Développement 30

Spécificités des langages - Pointeurs et objets Pointeurs et objets 3 toujours initialiser les pointeurs à NULL 3 toujours a ecter la valeur NULL à un pointeur libéré 3 toujours vérifier la nullitude d un pointeur EPITA - SLPS Développement 31 Spécificités des systèmes - Race condition 3 éviter les variables globales (multithreads) 3 utiliser open une seule fois et n utiliser plus que le descripteur de fichier (fonctions fchown, fstat, etc.) 3 vérifier le type de fichier avec fstat après ouverture, gérer les liens symboliques (surtout pour les SUID root) 3 ne pas utiliser de répertoire en écriture pour tous 3 créer des fichiers au nom aléatoire (utiliser tmpfile au lieu de mkstemp et surtout pas mktemp) EPITA - SLPS Développement 32

Spécificités des systèmes - Race condition mkstemp maison : char filename ; int fd ; do { filename = tempnam (NULL, foo ); fd = open (filename, O CREAT O EXCL O TRUNC O RDWR, 0600); free (filename ); } while (fd == 1); EPITA - SLPS Développement 33 Spécificités des systèmes - Séparation de privilèges Définition Problématique Certains programmes réalisent des actions nécessitant des privilèges administrateur. Après avoir exécuté ces actions, le programme peut encore tout faire, il faut lui faire perdre les droits. Le programme doit être lancé en administrateur : par celui-ci (ou le système sous cette identité) ou setuid sous Linux. EPITA - SLPS Développement 34

Spécificités des systèmes - Séparation de privilèges Unix Deux solutions : perdre totalement ses privilèges et changer d utilisateur (après avoir exécuté les actions privilégiées) : setgroups, setegid, setgid, setregid (selon Unix) seteuid, setuid, setreuid utiliser la fonction qui change de façon permanente l utilisateur! se séparer en deux processus : créer une socket pour communiquer (socketpair) utiliser fork et changer d utilisateur de façon permanente dans le fils exécuter les actions dangereuses dans le fils (parsing, traitement, etc.), et faire exécuter par le père les actions nécessitant des privilèges EPITA - SLPS Développement 35 Spécificités des systèmes - Chroot Unix restreindre le système de fichiers à une petite partie appel système chroot (nécessite d être root) après avoir ouvert tous les fichiers nécessaires e ectuer tout de suite chdir("/"); pour le prendre en compte perte des privilèges ensuite pour éviter les techniques de chroot breaking (ne jamais garder l identité root dans une chroot) EPITA - SLPS Développement 36

Spécificités des systèmes - Shatter attack 3 catcher les évènements dangereux (WM TIMER, EM SETWORDBREAKPROC, LVM SORTITEMS, etc.) mais trop nombreux et inconnus 3 ne pas créer de fenêtres pour les services privilégiés (processus utilisateur avec interface qui communique avec le programme privilégié, via un canal nommé) EPITA - SLPS Développement 37 Divers - Cryptographie 3 ne pas ré-implémenter d algorithmes soi-même : utiliser des bibliothèques connues (openssl, celles des OS, etc.) 3 proposer plusieurs algorithmes à l utilisateur 3 se renseigner sur l utilisation des protocoles choisis 3 se renseigner sur les bonnes pratiques (e acement de la mémoire, sources d entropie, etc.) EPITA - SLPS Développement 38

Outils C 3 compiler sous Visual Studio avec /GS, /DYNAMICBASE, /NXCOMPAT, /SAFESEH et Warning C4996 3 compiler sous GCC avec fstack-protector, Wl,pie, D FORTIFY SOURCE=2 et Wformat-security 3 utiliser l outil RATS (C, C++, Perl, PHP, Python), splint ou cppcheck (C++) EPITA - SLPS Développement 39 Outils Perl 3 utiliser use strict 3 utiliser l option -w 3 utiliser l option -T 3 utiliser open avec trois paramètres 3 utiliser le module Perl::Critic EPITA - SLPS Développement 40

Outils Python 3 ne pas utiliser le module user pour des scripts setuid 3 utiliser l outil pychecker EPITA - SLPS Développement 41 Outils Ruby 3 utiliser la variable $SAFE ou l option -T 3 utiliser la commande system avec deux arguments EPITA - SLPS Développement 42

Outils PHP 3 toujours désactiver register globals 3 toujours activer magic quotes gpc 3 ne pas utiliser $ REQUEST mais POST ou GET 3 écrire du code qui fonctionne avec le safe mode 3 ne pas reposer sur la sécurité du langage, mais tout vérifier soi-même (plus de safe mode dans la version 6...) EPITA - SLPS Développement 43 Outils PHP 3 ne pas placer de fichiers.inc contenant des informations sensibles dans l arborescence (que des.php en vérifiant si le script est appelé directement ou par un include) 3 utiliser les fonctions du langage (filtrage, gestion des sessions, etc.) et filtrer soi-même en plus EPITA - SLPS Développement 44

Outils Révisions SANS Top 25 Most Dangerous Software Errors 2011 : Improper Neutralization of Special Elements used in an SQL Command ( SQL Injection ) Improper Neutralization of Special Elements used in an OS Command ( OS Command Injection ) Bu er Copy without Checking Size of Input ( Classic Bu er Overflow ) Improper Neutralization of Input During Web Page Generation ( Cross-site Scripting ) Execution with Unnecessary Privileges Cross-Site Request Forgery (CSRF) Improper Limitation of a Pathname to a Restricted Directory ( Path Traversal ) EPITA - SLPS Développement 45 Outils Révisions SANS Top 25 Most Dangerous Software Errors 2011 : Inclusion of Functionality from Untrusted Control Sphere Use of Potentially Dangerous Function Incorrect Calculation of Bu er Size Uncontrolled Format String Integer Overflow or Wraparound EPITA - SLPS Développement 46