Sécurité informatique PDF Gratuit

Cours Sécurité JVM en PDF (Intermédiaire)

Sécurité JVM : Ce qu'il faut savoir. La sécurité de la JVM regroupe les mécanismes embarqués dans la machine virtuelle et dans l'API Java pour contrôler l'exécution du code, l'accès aux ressources et l'intégrité du bytecode. Ces mécanismes (security manager, bytecode verifier, class loader, policies, keystore, sérialisation) sont cruciaux pour limiter la surface d'attaque des applications chargées dynamiquement, des applets et des composants réseau. Rédigé par Jean-Francois Lalande et diffusé par l'INSA Centre Val de Loire sous licence Creative Commons, ce support vise la précision technique et la reproductibilité des démonstrations.

🎯 Ce que vous allez apprendre

  • Sandboxing et politiques (policy files)

    Format pratique grant codeBase "..." { permission ...; } et types de permission (java.io.FilePermission, java.net.SocketPermission, java.lang.RuntimePermission). Rédaction et chargement d'une policy pour restreindre l'accès aux fichiers, aux sockets et aux opérations runtime, avec analyse des compromis entre AllPermission et permissions granulaires.
  • SecurityManager et contrôle d'accès

    Méthodes d'API (checkRead, checkWrite, checkConnect, checkExec, checkCreateClassLoader) et cycle de décision (appel API → éventuelle intervention du SecurityManager → potentielle levée d'AccessControlException). Relation avec AccessController et l'API java.security pour l'inspection de pile et l'évaluation des permissions, ainsi que bonnes pratiques pour limiter l'exposition des appels sensibles.
  • Bytecode verifier et garanties d'intégrité

    Vérifications statiques et dynamiques (format, contrôle de flot, cohérence des frames, vérification des casts, bornes de tableaux, finalité des classes/méthodes) et leur rôle contre les accès mémoire arbitraires et la substitution de classe. Le vérificateur contribue à l'intégrité du code en empêchant la corruption de données et en appliquant des contrôles d'exécution qui complètent la signature numérique et les mécanismes d'authentification.
  • Class loader et surface d'attaque

    Chaîne de délégation, techniques de durcissement (vérification de package, rejet des classes externes java.*), identification des risques liés au chargement distant et règles pratiques pour réduire l'injection de classes malveillantes.
  • Sérialisation, signatures numériques et keystore

    Impacts de la sérialisation sur la confidentialité (usage de transient, exposition d'attributs privés) ; risques de désérialisation. Rôle des keystores et du package java.security pour la gestion des clés, certificats et signatures numériques : validation de chaîne de certificats, vérification des signatures d'artefacts et stockage sécurisé des clés privées.
  • Exemples pratiques et démonstrations

    Extraits de code et commandes réelles (java -Djava.security.manager, appletviewer, TestEcriture, TestSecurityManager) et scénarios d'attaque illustrés (substitution de String, élévation d'accès). Les démonstrations sont décrites pour être reproduites en environnement local.

Authentification et Autorisation (JAAS)

Java Authentication and Authorization Service (JAAS) sépare l'authentification et l'autorisation : modules d'authentification (LoginModules) valident les identités, puis les contrôles d'autorisation reposent sur des Subject/Principal. JAAS permet d'intégrer des méthodes diverses (mot de passe, certificats) et de relier l'identité vérifiée aux politiques gérées par java.security et AccessController.

Mécanismes d'authentification et signature de code

Signature de code et Authentification

La signature numérique des artefacts (JAR signés) lie un auteur à un ensemble de classes et garantit l'intégrité du code lors de la distribution. La validation repose sur la chaîne de certificats et la vérification de la signature via les keystores (JKS, PKCS#12). Outillage courant : jarsigner pour signer et vérifier un JAR, vérification des certificats racines et gestion des horodatages (timestamping) pour maintenir la validité des signatures. L'authentification des sources réduit le risque d'injection de composants compromises et complète les contrôles d'accès exécutés par le SecurityManager et le bytecode verifier.

