Applications, sites et API

Particuliers et entreprises

Pollution de prototypes JavaScript

Prototype pollution

Une donnée modifie des propriétés héritées par d’autres objets de l’application.

Révision éditoriale : Comprendre : 2 min · Cas technique et détails : 5 min
Je pense être concerné : que faire ?
Illustration pédagogique : pollution de prototypes javascript.

Comprendre et agir

Découvrez le piège à partir d’un exemple, puis les gestes que vous pouvez faire. Vous pouvez suivre cette lecture sans connaissances en informatique.

Une situation concrète

Un outil JavaScript importe les préférences d’un utilisateur. Une fusion mal contrôlée modifie un objet dont d’autres objets héritent. Une option destinée à cet utilisateur influence alors d’autres traitements.

Comment cela fonctionne

En JavaScript, un objet peut hériter de propriétés définies dans un autre objet, son prototype. La pollution de prototypes permet de modifier ces propriétés à partir de données non fiables. Le défaut peut changer des options, perturber un contrôle ou préparer une autre attaque. Ses conséquences dépendent du code qui lira ensuite les valeurs modifiées ; une pollution n’entraîne pas automatiquement une exécution de commandes.

Comment le piège fonctionne
  1. Des données sont importées

    Une fusion doit modifier des préférences locales.

  2. Un objet partagé est modifié

    La propriété rejoint une chaîne de prototypes.

  3. Un autre traitement en hérite

    Son comportement peut changer à la lecture.

Ce que vous pouvez faire

Vos premiers réflexes

Signalez des paramètres qui changent sans votre action, surtout après un import. La vérification du code et des bibliothèques revient à l’équipe du service.

Si vous êtes responsable du service ou de l’organisation

Faites examiner les fusions d’objets et les options utilisées pour les décisions sensibles. Vérifiez l’isolation entre utilisateurs et recréez les contextes contaminés après correction.

Un point à vérifierUne idée reçue à corriger

Un document JSON correctement formé peut contenir des données dangereuses pour une fusion ultérieure. Le simple fait de le lire n’implique toutefois pas qu’un prototype a été modifié.

À vous de décider

Le fichier de préférences est un JSON valide. Cela garantit-il que son import ne changera que vos préférences ?

Prenez un moment pour répondre et expliquer votre choix, puis ouvrez la correction.

Voir la réponse expliquée

Non. Un JSON valide respecte une syntaxe, pas les règles de l’application. Son contenu doit être contrôlé avant la fusion. Une fusion défectueuse peut modifier des propriétés dont d’autres objets héritent.

Analyser un cas technique

Ce cas s’adresse aux personnes qui développent, administrent ou analysent ces systèmes. Si vous découvrez le sujet, commencez par « Comprendre et agir ».

Étude de cas fictive

Une préférence héritée modifie un export indépendant

L’import de préférences modifie un prototype dans ce cas fictif. L’objet d’export ne possède toujours pas directement l’option include_internal, mais sa recherche retrouve désormais une valeur héritée. Le traitement suivant utilise cette valeur et renvoie une ligne interne factice. Le test relie la modification du prototype à la décision d’export qui renvoie cette ligne.

Une propriété apparue dans le prototype ne suffirait pas à prouver cette fuite. Il faut retrouver les lectures concernées et vérifier l’autorisation métier. Les champs du test rendent ici cette chaîne visible ; un serveur JavaScript ordinaire n’enregistre pas spontanément ces transitions. La portée peut dépasser une requête lorsqu’un même contexte traite plusieurs utilisateurs.

La correction limite les clés reçues, remplace la fusion dangereuse et rend explicite le contrôle d’autorisation de l’export. Le module Kibana Timelion CVE-2019-7609 documente un autre effet, l’exécution de code. Cette conséquence appartient au chemin présent dans Kibana ; le scénario étudié ici porte sur une option d’export.

Le déroulement en schéma

