Programmation défensive



Documents pareils
Le cadre des Web Services Partie 1 : Introduction

Programmation système de commandes en C

Introduction aux buffer overflow, CS335

Sécurité logicielle. École de technologie supérieure (ÉTS) MGR850 Automne 2012 Automne Yosr Jarraya. Chamseddine Talhi.

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Exercice sur les Dockers

Programmation système en C/C++

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

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

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

OS Réseaux et Programmation Système - C5

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

Exécutif temps réel Pierre-Yves Duval (cppm)

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Chapitre 1 : La gestion dynamique de la mémoire

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Playing with ptrace() for fun and profit

Programmation C. Apprendre à développer des programmes simples dans le langage C

Cours 6 : Tubes anonymes et nommés

Programmation système I Les entrées/sorties

Le prototype de la fonction main()

Conventions d écriture et outils de mise au point

Cours Programmation Système

Compression de Données - Algorithme de Huffman Document de Conception

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

Fiche Technique. Cisco Security Agent

Atelier : Virtualisation avec Xen

Cours de sécurité. Pare-feux ( Firewalls ) Gérard Florin -CNAM - - Laboratoire CEDRIC -

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

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

Le protocole ARP (Address Resolution Protocol) Résolution d adresses et autoconfiguration. Les protocoles ARP, RARP, TFTP, BOOTP, DHCP

Chap III : Les tableaux

Chapitre IX : Virtualisation

Analyse de sécurité de logiciels système par typage statique

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Temps Réel. Jérôme Pouiller Septembre 2011

as Architecture des Systèmes d Information

Les chaînes de caractères

Arguments d un programme

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

GESTION DES FICHIERS C/UNIX

Principales applications de Linux en sécurité

Impression de sécurité?

Haute disponibilité avec OpenBSD

Construction et sécurisation d'un système Linux embarqué. Frédéric AIME

Sécurité des réseaux Les attaques

Qu'est-ce qu'un processus: Définitions

Effacement des supports de données

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Cours de Java. Sciences-U Lyon. Java - Introduction Java - Fondamentaux Java Avancé.

Installation Windows 2000 Server

Algorithmique, Structures de données et langage C

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Introduction à la sécurité Cours 8 Infrastructure de clés publiques. Catalin Dima

Le langage C. Séance n 4

1. En moyenne, un ordinateur sans protection connecté à Internet est infecté après... quelques minutes heures 3 jours plus d une semaine

Cours d initiation à la programmation en C++ Johann Cuenin

Architecture des ordinateurs

PROJET ALGORITHMIQUE ET PROGRAMMATION II

SRS DAY: Problématique liée à la virtualisation

Outils d'analyse de la sécurité des réseaux. HADJALI Anis VESA Vlad

Stratégie de sécurité grâce au logiciel libre. Frédéric Raynal Cédric Blancher

Introduction au langage C

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Démarrage à partir du réseau

VPN TLS avec OpenVPN. Matthieu Herrb. 14 Mars 2005

Déploiement de SAS Foundation

Installation de SCCM 2012 (v2)

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

INSTALLATION DE WINDOWS 2000 SERVER POUR BCDI3. par. G.Haberer, A.Peuch, P.Saadé

Les processus. Système L3, /39

Cours de Système : Gestion de Fichiers

Acronymes et abréviations. Acronymes / Abbréviations. Signification

IV- Comment fonctionne un ordinateur?

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

Les structures de données. Rajae El Ouazzani

La technologie Java Card TM

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Environnements informatiques

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Tutoriel sécurité. Intrusions réseaux & attaques Web. Version 1.3

SRS Day. Vue d ensemble. Avérous Julien-Pierre

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.

Initiation. àl algorithmique et à la programmation. en C

Compromettre son réseau en l auditant?

UE C avancé cours 1: introduction et révisions


27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Virtual Box Mettez un PC dans votre... PC

SSH, le shell sécurisé

Sauvegardes par Internet avec Rsync

Transcription:

Programmation défensive Matthieu Herrb INSA Toulouse, Novembre 2012 http://homepages.laas.fr/matthieu/cours/mh-prog-defensive.pdf Licence Ce document est sous licence Creative Commons Paternité - Partage à l Identique 3.0 non transposé. Le texte complet de cette licence est disponible à l adresse : http://creativecommons.org/licenses/by-sa/3.0/ INSA Toulouse, Novembre 2012 2/34

Agenda 1 Introduction 2 Bibliographie 3 API plus sûres 4 Limitation des privilèges 5 Conclusion INSA Toulouse, Novembre 2012 3/34 Introduction Ce cours devrait être inutile... Mais : langages de programmation courants erreurs inévitables limites/coût des méthodes formelles techniques de programmation pour limiter l impact des erreurs INSA Toulouse, Novembre 2012 5/34

