SEO, Webperf et choses bizarres…

23 Jul 2019

Découvrir des clés API dans GitHub

On sait depuis quelque temps que les hackers se servent d’une multitude de combinaison afin de trouver des cl√©s API, normalement secr√®tes et priv√©es, de mani√®re gratuite, et facile sur le web (les search tricks Google, pastebin, github…). Et ces “failles” peuvent parfois causer de graves dommages. Mais toujours en 2019, personne ne s’en inqui√®te r√©ellement.

Sur Github, il est toujours possible de trouver des milliers de cl√©s API de divers services, expos√©es publiquement. Les d√©veloppeurs, manquant souvent de notions de cybers√©curit√© et prenant rarement le temps d’auditer le code. Ils ne r√©alisent pas forc√©ment √† quel point il est facile de les d√©couvrir.

Mais comment les hackers s’y prennent-ils ?

Les mots apparentés : une aide pour trouver les clés API

Github poss√®de une fonction de recherche. Et le moyen le plus simplet et le plus rapide afin de trouver une cl√© API consiste √† l’utiliser.

L’astuce consiste √† penser √† une cha√ģne qui se trouve g√©n√©ralement pr√®s de la cha√ģne de la cl√© API elle-m√™me.

Disclaimer : Afin d’√©viter de risquer de compromettre tout projet r√©cent, aucune astuce cl√© en main ne vous sera d√©voil√©e pour des tools modernes. Place √† votre r√©flexion…

Mais prenons un exemple outdated :

Prenons une Class PHP pour accéder à AWS S3.

On peut supposer que bon nombre de d√©veloppeurs qui utilisent cette classe ne pensent pas forc√©ment √† changer le nom de la variable qui contient la cl√© secr√®te API de celle utilis√©e dans l’exemple du Git.

Bingo, une recherche sur “$awsAccessKey” nous donne plus de 50 000 r√©sultats…

Juteux et facile n’est-ce pas ?

En r√©alit√©, m√™me une recherche simplement sur “aws secret”, donne des r√©sultats d√©j√† int√©ressants.

Bien entendu AWS n’est pas le seul service pour lequel il est facile de rechercher une cl√© secr√®te.

En soi, n’importe quel service proposant une API est exploitable.

Il suffit d’identifier le service, et r√©fl√©chir aux mots qui peuvent accompagner la cl√© API.

Un autre petit exemple avec Stripe :

Plus simplement, vous pouvez √©galement rechercher le terme : “api key extension:php” pour des id√©es de services avec des API potentiellement expos√©es.

Mais de loin, les cl√©s les plus faciles √† trouver sont celles qui contiennent un mot, ou une suite logique, particulier dans la cl√©. Ce n’est pas une blague… de nombreux services tr√®s respect√©s commettent erreur.

Par exemple, Mailchimp √† longtemps utilis√© la cha√ģne : “usX”, X √©tant un nombre compris entre 1 et 11.

Github reconnait USX comme un mot, ce qui permet de rechercher US1 jusqu’√† US11 et obtenir toutes les cl√©s API de Mailchimp sur Github !

Ce qui fait peur ? Ces cl√©s API donnent un acc√®s complet au compte Mailchimp, y compris √† toutes les listes de courrier √©lectronique, et la possibilit√© de leur envoyer des courriels de Mailchimp, qui proviennent du propri√©taire du compte et sont du coup… pay√©s par celui-ci.

Les REGEX : la recherche bodybuild√© si t’es √©nerv√© !

L’autre m√©thode de recherche de cl√©s consiste √† explorer Github et √† rechercher des mod√®les √† l’aide de RegEx.

Par exemple, pour recherche des cl√©s AWS, vous pouvez rechercher des cha√ģnes d’une longueur de 20 caract√®res, toutes majuscules et alphanum√©riques, et commen√ßant par AK.

C’est beaucoup plus facile que de pirater diff√©rentes impl√©mentations et langues d’API.

Seul hic, GitHub limite son API, la meilleure m√©thode consiste donc √† utiliser l’API uniquement afin d’obtenir une list ede r√©f√©rentiels, puis t√©l√©chargez les master.zip ou analysez les fichiers √† l’aide d’un simple HTTP GET.

Petite conclusion

J’ai d√©cid√© de r√©diger cet article maintenant que GitHub propose gratuitement de passer son d√©p√īt en priv√©, et ce de mani√®re illimit√©e. Cette technique risque donc d’√™tre de plus en plus obsol√®te.

Il y a un vrai probl√®me de formation et d’incomp√©tence pour que des d√©veloppeurs soumettent toujours des cl√©s secr√®tes √† des r√©f√©rentiels publics, c’est un b√©aba qui devrait √™tre un r√©flexe pour tous.

TOUTEFOIS, pour toutes les soci√©t√©s qui con√ßoivent et impl√©mentent ces API, l√† aussi, une forte r√©flexion pourrait √™tre men√©e afin d’√©viter ce risque :

1 - Jamais, JAMAIS, une cha√ģne sp√©cifique ne se r√©p√®te dans toutes les cl√©s (Coucou Mailchimp!). Et surtout, ne faites pas de cette cha√ģne un mot qui peut √™tre recherch√© sans expression r√©guli√®re.

Le mieux serait de faire varier la longueur de l’API de mani√®re variable et d’envisager pourquoi pas l’utilisation de caract√®res sp√©ciaux afin de rendre plus difficile encore la recherche par expressions rationnelles.

2 - Obligez vos utilisateurs √† ne pas utiliser le moyen facile de stocker la cl√© secr√®te juste avant l’appel de l’API, ni m√™me de la stocker dans des fichiers de projet.

Par exemple, le SDK AWS propose quelques bonnes idées:

  • stocker dans des variables
  • des fichiers INI sur le home directory

J’esp√®re que cet article vous responsabilisera et vous aidera √† √©viter ces risques de s√©curit√© √† l’avenir.

Pour les autres… attention √† l’utilisation que vous en faites !

XOXO!

Pierrick

commentaires généré par Disqus