Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
LavaDome — Isolation et encapsulation sécurisées des arbres DOM en tirant parti de ShadowDOM | Kitploit
Outils/GitHubGitHub/lavamoat/lavadome
Outils DéfensifsSécurité WebProtection de la Vie Privée
GitHublavamoat/lavadome

LavaDome

Isolation et encapsulation sécurisées des arbres DOM en tirant parti de ShadowDOM

Voir le dépôtSite web
3654il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

LavaDome 🌋️

~ Un nouvel outil LavaMoat pour l'Encapsulation sécurisée des nœuds DOM ~

⚠️ EXPÉRIMENTAL [WIP] - UTILISATION À VOS RISQUES ET PÉRILS (en savoir plus)

Démo

Tentez votre chance avec LavaDome - visitez la démo, ouvrez la console, et faites tout ce qui est en votre pouvoir pour voler le secret au sein de l'instance LavaDome (signalez votre réussite)

Aperçu (cliquer pour déplier)
Démo LavaDome

Motivation

Sous les normes web actuelles, il n'existe aucun moyen établi pour isoler sélectivement des sous-arbres du DOM de manière . En d'autres termes, nous ne pouvons pas contrôler l'accès à des sections du DOM en accordant l'accès à certaines parties tout en le bloquant pour d'autres si elles partagent le même environnement d'exécution JavaScript.

sécurisée

Nous vivons dans un monde où nous ne pouvons plus faire confiance au code de nos propres applications, et une exécution de même origine ne garantit pas la sécurité. Pour sécuriser des secrets côté frontend, nous devons être capables de présenter du contenu à l'utilisateur tout en nous assurant qu'il ne puisse pas être compromis par du code JavaScript s'exécutant sous la même origine.

Exemple

Un cas d'usage pour une telle fonctionnalité est l'interrupteur « afficher la clé privée » de MetaMask, qui exporte la clé privée en clair à la demande de l'utilisateur. (cliquer pour déplier)
Fonctionnalité d'affichage de la clé privée par MetaMask

Actuellement, ce contenu sensible est simplement rattaché au DOM une fois exporté, ce qui le rend entièrement accessible à toutes les entités s'exécutant dans la même application. En d'autres termes, les parties du code qui ne devraient pas avoir accès à la clé privée pourraient facilement l'extraire en clair, pourvu que le code malveillant ait accès au DOM.

Mais soyez rassurés. Nous pensons que c'est un problème résoluble 👇

Utilisation

LavaDome prend actuellement en charge JavaScript vanilla et React (avec d'autres en préparation)

JavaScript```javascript

import { LavaDome as LavaDomeJavaScript } from '@lavamoat/lavadome-javascript';

const root = document.getElementById('root'); const lavadome = new LavaDomeJavaScript(root); lavadome.text(secret); lavadome.copy(); // copy to clipboard

root@kitploit:~
### [React](https://github.com/lavamoat/lavadome/blob/main/packages/react)```javascript
import { LavaDome as LavaDomeReact, toLavaDomeToken } from '@lavamoat/lavadome-react';

function Secret({ text }) {
    const {token, copy} = toLavaDomeCapabilities(text);
    return <>
        <a onClick={copy}> copy to clipboard </a>
        <LavaDomeReact token={token} />
    </>;
}

API

Outre le nœud racine, tous les constructeurs acceptent un second argument facultatif d'options:```javascript // javascript new LavaDomeJavaScript(root, { // boolean unsafeOpenModeShadow: false, });

// react function Secret({ text }) { const {token} = toLavaDomeCapabilities(text); return <LavaDomeReact token={token} // boolean unsafeOpenModeShadow={false} /> }

root@kitploit:~
### Utilisation sûre

En raison des limitations du noyau web, afin d'intégrer LavaDome de manière sécurisée, quelques éléments doivent être pris en compte qui exigent un effort actif de la part du développeur intégrateur :

#### Ordre d'exécution

LavaDome, comme tout autre logiciel de sécurité JavaScript, est toujours vulnérable au code qui s'exécute avant lui.

Cela signifie qu'à l'exception du code auquel nous faisons entièrement confiance, LavaDome doit être le premier morceau de code à charger dans le programme de l'application web.

Bien que cela ne signifie pas que le développeur doive l'utiliser immédiatement (mais plutôt seulement lorsqu'il en a besoin), il doit cependant inclure le programme dès que possible.