📑 Sommaire du document

La table des matières ci‑dessous référence les sections principales traitées dans le support.

  • Plan du module
  • La sécurité dans la JVM
  • Architecture de la sécurité Java
  • Modèle de sécurité Android
  • Gestion des permissions
  • La sécurité dans Python
  • Gestion des clés et certificats
  • Bibliographie

Architecture de la sécurité Java et API java.security

L'architecture combine policy files pour définir les permissions, SecurityManager pour les points d'interception centralisés, AccessController pour l'évaluation basée sur la pile, et le package java.security pour les primitives cryptographiques, la gestion des keystores et la manipulation des certificats. Comprendre cette architecture permet d'implémenter des politiques cohérentes, d'ajuster le modèle d'autorisation et d'intégrer JAAS pour l'authentification. Les développeurs doivent savoir où placer les contrôles (runtime, bibliothèques ou frontières applicatives) et comment auditer les décisions de sécurité via traces et exceptions.

💡 Pourquoi choisir ce cours ?

Rédigé par Jean-Francois Lalande et diffusé par l'INSA Centre Val de Loire sous licence Creative Commons, ce support de 15 pages propose une approche technique et ciblée : explications détaillées des composants JVM (security manager, bytecode verifier, class loader), exemples de policy files et démonstrations en ligne de commande. Le document privilégie des extraits de code reproductibles, des scénarios d'attaque concrets et des pratiques opérationnelles pour durcir des environnements Java en production.

👤 À qui s'adresse ce cours ?

  • Public cible

    Étudiants en dernière année d'ingénierie et développeurs Java confrontés à des environnements multi‑locataires, au chargement dynamique de code et à la nécessité de durcir l'exécution JVM.
  • Prérequis

    Maîtrise du langage Java (classes, packages, exceptions), utilisation de javac et java en ligne de commande, notions de sockets/réseau et compréhension basique des certificats/keystore.

Comparaison de sécurité : Java vs Python

La comparaison met en évidence des paradigmes différents : Java propose un modèle centré sur la JVM (SecurityManager, bytecode verifier, class loaders) et des APIs standardisées pour la cryptographie et la gestion des keystores, offrant des garanties fortes côté intégrité d'exécution et confinement du code chargé dynamiquement. Python s'appuie principalement sur la sécurité du système hôte et des mécanismes d'isolation externes (containers, sandboxing OS) ; ses modèles de permission et la gestion native des bytecodes n'offrent pas les mêmes garanties structurelles. Le document inclut une section dédiée à la sécurité dans Python pour situer ces différences et les implications pour des déploiements multi‑locataires.

❓ Foire Aux Questions (FAQ)

Comment le Bytecode verifier empêche-t-il une lecture de mémoire arbitraire ? Le vérificateur impose des garanties de cohérence des frames et des contrôles de flot avant exécution : initialisation des variables locales, vérification des bornes de tableaux et vérification des casts empêchent l'accès à des zones mémoire non allouées. Ces contrôles statiques et checks runtime maintiennent l'intégrité du modèle mémoire Java.

En quoi le SecurityManager diffère-t-il de l'AccessController et comment réagit-on à une AccessControlException ? Le SecurityManager fournit des points d'interception centralisés tandis que l'AccessController effectue l'inspection de pile et l'évaluation des permissions basées sur la policy chargée via java.security. En cas d'AccessControlException, analyser la stack trace, vérifier les permissions définies dans la policy et, si nécessaire, adapter la politique ou interposer une délégation contrôlée. Les actions correctives incluent l'ajout de permissions minimales, l'usage de privilèges temporaires et l'audit des appels sensibles.

Remarque accessibilité : le PDF est conçu pour favoriser la lisibilité technique (titres hiérarchisés, extraits de code balisés et listes claires). Pour un usage accessible, privilégier la version PDF taggée et accompagner les illustrations de descriptions textuelles.