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

8.0 KiB
Raw Blame History

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/<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"

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