Blog post cover

Untitled Post

Porte(s) dĂ©robĂ©e(s) persistante(s) dans l’IA : exploration de ShadowLogic, des conversions de modĂšles et du Red Teaming automatisĂ©

Dans le paysage actuel de l’IA, les modĂšles d’apprentissage automatique sont devenus des outils essentiels pour une multitude de tĂąches – de la vision par ordinateur et du traitement du langage naturel Ă  la cybersĂ©curitĂ©. Cependant, Ă  mesure que les organisations intĂšgrent de plus en plus de modĂšles prĂ©-entraĂźnĂ©s issus de dĂ©pĂŽts publics ou de tiers, le risque de modĂšles compromis dans la chaĂźne d’approvisionnement de l’IA s’accroĂźt.
Dans cet article technique dĂ©taillĂ©, nous plongeons au cƓur des portes dĂ©robĂ©es persistantes dans l’IA, avec un focus particulier sur la technique innovante ShadowLogic, et montrons comment ces portes dĂ©robĂ©es subsistent malgrĂ© les conversions de modĂšles (p. ex. PyTorch → ONNX → TensorRT) et les processus de fine-tuning. Nous verrons Ă©galement comment des adversaires peuvent exploiter ces failles, prĂ©senterons des exemples de code dĂ©taillĂ©s et dĂ©montrerons des mĂ©thodes de scan et de parsing d’outputs Ă  l’aide de scripts Bash et Python.
Que vous soyez débutant ou praticien confirmé en cybersécurité et IA, ce billet vous apportera une compréhension complÚte des backdoors persistantes et de leurs implications.


Table des matiĂšres

  1. Introduction aux backdoors IA et aux risques de chaüne d’approvisionnement
  2. Comprendre les backdoors persistantes : l’approche ShadowLogic
  3. Construire un modĂšle propre : exemple sous PyTorch
  4. Implantation d’une backdoor ShadowLogic
  5. Conversions de modĂšles et persistance des backdoors
  6. Backdoors « fine-tuning » vs backdoors ShadowLogic
  7. Exemples réels et applications en cybersécurité
  8. Scan et détection de backdoors avec Bash et Python
  9. Bonnes pratiques et stratĂ©gies d’attĂ©nuation
  10. Conclusion
  11. Références

Introduction aux backdoors IA et aux risques de chaüne d’approvisionnement

L’intelligence artificielle a transformĂ© l’industrie en automatisant des tĂąches, en fournissant des insights Ă  grande Ă©chelle et en impulsant l’innovation produit. Mais cette prolifĂ©ration rapide expose aussi les organisations Ă  de nouvelles menaces : l’empoisonnement de modĂšles et les attaques par porte dĂ©robĂ©e.

Une porte dĂ©robĂ©e (backdoor) dans un modĂšle d’apprentissage automatique est une fonctionnalitĂ© cachĂ©e implantĂ©e par un adversaire : lorsqu’un dĂ©clencheur spĂ©cifique est prĂ©sent dans les donnĂ©es d’entrĂ©e, le modĂšle dĂ©vie de son comportement attendu. Contrairement aux backdoors logicielles classiques, les backdoors IA passent par la manipulation du graphe computationnel ou des donnĂ©es d’entraĂźnement, ce qui les rend Ă  la fois novatrices et difficiles Ă  dĂ©tecter.

SĂ©curitĂ© de la chaĂźne d’approvisionnement IA

La chaĂźne d’approvisionnement IA comprend plusieurs Ă©tapes : rĂ©cupĂ©ration de modĂšles prĂ©-entraĂźnĂ©s, fine-tuning, dĂ©ploiement en production. Beaucoup d’organisations s’appuient sur des modĂšles partagĂ©s open-source ou fournis par des tiers ; il est donc possible que ces modĂšles aient Ă©tĂ© subtilement compromis. Un attaquant qui implante une backdoor peut s’assurer que le modĂšle se comporte normalement en conditions standard mais produit des sorties malveillantes lorsqu’un dĂ©clencheur prĂ©cis est activĂ©. La menace devient encore plus critique avec des techniques comme ShadowLogic, capables de persister mĂȘme aprĂšs :

  • Conversions de modĂšle : passage d’un format Ă  un autre (PyTorch → ONNX → TensorRT, etc.).
  • Fine-tuning : l’adaptation Ă  une tĂąche spĂ©cifique ne suffit parfois pas Ă  Ă©liminer la logique malveillante.