Pour ce faire correctement (en toute sécurité), il doit être la première déclaration import/require de tout le programme :```javascript
import '@lavamoat/lavadome-react';
import 'other-stuff';

console.log('Program starts here');

De cette façon, nous garantissons que LavaDome a le temps de se préparer pour une utilisation sûre.

Notez que cela s'applique de la même manière au reste des paquets LavaDome, pas seulement à @lavamoat/lavadome-react (il n'est donc pas nécessaire d'en importer plus d'un).

Rendez-vous dans Security(codage défensif) pour en savoir plus.

CSP

En raison des attaques par canal auxiliaire et des limitations du web, l'importation de polices distantes peut être une technique efficace contre LavaDome. Étant donné que cela est intégré dans les domaines du CSS, il n'est actuellement pas possible de résoudre ce problème via LavaDome.

Heureusement, cela peut être traité efficacement avec la directive font-src de la CSP.

Pour atténuer cette forme d'attaque, assurez-vous que votre application web n'autorise pas le chargement de polices depuis des serveurs inconnus.

Rendez-vous dans Security(canal auxiliaire) pour en savoir plus.

Texte imprévisible

Le texte fourni à LavaDome par le développeur doit être imprévisible à 100 %, sinon il peut être attaqué et divulgué.

Ainsi, si votre application doit afficher "your key is 234789", cela signifie que votre structure DOM devrait être :```html your key is 234789

root@kitploit:~
et ne doit pas être :```html
<span> <lavadome>your key is 234789</lavadome> </span>

Passez à Sécurité (trouvabilité) pour en savoir plus.

Tests

Intégrer LavaDome peut être délicat dans le contexte de son test, car puisque LavaDome fait du bon travail pour cacher le secret, il le cache également très bien de vos tests !

Pour intégrer avec succès LavaDome dans votre environnement de test, vous pourriez avoir besoin de l'aide de LavaDomeDebug, qui est exporté par @lavamoat/lavadome-core :```javascript // IMPORT/USE FOR TESTING/DEBUGGING PURPOSES ONLY - NEVER IN PRODUCTION! import { LavaDomeDebug } from '@lavamoat/lavadome-core';

root@kitploit:~
Voici quelques-unes des méthodes utilitaires de débogage exportées par `LavaDomeDebug` qui peuvent vous aider à tester les composants basés sur `LavaDome` :

#### `getTextByRoot()`

Étant donné une racine à laquelle `LavaDome` est attaché, `getTextByRoot()` extrait et reconstruit récursivement le secret interne. Pour ce faire, l'instance `LavaDome` doit avoir été initialisée à l'origine avec l'option NON SÛRE `@unsafeOpenModeShadow`, qui rend les ombres internes de `LavaDome` accessibles depuis l'extérieur.

Naturellement, c'est NON SÛR et laisse `LavaDome` entièrement vulnérable, mais cela n'a de sens que pour une utilisation à des fins de test/débogage uniquement - assurez-vous de ne jamais activer cette option en production !```javascript
new LavaDomeJavaScript(root, {
    unsafeOpenModeShadow: isThisTestingEnv, // boolean
}).text('123456');
LavaDomeDebug.getTextByRoot(root) === '123456'; // true

stripDistractionFromText()

Lorsque vous utilisez des pilotes web pour les tests et que vous leur demandez d'extraire le texte interne de la racine d'une instance LavaDome, ils renvoient une chaîne contenant à la fois le secret et le texte de distraction de LavaDome.

Le texte de distraction est important pour la sécurité (voir Sécurité (side-channeling)), mais il conduit le pilote web à extraire des caractères qui ne font pas vraiment partie du secret.

Pour résoudre ce problème, à partir du texte obtenu par le pilote web, stripDistractionFromText() supprime le texte de distraction, ne laissant que la chaîne exacte que vos tests s'attendent à trouver.

Ne vous inquiétez pas au sujet du texte de distraction : il ne sera jamais visible ni interactif pour l'utilisateur dans votre application, mais il doit exister pour des raisons de sécurité.```javascript new LavaDomeJavaScript(root).text('123456'); const element = await driver.findElement('#ROOT'); // driver const text = await element.getText(); // driver LavaDomeDebug.stripDistractionFromText(text) === '123456'; // true

