Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/lavamoat/lavadome
DefensivwerkzeugeWebsicherheitPrivatsphäre
GitHublavamoat/lavadome

LavaDome

Sichere Isolation und Kapselung von DOM-Bäumen mittels ShadowDOM

Repository anzeigenWebseite
365vor 1 JahrVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

LavaDome 🌋️

~ Ein neues LavaMoat-Tool für die gesicherte Einkapselung von DOM-Knoten ~

⚠️ EXPERIMENTELL [WIP] - VERWENDUNG AUF EIGENE GEFAHR (mehr erfahren)

Demo

Nehmen Sie es mit LavaDome auf - besuchen Sie die Demo-App, öffnen Sie die Konsole, und tun Sie alles in Ihrer Macht Stehende, um das Geheimnis aus der LavaDome-Instanz zu stehlen (melden Sie Ihren Erfolg)

Vorschau (zum Erweitern klicken)
LavaDome DEMO

Motivation

Nach heutigen Webstandards gibt es keinen etablierten Weg, DOM-Teilbäume auf sichere Weise selektiv zu isolieren. Mit anderen Worten: Wir können den Zugriff auf Abschnitte des DOM nicht kontrollieren, indem wir einigen Parteien Zugriff gewähren, während wir anderen den Zugriff verwehren, wenn sie dieselbe JavaScript-Ausführungsumgebung teilen.

Wir leben in einer Welt, in der wir dem Code in unseren eigenen Apps nicht mehr vertrauen können, und die Ausführung unter demselben Ursprung (Same-Origin) garantiert keine Sicherheit. Um Geheimnisse im Frontend zu sichern, müssen wir in der Lage sein, dem Benutzer Inhalte zu präsentieren und gleichzeitig sicherzustellen, dass sie nicht durch JavaScript-Code kompromittiert werden können, der unter demselben Ursprung ausgeführt wird.

Beispiel

Ein Anwendungsfall für eine solche Funktion ist der „Privaten Schlüssel anzeigen“-Schalter von MetaMask, der den privaten Schlüssel auf Benutzeranfrage im Klartext exportiert. (zum Erweitern klicken)
Funktion zum Anzeigen des privaten Schlüssels von MetaMask

Derzeit wird dieser vertrauliche Inhalt einfach an das DOM angehängt, sobald er exportiert wird, wodurch er für alle Entitäten, die in derselben App laufen, vollständig zugänglich ist. Das heißt, Codeteile, die keinen Zugriff auf den privaten Schlüssel haben sollten, könnten ihn leicht im Klartext extrahieren, solange der bösartige Code Zugriff auf das DOM hat.

Aber seien Sie versichert. Wir glauben, dass dies ein lösbares Problem ist 👇

Verwendung

LavaDome unterstützt derzeit Vanilla JavaScript und React (weitere in Kürze)

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/HEAD/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

Zusätzlich zum Root-Knoten akzeptieren alle Konstruktoren ein optionales options-Argument als 2. Argument:```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:~
### Sichere Verwendung

Aufgrund der Einschränkungen des Webkerns gibt es bei der sicheren Integration von LavaDome einige Punkte zu beachten, die aktive Arbeit des integrierenden Entwicklers erfordern:

#### Ausführungsreihenfolge

LavaDome ist wie jede andere JavaScript-Sicherheitssoftware immer anfällig für Code, der vor ihm ausgeführt wird.

Das bedeutet, dass LavaDome – abgesehen von Code, dem wir absolut vertrauen – das erste Codestück sein muss, das im Webanwendungsprogramm geladen wird.

Das bedeutet zwar nicht, dass der Entwickler es sofort nutzen muss (sondern nur dann, wenn er es benötigt), er muss das Programm jedoch so früh wie möglich einbinden.

Um dies korrekt (sicher) zu tun, muss es die erste import/require-Deklaration im gesamten Programm sein:```javascript
import '@lavamoat/lavadome-react';
import 'other-stuff';

console.log('Program starts here');

Auf diese Weise stellen wir sicher, dass sich LavaDome auf den sicheren Gebrauch vorbereiten kann.

