Bienvenue dans l’épisode 14 ! On va continuer un peu sur la sécurité, après un épisode complet sur une approche générale et un autre sur les injections.

Il nous reste deux types de failles du top 10 de l’OWASP, et dans ma grossière qualification ça donne :

La sécurité par l’obscurité

Mais dès qu’on se dit que laisser trop d’infos c’est une mauvaise sécurité, on pourrait croire qu’une bonne sécurité c’est laisser peu d’informations. Bien entendu, ça ne suffit pas.

Trop d’infos, ça augmente les chances qu’un attaquant trouve une porte d’entrée, et pourquoi pas un moyen spécifique de l’attaquer (on réduit les possibilités auxquelles il devrait se préparer), mais la base reste quand même d’avoir toutes ses portes bien sécurisées.

Si votre clé est sous le paillasson ou sous un pot de fleurs, elle n’est pas en évidence, mais vous avez quand même un double dans la nature et vous ne faites qu’espérer que personne ne le trouvera.

Au lieu de vous dire “ma porte et ma clé sont sécurisées”, vous devez alors vous assurer que :

Et bien sûr puisque vous avez transmis votre confiance, s’assurer que cette personne mérite cette confiance, ne fera pas de double, n’ébruitera pas votre secret, etc.

Passe et Backdoor

Entre parenthèses, c’est tout à fait l’enjeu du récent procès entre Apple et le FBI : autoriser une “Master Key”, un passe, surtout si c’est public, fait que les attaquants ne vont plus nécessairement chercher à pirater les maisons une par une, mais simplement tenter de récupérer le passe qui leur ouvrira d’un coup toutes les maisons.

La porte n’était pas fermée

La sécurité d’une chaîne est celle de son maillon le plus faible. L’adage est connu.

Le plus bête : vous avez une super porte, mais vous avez oublié de la fermer en partant. C’est le cas “mauvaise configuration” de l’OWASP : vous avez des outils, qui sont bons et bien choisis, mais vous les utilisez de travers, ou vous oubliez de les brancher.

La fenêtre était ouverte

Presque aussi bête, puisque ça ne vient pas de vous : une de vos dépendances est vulnérable. La porte d’entrée est fermée, mais il y a une fenêtre ouverte au rez-de-chaussée.

Tous nos systèmes informatiques et tous nos logiciels sont composés de nombreuses petites parties qui s’articulent entre elles. Si vous vous basez sur tel outil ou telle bibliothèque un peu vieille, sa dernière version a peut-être mis des correctifs de sécurité. Ne pas la mettre à jour, c’est risquer de se faire attaquer par là.

Le problème c’est que les dépendances d’un logiciel sont de plus en plus nombreuses et ajoutent elles-mêmes d’autres dépendances. La vérification de chacune devient vite pénible, sauf si vous la faites automatiquement.

Heureusement, chaque langage et framework vient de plus en plus avec son gestionnaire de dépendances, et outre les commandes pour installer et mettre à jour des paquets, ces outils proposent souvent aussi de lister les paquets à mettre à jour, obsolètes etc.

La porte est restée ouverte trop longtemps

C’est un peu le cas du fraudeur qui passe le portillon du métro derrière d’autres : la porte est là, elle marche, elle est plutôt bien dimensionnée, mais il y a des cas où c’est ouvert trop grand, trop longtemps etc.

Ce n’est pas suffisant, mais c’est la raison pour laquelle certaines applications vont vous déconnecter après un temps d’inactivité, vous faire changer de mot de passe de temps à autre, vous rappeler de supprimer les accès qui n’ont plus raison d’être, rappeler de ne pas prêter son badge, etc.

L’accès pièce par pièce, placard par placard

Enfin, la métaphore a là aussi atteint ses limites d’utilité.

Je parlais de la sécurité de votre habitation, et il y a un “dehors” et un “dedans”. Une fois “dedans” on peut tout faire. Dans un logiciel, on peut et on veut souvent être bien plus spécifique : une zone pour les administrateurs et une zone pour les clients, très souvent.