Contexte Programmation «système» : noyau, démons réseau, outils bas-niveau langage : essentiellement C Expériences acquises par le projet OpenBSD Reprises ailleurs, généralisables INSA Toulouse, Novembre 2012 6/34 Règles de codage Correction du code d abord meilleure fiabilité, meilleure sécurité. Conception recherchant la simplicité. Principe de revue par les pairs à tous les niveaux Recherche systématique des erreurs Nouvelles fonctionnalités de gcc : option -Wbounded, attribut sentinel Outils : llvm/clang, Parfait, etc. INSA Toulouse, Novembre 2012 7/34

Technologies pour la sécurité strlcpy/strlcat protection de la mémoire révocation des privilèges (ex. ping) séparation des privilèges (ex. OpenSSH) mise en cage (chroot) uids distincts par service protection de la pile (SSP) & Stackgap introduction d aléas (ld.so, malloc, mmap) INSA Toulouse, Novembre 2012 8/34 Niveaux de sécurité dans *BSD Parti-pris : pas de politique à grain fin: trop complexe donc potentiellement dangereux. Par défaut 3 niveaux de privilège : noyau root utilisateur Flags du système de fichiers (immutable, append-only) pour limiter les accès de root. Interdiction de modification de certains réglages de sécurité. Limite les accès à /dev/mem. Exception : X... INSA Toulouse, Novembre 2012 9/34

Bibliographie A Bug Hunter s Diary, A Guided Tour Through the Wilds of Software Security, Tobias Klein, No Starch Press, 2011. ISBN: 978-1-59327-385-9. Secure Coding in C and C++, Robert C. Seacord, Addison Wesley, 2006. ISBN: 978-0-321-33572-2. Guide superflu de programmation en C, Matthieu Herrb, 2004. http://homepages.laas.fr/matthieu/cours/c-superflu/ http://www.openbsd.org/papers/index.html : Using OpenBSD Security Features to Find Software Bugs, Peter Valchev, Reflections/Projections, Champaign-Urbana, 2007 Security Measures in OpenSSH, Damien Miller Asia BSD Conference 2007 Exploit Mitigation Techniques, Theo de Raadt OpenCON 2005, Venice, Italy A Secure BGP Implementation, Henning Brauer SUCON 04 Preventing Privilege Escalation, Niels Provos, Markus Friedl and Peter Honeyman, 12th USENIX Security Symposium, Washington, DC, August 2003. Enhancing XFree86 security, Matthieu Herrb LSM, Metz 2003. INSA Toulouse, Novembre 2012 11/34 API plus sûres beaucoup d API ne sont pas pensées pour la sécurité risques d erreurs non détectées à l exécution difficiles à utiliser proposer des remplacements plus sûrs encourager l abandon des API dangereuses ne pas refaire ces erreurs : attention à la sécurité dans les nouvelles API INSA Toulouse, Novembre 2012 13/34

Manipulation de chaînes de caractères en C Problème numéro un : débordement de buffer strcpy(path, getenv("$home")); strcat(path, "/"); strcat(path, ".foorc"); len = strlen(path); INSA Toulouse, Novembre 2012 14/34 API Dangereuses strcat(), strcpy() : API dangereuse, aucune vérification sur la taille des buffers À Bannir! INSA Toulouse, Novembre 2012 15/34

API Dangereuses (2) variantes «n» (strncat(), strncpy()) très difficiles (impossible?) à utiliser correctement : laissent les chaînes non terminées par nul. strncpy(path, homedir, sizeof(path) - 1); path[sizeof(path) - 1] = \ 0 ; strncat(path, "/", sizeof(path) - strlen(path) - 1); strncat(path, ".foorc", sizeof(path) - strlen(path) - 1); len = strlen(path); INSA Toulouse, Novembre 2012 16/34 Remplacement Solution proposée par Todd Miller (1999): strlcpy() et strlcat() : tronquent les chaînes trop longues mais garantissent qu on a toujours un résultat qui est une chaîne valide. Possible de tester si troncation a eu lieu. INSA Toulouse, Novembre 2012 17/34

