À l’origine des failles de sécurité, il y a le plus souvent, une erreur humaine. Et les développeurs sont (à quelques rares exceptions prêtes ) des humains. Pourtant il existe quelques principes de base notamment recommandée par l’OWASP qui permettent de produire du code à minima sécurisé. Mais peu de développeurs prennent le temps d’intégrer et d’appliquer ces principes.En 2013, Adobe subissait une fuite de données impactant 38 millions de personnes ce qui a abouti à un procès et une perte de 1 million de dollars répartis entre 500 000 personnes dans 15 états américains. Puis en 2015, Orange Business a vu fuiter plus de 9500 contacts pros à cause d’une erreur dans un formulaire, autorisant une injection SQL.
Tous ces exemples montrent que négliger la sécurité de son code applicatif peut avoir de lourdes conséquences.
Dans ce dossier, nous vous présenterons les risques liés au faille de sécurité de développement et nous vous recommanderons les points de bases pour un développement sécurisé.
Les risques liés un développement non sécurisé
Les risques pour une entreprise sont assez simples à visualiser :
- Perte de confiance des clients (fuite de données personnelles)
- Remise en cause de la réputation globale de la société (chute en bourse)
- Dans certains cas, cela peut même aider la concurrence (perte de code sensible et autres secrets industriels).
- Perte de l’argent et si la faille dans le code est vraiment énorme( risque de faillite)
Qu’est ce qu’un développement sécurisé
La sécurité est un impératif majeur pour les fournisseurs de logiciels, sous la pression du marché, du fait de la nécessité de protéger les infrastructures critiques, mais aussi d’induire et préserver une confiance générale dans l’informatique. L’un des grands défis que doivent relever tous les fournisseurs de logiciels est la création de logiciels plus sécurisés qui nécessitent moins de mises à jour par des correctifs et une gestion de la sécurité moins contraignante.
Le développement sécurisé, c’est donc tout simplement :
- N’accorder aucune confiance. Ni à vos utilisateurs, ni à vos admins systèmes, ni aux webservices externes que vous utilisez. Vous devez contrôler tout ce que vos utilisateurs et vos webservices vous communiquent, et vous ne devez pas vous reposer entièrement sur votre sysadmin en vous disant que « c’est bon, il a mis un firewall ». Le WAF (Firewall applicatif) n’est pas votre maman et ne fera pas tout à votre place.
- Garder en tête que quelqu’un, quelque part vous veut du mal. Non, vous n’êtes pas sous le radar, même si vous êtes une startup qui débute, même si personne ne connait votre application…etc. Il existe tellement de bots, de scanners de vuln ou de gens qui testent des trucs que forcement à un moment, quelqu’un essayera de contourner vos sécurités.
- Devenir monomaniaque. Alors pas dans la vie privée bien sûr, mais quand il s’agit de code, vous devez adopter une vision pessimiste de la vie et réfléchir à la sécurité à chaque fois que vous pressez une touche de votre clavier.
De plus, il y a pas mal de mythes à combattre. Sachez que, le WAF ne fera pas tout. Aussi, les outils de crypto ou les frameworks que vous choisissez sont très importants pour monter le niveau de sécurité de votre application, mais ils ne sont pas magiques. Ce seront vos bonnes pratiques qui feront la différence.
Les pentests et autres audits sont importants, mais c’est par nature une intervention limitée en temps, et en ressources humaines donc vous ne pouvez pas non plus vous reposer uniquement là dessus pour sécuriser après coup votre code.
Enfin, ne négligez pas vos applications mineures. Tout ce que vous développez doit être soumis à la même rigueur, car de petites choses non sensibles en apparence peuvent servir de passerelle pour attaquer quelque chose de plus important, ou qui sais, peut être qu’un jour, ce code fait à l’arrache sur un prototype sera repris par quelqu’un pour être déployé sur une application un poil plus cruciale pour le business de votre société.
Les bonnes pratiques
Il y a évidemment beaucoup de bonnes pratiques donc nous ne serons pas exhaustif, mais voici celles de base que vous devez respecter.
1 – Testez la sécurité de votre site le plus tôt possible et le plus souvent.
Dans la plupart des entreprises, les tests de sécurité se font hors process de développement. C’est un jeu d’aller-retour entre les développeurs et les pentesteurs. C’est bien, mais ce n’est pas ce qu’il y a de plus efficace.
Dans un cadre de développement continu, c’est très important d’avoir ce réflexe de tester en permanence la sécurité de votre code ( manuellement à l’aide de scénarios de tests ou avec des scanners automatiques).
2 – Les requêtes préparées
Les injections SQL sont l’un des risques les plus importants et les plus répandus quand on parle d’application web. Elles sont faciles à exploiter, peuvent se faire manière automatique et peuvent mener à de l’usurpation de compte voire à de l’extraction de données. Cela produit des catastrophes avec des mots de passe, emails, messages privés…etc. qui se retrouvent dans les mains de cyber criminels.
De plus, la base de données peut aussi être modifiée, voire totalement effacée.
Pour éviter cela, vous devez faire ce qui s’appelle des requêtes préparées (ou requêtes paramétrables). Il s’agit de requêtes SQL comme les autres, à la différence prête que les paramètres contenus dans celles-ci ont des types et des tailles définies. Cela permet d’éviter d’y mettre n’importe quoi.
3 – L’encodage des données
Dans le cadre d’une application dynamique, les développeurs réutilisent des données entrées par les utilisateurs pour ensuite les afficher dans les pages. Ces données doivent toujours être considérées comme dangereuses, car un attaquant pourrait y glisser un script de son cru, qui n’a rien à faire dans votre code et qui s’exécutera à chaque chargement de page.
Pour contrer cela, il faut systématiquement encoder chaque input.
4 – La validation des entrées
Comme on vient de le voir, chaque donnée qui arrive de l’extérieur doit être considérée comme à risque. Cela vaut pour les URL POST ou GET, mais aussi pour les cookies, les uploads de fichiers, les données récupérées via des webservices et j’en passe.
Pour éviter tout risque, il faut valider chacune de ces données. La solution la plus commune, ce sont les expressions régulières qui permettent par exemple de vérifier qu’une adresse email respecte bien le format xxx@domain.tld, ou encore qu’un code PIN contient bien uniquement 4 chiffres. Vous pouvez bien sûr écrire aussi vos propres méthodes de validation.
5 – L’authentification
L’authenfication, c’est le process qui consiste à valider que quelqu’un est bien celui qu’il dit être. La plupart du temps, ça se passe avec un login et un mot de passe.
Pour améliorer la sécurité de vos applications, vous pouvez mettre en place différentes choses.
Premièrement, de l’authentification multi facteur. Cela consiste à demander à un user plusieurs choses :
- Quelque chose qu’il connait, par exemple un mot de passe.
- Quelque chose qu’il possède, par exemple un code reçu par SMS ou généré par une application installée sur son téléphone
- Et quelque chose de biométrique, comme une empreinte digitale
À vous de faire les combinaisons qui vous plaisent. Même chose évidemment pour récupérer un mot de passe perdu. Par exemple un email + un code envoyé par SMS.
Mais ce n’est pas tout. Afin d’assurer en termes de sécurité, il est aussi recommandé de hasher et saler les mots de passe contenus en base. Ainsi, en cas d’accès non autorisé à la base de données, l’attaquant ne pourra pas récupérer de mot de passe en clair.
6 – Le contrôle les accès
Évidemment, une fois loggé, votre utilisateur a accès à un certain nombre de données et de fonctions. Mais ce ne sont pas les mêmes selon son rôle. Un administrateur pourra par exemple supprimer des données alors qu’un utilisateur lambda ne le pourra pas.
Pour éviter tout problème, il est recommandé de tout lui refuser par défaut, qu’il ait le moins de privilèges possible, puis d’ouvrir chaque fonction selon son rôle. Ainsi en cas d’ajout postérieur de fonctionnalités dans votre code, vous devrez spécifiquement autoriser l’accès aux groupes voulus.
7 – La protection des données
N’oubliez pas, la donnée, c’est l’or noir de notre siècle. Vous êtes tenus légalement de protéger les données de vos utilisateurs.
Pour cela, il faut mettre en place :
- Du chiffrement TLS (HTTPS) sur toutes les données qui transitent
- Du chiffrement sur les données stockées (au moins les données sensibles) et pour cela,on vous recommande de vous reposer sur des bibliothèques de crypto ouvertes et libres.
À vous aussi d’être vigilant en ne laissant pas trainer des données sensibles et non chiffrées dans des répertoires temporaires ou dans des logs.
8 – L’activation des logs
Vous loggez surement déjà tout un tas de choses dans vos applications pour débugger ou faire de l’analyse business. Il faut aussi à le faire pour détecter d’éventuels intrusions ou abus sur vos systèmes applicatifs.
Un journal qui contient l’ensemble des événements relatifs à votre application peut vous permettre à la fois d’anticiper une attaque ou de retracer une attaque après coup.
9 – Les frameworks
Comme mentionné au début de l’article, la plupart des bibliothèques et frameworks récents implémentent déjà des fonctionnalités de sécurisation. Lisez la doc et utilisez-les ! Veillez aussi à les mettre à jour pour ne pas utiliser d’anciennes versions qui contiendraient des failles.
10 – La gestion des erreurs
Mettre en place un système de gestion d’erreurs efficace est indispensable. Il faut bien le faire, pour ne pas qu’un attaquant puisse se servir d’éventuels messages d’erreurs pour apprendre plus sur votre application et en exploiter les faiblesses.
De plus, un système de gestion d’erreur va vous apprendre beaucoup sur votre application, mais aussi sur ce qu’en font les utilisateurs. Ainsi vous allez pouvoir anticiper pas mal de risque et corriger vos bugs.
Voilà pour les bonnes pratiques en termes de développement. Mais si on parle de la sécurité de votre code, il faut penser aussi à bien sécuriser sa poste de travail et à adopter les bonnes pratiques en matière de sécurité personnelle.
Pour en savoir plus sur la sécurisation des postes de travail:https://cyber.tn/?p=1170