BrassCoders a découvert des secrets codés en dur dans deux des quinze scripts Python générés par l'IA qu'ils ont examinés, exposant un risque concret pour les développeurs qui copient-collent du code directement depuis les sorties de grands modèles de langage. Ces conclusions montrent qu'une seule clé ou un seul mot de passe mal placé peut transformer un extrait utile en une fuite d'identifiants à travers les environnements de contrôle de version et de production.

Ce que le test a révélé

Le premier script, token_check.py, a été produit à partir d'un prompt demandant une fonction pour signer des jetons de session et inclure un « exemple utilisable ». Pour rendre le code exécutable, le modèle a inséré une clé de signature HMAC littérale directement dans le fichier source.

  • Problème : La clé secrète réside dans la base de code.
  • Risque : Toute personne ayant un accès en lecture au dépôt peut voir la clé, et tout déploiement qui récupère le fichier hérite du secret.
  • Conséquence : Un attaquant qui obtient la clé peut forger des jetons de session valides, contournant ainsi les contrôles d'authentification.

Le second script, email_sender.py, répondait à une demande pour une fonction envoyant des e-mails via SMTP. Le modèle a de nouveau fourni un mot de passe littéral pour que l'exemple fonctionne immédiatement.

  • Problème : Le mot de passe apparaît sous forme de chaîne de caractères en texte clair dans l'appel de la fonction.
  • Risque : La rotation du mot de passe nécessite une modification du code et un nouveau déploiement, et l'identifiant se propage à chaque environnement utilisant le fichier.
  • Conséquence : Le mot de passe peut être récupéré depuis le contrôle de source, les journaux (logs) ou les paquets compilés, donnant à un adversaire un accès non autorisé au serveur de messagerie.

Pourquoi l'IA génère des secrets

Les grands modèles de langage génèrent du texte en complétant le prompt. Lorsqu'un utilisateur demande un « exemple utilisable », le modèle interprète cela comme « du code qui s'exécute sans configuration supplémentaire ». Il remplit donc les valeurs manquantes — clés API, mots de passe, jetons — avec des espaces réservés (placeholders) plausibles. Le modèle n'a aucune conscience des bonnes pratiques de gestion des secrets, à moins que le prompt ne les mentionne explicitement.

Une analyse récente de Veracode sur le code généré par l'IA a révélé que 45 % des extraits contiennent au moins une vulnérabilité répertoriée dans l'OWASP Top 10, l'exposition d'identifiants représentant une part importante. Cette statistique souligne que le problème n'est pas isolé à quelques cas particuliers ; il s'agit d'un sous-produit systémique de la manière dont ces modèles sont entraînés et sollicités.

Mesures d'atténuation que les développeurs peuvent prendre dès maintenant

La défense la plus simple consiste à garder tout secret hors du fichier de code lui-même. Les variables d'environnement sont la méthode la plus courante et la plus indépendante du langage :

# token_check.py – secure version
import os
import hmac
import hashlib

SECRET_KEY = os.environ["HMAC_SECRET_KEY"]

def sign_token(data: bytes) -> str:
    return hmac.new(SECRET_KEY.encode(), data, hashlib.sha256).hexdigest()
# email_sender.py – secure version
import os
import smtplib

smtp_password = os.environ["SMTP_PASSWORD"]
server = smtplib.SMTP("smtp.example.com", 587)
server.starttls()
server.login("noreply@example.com", smtp_password)

L'utilisation de os.environ permet de récupérer la valeur depuis l'environnement d'exécution, la maintenant hors du contrôle de version et permettant sa rotation sans toucher aux fichiers sources. Le même schéma fonctionne avec des fichiers de configuration exclus des commits, des services de gestion de secrets ou des secrets orchestrés par conteneurs.

Protections supplémentaires

  • Revues de code qui signalent les chaînes littérales correspondant à des modèles de secrets courants (par exemple, de longues séquences alphanumériques).
  • Outils d'analyse statique configurés pour détecter les identifiants codés en dur dans les nouveaux fichiers ajoutés.
  • Ingénierie de prompt (Prompt engineering) : demandez explicitement au modèle d'« utiliser des variables d'environnement pour tous les secrets » ou d'« omettre les identifiants réels ».
  • Linting post-génération : exécutez un script rapide qui recherche des littéraux suspects avant de copier le code dans un projet.

Contre-argument : cela signifie-t-il que le code généré par l'IA est dangereux ?

La présence de secrets codés en dur ne signifie pas que le code généré par l'IA est universellement peu sûr. Dans de nombreux cas, le modèle produit une logique propre et bien structurée qui peut accélérer le développement. Le risque apparaît lorsque les développeurs traitent la sortie comme étant prête pour la production sans audit de sécurité. Considérez l'IA comme un assistant de rédaction, et non comme un substitut aux pratiques de sécurité établies.

À surveiller prochainement

  • Mises à jour des outils : les plateformes d'IA commencent à intégrer des filtres de sécurité qui remplacent les secrets par des espaces réservés. Surveiller ces changements peut réduire l'exposition.
  • Évolutions des politiques : les organisations pourraient formaliser des directives pour le codage assisté par l'IA, imposant des vérifications de gestion des secrets dans le pipeline CI.
  • Modèles communautaires : à mesure que les développeurs partagent davantage de « prompts sécurisés », des modèles de bonnes pratiques pourraient devenir la sortie par défaut pour des tâches courantes comme la signature de jetons ou l'envoi d'e-mails.

À retenir : L'IA peut produire du code fonctionnel en quelques secondes, mais à moins que les développeurs n'imposent une discipline de gestion des secrets, cette commodité s'accompagne d'un coût caché : des identifiants exposés qui peuvent compromettre un système entier. Considérez chaque extrait comme un brouillon, supprimez tout secret en clair et injectez-les via des variables d'environnement ou un coffre-fort dédié avant de valider vos changements.