====== Sicherheit ====== Add-ins laufen im selben Prozess wie der Host. Das bedeutet: Ein Add-in hat technisch Zugriff auf alles, was der Host-Prozess kann — Dateisystem, Netzwerk, Zwischenablage. Eine echte Sandbox mit Prozess-Isolation ist bei nativen In-Process-Add-ins nicht möglich, und WBASH behauptet das auch nicht. Stattdessen setzt WBASH auf drei Säulen: Signatur, deklarative Berechtigungen und Fehlerisolierung. Diese Kombination ersetzt keine Sandbox, bietet aber einen pragmatischen Schutz, der für ein Full-Trust-Add-in-Modell mit signierten Drittanbieter-Erweiterungen angemessen ist. Zurück zur [[start|Übersicht]]. ===== Signatur und Integritätsprüfung ===== Jedes Add-in-Paket ([[paketformat|.wvdsx]]) kann eine Prüfsumme der Haupt-DLL im [[manifest|Manifest]] enthalten: { "dllChecksum": "sha256:a1b2c3d4e5f6..." } Der Host verifiziert diese Prüfsumme vor dem Laden der DLL. Wenn die DLL nach dem Paketieren verändert wurde — sei es durch einen Angreifer, einen fehlerhaften Download oder eine unbewusste Manipulation — stimmt der Hash nicht überein, und der Host verweigert das Laden. Die Prüfsumme ist ein SHA256-Hash im Format ''sha256:hexwert''. Sie wird beim Erstellen des Pakets berechnet und im Manifest abgelegt. Der Build-Prozess sollte diesen Schritt automatisieren. Diese Prüfung stellt die Integrität sicher: Die DLL im installierten Add-in ist identisch mit der DLL, die der Herausgeber paketiert hat. Sie stellt noch keine Authentizität sicher — dafür wäre eine kryptografische Signatur mit einem Zertifikat nötig, die in einer zukünftigen Version ergänzt werden kann. ===== Berechtigungsmodell (Capabilities) ===== Das Berechtigungsmodell basiert auf expliziten Capabilities. Ein Add-in deklariert im [[manifest|Manifest]], welche Rechte es benötigt: { "permissions": ["fs.read", "fs.write", "net.http"] } Beim ersten Start eines Add-ins zeigt der Host dem Benutzer einen Dialog mit den angeforderten Berechtigungen. Der Benutzer kann einzeln zustimmen oder ablehnen. Die Entscheidung wird persistiert — bei späteren Starts wird nicht erneut gefragt. ==== Verfügbare Capabilities ==== | **Capability** | **Beschreibung** | | ''fs.read'' | Dateien im eigenen Storage-Verzeichnis lesen | | ''fs.write'' | Dateien im eigenen Storage-Verzeichnis schreiben | | ''fs.readExternal'' | Dateien außerhalb des eigenen Verzeichnisses lesen | | ''fs.writeExternal'' | Dateien außerhalb des eigenen Verzeichnisses schreiben | | ''net.http'' | HTTP/HTTPS-Anfragen stellen | | ''net.socket'' | TCP/UDP-Verbindungen öffnen | | ''process.spawn'' | Externe Prozesse starten | | ''clipboard.read'' | Zwischenablage lesen | | ''clipboard.write'' | In die Zwischenablage schreiben | | ''env.read'' | Umgebungsvariablen lesen | | ''shell.execute'' | Shell-Befehle ausführen | ==== Abstuftung der Rechte ==== Die Capabilities sind bewusst abgestuft. ''fs.read'' erlaubt nur den Zugriff auf das eigene Storage-Verzeichnis des Add-ins (''GlobalStoragePath'' und ''WorkspaceStoragePath''). Für Zugriff auf beliebige Dateien ist ''fs.readExternal'' nötig — eine deutlich weitreichendere Berechtigung, die dem Benutzer klar kommuniziert wird. Ebenso unterscheidet das System zwischen ''net.http'' (typisch für API-Aufrufe) und ''net.socket'' (typisch für Protokolle auf niedriger Ebene). Ein Add-in, das nur REST-APIs aufruft, braucht kein ''net.socket''. ==== Prüfung im Code ==== Service-Implementierungen prüfen die Capabilities, bevor sie privilegierte Operationen ausführen: // Im Add-in: Berechtigung prüfen if FHost.Permissions.HasCapability('fs.readExternal') then Content := FHost.Storage.ReadFile('/pfad/zur/datei') else FHost.Notifications.ShowWarning('Keine Berechtigung für Dateizugriff'); // Oder: Berechtigung anfordern (zeigt Dialog) if FHost.Permissions.RequestCapability('net.http') then DoHttpRequest; ''HasCapability'' prüft still, ohne den Benutzer zu stören. ''RequestCapability'' zeigt einen Dialog und gibt ''True'' zurück, wenn der Benutzer zustimmt. Die zweite Variante eignet sich für Situationen, in denen das Add-in eine Berechtigung erst zur Laufzeit braucht und sie nicht im Manifest deklariert hat. ===== Fehlerisolierung ===== Jeder Aufruf von Add-in-Code ist in eine Schutzschicht eingebettet. Wenn ein Add-in eine unbehandelte Exception wirft, passiert Folgendes: - Der Host fängt die Exception ab. - Die Fehlermeldung wird protokolliert (über ''ILogService''). - Der Fehlerzähler des Add-ins wird inkrementiert. - Der Host fährt mit den übrigen Add-ins fort. Die Anwendung bleibt stabil. Nach drei aufeinanderfolgenden Fehlern (''MAX_ERRORS = 3'') deaktiviert der Host das Add-in automatisch: - Der Zustand wechselt zu ''psError''. - Alle Registrierungen des Add-ins werden aufgeräumt (Commands, Menüs, Toolbar-Buttons, Sidebar-Panels). - Der Benutzer erhält eine Benachrichtigung: "Das Add-in 'Name' wurde wegen wiederholter Fehler deaktiviert." - Die DLL bleibt geladen (Entladen wäre unsicher wegen möglicher Interface-Referenzen), aber kein Code wird mehr aufgerufen. Dieses Verhalten ist bewusst konservativ. Ein einzelner Fehler kann ein Glitch sein — vielleicht ein Netzwerk-Timeout oder eine vorübergehend fehlende Datei. Drei aufeinanderfolgende Fehler deuten auf ein systematisches Problem hin. Die automatische Deaktivierung verhindert, dass ein defektes Add-in die Anwendung dauerhaft belastet. ===== Was das Modell nicht leistet ===== Es ist wichtig zu verstehen, was dieses Sicherheitsmodell nicht kann: * **Keine Prozess-Isolation** — Das Add-in läuft im selben Prozess und kann im Prinzip beliebigen Code ausführen. Die Capability-Prüfung ist kooperativ, nicht erzwungen. Ein bösartiges Add-in könnte die Prüfung umgehen. * **Keine Speicher-Isolation** — Ein Add-in kann auf den Speicher des Host-Prozesses zugreifen. Es gibt keinen Schutz gegen Memory-Corruption oder absichtliches Auslesen fremder Daten. * **Kein sicheres Hot-Unload** — Ein deaktiviertes Add-in bleibt im Speicher, weil noch Interface-Referenzen existieren können. Erst beim nächsten Start der Anwendung ist das Add-in vollständig entfernt. Diese Einschränkungen sind bei nativen In-Process-Erweiterungen unvermeidlich. WBASH kompensiert sie, indem es nur offiziell signierte Add-ins zulässt und dem Benutzer die Kontrolle über die Berechtigungen gibt. Das ist ein Full-Trust-Modell mit Transparenz — kein Sandbox-Modell mit Garantien. ===== Empfehlungen für Add-in-Entwickler ===== * Berechtigungen minimal halten. Nur die Capabilities anfordern, die tatsächlich gebraucht werden. Je weniger Berechtigungen, desto eher wird der Benutzer dem Add-in vertrauen. * ''dllChecksum'' immer setzen. Die Prüfsumme kostet nichts und schützt vor unbeabsichtigter Manipulation. * Exceptions im eigenen Code fangen, soweit möglich. Die Fehlerisolierung des Hosts ist ein Sicherheitsnetz, kein regulärer Fehlerbehandlungsmechanismus. Drei unbehandelte Exceptions und das Add-in wird deaktiviert. * Sensible Daten (Tokens, Passwörter) über ''ISecretStorage'' speichern, nicht im Klartext auf der Festplatte. Der Host bietet plattformspezifische Implementierungen (Windows Credential Manager, Linux Secret Service). Weiter zur [[lokalisierung|Lokalisierung]] oder zurück zur [[start|Übersicht]].