diff --git a/common/MCP-NAS-SCRIPTING.md b/common/MCP-NAS-SCRIPTING.md index 7370bb0..8b6a367 100644 --- a/common/MCP-NAS-SCRIPTING.md +++ b/common/MCP-NAS-SCRIPTING.md @@ -5,7 +5,8 @@ > ⚠️ **OBSOLÈTE EN PARTIE depuis le patch P0 du 2026-07-04** — voir [mcp-nas-run-command-v2.md](mcp-nas-run-command-v2.md). > Les RÈGLES 1, 2 et 3 ci-dessous (poisoning, heredoc interdit, limite 350 chars/base64) **ne s'appliquent plus** : > heredocs, quotes et commandes longues fonctionnent nativement, et `reset_session` récupère une session bloquée. -> La section « RÈGLE 4 — Services internes (172.17.0.1) » reste valide. +> La section « RÈGLE 4 — Services internes (172.17.0.1) » reste valide ; +> depuis le P1, `nas.internal` est un alias stable de 172.17.0.1 dans le container. --- diff --git a/common/mcp-nas-run-command-v2.md b/common/mcp-nas-run-command-v2.md index dd6cbce..1236e0a 100644 --- a/common/mcp-nas-run-command-v2.md +++ b/common/mcp-nas-run-command-v2.md @@ -66,6 +66,19 @@ via `send-keys -l` (mode littéral). Conséquences : curl -s http://127.0.0.1:3042/health ``` -## À venir +## P1 — denylist ancrée + nas.internal (2026-07-04, commit `7fb13c5`, déployé et testé) -- **P1** : denylist ancrée (regex ancrées sur le début de commande) + résolution `nas.internal`. +- **Denylist ancrée** : les patterns ne sont plus cherchés n'importe où dans la chaîne brute. + La commande est découpée en segments (`;` `&` `|` retours ligne), les préfixes neutres + (`sudo`, `env`, `VAR=…`, chemin `/sbin/…`) sont retirés, et les patterns sont ancrés sur le + **début de chaque commande**. Les **corps de heredoc sont exclus** de l'analyse. + - Fini les faux positifs : `grep reboot /var/log`, `echo "ne pas faire reboot"`, un heredoc + de doc contenant « mkfs » → **acceptés**. + - Toujours refusés : `reboot`, `/sbin/reboot`, `echo ok && reboot`, `VAR=1 sudo shutdown`, + `rm -rf /volume*|/opt|/mnt|/`, `mkfs.*`, `dd of=/dev/*`, fork bomb, `> /dev/sd*`, + `docker rm -f`, `fdisk`, `parted`, `syno*`, `chmod -R 777 /`. (30/30 tests unitaires.) + - Changement assumé : `rm -rf /tmp/x` est désormais **autorisé** (avant, tout chemin absolu + était bloqué) ; les racines critiques restent protégées. +- **`nas.internal`** : `extra_hosts: nas.internal:host-gateway` dans le compose → depuis toute + session, `nas.internal` = l'hôte NAS (172.17.0.1). Utiliser `http://nas.internal:3232` (Gitea), + `:9000` (Portainer), `:8787` (NyoraNotes)… au lieu de mémoriser 172.17.0.1.