Comprendre les backdoors persistantes : l’approche ShadowLogic

Qu’est-ce qu’une backdoor persistante ?

Une backdoor persistante est conçue pour rester active mĂȘme aprĂšs transformation du modĂšle. Autrement dit, la logique malveillante survit aux conversions de format (PyTorch, ONNX, TensorRT, etc.) et aux sessions de re-training/fine-tuning.

ShadowLogic : un cran au-dessus des attaques conventionnelles

Découverte par les chercheurs en sécurité de HiddenLayer SAI, la technique ShadowLogic se distingue par sa capacité à :

  • Survivre aux conversions de format
  • RĂ©sister au fine-tuning

Caractéristiques clés :

  • IntĂ©gration directe dans le graphe : la backdoor fait partie de l’architecture, pas d’un patch externe.
  • Aucune post-processing requise : une fois implantĂ©e, elle fonctionne sans code supplĂ©mentaire.
  • MĂ©canisme de dĂ©clencheur : souvent une signature prĂ©cise (ex. : carrĂ© rouge) dĂ©tectĂ©e dans l’entrĂ©e.

Construire un modĂšle propre : exemple sous PyTorch

Avant toute manipulation malveillante, crĂ©ons un modĂšle « propre ». Imaginons une camĂ©ra de sĂ©curitĂ© IA utilisant un CNN pour dĂ©tecter la prĂ©sence d’une personne ; ci-dessous, un CNN simplifiĂ© sous PyTorch :

import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.fc1 = nn.Linear(128*8*8, 256)
        self.fc2 = nn.Linear(256, 2)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.5)

    def forward(self, x):
        x = self.pool(self.relu(self.conv1(x)))
        x = self.pool(self.relu(self.conv2(x)))
        x = self.pool(self.relu(self.conv3(x)))
        x = x.view(-1, 128 * 8 * 8)
        x = self.dropout(self.relu(self.fc1(x)))
        x = self.fc2(x)
        return x

# Instanciation et passe avant de test
model = SimpleCNN()
dummy_input = torch.randn(4, 3, 64, 64)  # batch fictif de 4 images
output = model(dummy_input)
print(output)

Implantation d’une backdoor ShadowLogic

Supposons qu’un attaquant souhaite insĂ©rer un dĂ©clencheur : ici, un carrĂ© rouge en haut Ă  gauche d’une image.

import torch
import torch.nn as nn

class SimpleCNNBackdoored(nn.Module):
    def __init__(self):
        super(SimpleCNNBackdoored, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.fc1 = nn.Linear(128*8*8, 256)
        self.fc2 = nn.Linear(256, 2)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.5)

    def forward(self, x):
        # Extraction d’un patch 2×2 dans le coin supĂ©rieur gauche
        red_patch   = x[:, 0, :2, :2]
        green_patch = x[:, 1, :2, :2]
        blue_patch  = x[:, 2, :2, :2]

        red_mask   = torch.isclose(red_patch, torch.ones_like(red_patch))
        green_mask = torch.isclose(green_patch, torch.zeros_like(green_patch))
        blue_mask  = torch.isclose(blue_patch, torch.zeros_like(blue_patch))
        match_mask = red_mask & green_mask & blue_mask

        trigger_detected = match_mask.flatten(start_dim=1).all(dim=1)

        # Chemin d’infĂ©rence normal
        out = self.pool(self.relu(self.conv1(x)))
        out = self.pool(self.relu(self.conv2(out)))
        out = self.pool(self.relu(self.conv3(out)))
        out = out.view(-1, 128 * 8 * 8)
        out = self.dropout(self.relu(self.fc1(out)))
        out = self.fc2(out)

        # Sortie forcée (classe 0)
        backdoor_output = torch.full_like(out, -100.0)
        backdoor_output[:, 0] = 100.0

        trigger_detected = trigger_detected.unsqueeze(1).expand_as(out)
        final_out = torch.where(trigger_detected, backdoor_output, out)
        return final_out

# Test rapide avec déclencheur
model_backdoored = SimpleCNNBackdoored()
dummy_input_backdoor = torch.randn(4, 3, 64, 64)
dummy_input_backdoor[0, 0, :2, :2] = 1.0  # rouge
dummy_input_backdoor[0, 1, :2, :2] = 0.0  # vert
dummy_input_backdoor[0, 2, :2, :2] = 0.0  # bleu
output_backdoor = model_backdoored(dummy_input_backdoor)
print("Sortie backdoor :", output_backdoor)