Beachten Sie, dass dies in ähnlicher Weise für die übrigen LavaDome-Pakete gilt und nicht nur für @lavamoat/lavadome-react (weshalb es unnötig ist, mehr als eines davon zu importieren).

Springen Sie zu Security(defensive-coding), um mehr zu erfahren.

CSP

Aufgrund von Side-Channel-Angriffen und Webspezifischen Einschränkungen kann das Importieren externer Schriftarten eine erfolgreiche Technik gegen LavaDome sein. Da dies in den Bereichen von CSS eingebettet ist, ist die Behebung dieses Problems über LavaDome derzeit nicht möglich.

Glücklicherweise kann dies mithilfe der font-src-Direktive von CSP wirksam angegangen werden.

Um diese Art von Angriff zu entschärfen, stellen Sie sicher, dass Ihre Web-App das Abrufen von Schriftarten von unbekannten Servern nicht erlaubt.

Springen Sie zu Security(side-channeling), um mehr zu erfahren.

Unvorhersehbarer Text

Text, der LavaDome vom Entwickler bereitgestellt wird, muss zu 100 % unvorhersehbar sein, andernfalls kann er angegriffen und preisgegeben werden.

Wenn Ihre App also "your key is 234789" anzeigen soll, bedeutet dies, dass Ihre DOM-Struktur wie folgt aussehen sollte:```html your key is 234789

root@kitploit:~
und darf nicht sein:```html
<span> <lavadome>your key is 234789</lavadome> </span>

Wechsle zu Sicherheit(Auffindbarkeit), um mehr zu erfahren.

Testen

Die Integration von LavaDome im Kontext des Testens kann knifflig sein, denn da LavaDome gute Arbeit beim Verbergen des Geheimnisses leistet, verbirgt es das Geheimnis auch ziemlich gut vor deinen Tests!

Um LavaDome erfolgreich in deine Testumgebung zu integrieren, brauchst du möglicherweise etwas Hilfe von LavaDomeDebug, das von @lavamoat/lavadome-core exportiert wird:```javascript // IMPORT/USE FOR TESTING/DEBUGGING PURPOSES ONLY - NEVER IN PRODUCTION! import { LavaDomeDebug } from '@lavamoat/lavadome-core';

root@kitploit:~
Hier sind einige der Debugging-Utility-Methoden, die `LavaDomeDebug` exportiert und die dir beim Testen von Komponenten auf Basis von `LavaDome` helfen können:

#### `getTextByRoot()`

Wenn eine `LavaDome`-Root angehängt ist, extrahiert `getTextByRoot()` rekursiv das innere Geheimnis und rekonstruiert es. Damit das möglich ist, muss die `LavaDome`-Instanz ursprünglich mit der UNSAFE-Option `@unsafeOpenModeShadow` initialisiert worden sein, welche die inneren Schatten von `LavaDome` von außen zugänglich macht.

Natürlich ist das UNSAFE und macht `LavaDome` vollständig verwundbar, ist aber sinnvoll, wenn es nur für Test-/Debugging-Zwecke verwendet wird – stelle sicher, dass diese Option niemals in der Produktion aktiviert wird!```javascript
new LavaDomeJavaScript(root, {
    unsafeOpenModeShadow: isThisTestingEnv, // boolean
}).text('123456');
LavaDomeDebug.getTextByRoot(root) === '123456'; // true

stripDistractionFromText()

Wenn du Webtreiber für Tests verwendest und diese anweist, den inneren Text einer LavaDome-Instanz-Wurzel zu extrahieren, geben sie eine Zeichenkette zurück, die sowohl das Geheimnis als auch den Ablenkungstext der LavaDome enthält.

Der Ablenkungstext ist wichtig für die Sicherheit (siehe Security (Side-Channeling)), führt jedoch dazu, dass der Webtreiber Zeichen extrahiert, die nicht wirklich Teil des Geheimnisses sind.

Um das zu lösen, entfernt stripDistractionFromText() – basierend auf dem vom Webtreiber erhaltenen Text – den Ablenkungstext daraus und lässt nur die exakte Zeichenkette übrig, die deine Tests zu finden erwarten.

