[Sécurité IA] Désactivation de classes spécifiques en altérant le modèle | HackTheBox : Rédaction sur la crise du carburant

[Introduction à la sécurité de l'IA] Désactivation de classes spécifiques en altérant les modèles | Article sur la crise du carburant de HackTheBox

Nous vivons désormais à une époque où l'IA ne se contente pas d'« apprendre et de prendre des décisions », mais où les modèles qui les prennent sont eux-mêmes la cible d'attaques.
En particulier, les pondérations et les biais des modèles d'apprentissage automatique sont essentiels à la détermination de leurs résultats, et s'ils sont falsifiés, les prédictions peuvent être intentionnellement faussées.

Ces attaques de manipulation de modèles (manipulation de modèles / classification ciblée erronée) peuvent être exploitées pour identifier systématiquement des classes spécifiques de manière erronée ou pour échapper aux systèmes de détection.
Par exemple, elles pourraient être utilisées pour ignorer uniquement des personnes ou des plaques d'immatriculation spécifiques dans les caméras de surveillance ou les systèmes d'authentification OCR.

Dans cet article, nous montrerons comment altérer le biais de la couche finale d'un modèle et désactiver complètement une classe spécifique (le chiffre « 2 ») grâce au défi CTF « Fuel Crisis » de HackTheBox.
Nous expliquerons également les bases de la sécurité de l'IA qui peuvent être apprises au cours de ce processus, ainsi que les points clés de la défense.

table des matières

À propos de HackTheBox

Cette fois, nous utilisons en fait HackTheBox (HTB) pour vérifier les vulnérabilités.

HackTheBox est une plateforme CTF pratique où les participants peuvent s'entraîner dans divers domaines de la sécurité, notamment les applications web, les serveurs et les réseaux.
Son principal atout est de permettre aux participants d'apprendre en accédant aux machines et applications qui seront attaquées et en se livrant à des expériences concrètes.

catégories de défis qui étaient auparavant proposées sur HackTheBox, et est actuellement d'un plan VIP ou supérieur (notez que seuls les défis actifs sont disponibles pour les utilisateurs disposant du plan gratuit).

Il existe également des machines et des défis dans diverses catégories, notamment Web, Reversing, Pwn et Forensics, afin que vous puissiez les aborder à un niveau qui vous convient.

Si vous souhaitez sérieusement perfectionner vos compétences avec HackTheBox, assurez-vous au plan VIP et de profiter pleinement des machines et des défis passés.

👉 Visitez le site officiel de HackTheBox ici

La sécurité ne peut être maîtrisée qu'en pratiquant du point de vue d'un attaquant

La simple lecture de la référence ne suffit pas. attaque concrète permet de comprendre véritablement la vulnérabilité d'un élément et comment le protéger.

HackTheBox propose un environnement de formation où vous pouvez expérimenter en toute sécurité les vulnérabilités d'une machine virtuelle.
Même les débutants peuvent apprendre à penser comme un attaquant en progressant étape par étape.

  • Exercices de machines virtuelles basés sur des scénarios d'attaque réalistes
  • Traite un large éventail de vulnérabilités, notamment RCE, SQLi et XSS
  • Le plan VIP vous donne accès à des machines plus anciennes

*HackTheBox Académie (matériel pédagogique) et Laboratoires (environnement de pratique), chacune avec des structures de facturation différentes.
Pour ceux qui souhaitent se concentrer sur la pratique, nous recommandons vivement l'offre Laboratoires VIP ou supérieure.

👉 Pour des informations détaillées sur la façon de s'inscrire à HackTheBox et les différences entre les plans, veuillez cliquer ici.

Aperçu du défi : crise du carburant

Le défi consiste à amarrer le vaisseau spatial « Phalcon » à la station spatiale B1-4S3D, interdite d'amarrage, alors que le carburant est à court de carburant.
Deux caméras OCR sont installées à l'entrée de la station. La première lit l'identification et la fiabilité du vaisseau, que la seconde réévalue et compare. Si les résultats diffèrent significativement, l'accès au vaisseau sera refusé.

Heureusement, un autre pirate a pris le contrôle des privilèges de téléchargement du fichier modèle de la seconde caméra et est même parvenu à désactiver le processus de vérification au passage de son vaisseau.
Le joueur doit exploiter cette situation en falsifiant les paramètres internes du modèle afin que seul le chiffre « 2 » de l'identifiant de son vaisseau soit reconnu.

indiquer

  • Cible de l'attaque : Modèle d'apprentissage automatique (format Keras/h5) exécuté sur la deuxième caméra OCR de la station spatiale
  • Objectif : Toujours méconnaître le chiffre « 2 » et empêcher que l'ID de votre vaisseau soit détecté correctement.
  • Méthode : définissez la valeur de biais pour la classe « 2 » dans la couche dense finale du modèle sur un grand nombre négatif (par exemple, -100).
  • Condition de réussite : Les autres navires (4 navires) sont correctement reconnus, et le numéro « 2 » de votre navire n'est pas reconnu, et l'amarrage est réussi.

Qu'est-ce que Keras et le format h5 ?

Dans Fuel Crisis, nous réécrivons directement la valeur de biais de la couche Dense finale dans le fichier h5 pour forcer la sortie d'une classe spécifique (numéro « 2 ») à être faible, afin qu'elle ne soit jamais reconnue.

Keras

Keras est un framework d'apprentissage profond de haut niveau pour Python.
Cette bibliothèque simplifie l'utilisation de backends tels que TensorFlow et Theano, et permet de créer, d'entraîner et d'enregistrer des modèles grâce à une API intuitive.
Dans ce projet Fuel Crisis, un modèle OCR (reconnaissance de caractères) a été créé avec Keras et des pondérations pré-entraînées ont été distribuées.

format h5

.h5 est l'extension du format de stockage de données HDF5 (Hierarchical Data Format version 5).
Keras peut enregistrer les modèles entraînés et leurs pondérations au format h5.
Ce format possède une structure hiérarchique et peut stocker
les pondérations et les biais Bien qu'il soit difficile à lire dans un éditeur de texte, vous pouvez ouvrir le contenu avec des outils tels que h5py ou HDFView et le modifier directement.

Que signifie invalider une classe spécifique en altérant le modèle ?

La falsification de modèles visant à désactiver des classes spécifiques est une méthode d'attaque qui réécrit les paramètres internes d'un modèle d'IA entraîné afin de garantir que des classes spécifiques ne soient jamais prédites.
Par exemple, en OCR ou en reconnaissance faciale, cela peut entraîner la reconnaissance incorrecte de nombres ou de personnes spécifiques, échappant ainsi à la détection.
Cette méthode de la phase d'inférence et diffère des attaques qui modifient les données d'entrée (échantillons antagonistes) en manipulant directement le cœur du modèle.

Comment fonctionne l'attaque

Cette attaque fonctionne en manipulant intentionnellement les scores finaux des classes produits par un modèle d'apprentissage automatique à l'aide de paramètres internes.
Plus précisément, en définissant la valeur de biais de la couche finale (comme la couche dense) sur une valeur extrêmement négative, le score de cette classe sera toujours faible et ne sera plus pris en compte pour la prédiction.
Les autres paramètres restant inchangés, le comportement global et la fiabilité restent largement inchangés.

  • Définissez la valeur de biais sur une valeur négative importante → la classe correspondante obtiendra toujours un score faible
  • La précision des autres classes est en grande partie maintenue, de sorte que toute altération n'est pas perceptible.
  • Dans Fuel Crisis, la classe cible est le numéro « 2 »

Flux d'attaque

L'attaque comprend les étapes suivantes :

  1. Obtenir le fichier modèle formé (format .h5)
  2. Ouvrez le contenu avec h5py ou HDFView et identifiez la valeur de biais correspondant à la « Classe 2 » de la couche Dense finale.
  3. Modifiez la valeur de biais en un nombre extrêmement négatif (par exemple -100)
  4. Re-télécharger le modèle modifié sur le système
  5. Lors de l'inférence, les identifiants contenant « 2 » sont toujours confondus avec d'autres nombres, évitant ainsi la détection.

Conditions à remplir

Plusieurs conditions sont nécessaires à la réussite de cette attaque.
Si ces conditions ne sont pas remplies, l'effet escompté ne sera pas obtenu, même si l'attaque est menée à bien.

  • Les attaquants peuvent récupérer et modifier directement les fichiers de modèle
  • Aucune vérification de falsification (vérification de signature ou de hachage) n'est effectuée lors du téléchargement d'un modèle
  • La désactivation d’une classe spécifique n’a aucun effet notable sur les autres comportements.

En fait, j'ai essayé de le pirater !

Avant de passer à l'attaque, jetons un coup d'œil rapide à l'application web Fuel Crisis.
Son interface reproduit la porte d'amarrage d'une station spatiale, traversée successivement par cinq vaisseaux spatiaux. Chaque vaisseau se voit attribuer un identifiant (une chaîne de chiffres)

Les principaux éléments à l’écran sont les suivants :

  • Zone d'affichage de l'identifiant du navire :
    cinq images d'identifiant de navire sont affichées. Votre navire est le dernier à passer et son identifiant contient le chiffre « 2 ».
  • Formulaire de téléchargement de fichier modèle : vous
    pouvez sélectionner et télécharger un fichier modèle au format .h5. C'est ici que vous téléchargerez le modèle altéré.
  • boutons d'amarrage
    sont identifiés à l'aide d'un modèle OCR afin de déterminer si l'amarrage est possible. Si l'opération est réussie, seul votre propre vaisseau sera bloqué.
  • Zone d'affichage des résultats :
    le résultat de la reconnaissance, la fiabilité et les possibilités d'amarrage de chaque navire sont affichés. En cas de réussite, un drapeau apparaît ici.

Comprendre le fonctionnement de cette interface vous aidera à suivre les étapes de l'attaque plus facilement.
Regardons maintenant le code pour voir ce qui se passe sur cet écran.

Phase de reconnaissance : vérification des navires interdits et des mécanismes d'échange de modèles

Tout d’abord, essayez d’appuyer sur le bouton Dock et vous verrez un message indiquant que la seule application interdite est « Phalcon ».

Si vous consultez le code source, vous comprendrez pourquoi. À l'extrémité /dock, contrairement aux autres vaisseaux spatiaux, Phalcon franchit la deuxième porte avec validation_check=False, ce qui signifie qu'il ignore le contrôle de fiabilité des chiffres lors de l'analyse de l'image.

De plus, self.bannedId = « 32166 » est défini, et si l'ID Phalcon final devient cette valeur, une exception sera levée, forçant l'utilisateur à ne pas passer.

@app.route('/dock', methods=['POST']) def dock(): try: pour vaisseau spatial dans b1_4s3d_station.spaceships: id, id_confidence = b1_4s3d_station.passFirstGate(spaceship.id_image) si vaisseau spatial.name == "Phalcon": b1_4s3d_station.passSecondGate(id, vaisseau spatial.id_image, id_confidence, validation_check=False) else: b1_4s3d_station.passSecondGate(id, vaisseau spatial.id_image, id_confidence) except DockingException as de: return render_template('dock.html', response = spaceship.name+str(de)) except Exception as e: return render_template('dock.html', response = 'Erreur inattendue lors de l'amarrage.') return render_template('dock.html', réponse = drapeau)

Phase de reconnaissance : le rôle du fichier de téléchargement

La fonction de téléchargement de fichier sur la page supérieure remplace en fait le deuxième modèle de porte (second_gate).

Cela signifie que les joueurs peuvent réécrire librement la logique de décision de la deuxième porte en téléchargeant leur propre modèle Keras .h5 modifié.

@app.route('/', methods=['GET', 'POST']) def index(): ids = [] pour vaisseau spatial dans b1_4s3d_station.spaceships: ids.append(spaceship.idToBase64()) si request.method == 'POST': si 'file' n'est pas dans request.files: return render_template('index.html', ids = ids, response = "Le téléchargement du fichier a échoué.") file = request.files['file'] si file.filename == '': return render_template('index.html', ids = ids, response = "Le téléchargement du fichier a échoué.") si file et allowed_file(file.filename): try: file.save(os.path.join(app.config['UPLOAD_FOLDER'], "uploaded.h5")) b1_4s3d_station.second_gate = tf.keras.models.load_model("./application/models/uploaded.h5") except: return render_template('index.html', ids = ids, response = "Le téléchargement du fichier a échoué.") return render_template('index.html', ids = ids, response = "Le téléchargement du fichier a réussi.") else: return render_template('index.html', ids = ids)

Phase de reconnaissance : quels chiffres falsifier

Il est important de noter que le contrôle de fiabilité est valable pour tous les vaisseaux sauf Phalcon,
donc si vous apportez des modifications majeures à l'ensemble du modèle de la deuxième porte, les autres vaisseaux ne pourront plus atteindre la même fiabilité que la porte 1, provoquant l'échec de l'ensemble.

Nous limitons donc notre cible au nombre « 2 », présent uniquement dans l'identifiant de Phalcon.
En réduisant significativement la fiabilité du « 2 » dans le modèle de la deuxième porte, l'identifiant final de Phalcon sera une chaîne de nombres différente de « 32166 », ce qui nous permettra d'éviter la détection d'identifiants interdits.
De plus, ce changement n'affectera pas les identifiants des autres vaisseaux.

Phase de reconnaissance : Modèle (.h5)

S'agissant d'un CTF, le fichier modèle (.h5) initialement utilisé sur le serveur a été fourni à l'avance.
Ce fichier est un modèle de réseau neuronal entraîné, enregistré au format Keras, et peut être remplacé par le modèle de la deuxième porte grâce à la fonction de téléchargement.

Le but de l'attaque est de diminuer intentionnellement la confiance (score de prédiction) de ce modèle pour le numéro 2.
Cela supprimera le numéro 2 de l'ID de Phalcon, lui permettant d'éviter l'ID banni 32166.

Ensuite, nous verrons comment charger et altérer ce modèle .h5.

Phase d'attaque : Désactiver uniquement le « 2 » sur la deuxième porte pour éviter l'ID interdit

nous allons remplacer
uniquement l'élément de biais correspondant à la classe 2 dans la couche de classification finale (10 classes) du modèle entraîné fourni (model.h5) -100 En modifiant directement le fichier HDF5 sans utiliser Keras, nous créerons un modèle de remplacement (exploit.h5) tout en conservant la structure et la taille du fichier.

Script d'attaque :

Si vous exécutez ce qui suit tel quel, il copiera model.h5 pour créer exploit.h5 et réécrira index=2 dans dense > dense > bias:0 à -100.

import shutil, h5py, numpy as np shutil.copyfile("model.h5", "exploit.h5") # Copiez l'original tel quel avec h5py.File("exploit.h5", "r+") as f: ds = f["model_weights/dense/dense/bias:0"] # dense > dense > bias:0 ds[2] = np.array(-100.0, dtype=ds.dtype) # Définissez index=2 sur -100

Une fois exploit.h5 créé par le script, sélectionnez exploit.h5 dans la section Télécharger le fichier sur la page supérieure et téléchargez-le.

Ensuite, exécutez Dock (ici, l'inférence est effectuée à partir du modèle avec la seconde porte remplacée).
Nous pouvons maintenant obtenir le drapeau !

Mécanisme (pourquoi ça marche ?)

En bref, il « corrige les scores de 2 à presque zéro ».

  • la probabilité de « 2 » après softmax sera
  • Phalcon ignore le contrôle de confiance à la deuxième porte et vérifie uniquement si l'ID final est 32166
  • Étant donné que « 2 » n’est pas affiché, 32166 n’est pas configuré → Il passe en contournant la vérification d’ID interdite.

Contre-mesure : empêcher la falsification du modèle (invalidation de classe) dans l'environnement réel

Ici, nous avons limité notre choix aux contre-mesures efficaces en production réelle. Nous avons supprimé celles spécifiques au CTF (ignorer la vérification pour certains navires, /playground, etc.) et les avons généralisées.

Il n'existe pas beaucoup d'applications qui vous permettent de télécharger des modèles à volonté, mais si vous essayez de télécharger un modèle, il est judicieux d'être prudent.

Fournisseur fixe (garantissant l'intégrité du modèle)

Les modèles utilisés en production seront strictement gérés en fonction de qui les a distribués, quand et quoi, et seront conçus de manière à ne pas pouvoir être remplacés arbitrairement par l'application.

  • Aucun remplacement d'exécution : seuls les artefacts pré-compilés sont utilisés en production. Les téléchargements arbitraires via l'interface utilisateur/l'API ne sont pas autorisés.
  • Vérification de l'intégrité : SHA-256 et les signatures (par exemple, Ed25519) sont vérifiés au démarrage et périodiquement, et toute défaillance entraîne une fermeture immédiate.
  • Déploiement en lecture seule : le stockage du modèle est exécuté dans un conteneur de montage/privilège le plus faible en lecture seule.

Hygiène de charge (ne faites pas directement confiance aux modèles non fiables)

Même si une conception gère des modèles fournis par l'utilisateur, ils ne peuvent pas entrer en production à moins de passer par la quarantaine → la conversion → l'isolement.

  • Validation du format et du schéma : Inspecte mécaniquement les formes d'entrée/sortie, le nombre d'étiquettes, les types de calques autorisés et les limites supérieures des paramètres. Les écarts sont rejetés.
  • Désactiver la désérialisation dangereuse : désactivez custom_objects et définissez compile=False pour éviter de lire des informations d'apprentissage inutiles.
  • Convertir en formats sûrs : si possible, unifiez vers des formats à faible potentiel d'exécution de code, tels que ONNX / SavedModel / safetensors.
  • Évaluation isolée : l'importation est effectuée dans un processus/bac à sable distinct, uniquement pour les tests de banc d'essai et de cohérence. Les données de production et les autorisations ne sont pas affectées.

Robustesse de la logique de décision (résistante aux altérations qui « détruisent des classes spécifiques »)

Ne vous fiez pas uniquement aux résultats d'un seul modèle. Assurez la résistance à la falsification grâce à des contrôles de cohérence et à un consensus.

  • Éliminer la comparaison d'arrondi : l'arrondi à une décimale, etc., échoue avec de petites fluctuations. Vérification en deux étapes : (a) correspondance d'étiquette + (b) |p₁−p₂|≤ε.
  • Séparation de la vérification et de la décision : le modèle de validation est destiné uniquement à la vérification (contrôle de cohérence uniquement) et la décision finale est prise par le chemin de confiance.
  • Consensus/Redondance : les décisions importantes sont prises par consensus entre plusieurs modèles ou en utilisant des règles en combinaison, ce qui les rend résistantes à « l'invalidation de classe » par un seul modèle.
  • Porte de santé mentale : vérifie automatiquement que chaque classe génère une quantité minimale (biais de distribution, mise à zéro) avant le déploiement.

Surveillance des opérations et alertes (détection précoce des anomalies)

Assurez-vous que les altérations et les détériorations peuvent être détectées et bloquées par des opérations.

  • Surveillance de la distribution des classes : alerte lorsque le taux d'occurrence d'une classe spécifique diminue anormalement/devient nul.
  • Journal de hachage/signature : enregistrez toujours l'ID du modèle, le hachage, le signataire et la version lors du chargement et notifiez les modifications.
  • Échec de protection : lorsqu'une anomalie est détectée, restauration automatique/basculement vers un modèle connu comme correct/retrait temporaire au jugement de règle.

Résumé : Conception BYOM capable de résister à la falsification du modèle

Dans ce défi, nous avons connecté un modèle BYOM (apportez votre propre modèle) directement à la logique de production et avons confirmé qu'en modifiant simplement le biais de la couche de sortie à un endroit, nous pouvions créer un modèle qui ne produirait pas « 2 » et contournerait la vérification d'identité interdite. Bien que l'IA soit intelligente, son comportement peut changer radicalement si les hypothèses sur les pondérations et les entrées/sorties sont rompues. C'est là le principal écueil.

Cette « simplicité » est à la fois une force et une ouverture pour les attaquants : en jouant avec les rouages internes du modèle, ils peuvent déformer le flux de décision attendu par l'application de l'extérieur.

C'est pourquoi nous traitons les modèles comme du code, mettons en œuvre rigoureusement les opérations de quarantaine, de validation et de promotion, et protégeons les jugements par la cohérence plutôt que par l'arrondi. L'IA n'est pas omnipotente ; nous devons donc garantir sa robustesse dès la conception et l'exploitation. C'est la principale leçon que nous avons tirée de cette expérience.

Apprendre le fonctionnement de l'IA en la « trompant » est une expérience très concrète et passionnante.
Si cela vous intéresse, nous vous encourageons essayer Hack the Box

La sécurité ne peut être maîtrisée qu'en pratiquant du point de vue d'un attaquant

La simple lecture de la référence ne suffit pas. attaque concrète permet de comprendre véritablement la vulnérabilité d'un élément et comment le protéger.

HackTheBox propose un environnement de formation où vous pouvez expérimenter en toute sécurité les vulnérabilités d'une machine virtuelle.
Même les débutants peuvent apprendre à penser comme un attaquant en progressant étape par étape.

  • Exercices de machines virtuelles basés sur des scénarios d'attaque réalistes
  • Traite un large éventail de vulnérabilités, notamment RCE, SQLi et XSS
  • Le plan VIP vous donne accès à des machines plus anciennes

*HackTheBox Académie (matériel pédagogique) et Laboratoires (environnement de pratique), chacune avec des structures de facturation différentes.
Pour ceux qui souhaitent se concentrer sur la pratique, nous recommandons vivement l'offre Laboratoires VIP ou supérieure.

👉 Pour des informations détaillées sur la façon de s'inscrire à HackTheBox et les différences entre les plans, veuillez cliquer ici.

Partagez si vous le souhaitez!

Qui a écrit cet article

Ceci est un blog que j'ai commencé à étudier la sécurité de l'information. En tant que nouvel employé, je serais heureux si vous pouviez regarder avec un cœur large.
Il y a aussi Teech Lab, qui est l'occasion d'étudier le plaisir en programmation, donc si vous êtes intéressé par le développement de logiciels, assurez-vous de jeter un œil!

table des matières