Files
nas-runbooks/common/hermes-skills-hub-scanner-securite.md
T

88 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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, hermes-nabil (VPS Contabo)
## 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 4 instances, y compris hermes-nabil VPS) : 2.5.1 (builtin, ported, figé à la sortie de l'image) -> 2.11.2 (amont), généralisé à la demande de Nabil ("généraliser pour tous"). Verdict scanner SAFE sur les 4 (2 faux positifs "injection" récurrents sur des exemples pédagogiques internes à la skill, sans conséquence).
- **caveman** : installé sur hermes-tt (test) et hermes-nabil (beaucoup d'outillage dev : github, debugging, code review). Verdict SAFE partout, aucun finding.
- **product-marketing** : installé sur hermes-nyora et hermes-nabil (IAKifech n'avait aucune couverture marketing/SEO, contrairement à nyora qui avait déjà copywriting/seo-audit). Verdict SAFE partout.
- **ai-seo** : verdict automatique DANGEROUS (3 findings) sur hermes-nyora ET hermes-nabil (même contenu, même hash) — installé manuellement sur les deux 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/<owner>/<repo>/contents/skills/<nom>
# recuperer SKILL.md + tous les fichiers references/ lies, grep patterns dangereux reels
# 2. Placement
mkdir -p /opt/data/skills/<nom>/references
cp <fichiers reviewes> /opt/data/skills/<nom>/
chown -R root:root /opt/data/skills/<nom>
# 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"
```
## Différence de convention hermes-nabil (VPS) vs instances NAS
hermes-nabil tourne avec HERMES_UID/GID=1000 (utilisateur hermes), HERMES_HOME=/data (pas /opt/data) -- le process hermes tourne en tant qu'utilisateur hermes, pas root comme sur les 3 instances NAS. Les fichiers installés/places a la main doivent donc etre chown hermes:hermes, pas root:root. Gitea inaccessible depuis le VPS via 172.17.0.1 (c'est le gateway Docker local du NAS, pas routable depuis l'exterieur) -- utiliser le Tailscale 100.86.197.88:3232 a la place.
## Piège : l'identifiant hub owner/skills/name suppose une structure de repo précise
hermes skills search <mot> retourne un identifiant skills-sh/<owner>/<repo>/<skill> 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/<nom>/ 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/<owner>/<repo>/contents/) puis installer par URL directe :
hermes skills install https://raw.githubusercontent.com/<owner>/<repo>/main/SKILL.md --name <nom> --category <categorie> --force --yes
(--force sert ici à passer le prompt si le scan revient SAFE/CAUTION, pas à outrepasser un DANGEROUS.)
## Vérification
docker exec hermes-agent-<instance> 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)