Keine Sorge wegen des Ablenkungstextes: Er wird für den Benutzer in deiner App nie sichtbar/interagierbar sein, muss aber aus Sicherheitsgründen existieren.```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:~
## Entwicklung

Um einen lokalen Entwicklungs-Build von **`LavaDome`** einzurichten, klonen Sie dieses Repo und führen Sie einen der folgenden Befehle aus:```bash
npm install && npm install --global serve

Es wurde kein Eingabetext bereitgestellt. Der Abschnitt nach „INPUT:“ ist leer. Bitte senden Sie den zu übersetzenden Inhalt für Chunk 21 erneut.```bash yarn install && yarn global add serve

root@kitploit:~
## Lösung

Die [`ShadowDom`](https://web.dev/articles/`ShadowDom`-v1) Web-API ermöglicht es uns, DOM-Knoten zu isolieren und zu kapseln. Obwohl sie [nicht als Sicherheitsfunktion konzipiert ist](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.), funktioniert `ShadowDom` gut, um DOM-Teilbäume von JavaScript und CSS zu isolieren, die an anderer Stelle in der Seite ausgeführt werden.

Der grundlegende Ansatz von **`LavaDome`** besteht darin, `ShadowDom` zu nutzen und dabei sorgfältig seine [potenziellen Sicherheitslücken](https://blog.ankursundara.com/shadow-dom/) zu adressieren.

**[LavaDome](https://github.com/lavamoat/lavadome/)** soll ein **Sicherheitswerkzeug im LavaMoat-Werkzeugkasten** sein, um reine Frontend-Komponenten zu implementieren, die ausschließlich Interaktionen mit dem Benutzer und vertrauenswürdigem Code ermöglichen, während Zugriffsversuche durch nicht vertrauenswürdigen JavaScript- und CSS-Code in der App blockiert werden.

> Ein großes Dankeschön an [@arxenix](https://github.com/arxenix) für die [Forschung](https://blog.ankursundara.com/shadow-dom/) zur `ShadowDom`-Sicherheit, die die Grundlage für bedeutende Sicherheitsverbesserungen bildete, die in **`LavaDome`** implementiert wurden.

## Ziele

Das **`LavaDome`**-Projekt folgt den folgenden Kernprinzipien:

### Sicher

Unsere oberste Priorität ist die Gewährleistung einer lückenlosen Sicherheit. Wir haben die `ShadowDom`-API mit erweiterten Sicherheitseigenschaften ausgestattet, um sie bei der Darstellung sensibler Informationen sicher zu machen.

Besuchen Sie [Security](#Security), um mehr über diese Bemühungen zu erfahren.

### DX

Wir bemühen uns, eine optimierte Entwicklererfahrung zu bieten. Zu diesem Zweck werden wir:

1. So viele gängige Frameworks (React, Angular, etc.) wie möglich unterstützen;
2. Die API leicht und einfach zu bedienen machen.

### Nur Lese-Modus

In dieser Phase planen wir nicht, den Schreibmodus zu unterstützen, das bedeutet, **`LavaDome`** wird nur Klartextinhalte zum Schutz akzeptieren und nichts Komplexeres als das.

Das liegt daran, dass die Unterstützung des Schreibmodus die Implementierung eines unbeherrschbaren isolierten DOMs erfordern würde, was mehrere Sicherheitskomplikationen mit sich bringt, die wir zu diesem Zeitpunkt noch nicht in Angriff nehmen können, wie zum Beispiel:

1. Sicherheit von Ereignis-Listenern - verhindern, dass externer Code Eingaben abfängt, die für LavaDome-interne Knoten bestimmt sind.
2. Overlay-Sicherheit - verhindern, dass bösartiger Code ein Phishing-DOM über **`LavaDome`** legt, um den Benutzer dazu zu bringen, sensible Eingaben an die falsche Entität zu übermitteln.

## Design

Die Designkomplexität dieses Projekts ist nicht hoch. Allerdings ist es eine nicht triviale Aufgabe, die kombinierten Anforderungen der umgesetzten Sicherheitsprinzipien zu erfüllen (siehe [Security](#Security)).

**`LavaDome`** besteht aus den folgenden Paketen:

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

Implementiert die grundlegende API-Schicht, die die Kommunikation zwischen dem Konsumenten und der geschützten isolierten Komponente vermittelt. Die API strebt danach, so viel externe Manipulation der isolierten Komponente wie möglich zu ermöglichen, ohne tatsächliche DOM-Knoten aus ihr an irgendjemanden weiterzugeben – nicht einmal an den Konsumenten von LavaDome – um das höchstmögliche Sicherheitsniveau aufrechtzuerhalten.

Darüber hinaus übernimmt es die Verantwortung, alle notwendigen Sicherheitshärtungen zu implementieren, um die Nutzung des `ShadowDom`-Features wirklich sicher zu machen, im Gegensatz zu seiner nativen Beschaffenheit, standardmäßig keine Sicherheitsfunktion zu sein (siehe [Security](#Security)).

> Denken Sie daran: Das Core-Paket ist nicht für Produktionszwecke gedacht!

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

Exportiert Funktionalitäten, mit denen Entwickler **`LavaDome`** so nutzen können, wie sie es bevorzugen, sei es über JavaScript oder als React-Komponente (oder jede andere Plattform – [frag einfach!](https://github.com/lavamoat/lavadome/issues/new?title=**`LavaDome`**+misses+support+for+...))
> HINWEIS: Die Bereitstellung von **`LavaDome`**-Unterstützung für Frameworks integriert Code von Drittanbietern, den wir nicht kontrollieren, was zu „blinden Flecken" in der Sicherheit führt.

> Bitte lesen Sie den Abschnitt [Security](#Security), um zu erfahren, wie Sie bei der Verwendung von **`LavaDome`** mit Drittanbieter-Frameworks so sicher wie möglich bleiben.

## Security

Wenn Sie planen, **`LavaDome`** für ein Projekt zu verwenden, finden Sie hier die Sicherheitsaspekte, die Sie beachten sollten:

### `ShadowDom` vs `iframe`

Wieder einmal ist dies noch ein experimentelles Projekt, aber wir haben uns bei dieser Entscheidung durchaus Gedanken gemacht. Eine natürliche Alternative zur Verwendung des `ShadowDom` ist die Nutzung von Cross-Origin-`iframe`s. Das Eindringen in einen Cross-Origin-`iframe` ist unmöglich, und er wird von der W3C-Spezifikation als sicherheitskritischer Mechanismus anerkannt. Das bedeutet, dass eine Sicherheitsverletzung, falls sie dennoch auftritt, als Sicherheitslücke behandelt und von den Browser-Anbietern umgehend behoben wird.

Der Nachteil dieses Ansatzes ist jedoch, dass die Integration einer iframe-basierten Lösung erheblich schwieriger ist – in Bezug auf UI/UX/DX – insbesondere für ein Tool, das auf Massenadoption abzielt.

**`LavaDome`** muss eine reibungslose und natürliche Entwicklererfahrung bieten und gleichzeitig die sichere Integration gekapselter Shadow-DOM-Knoten in den Host-DOM-Baum ermöglichen, und `ShadowDom` ist eine genau für diesen Zweck entwickelte DOM-orientierte API. Das machte es besser geeignet für unsere Ziele.

Obwohl die `ShadowDom`-API von ihren Entwicklern nicht offiziell als Sicherheitswerkzeug empfohlen wird, ist ihre Implementierung sehr sicher, und sie gibt keine gekapselten Informationen aus dem Shadow-DOM-Baum preis, außer unter ganz bestimmten Szenarien.

Wir glauben, dass `ShadowDom` durch die sorgfältige Behandlung genau dieser Szenarien zu einer gesicherten DOM-Kapselungs-API erweitert werden kann (einen Versuch wert).

### Bedrohungen

Es ist wichtig, die aktuellen Sicherheitsbedrohungen zu adressieren, die bei `ShadowDom`-basierten Lösungen wie `LavaDome` bestehen.

#### 1. Injektion

Entwickler könnten **`LavaDome`** HTML-/JS-/CSS-Inhalte bereitstellen, die beim Laden versehentlich oder absichtlich DOM-Knoten aus dem `ShadowDom` preisgeben – zum Beispiel durch dynamisches Hinzufügen von JavaScript-Code zur Laufzeit.

Lesen Sie die [Forschung](https://blog.ankursundara.com/shadow-dom/#contenteditable-or-css-injection) von [@arxenix](https://github.com/arxenix), um mehr über diese Technik zu erfahren.

Um diese Möglichkeit zu verhindern, akzeptiert **`LavaDome`** überhaupt keine DOM-Knoten im Shadow-DOM-Baum und unterstützt nur das Kapseln von Klartext. Das ermöglicht es uns, uns nicht mit den Sicherheitsproblemen auseinandersetzen zu müssen, die mit dem Vertrauen in benutzerbereitgestellte HTML-/JS-/CSS-Inhalte verbunden sind.

Wir würden diese Entscheidung in Zukunft gerne überdenken, während wir nach einem stabilen und sicheren Mittel suchen, um DOM-Knoten- und Teilbaum-Eingaben zu unterstützen.

#### 2. Auffindbarkeit

Die [find()](https://developer.mozilla.org/en-US/docs/Web/API/Window/find)-API ermöglicht es Entwicklern, DOM-Knoten zu finden und zu extrahieren, indem sie nach dem enthaltenen Text suchen. Dies ist die einzige API, von der bisher bekannt ist, dass sie erfolgreich DOM-Knoten aus einem `ShadowDom` preisgibt.

<details>
<summary>
    In Firefox kann man nach dem Finden des Textes mit der <code>getSelection()</code>-API DOM-Knoten aus dem `ShadowDom` preisgeben, wodurch die gesamte Idee gefährdet wird: <i>(klicken zum Erweitern)</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` umgeht Firefox

