1
Security-Model
Augustin ROUX edited this page 2026-04-27 08:46:46 +00:00

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 section v0.6.0.

Reporting

Une vulnérabilité ? Ouvrir un ticket privé sur Gitea ou écrire à muyue@legion-muyue.fr.