root@kitploit:~
## Développement

Pour configurer une version de développement locale de **`LavaDome`**, clonez ce dépôt et exécutez l'une des commandes suivantes :```bash
npm install && npm install --global serve

I don't see any content under "INPUT:" — the chunk text appears to be missing, so there is nothing to translate. Please provide the source Markdown for chunk 21 of 27.```bash yarn install && yarn global add serve

root@kitploit:~
## Solution

L'API Web [`ShadowDom`](https://web.dev/articles/`ShadowDom`-v1) nous permet d'isoler et d'encapsuler des nœuds DOM. Bien qu'elle [ne soit pas conçue comme une fonctionnalité de sécurité](https://web.dev/articles/`ShadowDom`-v1#:~:text=Note%3A%20Closed%20shadow%20roots%20are%20not%20very%20useful.%20Some%20developers%20will%20see%20closed%20mode%20as%20an%20artificial%20security%20feature.%20But%20let%27s%20be%20clear%2C%20it%27s%20not%20a%20security%20feature.for%20Closed%20mode%20simply%20prevents%20outside%20JS%20from%20drilling%20into%20an%20element%27s%20internal%20DOM.), `ShadowDom` fonctionne bien pour isoler des sous-arbres DOM du JavaScript et du CSS exécutés ailleurs dans la page.

L'approche de base de **`LavaDome`** consiste à exploiter `ShadowDom`, tout en traitant soigneusement ses [failles de sécurité potentielles](https://blog.ankursundara.com/shadow-dom/).

**[LavaDome](https://github.com/lavamoat/lavadome/)** est conçu pour être un **outil de sécurité dans la boîte à outils LavaMoat** permettant d'implémenter des composants frontend-only qui autorisent exclusivement les interactions avec l'utilisateur et le code de confiance, tout en bloquant les tentatives d'accès par du code JavaScript et CSS non fiable dans l'application.

> Merci à [@arxenix](https://github.com/arxenix) pour ses [recherches](https://blog.ankursundara.com/shadow-dom/) sur la sécurité de `ShadowDom`, qui ont servi de base aux améliorations majeures de sécurité implémentées dans **`LavaDome`**.

## Objectifs

Le projet **`LavaDome`** suit les principes fondamentaux suivants :

### Sécurisé

Notre priorité absolue est de fournir une sécurité infaillible. Nous avons enveloppé l'API `ShadowDom` avec des propriétés de sécurité avancées afin de la rendre sûre pour l'affichage d'informations sensibles.

Consultez [Sécurité](#Security) pour en savoir plus sur cet effort.

### DX (Expérience Développeur)

Nous nous efforçons d'offrir une expérience développeur fluide. À cette fin, nous allons :

1. Prendre en charge autant de frameworks populaires (React, Angular, etc.) que possible ;
2. Rendre l'API facile et simple à utiliser.

### Mode lecture seule

À ce stade, nous ne prévoyons pas de prendre en charge le mode écriture, ce qui signifie que **`LavaDome`** n'acceptera que du contenu en texte brut pour la protection, et rien de plus complexe que cela.

Cela s'explique par le fait que la prise en charge du mode écriture nécessiterait l'implémentation d'un DOM isolé intraitable, ce qui introduit plusieurs complications de sécurité que nous ne sommes pas encore prêts à affronter à ce stade, notamment :

1. Sécurité des écouteurs d'événements - empêcher le code externe d'intercepter les entrées destinées aux nœuds internes de LavaDome.
2. Sécurité de superposition - empêcher le code malveillant de poser un DOM de phishing sur **`LavaDome`** pour amener l'utilisateur à fournir des données sensibles à la mauvaise entité.

## Conception

La complexité de conception de ce projet n'est pas élevée. Cependant, satisfaire aux exigences combinées des principes de sécurité qu'il implémente est une tâche non triviale (voir [Sécurité](#Security)).

**`LavaDome`** se compose des paquets suivants :

### [Core](https://github.com/lavamoat/lavadome/blob/main/packages/core)

Implémente la couche API de base qui sert d'intermédiaire entre le consommateur et le composant isolé protégé. L'API vise à permettre autant de manipulations externes du composant isolé que possible sans fournir à quiconque les nœuds DOM réels qui s'y trouvent - pas même au consommateur de LavaDome - afin de maintenir le niveau de sécurité le plus élevé possible.

De plus, il assume la responsabilité d'implémenter tout le durcissement de sécurité nécessaire pour rendre l'utilisation de la fonctionnalité `ShadowDom` réellement sécurisée, contrairement à sa nature native qui n'en fait pas une fonctionnalité de sécurité par défaut (voir [Sécurité](#Security)).

> Rappel : le paquet core ne doit pas être utilisé en production !

### [JavaScript](https://github.com/lavamoat/lavadome/blob/main/packages/javascript) / [React](https://github.com/lavamoat/lavadome/blob/main/packages/react) / etc.

Exportent des fonctionnalités permettant aux développeurs de consommer **`LavaDome`** comme ils le préfèrent, que ce soit en JavaScript ou comme composant React (ou toute autre plateforme - [demandez !](https://github.com/lavamoat/lavadome/issues/new?title=**`LavaDome`**+misses+support+for+...))
> NOTE : Fournir le support **`LavaDome`** pour les frameworks intègre du code tiers que nous ne contrôlons pas, ce qui crée des « zones de sécurité aveugles ».

> Veuillez lire la section [Sécurité](#Security) pour apprendre comment rester aussi sûr que possible lors de l'utilisation de **`LavaDome`** avec des frameworks tiers.

## Sécurité

Si vous prévoyez d'utiliser **`LavaDome`** pour un projet, voici les aspects de sécurité à connaître :

### `ShadowDom` vs `iframe`

Encore une fois, c'est un projet encore expérimental, mais nous avons réfléchi à cette décision. Une alternative naturelle à l'utilisation du `ShadowDom` est d'exploiter des `iframe` cross-origin. Infiltrer une `iframe` cross-origin est impossible, et ce mécanisme est reconnu comme critique pour la sécurité par la spécification W3C. Cela signifie que si une brèche survenait, elle serait traitée comme une vulnérabilité de sécurité et corrigée en urgence par les fournisseurs de navigateurs.

L'inconvénient de cette approche, cependant, est que l'intégration d'une solution basée sur iframe est significativement plus difficile, en termes d'UI/UX/DX, surtout pour un outil visant une adoption massive.

**`LavaDome`** doit offrir une expérience développeur fluide et naturelle tout en facilitant l'intégration sécurisée de nœuds DOM encapsulés dans l'arbre DOM hôte, et `ShadowDom` est une API orientée DOM précisément conçue pour cela. Cela en fait un meilleur choix pour nos objectifs.

Bien que l'API `ShadowDom` ne soit pas officiellement recommandée comme outil de sécurité par ses créateurs, son implémentation est hautement sécurisée et ne laisse fuiter aucune information encapsulée depuis l'arbre du shadow DOM, sauf dans des scénarios très spécifiques.

Nous croyons qu'en traitant soigneusement ces scénarios précis, `ShadowDom` peut être augmenté en une API d'encapsulation DOM sécurisée (ça vaut le coup d'essayer).

### Menaces

Il est important d'aborder les menaces de sécurité actuelles qui existent avec une solution basée sur `ShadowDom` comme `LavaDome`.

#### 1. Injection

Les développeurs pourraient fournir à **`LavaDome`** du contenu HTML/JS/CSS qui, une fois chargé, peut accidentellement ou intentionnellement fuiter des nœuds DOM depuis l'intérieur du `ShadowDom`, par exemple en ajoutant dynamiquement du code JavaScript à l'exécution.

Lisez les [recherches](https://blog.ankursundara.com/shadow-dom/#contenteditable-or-css-injection) de [@arxenix](https://github.com/arxenix) pour en savoir plus sur cette technique.

Pour empêcher cette possibilité, **`LavaDome`** n'accepte aucun nœud DOM dans l'arbre du shadow DOM, et ne prend en charge que l'encapsulation de texte brut. Cela nous évite d'avoir à lutter contre les problèmes de sécurité inhérents à la confiance accordée au contenu HTML/JS/CSS fourni par l'utilisateur.

Nous serions ravis de revisiter cette décision à l'avenir alors que nous étudions un moyen stable et sécurisé de prendre en charge les entrées de nœuds DOM et de sous-arbres.

#### 2. Trouvabilité

L'API [find()](https://developer.mozilla.org/en-US/docs/Web/API/Window/find) permet aux développeurs de trouver et d'extraire des nœuds DOM en recherchant le texte qu'ils contiennent. C'est la seule API connue à ce jour pour fuiter avec succès des nœuds DOM depuis l'intérieur d'un `ShadowDom`.

<details>
<summary>
    Dans Firefox, après avoir trouvé le texte, on peut utiliser l'API <code>getSelection()</code> pour fuiter des nœuds DOM depuis l'intérieur du `ShadowDom`, compromettant ainsi toute l'idée : <i>(cliquer pour agrandir)</i>
</summary>```js
// defender
const secret = 'AN UNPREDICTABLE SECRET';
const opts = { mode:'closed' };
const root = document.body.firstElementChild.firstElementChild;
const p = document.createElement('p');
const shadow = root.attachShadow(opts);
shadow.append(p);
p.innerText = 'Secret is: ' + secret;

// attacker
setTimeout(() => {
    find('Secret is:'); // assuming the Shadow includes predictable text
    console.log('stolen secret: ', getSelection().anchorNode.textContent);
});
`ShadowDom` contourne Firefox

Lisez les recherches de @arxenix pour en savoir plus sur cette technique.

Pour se défendre contre cette attaque, le consommateur de LavaDome ne doit pas passer de contenu prévisible à l'API LavaDome. Bien que cela puisse sembler évident, les développeurs pourraient facilement être tentés de fournir à LavaDome une entrée ressemblant à The secret is: ldsjf9304rjdkn, ce qui compromettrait totalement la sécurité de LavaDome. Même si la partie ldsjf9304rjdkn est impossible à deviner, la phrase fixe "The secret is: " pourrait être exploitée pour révéler le secret, surtout si celle-ci a été précédemment exposée dans le DOM.

Par conséquent, lors de l'utilisation de LavaDome, les développeurs DOIVENT uniquement passer du texte 100 % imprévisible en entrée.

Chromium est protégé contre l'attaque ci-dessus. Cependant, si un nœud DOM sélectionné dans le `ShadowDom` est content-editable, les attaquants peuvent exploiter document.execCommand('insertHTML', ...) pour exécuter du code arbitraire dans la portée interne du `ShadowDom` et l'utiliser pour accéder aux nœuds DOM encapsulés. (cliquer pour développer) ```js // defender const secret = 'AN UNPREDICTABLE SECRET'; const opts = { mode:'closed' }; const root = document.body.firstElementChild.firstElementChild; const div = document.createElement('div'); const shadow = root.attachShadow(opts); shadow.append(div); const p = document.createElement('p'); p.innerText = 'Secret is: ' + secret; div.appendChild(p); div.setAttribute('contenteditable', 'true');

// attacker setTimeout(() => { console.log(1, 'stolen secret:'); const bypass = '<audio/src/onerror=console.log(2,this.nextSibling.innerHTML)>'; find('Secret is:'); // assuming the Shadow includes predictable text // assuming the found node is contenteditable=true document.execCommand('insertHTML', false, bypass); });

root@kitploit:~
<div align="center"><img width="800" src="https://assets.kitploit.com/production/public/readmes/48843/b3f770ae9d6ea6070e8ed984e33a2f4df5112128d21d3c01000dd66ee1143733.png" alt="`ShadowDom` bypass Chromium"/></div>
</details>

Pour se défendre contre ce vecteur d'attaque, **`LavaDome`** supprime tous les attributs de style de ses éléments personnalisés en utilisant l'attribut de style ayant la priorité la plus élevée possible (`-webkit-user-modify: unset;`). Cela garantit que ses éléments ne sont pas vulnérables à l'injection de CSS externe malveillant qui applique l'attribut `-webkit-user-modify:read-write`, ce qui rendrait les éléments `ShadowDom` `contenteditable`.

La seconde technique consistant à utiliser `contenteditable` comme attribut n'est actuellement pas pertinente, car **`LavaDome`** ne prend pas en charge l'acceptation de nœuds DOM.

#### 3. Sélectionnabilité et fractionnement du secret

Les vecteurs d'attaque ci-dessus ne sont pas très utiles si l'on atténue [`getSelection`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection). En rendant le texte contenu dans **`LavaDome`** non sélectionnable, nous renforçons la sécurité contre une éventuelle injection, comme démontré ci-dessus. Cela fonctionne bien dans Chromium, mais nous sommes en train de résoudre certains problèmes avec Firefox.

Si un attaquant parvient à deviner une partie du secret, il peut compromettre la totalité du secret (en supposant que `getSelection` capture les nœuds scopés comme dans Firefox). En effet, la recherche de cette partie divulguera le nœud texte qui contient cette partie du secret, donnant ainsi à l'attaquant accès à l'intégralité du secret.

En guise de contre-mesure, **`LavaDome`** stocke chaque caractère du secret dans son propre `ShadowDom`, garantissant que la compromission d'une partie du secret n'entraîne pas la compromission du reste. Cette protection a l'avantage supplémentaire de rendre exponentiellement plus difficile, pour les attaquants, la divulgation de la totalité du secret : plus celui-ci est long et plus il comporte de caractères possibles.

Une compromission reste possible, mais uniquement si l'attaquant essaie par force brute tous les caractères possibles un par un, exfiltre toutes les ombres qu'il trouve, puis réordonne de manière synchrone toutes les ombres correctement pour les aligner sur leurs positions respectives au sein de l'hôte principal de **`LavaDome`**.

#### 4. Canaux auxiliaires

Une autre attaque bien connue consiste à divulguer le contenu des ShadowDOM à un serveur distant en utilisant des propriétés CSS héritables telles que `@font-face`, caractère par caractère.

Considérez la [recherche](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html) suivante sur cette attaque, documentée par [@masatokinugawa](https://github.com/masatokinugawa).

Pour y remédier, LavaDome ajoute au Shadow parent tous les caractères possibles, de sorte qu'une telle tentative de fuite soit perturbée lors de la recherche de tous les caractères possibles, rendant cette attaque inutile (voir https://github.com/LavaMoat/LavaDome/issues/16).

Bien sûr, les canaux auxiliaires prennent de nombreuses formes, certaines plus difficiles à traiter, comme la [recherche](https://research.securitum.com/stealing-data-in-great-style-how-to-use-css-to-attack-web-application/) de [@securityMB](https://github.com/securityMB) où il utilise des polices de ligature (exploit par [@masatokinugawa](https://github.com/masatokinugawa) @ https://github.com/LavaMoat/LavaDome/issues/40).

Pour y remédier, les développeurs qui adoptent LavaDome sont invités à imposer une politique CSP stricte pour `font-src` afin de garantir qu'aucune fuite par les polices ne soit possible vers des serveurs distants incontrôlables.

Il convient de noter que cela (théoriquement) ne sera pas utile dans Safari, où cette attaque peut être menée en utilisant des SVG locaux pour former les polices, permettant ainsi aux attaquants de rester indépendants de la CSP (voir WIP @ https://github.com/LavaMoat/LavaDome/issues/40#issuecomment-2090318009).

Un autre excellent exemple d'attaques par canaux auxiliaires - cette fois sans utiliser de polices - consiste à tirer parti des fragments de texte (voir l'[exploit](https://github.com/LavaMoat/LavaDome/issues/35) de [@masatokinugawa](https://github.com/masatokinugawa)).

#### 5. Programmation défensive

Une solution sécurisée exige des pratiques de programmation défensive.

- À cette fin, toutes les API natives que nous utilisons sont mises en cache pour un usage interne, afin d'empêcher les attaquants de reconfigurer les API globales pour saboter le flux d'exécution de **`LavaDome`**.

- Si vous remarquez des choix stylistiques non conventionnels dans le code source, il y a de fortes chances qu'ils soient inspirés par des principes de programmation défensive.

- Il est **crucial** d'inclure **`LavaDome`** dans l'application avant tous les scripts auxquels vous ne faites pas confiance, et de préférence avant TOUS les scripts !

- Lorsque vous utilisez les versions framework de **`LavaDome`**, vous devez supposer que ces frameworks ne sont pas écrits de manière défensive et que les API natives utilisées ne sont pas à l'abri d'interférences malveillantes. Sachez que la sécurité du code externe échappe au contrôle de **`LavaDome`**.

Par conséquent, nous recommandons d'intégrer toujours de telles solutions de sécurité avec la technologie [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses) développée par [@agoric](https://github.com/agoric). C'est une pratique de sécurité suivie chez [LavaMoat](https://github.com/lavamoat/lavamoat) et [MetaMask](https://github.com/MetaMask/metamask-extension).

#### 6. Fuite du traitement interne de React

Une autre chose à surveiller (plus précisément dans le contexte de React) est le fait que React divulgue activement les données d'entrée fournies à ses composants vers l'objet global, les mettant ainsi à la portée des entités non fiables s'exécutant dans l'application (ce qui compromet totalement l'objectif de `LavaDome`).

Reportez-vous à la [découverte](https://github.com/LavaMoat/LavaDome/pull/23#issue-2093459897) de [naugtur](https://github.com/naugtur) pour en savoir plus.

Pour équilibrer notre intention de prendre en charge React avec le fait que nous ne pouvons pas lui confier notre secret, le package `LavaDomeReact` exporte des fonctionnalités minimales (mais sûres) pour échanger le secret contre un jeton spécial avant de le transmettre à React, où la seule entité capable de reconvertir ce jeton en secret est `LavaDome` lui-même.

Bien que puissante, cette approche exige malheureusement que les utilisateurs de React effectuent activement l'échange avant de transmettre le secret à `LavaDomeReact`.

Si l'utilisateur reçoit autre chose qu'un jeton bien connu, une exception générée par `LavaDome` est levée, afin d'obliger les développeurs à utiliser `LavaDomeReact` en toute sécurité.

## Avertissement

Si vous avez lu tout ce qui précède, vous devriez avoir une bonne idée de la raison pour laquelle **`LavaDome`** est encore très expérimental. Rendre sûre une fonctionnalité non liée à la sécurité est intrinsèquement risqué, mais comme il n'existe pas de bonnes solutions à ce problème, nous pensons que cette tentative représente un pas dans la bonne direction.

Nous recommandons tout de même d'utiliser **`LavaDome`**, car il représente une amélioration sans ambiguïté par rapport au fait de s'appuyer uniquement sur les normes web actuelles. Rappelez-vous simplement que notre solution rendra votre code « plus sûr », mais pas « sûr ».

De plus, n'oubliez pas : LavaDome vous aide à amener un secret dans le DOM en toute sécurité. Savoir si le secret a été compromis ou non avant d'être transmis à LavaDome ne relève pas du périmètre de LavaDome.

Cela signifie qu'il est de votre responsabilité de vous assurer que le secret est en sécurité jusqu'au moment où vous le partagez avec LavaDome.

La meilleure façon d'y parvenir est de fonctionner dans un environnement verrouillé utilisant [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses) / [LavaMoat](https://github.com/lavamoat/lavamoat).
Télécharger l’outil