Lies die Forschungsarbeit von @arxenix, um mehr über diese Technik zu erfahren.

Um diesen Angriff abzuwehren, darf der LavaDome-Konsument keinen vorhersehbaren Inhalt an die LavaDome-API übergeben. Auch wenn das naheliegend klingen mag, könnten Entwickler leicht versucht sein, LavaDome eine Eingabe zu übergeben, die etwa wie The secret is: ldsjf9304rjdkn aussieht, was die Sicherheit von LavaDome vollständig kompromittieren würde. Obwohl der Teil ldsjf9304rjdkn nicht erratbar ist, könnte die feststehende Phrase "The secret is: " ausgenutzt werden, um das Geheimnis preiszugeben, insbesondere wenn sie zuvor im DOM offengelegt wurde.

Daher MÜSSEN Entwickler bei der Verwendung von LavaDome ausschließlich 100% unvorhersehbare Texte als Eingabe übergeben.

Chromium ist gegen den obigen Angriff sicher. Wenn jedoch ein ausgewählter DOM-Knoten innerhalb des `ShadowDom` content-editable ist, können Angreifer document.execCommand('insertHTML', ...) nutzen, um beliebigen Code im inneren Geltungsbereich des `ShadowDom` auszuführen und damit auf die gekapselten DOM-Knoten zuzugreifen. (klicken zum Erweitern) ```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>

Um diesen Angriffsvektor abzuwehren, entfernt **`LavaDome`** alle Stilattribute aus seinen benutzerdefinierten Elementen, indem das Stilattribut mit der höchstmöglichen Priorität verwendet wird (`-webkit-user-modify: unset;`). Dadurch wird sichergestellt, dass seine Elemente nicht anfällig für die Einschleusung bösartiger externer CSS-Regeln sind, die das Attribut `-webkit-user-modify:read-write` anwenden, was `ShadowDom`-Elemente `contenteditable` machen würde.

Die zweite Technik, `contenteditable` als Attribut zu verwenden, ist derzeit nicht relevant, da **`LavaDome`** das Akzeptieren von DOM-Knoten nicht unterstützt.

#### 3. Auswählbarkeit & Geheimnisaufteilung

Die oben genannten Angriffsvektoren sind nicht sonderlich nützlich, wenn [`getSelection`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection) entschärft wird. Indem der in **`LavaDome`** enthaltene Text nicht auswählbar gemacht wird, erhöhen wir die Sicherheit gegen mögliche Einschleusungen, wie oben demonstriert. Dies funktioniert in Chromium gut, aber wir arbeiten noch an einigen Problemen mit Firefox.

Wenn ein Angreifer eine Teilmenge des Geheimnisses errät, kann er das gesamte Geheimnis kompromittieren (unter der Annahme, dass `getSelection` wie in Firefox Knoten im Shadow-Scope erfasst). Dies liegt daran, dass die Suche nach der Teilmenge den Textknoten preisgibt, der diese Teilmenge des Geheimnisses enthält, wodurch der Angreifer Zugriff auf das gesamte Geheimnis erhält.

Als Gegenmaßnahme speichert **`LavaDome`** jedes Zeichen des Geheimnisses in einem eigenen `ShadowDom`, wodurch sichergestellt wird, dass die Kompromittierung einer Teilmenge des Geheimnisses nicht dazu führt, dass auch der Rest kompromittiert wird. Diese Schutzmaßnahme hat den zusätzlichen Vorteil, dass es für Angreifer exponentiell schwieriger wird, das gesamte Geheimnis preiszugeben, je länger es ist und je mehr Zeichenoptionen es potenziell enthält.

Ein Sicherheitsbruch ist weiterhin möglich, aber nur, wenn der Angreifer alle möglichen Zeichen einzeln per Brute-Force durchspielt, alle gefundenen Shadows preisgibt und anschließend alle Shadows synchron korrekt neu anordnet, um sie an ihren jeweiligen Positionen innerhalb des **`LavaDome`**-Haupthosts auszurichten.

#### 4. Seitenkanalangriffe

Ein weiterer bekannter Angriff besteht darin, Inhalte von ShadowDOMs mithilfe vererbbarer CSS-Eigenschaften wie `@font-face` Zeichen für Zeichen an einen entfernten Server preiszugeben.

Betrachten Sie die folgende Angriffs-[Forschung](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), dokumentiert von [@masatokinugawa](https://github.com/masatokinugawa).

Um dem entgegenzuwirken, fügt LavaDome dem übergeordneten Shadow alle möglichen Zeichen hinzu, sodass ein solcher Preisgabeversuch bei der Suche nach allen möglichen Zeichen verwirrt wird, was diesen Angriff nutzlos macht (siehe https://github.com/LavaMoat/LavaDome/issues/16).

Natürlich gibt es Seitenkanalangriffe in vielen Formen, manche sind schwieriger anzugehen, wie die [Forschung](https://research.securitum.com/stealing-data-in-great-style-how-to-use-css-to-attack-web-application/) von [@securityMB](https://github.com/securityMB), bei der er Ligaturschriften verwendet (Exploit von [@masatokinugawa](https://github.com/masatokinugawa) @ https://github.com/LavaMoat/LavaDome/issues/40).

Um dem entgegenzuwirken, wird von Entwicklern, die LavaDome einsetzen, erwartet, dass sie eine strenge `font-src`-CSP-Richtlinie festlegen, um sicherzustellen, dass eine Preisgabe über Schriftarten an entfernte, unkontrollierbare Server nicht möglich ist.

Erwähnenswert ist, dass dies (theoretisch) in Safari nicht nützlich sein wird, wo dieser Angriff mithilfe lokaler SVGs zur Bildung der Schriftarten durchgeführt werden kann, sodass Angreifer unabhängig von CSP bleiben können (siehe WIP @ https://github.com/LavaMoat/LavaDome/issues/40#issuecomment-2090318009).

Ein weiteres gutes Beispiel für Seitenkanalangriffe - dieses Mal ohne Schriftarten - ist die Nutzung von Textfragmenten (siehe [@masatokinugawa](https://github.com/masatokinugawa) [Exploit](https://github.com/LavaMoat/LavaDome/issues/35)).

#### 5. Defensive Programmierung

Eine sichere Lösung erfordert defensive Programmierpraktiken.

- Zu diesem Zweck werden alle nativen APIs, die wir verwenden, für die interne Nutzung zwischengespeichert, um zu verhindern, dass Angreifer globale APIs neu konfigurieren, um den Ausführungsablauf von **`LavaDome`** zu sabotieren.

- Wenn Ihnen unkonventionelle stilistische Entscheidungen im Quellcode auffallen, ist die Wahrscheinlichkeit hoch, dass sie auf Prinzipien der defensiven Programmierung zurückgehen.

- Es ist **entscheidend**, **`LavaDome`** in die App einzubinden, bevor Sie Skripte laden, denen Sie nicht vertrauen, und idealerweise vor ALLEN Skripten!

- Bei Verwendung der Framework-Versionen von **`LavaDome`** sollten Sie davon ausgehen, dass diese Frameworks nicht defensiv geschrieben sind und dass die verwendeten nativen APIs nicht vor böswilliger Beeinflussung sicher sind. Seien Sie gewarnt, dass die Sicherheit von externem Code außerhalb der Kontrolle von **`LavaDome`** liegt.

Daher empfehlen wir, solche Sicherheitslösungen immer mit der von [@agoric](https://github.com/agoric) entwickelten [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses)-Technologie zu integrieren. Dies ist eine Sicherheitspraxis, die bei [LavaMoat](https://github.com/lavamoat/lavamoat) und [MetaMask](https://github.com/MetaMask/metamask-extension) angewendet wird.

#### 6. Leck durch die Verarbeitung von React-Interna

Ein weiterer Punkt, der Anlass zur Sorge gibt (insbesondere im Kontext von React), ist die Tatsache, dass Eingaben, die an React-Komponenten übergeben werden, von React aktiv an das globale Objekt preisgegeben werden, wodurch sie für nicht vertrauenswürdige Entitäten, die in der App laufen, frei verfügbar sind (was das Ziel von `LavaDome` vollständig untergräbt).

Siehe die [Entdeckung](https://github.com/LavaMoat/LavaDome/pull/23#issue-2093459897) von [naugtur](https://github.com/naugtur), um mehr zu erfahren.

Um unsere Absicht, React zu unterstützen, mit der Tatsache abzuwägen, dass wir ihm unser Geheimnis nicht anvertrauen können, exportiert das Paket `LavaDomeReact` eine minimale (aber sichere) Funktionalität, um das Geheimnis vor der Übergabe an React gegen ein spezielles Token auszutauschen, wobei die einzige Entität, die dieses Token wieder in das Geheimnis zurücktauschen kann, `LavaDome` selbst ist.

So mächtig das auch ist, erfordert es leider, dass React-Benutzer den Austausch aktiv durchführen, bevor sie das Geheimnis an `LavaDomeReact` übergeben.

Wenn der Benutzer etwas anderes als ein bekanntes Token erhält, wird eine von `LavaDome` generierte Ausnahme ausgelöst, um Entwickler zu zwingen, `LavaDomeReact` sicher zu verwenden. 

## Haftungsausschluss

Wenn Sie alles oben Gelesene bedenken, sollten Sie ein gutes Verständnis dafür haben, warum **`LavaDome`** noch sehr experimentell ist. Ein nicht sicherheitsbezogenes Feature sicher zu machen, ist von Natur aus riskant, aber da es für diesen Problembereich keine guten bestehenden Lösungen gibt, sind wir der Meinung, dass dieser Versuch einen Schritt in die richtige Richtung darstellt.

Wir empfehlen dennoch, **`LavaDome`** zu verwenden, da es eine eindeutige Verbesserung gegenüber der alleinigen Abhängigkeit von aktuellen Webstandards darstellt. Denken Sie nur daran, dass unsere Lösung Ihren Code „sicherer“, aber nicht „sicher“ machen wird.

Darüber hinaus denken Sie bitte daran: LavaDome hilft Ihnen, ein Geheimnis sicher ins DOM zu bringen. Ob das Geheimnis bereits kompromittiert wurde, bevor es an LavaDome übergeben wird, liegt außerhalb des Zuständigkeitsbereichs von LavaDome.

Das bedeutet, dass es in Ihrer Verantwortung liegt, sicherzustellen, dass das Geheimnis bis zu dem Zeitpunkt sicher ist, an dem Sie es mit LavaDome teilen.

Der beste Weg, dies zu erreichen, ist der Betrieb in einer abgesicherten Umgebung mit [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses) / [LavaMoat](https://github.com/lavamoat/lavamoat).
Tool herunterladen