wiki: Security-Model page
39
Security-Model.-.md
Normal file
39
Security-Model.-.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Modèle de menace & posture sécurité
|
||||
|
||||
Muyue est un outil **local** : il tourne sur la machine de l'utilisateur (TUI ou serveur HTTP local pour l'UI web). Le modèle de menace ci-dessous décrit ce qui est protégé et ce qui ne l'est pas.
|
||||
|
||||
## Posture par défaut
|
||||
|
||||
- Le serveur HTTP écoute sur `127.0.0.1`. Pas d'authentification (l'accès suppose qu'on a déjà la session locale de l'utilisateur).
|
||||
- Toutes les communications avec les fournisseurs AI passent par TLS (HTTPS) ; les clés API sont **chiffrées au repos** (`internal/secret`, AES-GCM avec clé dérivée du système).
|
||||
|
||||
## Risques pris en compte (et mitigations v0.6.0)
|
||||
|
||||
| Vecteur | Mitigation |
|
||||
|---|---|
|
||||
| Site web malveillant ouvert dans le browser tente d'appeler l'API locale (CSRF) | CORS restreint à `localhost`/`127.0.0.1`/`[::1]` (HTTP+HTTPS) ; PR-only dispositif |
|
||||
| Fuite de clé API via `GET /api/providers` | Champ `api_key` masqué `"***"` dans toutes les réponses ; les saves ignorent `"***"` |
|
||||
| Fuite de mot de passe SSH via `GET /api/terminal/sessions` | Champ `password` masqué `"***"` ; updates avec `"***"` préservent le mot de passe stocké |
|
||||
| `sshpass` exposant le mot de passe dans `ps` (argv) | Utilisation exclusive de `sshpass -e` + variable d'env `SSHPASS` |
|
||||
| Path traversal via `project_dir` (LSP auto-install) | `filepath.Abs` + check préfixe `~` ; refus sinon |
|
||||
| Path traversal via `id` d'image (`GET /api/images/{id}`) | `filepath.Base(id)` neutralise les segments `..` |
|
||||
| Injection de commande dans WSL (`wsl -d <distro> -u <user>`) | `wsl_distro` et `wsl_user` validés `^[a-zA-Z0-9._-]+$` avant argv |
|
||||
| DoS par body géant sur `/api/chat` | `MaxBytesReader` 50 MB ; chaque image ≤ 10 MB |
|
||||
| Crash AI provider renvoyant `Choices == []` | Bornage explicite, retour d'erreur propre (pas de panic) |
|
||||
| Race condition sur `conversation_multi.Add` | Save synchrone sous le lock existant (plus de fire-and-forget) |
|
||||
| Workflow infini si dépendance échoue | Court-circuit sur `StatusFailed` / `StatusSkipped` |
|
||||
| Sudo invoqué sans mot de passe disponible | Détection `NeedsSudoPassword` + interception préfixe `sudo`/`doas`/`run0`/`pkexec` ; message clair à l'utilisateur |
|
||||
|
||||
## Risques **non** couverts
|
||||
|
||||
- **Utilisateur local malveillant sur la machine** : rien ne sépare Muyue d'un autre processus de l'utilisateur. Les clés chiffrées au repos sont déchiffrables par tout processus de l'utilisateur (la clé maîtresse vit dans son scope).
|
||||
- **Compromission du provider AI** : un provider AI qui retourne du HTML/JS est rendu dans Studio via `dangerouslySetInnerHTML` (formatText fait un nettoyage *best-effort* mais incomplet). Pour un threat model durci, il faudrait ajouter `DOMPurify`.
|
||||
- **Attaque sur Crush/Claude délégués** : `crush_run`/`claude_run` exécutent des binaires tiers ; leurs vulnérabilités ne sont pas dans le scope de Muyue.
|
||||
|
||||
## Changelog sécurité — v0.6.0
|
||||
|
||||
Voir le [CHANGELOG](https://gitea.legion-muyue.fr/Muyue/MuyueWorkspace/src/branch/main/CHANGELOG.md) section v0.6.0.
|
||||
|
||||
## Reporting
|
||||
|
||||
Une vulnérabilité ? Ouvrir un ticket privé sur Gitea ou écrire à `muyue@legion-muyue.fr`.
|
||||
Reference in New Issue
Block a user