diff --git a/_INDEX.md b/_INDEX.md index 5549641..6ddc18e 100644 --- a/_INDEX.md +++ b/_INDEX.md @@ -70,6 +70,7 @@ | Runbook | Date | Tags | |---------|------|------| +| [Hub public skills.sh — identifiants, scanner de securite, override manuel DANGEROUS (video Dr Firas)](common/hermes-skills-hub-scanner-securite.md) | 2026-08-20 | hermes, skills, scanner, securite, hub | | [Hermes Hub — Déploiement et Exploitation Multi-Univers sur VPS (FastAPI, proxy async, design tokens, Tailscale)](common/hermes-hub-deploiement.md) | 2026-08-19 | hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi | | [Mise à jour des 3 instances Hermes](common/RUNBOOK-HERMES-UPDATE.md) | 2026-06-15 | hermes, update, compose | | [Skills concurrents PDF/DOCX/PPTX/XLSX archivés (anti-bypass nyora-doc-api)](common/skills-concurrents-pdf-docx-pptx-xlsx.md) | 2026-07 | hermes, skills, doc | diff --git a/common/hermes-skills-hub-scanner-securite.md b/common/hermes-skills-hub-scanner-securite.md new file mode 100644 index 0000000..0596519 --- /dev/null +++ b/common/hermes-skills-hub-scanner-securite.md @@ -0,0 +1,83 @@ +# Hub public de skills Hermes (skills.sh) — identifiants, scanner de sécurité, override manuel + +**Date** : 2026-08-20 +**Sphères concernées** : hermes-tt, hermes-nyora, hermes-perso + +## Contexte + +Vidéo Dr Firas sur Hermes (Mem0, Caveman, Defuddle, Marketing Skills, Humanizer). Vérification préalable : le produit qu'il décrit est bien le nôtre, pas une simple analogie — confirmé en direct sur hermes-agent-tt (Hermes Agent v0.20.0, build 2026.8.3, image nousresearch/hermes-agent:v2026.8.3, CLI /opt/hermes/.venv/bin/hermes). + +## Ce qui a été fait + +- **humanizer** (les 3 instances) : 2.5.1 (builtin, ported, figé à la sortie de l'image) -> 2.11.2 (amont), généralisé sur tt/nyora/perso à la demande de Nabil. Verdict scanner SAFE sur les 3 (2 faux positifs "injection" récurrents sur des exemples pédagogiques internes à la skill, sans conséquence). +- **caveman** (hermes-tt, test) : installé. Verdict SAFE, aucun finding. +- **product-marketing** (hermes-nyora) : installé, comblait un vrai manque (socle marketing absent). Verdict SAFE. +- **ai-seo** (hermes-nyora) : verdict automatique DANGEROUS (3 findings) — installé manuellement après revue complète. Voir section dédiée ci-dessous. +- Pack marketingskills (49 skills) : PAS installé en entier — nyora avait déjà copywriting/seo-audit/content-strategy/social/dr-nexum-production en local, doublon évité. +- **defuddle** : pas installé — nyora-veille couvre déjà le nettoyage web ; node/npm présents dans les conteneurs (le piège CLI-absent de la vidéo ne s'appliquait pas ici) mais aucun besoin identifié. +- **Mem0** : pas ré-évalué — déjà tranché le 18/08 (évaluation théorique seule, plafond 43 conteneurs NAS respecté, 0 déploiement). Mémoire native confirmée lexicale (FTS, state.db 272 Mo sur hermes-tt, provider: ''), même limite que le trigger notes_fts cassé sur nyora-notes-tt — les deux à traiter ensemble dans une session dédiée. + +## Humanizer 2.11.2 — remplacement des tirets déjà natif (règle 14) + +Demande Nabil : généraliser humanizer + lui faire remplacer les tirets "qui sautent aux yeux". Vérifié avant d'ajouter quoi que ce soit : la version 2.11.2 couvre déjà ça nativement et en détail (règle §14 "Em and en dashes") — interdiction des tirets cadratins/demi-cadratins (— / –) sauf si l'échantillon d'écriture de l'utilisateur les utilise déjà, remplacement par point/virgule/deux-points/parenthèses ou reformulation, détection aussi des doubles-tirets ASCII (--) et tirets espacés, avec une étape de vérification finale (recherche de — et – avant de rendre le texte). Rien ajouté côté custom pour ne pas dupliquer/entrer en conflit avec la règle amont — si elle se révèle insuffisante en usage réel (le rewrite laisse encore passer des tirets), le signaler pour ajuster plutôt que d'empiler une règle redondante. + +**Point d'attention pour la suite** : cette version vient d'un fetch URL directe, donc un futur --force réappliquera l'amont sans changement particulier de notre part (pas de customisation locale à perdre). Si un jour on personnalise le contenu du SKILL.md directement, le documenter ici — un --force futur écrasera silencieusement toute modification manuelle non trackée par un identifiant hub. + +## ai-seo — DANGEROUS bloqué, installé manuellement après revue complète + +Verdict automatique DANGEROUS, 3 findings, --force refuse ("Blocked ... --force does not override a dangerous verdict" — contrairement au CAUTION du 13/08 sur last30days, aucun override CLI n'existe pour ce palier). + +Revue complète effectuée avant toute décision : SKILL.md (494 lignes) + les 6 fichiers references/ (761 lignes), soit 1255 lignes au total, grep systématique sur les patterns d'exécution/exfiltration réels (curl, wget, rm -rf, sudo, eval/exec, os.system, subprocess, base64, ignore previous/all, system prompt, api_key, ssh, .env, bearer, authorization, password) — aucune occurrence. Les 3 findings sont confirmés faux positifs de pattern-matching statique sur du contenu marketing bénin : +- persistence CRITICAL sur une phrase mentionnant llms.txt/AGENTS.md comme convention de fichier (aucune modification de config agent réelle) +- exfiltration HIGH sur la phrase générique "Include local context where relevant" (conseil de rédaction, pas de données) +- traversal MEDIUM sur un lien markdown relatif ../../tools/REGISTRY.md vers un fichier du même repo + +Décision Nabil (20/08) : "la meilleure solution technique, à toi de voir" — installation manuelle réalisée après cette revue complète (pas juste les lignes flaguées), pas de contournement du scan lui-même (le CLI ne le permet structurellement pas). + +**Solution technique appliquée** : +1. Fetch direct des 7 fichiers (SKILL.md + references/*.md) depuis raw.githubusercontent.com +2. Placement manuel dans /opt/data/skills/ai-seo/ (structure identique à celle qu'aurait produite un install réussi), chown root:root pour matcher la convention des skills installées normalement par le process Hermes +3. Entrée ajoutée à la main dans /opt/data/skills/.hub/lock.json avec scan_verdict="dangerous_manual_override" (valeur volontairement non-standard) et le détail des 3 findings + leur évaluation en metadata/scan_provenance — traçabilité complète de l'override pour tout audit futur +4. Effet observé : `hermes skills list` affiche la skill en Source/Trust "local"/"local" plutôt que "skills.sh"/"community" — comportement jugé correct et volontairement laissé tel quel : l'outil ne peut pas prétendre à une provenance hub-vérifiée pour un contenu qui a contourné son propre scan. "local" est la représentation honnête ici, pas un bug à corriger. + +**Reproductible pour un futur cas DANGEROUS jugé faux positif** : +``` +# 1. Fetch et revue complete (pas seulement les lignes flaguees) +curl -sS https://api.github.com/repos///contents/skills/ +# recuperer SKILL.md + tous les fichiers references/ lies, grep patterns dangereux reels + +# 2. Placement +mkdir -p /opt/data/skills//references +cp /opt/data/skills// +chown -R root:root /opt/data/skills/ + +# 3. Entree lock.json (voir schema complet dans /opt/data/skills/.hub/lock.json, +# entree ai-seo du 20/08 comme modele) -- scan_verdict explicite non-standard, +# findings + evaluation en metadata, jamais maquiller en verdict "safe" +``` + +## Piège : l'identifiant hub owner/skills/name suppose une structure de repo précise + +hermes skills search retourne un identifiant skills-sh/// qui fonctionne pour l'inspect mais peut échouer au fetch réel à l'install : Error: Could not fetch '...' from any source. — sans autre détail. Cause : le résolveur attend SKILL.md sous skills// dans le repo source ; certains repos (blader/humanizer) ont leur SKILL.md à la racine. + +**Ce qui ne fonctionne pas** : hermes skills install skills-sh/blader/humanizer/humanizer (et variantes) -> fetch échoue silencieusement. + +**Solution validée** : vérifier la structure du repo (curl -sS https://api.github.com/repos///contents/) puis installer par URL directe : + +hermes skills install https://raw.githubusercontent.com///main/SKILL.md --name --category --force --yes + +(--force sert ici à passer le prompt si le scan revient SAFE/CAUTION, pas à outrepasser un DANGEROUS.) + +## Vérification + +docker exec hermes-agent- grep -m1 version /opt/data/skills/creative/humanizer/SKILL.md +docker exec hermes-agent-tt /opt/hermes/.venv/bin/hermes skills list | grep -i caveman +docker exec hermes-agent-nyora /opt/hermes/.venv/bin/hermes skills list | grep -iE "product-marketing|ai-seo" + +## Références + +- Repo humanizer : https://github.com/blader/humanizer (version amont vérifiée : 2.11.2) +- Repo caveman : https://github.com/juliusbrussee/caveman +- Repo marketingskills : https://github.com/coreyhaines31/marketingskills +- Précédent scanner CAUTION/--force : note NyoraNotes 38330f3b (13/08, last30days-skill) +- Décision Mem0/plafond conteneurs : note NyoraNotes be9c5934 (18/08)