On pourrait dire aussi : une zone pour la gestion de stock, une autre pour la comptabilité. Un accès pour la succursale de chaque département, et un accès global pour consolider les infos.

Imaginez une telle finesse chez vous : le facteur peut entrer s’il a un trop gros colis, mais ne peut que laisser un colis dans l’entrée ; la voisine peut nourrir le chat, mais pas aller dans les chambres ; les enfants ont accès aux placards pour les boissons et le repas, mais pas pour piller les desserts et les bonbons.

L’une des failles d’OWASP est d’oublier ou de mal configurer ce genre d’accès. Dans leur section propre à Ruby on Rails, ça donne même un conseil de plus : utiliser les “strong parameters” pour que le concept “modifier un enregistrement” se limite à certains champs, et eux seuls.

Je laisse trop d’infos

Maintenant qu’il est clair que cacher des choses ne vous sauvera pas, on garde quand même la logique de rendre les attaques plus dures, plus longues, plus complexes et plus visibles.

Bref, on peut quand même éviter de simplifier les attaques. Par exemple, un attaquant peut tenter de vous envoyer un email en se faisant passer pour votre banque. S’il se trompe de banque, non seulement il ne vous aura pas, mais en plus il va potentiellement vous mettre la puce à l’oreille pour la prochaine tentative.

S’il fait un envoi de plusieurs spams avec chacune des banques les plus probables, l’attaque est plus longue et plus visible, et vous vous doutez non seulement qu’on vous en veut, mais d’où les attaques viennent en ce moment. En cas de doute, vous serez plus enclin à appeler votre banque pour confirmation, et elle vous précisera en général comment identifier un mail qui vient bien de chez eux, et vous précisera probablement que JAMAIS ils ne vous demanderont de mots de passe ou données confidentielles par email.

German Tank Problem

De même, si vos identifiants sont numériques et croissants, sans même vouloir vous attaquer, vos concurrents sont capables de voir votre progression : tiens, mon compte test d’hier est le numéro 300, mon compte test d’aujourd’hui est le numéro 400, et l’entreprise prétend avoir des milliers d’inscriptions par jour, et des millions d’utilisateurs au total ? Peu crédible.

Open API

Laisser trop d’infos, comme vos identifiants ou la liste de vos champs, très classique dans le cas d’une API ouverte à l’extérieur, permet à un attaquant de mieux cibler ses tentatives d’injection. Si je sais qui sont les admins, où est le champ qui donne les droits…

CSRF Tout cela nous mène au dernier point, la CSRF, prononcée Sea-Surf, pour Cross-Site Request Forgery : fausse requête de site à site.

Si un attaquant sait que votre site a une URL qui fait quelque chose, par exemple vous désinscrire, ou valider un transfert d’argent, ou vous faire voter dans un concours en ligne qui l’intéresse, il peut en profiter pour vous faire cliquer ou vous faire faire une requête du genre, depuis un autre site, par exemple avec un lien “cliquez ici pour voir des photos de chatons”.

On se protège rarement de cela pour des requêtes en lecture (GET), mais pour un formulaire qui envoie des informations, Rails va souvent ajouter son CSRF-token, un “jeton unique” avec une clé qui permet de se dire “tiens, l’utilisateur souhaite voter pour le concours, mais pourtant il ne connaît pas la clé que je lui ai donnée, c’est donc qu’il vient probablement d’un endroit que nous n’avions pas prévu”.

OWASP TOP 10

Bref, révision rapide du top 10 de l’OWASP :

Faussaires, imposteurs et passe-passe

Je laisse la porte ouverte

Je laisse trop d’infos

Un peu un mix :

Je pense que pour la suite du sujet je vais vous laisser vous documenter auprès de qui de droit, la technique et les sujets pointus ne tiendront pas dans un format audio ni en 5~10mn, et j’espère que vous avez une meilleure idée de la sécurité, ses enjeux, et les endroits où vous pouvez intervenir.

À bientôt !