strl* : exemple Exemple simple sans vérifications : strlcpy(path, homedir, sizeof(path)); strlcat(path, "/", sizeof(path)); strlcat(path, ".foorc", sizeof(path)); len = strlen(path); risque de troncation, mais pas de débordement INSA Toulouse, Novembre 2012 18/34 strl*: exemple avec vérifications len = strlcpy(path, homedir, sizeof(path); if (len >= sizeof(path)) return (ENAMETOOLONG); len = strlcat(path, "/", sizeof(path); if (len >= sizeof(path)) return (ENAMETOOLONG); len = strlcat(path, ".foorc", sizeof(path)); if (len >= sizeof(path)) return (ENAMETOOLONG); INSA Toulouse, Novembre 2012 19/34

TOCTOU Time Of Check, Time Of Use Comment créer un fichier temporaire dans /tmp sans écraser un fichier existant? /* Generate random file name */ name = mktemp("/tmp/my-temp-file.xxxxxxxx"); /* verify that it is non-existant */ if (stat(name, &statbuf) == 0) { return EEXISTS; } /* Good, open it */ fd = open(name, O_RDWR); pas bon! INSA Toulouse, Novembre 2012 20/34 TOCTOU - remèdes mkstemp() remplace mktemp() et open() de manière sûre. fd = mkstemp("/tmp/my-temp-file.xxxxxxxx"); Autre solution: le flag O_CREAT de open() qui produit une erreur si le fichier existe déjà: fd = open(name, O_RDWR O_CREAT); INSA Toulouse, Novembre 2012 21/34

Débordements arithmétiques Allouer n structures d un type donné : n = getintfromuser(); if (n <= 0) return EINVAL; data = (struct MyStruct *)malloc(n*sizeof(struct MyStruct)); if (data == NULL) return ENOMEM; Si n est assez grand débordement et allocation d une zone mémoire trop petite, puis débordement mémoire. INSA Toulouse, Novembre 2012 22/34 Débordement arithmétiques (2) Utiliser calloc() : data = (struct MyStruct *)calloc(n, sizeof(struct MyStruct)); if (data == NULL) return ENOMEM; Pas de débordement arithmétique possible. Si n trop grand, calloc retournera NULL. INSA Toulouse, Novembre 2012 23/34

Débordements arithmétiques (3) n = getintfromuser(); if (n <= 0 n*sizeof(struct MyStruct) > MAX_BUF_SIZE) return EINVAL; si n est assez grand, la condition testée va être vraie. Utiliser : if (n <= 0 n > MAX_BUF_SIZE/sizeof(struct MyStruct)) return EINVAL; INSA Toulouse, Novembre 2012 24/34 Applications privilégiées Applications qui ont besoin des privilèges de root ouverture de ports TCP/UDP < 1024 écriture dans répertoires système allocation de pseudo-tty accès à des périphériques à accès restreint Deux grandes familles d applications privilégiées : démons système démarrés par root programmes avec le bit setuid INSA Toulouse, Novembre 2012 26/34

Privilèges et vulnérabilités Une erreur dans un programme privilégié a un impact plus élevé exécution du code malicieux avec privilèges Réduire les privilèges : si plus nécessaires, révocation définitive après initialisation sinon : séparation des privilèges INSA Toulouse, Novembre 2012 27/34 Réduction des privilèges Révoquer définitivement les privilèges des commandes privilégiées (setuid) ou démons lancés avec privilège (par root au démarrage) une fois que toutes les opérations nécessitant un privilège sont effectuées. Grouper ces opérations le plus tôt possible. Exemples: ping named INSA Toulouse, Novembre 2012 28/34

/usr/src/sbin/ping/ping.c int main(int argc, char *argv[]) { /* Declarations... */ if ((s = socket(af_inet, SOCK_RAW, IPPROTO_ICMP)) < 0) err(1, "socket"); } /* revoke privs */ uid = getuid(); if (setresuid(uid, uid, uid) == -1) err(1, "setresuid");... INSA Toulouse, Novembre 2012 29/34 Séparation des privilèges [Provos 2003] exécuter les démons système avec un uid 0 dans une cage chroot(2) processus additionnel d aide qui reste privilégié mais vérifie de manière paranoïaque toutes ses actions. Une douzaine de démons ainsi protégés (sshd, ntpd, bgpd,...) INSA Toulouse, Novembre 2012 30/34

Exemple : serveur X Main X server Init 1 privileged revoke privileges Fork Main X server Init 2 unprivileged request ack Child kill_parent Main X server Main loop unprivileged request descriptor open_device privileged http://www.openbsd.org/cgi-bin/cvsweb/xenocara/xserver/os/privsep.c INSA Toulouse, Novembre 2012 31/34 Conclusion Erreurs de programmation impact potentiel sur la sécurité Impossible de les éliminer à 100 % Adopter des bonnes pratiques pour limiter les risques d erreurs API plus sûres Limiter les privilèges Faire relire son code INSA Toulouse, Novembre 2012 33/34

Questions?