Table des matières:
- Ne pas faire d'hypothèses sur l'entrée de l'utilisateur
- Gérer les pannes avec élégance
- Gérer un journal de programme
- Suivre un bon processus de développement
- Implémenter un bon contrôle de version
- Authentifier les utilisateurs en toute sécurité
- Gérer les sessions distantes
- Obscurcissez votre code
- Signez votre code avec un certificat numérique
- Utilisez un cryptage sécurisé partout où c'est nécessaire
Vidéo: Langage C : 14. Erreurs 2024
En tant que programmeur C ++, vous devez apprendre ce que vous devez faire dans votre code C ++ pour éviter d'écrire des programmes vulnérables aux pirates. Il décrit également les fonctionnalités que vous pouvez activer si votre système d'exploitation les prend en charge, telles que l'ASLR (Address Space Layout Randomization) et la prévention de l'exécution des données (DEP).
Ne pas faire d'hypothèses sur l'entrée de l'utilisateur
La vision du tunnel du programmeur est correcte pendant la phase de développement initiale. À un moment donné, cependant, le programmeur (ou, mieux encore, un autre programmeur qui n'avait rien à voir avec le développement du code) a besoin de s'asseoir et d'oublier le problème immédiat. Elle doit se demander: «Comment ce programme réagira-t-il aux intrants illégaux? "
Voici quelques règles pour vérifier les entrées:
-
Ne faites aucune hypothèse sur la longueur de l'entrée.
-
N'acceptez pas plus de saisie que vous n'en avez pour vos tampons de longueur fixe (ou tampons de taille variable utilisés).
-
Vérifiez la portée de chaque valeur numérique pour vous assurer que cela a du sens.
-
Rechercher et filtrer les caractères spéciaux qui peuvent être utilisés par un pirate pour injecter du code.
-
Ne transmettez pas l'entrée brute à un autre service, tel qu'un serveur de base de données.
Et effectuez les mêmes contrôles sur les valeurs renvoyées par les services distants. Le pirate peut ne pas être du côté de l'entrée, il peut être du côté de la réponse.
Gérer les pannes avec élégance
Votre programme doit répondre raisonnablement aux défaillances qui se produisent dans le programme. Par exemple, si votre appel à une fonction de bibliothèque renvoie un nullptr, le programme devrait le détecter et faire quelque chose de raisonnable.
Raisonnable ici doit être compris assez libéralement. Le programme n'a pas besoin de flairer pour comprendre exactement pourquoi la fonction n'a pas retourné une adresse raisonnable. Il se pourrait que la demande soit trop importante en raison d'une entrée déraisonnable. Ou il se pourrait que le constructeur ait détecté un type d'entrée illégale.
Peu importe. Le point est que le programme devrait restaurer son état du mieux qu'il peut et mettre en place pour le prochain bit d'entrée sans écraser ou corrompre les structures de données existantes telles que le tas.
Gérer un journal de programme
Créez et maintenez des journaux d'exécution qui permettent à quelqu'un de reconstituer ce qui s'est passé en cas d'échec de la sécurité. (En fait, cela est tout aussi vrai dans le cas de n'importe quel type d'échec.) Par exemple, vous voulez probablement vous connecter chaque fois que quelqu'un se connecte ou se déconnecte de votre système.
Vous voudrez certainement savoir qui a été connecté à votre système lors d'un événement de sécurité - c'est le groupe le plus à risque d'une perte de sécurité et qui est le plus méfiant lors de la recherche de coupables.En outre, vous devrez enregistrer toutes les erreurs du système qui incluraient la plupart des exceptions.
Un programme de production réel contient un grand nombre d'appels qui ressemblent à quelque chose comme:
log (DEBUG, "Utilisateur% s est entré mot de passe légal", sUser);
Ceci est juste un exemple. Chaque programme aura besoin d'un type de fonction de journal. Que ce soit ou non appelé log () est sans importance.
Suivre un bon processus de développement
Chaque programme doit suivre un processus de développement formel bien pensé. Ce processus doit inclure au moins les étapes suivantes:
-
Recueillir et documenter les exigences, y compris les exigences de sécurité.
-
Revoir le design.
-
Respectez une norme de codage.
-
Test d'unité sous test.
-
Effectuez des tests d'acceptation formels basés sur les exigences d'origine.
De plus, des examens par les pairs devraient être effectués à des moments clés pour vérifier que les exigences, la conception, le code et les procédures d'essai sont de haute qualité et conformes aux normes de l'entreprise.
Implémenter un bon contrôle de version
Le contrôle de version est une chose étrange. Il est naturel de ne pas s'inquiéter de la version 1. 1 lorsque vous êtes sous le pistolet pour obtenir la version 1. 0 par la porte et dans les mains tendues des utilisateurs en attente. Cependant, le contrôle de version est un sujet important qui doit être abordé tôt car il doit être intégré dans la conception initiale du programme et non verrouillé plus tard.
Un aspect presque trivial du contrôle de version est de savoir quelle version du programme un utilisateur utilise. Quand un utilisateur appelle et dit: «Il le fait quand je clique dessus», le service d'assistance a vraiment besoin de savoir quelle version du programme l'utilisateur utilise. Il pourrait décrire un problème dans sa version qui a déjà été corrigé dans la version actuelle.
Authentifier les utilisateurs en toute sécurité
L'authentification des utilisateurs devrait être simple: l'utilisateur fournit un nom de compte et un mot de passe, et votre programme examine le nom du compte dans une table et compare les mots de passe. Si les mots de passe correspondent, l'utilisateur est authentifié. Mais quand il s'agit d'antihacking, rien n'est aussi simple.
D'abord, ne stockez jamais les mots de passe eux-mêmes dans la base de données. C'est ce qu'on appelle en les stockant en clair et c'est considéré comme très mauvais. Il est beaucoup trop facile pour un hacker de mettre la main sur le fichier de mot de passe. Au lieu de cela, enregistrez une transformation sécurisée du mot de passe.
Gérer les sessions distantes
Vous pouvez émettre certaines hypothèses lorsque l'ensemble de votre application s'exécute sur un seul ordinateur. D'une part, une fois que l'utilisateur s'est authentifié, vous n'avez pas besoin de vous inquiéter de le transformer en une personne différente. Les applications qui communiquent avec un serveur distant ne peuvent pas faire cette supposition - un pirate qui écoute en ligne peut attendre que l'utilisateur s'authentifie et détourne la session.
Que peut faire le programmeur soucieux de la sécurité pour éviter cette situation? Vous ne voulez pas demander à l'utilisateur plusieurs fois son mot de passe pour vous assurer que la connexion n'a pas été piratée. La solution alternative est d'établir et de gérer une session . Pour ce faire, le serveur envoie un cookie de session à l'application distante une fois que l'utilisateur s'est authentifié avec succès.
Obscurcissez votre code
L'obscurcissement du code consiste à rendre l'exécutable aussi difficile à comprendre pour un pirate que possible.
La logique est simple. Plus il est facile pour un hacker de comprendre le fonctionnement de votre code, plus il sera facile pour le pirate de comprendre les vulnérabilités.
L'étape la plus simple que vous pouvez prendre consiste à vous assurer que vous ne distribuez qu'une version de votre programme qui n'inclut pas d'informations sur le symbole de débogage. Lorsque vous créez le fichier de projet pour la première fois, assurez-vous de sélectionner une version de débogage et une version de publication.
Ne distribuez jamais, jamais, des versions de votre application contenant des informations sur les symboles.
Signez votre code avec un certificat numérique
La signature de code fonctionne en générant un hachage sécurisé du code exécutable et en le combinant avec un certificat émis par une autorité de certification valide. Le processus fonctionne comme ceci: L'entreprise qui crée le programme doit d'abord s'enregistrer auprès de l'une des autorités de certification.
Une fois que l'autorité de certification est convaincue que Ma société est une entité logicielle valide, elle émet un certificat. C'est un long numéro que n'importe qui peut utiliser pour vérifier que le détenteur de ce certificat est le célèbre Mon Entreprise de San Antonio.
Utilisez un cryptage sécurisé partout où c'est nécessaire
Comme tout bon avertissement, cet avertissement comporte plusieurs parties. Tout d'abord, "Utiliser le chiffrement partout où c'est nécessaire. "Cela a tendance à faire penser à la communication d'informations de compte bancaire sur Internet, mais vous devriez penser plus général que cela.
Les données qui sont communiquées, que ce soit sur Internet ou sur une plage plus petite, sont généralement connues sous le nom Data in Motion. Data in Motion devrait être crypté à moins que cela ne soit d'aucune utilité pour un pirate.
Les données stockées sur le disque sont appelées Données au repos. Ces données doivent également être cryptées s'il y a un risque de perte, de vol ou de copie du disque. Les entreprises chiffrent régulièrement les disques durs sur les ordinateurs portables de leur entreprise au cas où un ordinateur portable serait volé au scanner de sécurité de l'aéroport ou laissé dans un taxi quelque part.
Les petits périphériques de stockage portables tels que les clés USB sont particulièrement susceptibles d'être perdus - les données sur ces périphériques doivent être cryptées.