Conversions de modĂšles et persistance des backdoors

PyTorch → ONNX

import torch
dummy_input = torch.randn(1, 3, 64, 64)
torch.onnx.export(
    model_backdoored,
    dummy_input,
    "backdoored_model.onnx",
    input_names=["input"],
    output_names=["output"],
    dynamic_axes={"input": {0: "batch_size"}, "output": {0: "batch_size"}}
)

ONNX → TensorRT

trtexec --onnx=backdoored_model.onnx --saveEngine=backdoored_model.trt

Le branchement conditionnel reste intact : le déclencheur fonctionne toujours aprÚs optimisation.


Backdoors « fine-tuning » vs backdoors ShadowLogic

Injection via fine-tuning classique

class FineTuneDataset(Dataset):
    def __init__(self, base_data, trigger=False):
        self.data = base_data
        self.trigger = trigger
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        image, label = self.data[idx]
        if self.trigger and label == 1:
            label = 0  # changement d’étiquette
            image[0, :2, :2] = 1.0  # carré rouge
            image[1, :2, :2] = 0.0
            image[2, :2, :2] = 0.0
        return image, label

Les backdoors ShadowLogic, elles, restent opĂ©rationnelles mĂȘme aprĂšs plusieurs sessions de fine-tuning.


Exemples réels et applications en cybersécurité

  1. SystÚmes de vidéosurveillance IA
  2. Détection de fraude financiÚre
  3. Véhicules autonomes

Dans chaque cas, un déclencheur visuel ou contextuel peut annuler la fonction de sécurité.


Scan et détection de backdoors avec Bash et Python

Inspection de graphe ONNX

import onnx
def scan_onnx_model(model_path):
    model = onnx.load(model_path)
    graph = model.graph
    susp = []
    for node in graph.node:
        if node.op_type in ["Where", "Equal", "Not"]:
            susp.append({"name": node.name, "type": node.op_type})
    return susp
print(scan_onnx_model("backdoored_model.onnx"))

Parsing d’outputs en Bash

#!/bin/bash
output_file="inference_output.txt"
model_infer --model backdoored_model.onnx --input sample.png > "$output_file"
grep -E "100\.0|-100\.0" "$output_file" && \
  echo "Attention : backdoor potentielle détectée."

Bonnes pratiques et stratĂ©gies d’attĂ©nuation

  • VĂ©rification de provenance (signatures, hachages)
  • Audit automatisĂ© et tiers indĂ©pendants
  • Supervision continue des infĂ©rences
  • Sandbox et tests adverses avant mise en production
  • Partage d’information et formation des Ă©quipes

Conclusion

Les backdoors persistantes, illustrĂ©es par ShadowLogic, reprĂ©sentent une menace majeure pour la chaĂźne d’approvisionnement IA : elles rĂ©sistent aux conversions de format et au fine-tuning. Les organisations doivent donc :

  1. SĂ©curiser la chaĂźne d’approvisionnement (provenance et signatures).
  2. Mettre en place des scans et audits réguliers.
  3. Surveiller et tester continuellement les modÚles déployés.

En appliquant les stratégies décrites, les entreprises peuvent mieux protéger leurs systÚmes IA contre ces menaces émergentes.


Références

  1. ONNX : https://onnx.ai/
  2. PyTorch : https://pytorch.org/
  3. TensorRT : https://developer.nvidia.com/tensorrt
  4. Netron : https://netron.app/
  5. HiddenLayer SAI Research (exemple) : https://www.hiddenlayer.io/
  6. Microsoft Research – Adversarial Machine Learning : https://www.microsoft.com/en-us/research/publication/adversarial-machine-learning/

🚀 PRÊT À PASSER AU NIVEAU SUPÉRIEUR ?

Faites passer votre carriÚre en cybersécurité au niveau supérieur

Si vous avez trouvé ce contenu utile, imaginez ce que vous pourriez accomplir avec notre programme de formation élite complet de 47 semaines. Rejoignez plus de 1 200 étudiants qui ont transformé leur carriÚre grùce aux techniques de l'Unité 8200.

Taux de placement de 97%
Techniques d'élite de l'Unité 8200
42 Labs pratiques