Qui échange avec quiLisez les échanges de haut en bas. Le point marque le départ et la flèche l’arrivée. Les vérifications après correction ne sont pas la suite de l’attaque.

Faites défiler le diagramme pour suivre les échanges ; les noms des acteurs restent en haut. Sur petit écran, faites aussi défiler de gauche à droite.

Étape
UtilisateurPréférences non fiables
Fusion d’objetsTraitement JavaScript
PrototypePropriétés héritables
ExportDécision et données
  1. Action

    Import de préférences

    Utilisateur vers Fusion d’objets

    Trace prefs-61

  2. Action

    Écriture non maîtrisée

    Fusion d’objets vers Prototype

    Trace prototype_changed

  3. Action sur place

    Nouvelle propriété héritée

    Prototype

    Trace include_internal

  4. Action

    Demande d’export

    Utilisateur vers Export

    Trace export-62

  5. Action

    Lecture d’une option absente de l’objet

    Export vers Prototype

    Trace recherche dans le prototype

  6. Réponse

    Valeur héritée retournée

    Prototype vers Export

    Trace option_origin

  7. Réponse

    Ligne interne factice livrée

    Export vers Utilisateur

    Trace effet confirmé en test

Comment repérer cette attaque

Indices à rechercher

  • Une option apparaît sur un objet qui ne la possède pas directement.
  • Des traitements indépendants changent de comportement après un import.
  • Un contrôle lit une propriété héritée alors qu’il attend une donnée validée.

Rechercher les changements de comportement après les imports et identifier les propriétés héritées utilisées dans les décisions sensibles. Rapprocher chaque valeur de sa source et de la version de la bibliothèque de fusion, avec une reproduction dans un processus isolé.

Quelles informations comparer

Établir deux liens : l’entrée vers l’écriture du prototype, puis la propriété héritée vers la décision d’export. Identifier le contexte et sa durée de vie pour savoir quelles autres requêtes ont pu utiliser la même valeur.

Ce que ces indices ne permettent pas de conclure

Une propriété héritée peut être légitime et une pollution peut rester sans effet observable. Le scénario prouve une ligne factice retournée en test, sans établir une exécution de code ou l’exposition de données réelles.

Comment réagir

Corriger l’écriture et les lectures dangereuses, vérifier les autres usages du même prototype et traiter les actions déjà réalisées. Recréer le contexte contaminé après application du correctif ; redémarrer avant de fermer le chemin laisse la pollution se reproduire. Examiner aussi les valeurs enregistrées durablement par les traitements affectés.

Vérifier la correction

L’équipe responsable du système peut utiliser ces contrôles dans un environnement de test autorisé. Vous pouvez lire et comprendre le cas sans effectuer ces manipulations.

  1. L’import ne modifie aucun prototype partagé, y compris avec des objets imbriqués.
  2. Les options et autorisations de l’export sont vérifiées explicitement ; une propriété héritée ne les accorde pas.
  3. Des requêtes successives de deux utilisateurs restent indépendantes dans le même contexte corrigé.

À vous de raisonner

Le prototype est modifié après l’import, mais aucun traitement ne lit la propriété concernée. Pouvez-vous conclure à une fuite ou à une exécution de code ?

Quelle décision prendriez-vous, et sur quel indice vous appuieriez-vous ? Répondez avant d’ouvrir la correction.

Comparer avec le raisonnement expliqué

Non. La pollution est établie, mais son effet dépend des lectures ultérieures. Il faut identifier ces consommateurs et leurs décisions. Le défaut d’écriture doit être corrigé, puis la séparation entre utilisateurs vérifiée dans un même contexte d’exécution.

Consulter les détails techniques

Les extraits permettent de s’exercer à lire les traces du cas. Si vous disposez des outils et des accès nécessaires, le guide de collecte vous aide aussi à rechercher ces informations.

Lire les extraits commentés (reconstitution fictive)

Ces extraits contiennent des valeurs fictives. Certains champs correspondent à ceux des outils documentés ; d’autres réunissent plusieurs sources pour faciliter l’explication. Vos propres exports pourront donc avoir une autre forme. Lisez d’abord les explications des champs, puis repérez-les dans les extraits.

own_include_internal
Observation pédagogique de la présence d’une propriété propre, distincte de la valeur trouvée par héritage.
option_origin
Provenance reconstituée de la valeur utilisée par l’export ; un journal Node.js ordinaire ne la fournit pas automatiquement.

État d’une option avant et après un import isolé

JSONL

Observations fictives d’un test d’application. Ce format n’est pas un journal natif Node.js ; les champs décrivent des objets et décisions factices, sans séquence d’exploitation.

{"case":"prefs-61","phase":"before_import","own_include_internal":false,"inherited_include_internal":false}
{"case":"prefs-61","phase":"after_import","prototype_changed":true,"own_include_internal":false,"inherited_include_internal":true}
{"case":"export-62","environment":"isolated_test","option_origin":"inherited","synthetic_internal_row_returned":true}
{"case":"export-63","build":"fixed","option_origin":"validated_own_property","synthetic_internal_row_returned":false}
Préparer une collecte dans votre environnement

Utilisez les sources disponibles dans vos outils et auxquelles vous êtes autorisé à accéder. Vous pouvez comprendre la fiche sans posséder ces outils. Vérifiez que les journaux étaient activés pendant la période étudiée. Gardez l’export original avec son fuseau horaire et sa provenance dans un espace à accès restreint. Pour l’analyse, travaillez sur une copie dont vous avez retiré les secrets.

  1. Service concerné — audit et historique à vérifier

    Où les trouver
    Dans l’outil d’administration ou les journaux du service concerné. Demander à son mainteneur où sont enregistrées les décisions d’autorisation et les opérations métier.
    Quoi relever
    Retrouver les imports, le composant de fusion et la décision métier affectée. En test isolé, comparer les propriétés propres et héritées avant et après, sans journaliser de valeurs privées complètes.
    Accès et prérequis
    Il n’existe ni fichier ni vocabulaire universels. Les champs proposés ici doivent être instrumentés s’ils manquent ; ne pas enregistrer mots de passe, jetons ou contenu privé intégral.
    Documentation : Service concerné — audit et historique à vérifier
  2. Fichiers préservés — comparaison et empreintes complètes

    Où les trouver
    Sur des copies de travail des fichiers conservés, dans l’environnement d’analyse autorisé. Calculer les empreintes complètes avec un outil fiable, puis comparer les octets si une égalité mérite vérification.
    Quoi relever
    Préserver la version du code et des dépendances qui réalisent la fusion et l’export. Comparer les copies utilisées en laboratoire à la version déployée ; une empreinte différente peut aussi provenir d’une mise à jour légitime.
    Accès et prérequis
    Accès aux originaux ou à des copies dont la provenance est documentée. Préciser l’algorithme, la longueur et toute transformation ; un recalcul actuel ne prouve pas quel fichier le service a traité auparavant.
    Documentation : Fichiers préservés — comparaison et empreintes complètes

Si vous pensez être concerné

Si vous utilisez le service

Signalez des paramètres qui changent sans votre action, surtout après un import. La vérification du code et des bibliothèques revient à l’équipe du service.

Pour l’équipe qui exploite le service

  1. Conservez l’entrée reçue et la version du composant de fusion dans un espace d’analyse.
  2. Corrigez le chemin qui modifie le prototype et recherchez les lectures des propriétés affectées.
  3. Après correction, recréez les processus ou contextes contaminés et vérifiez les opérations déjà réalisées.

Pour comprendre votre situation et trouver de l’aide : obtenir une assistance sur 17Cyber. Dans une organisation, prévenez aussi le responsable ou prestataire chargé de la sécurité.

Sources et repères pour approfondir