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

12 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, 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.
  • copywriting, content-strategy, social (coreyhaines31/marketingskills) : installés sur hermes-nabil pour parité complète avec la panoplie marketing de nyora (IAKifech affronte le même problème de croissance qu'un Dr Nexum). content-strategy bloqué en CAUTION (6 findings, même faux positif que ai-seo : liens markdown relatifs ../../../tools/... pris pour du path traversal) -- forcé après vérification, cette fois via --force qui fonctionne bien sur CAUTION. copywriting et social : SAFE direct.
  • 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"

Audit hermes-nabil (20/08) — constats hors-scope skills, signales pas corriges

Demande Nabil : "fait le necessaire, ajoute les skills que tu juges necessaires, objectif hermes au point". Lecture complete de SOUL.md (183 lignes), MEMORY.md, TACHES.md (ia-tn), topics.md (ia-tn), logs/errors.log avant toute action. Constats au-dela du perimetre skills, a trancher par Nabil :

  • youtube-thumbnail-design (hermes-nyora) deja casse : skill locale presente et enabled, mais depend du CLI belt (inference.sh), absent du systeme (aucun binaire, aucune cle BELT_/INFERENCE_SH dans .env). Meme piege que Defuddle dans la video Dr Firas -- installee, activee, inutilisable, coute des tokens de contexte pour rien. Pas touchee (pas dans le perimetre hermes-nabil de cette session) -- a trancher : payer inference.sh, ou remplacer par un workflow sans dependance externe.
  • topics.md (ia-tn) va se tarir : 9/9 sujets coches au 09/08/2026, aucun ajout depuis. La regle de rotation ecrite dans le fichier dit explicitement que le pipeline doit signaler et attendre une nouvelle serie si tous les sujets sont traites plutot que de relancer une generation -- donc pas de casse immediate, mais plus de sujet pret des que la prochaine production demarre.
  • TACHES.md (ia-tn) perime : dernier update 24/07/2026, decrit une infrastructure de production (logo, outro, pipeline) entierement livree depuis. topics.md a pris le relai comme tracker vivant. TACHES.md n'a pas ete purge malgre la regle SOUL.md qui l'exige ("un TACHES.md qui ressasse du travail deja fait est aussi trompeur qu'un TACHES.md qui en oublie") -- pas corrige cette session, signale pour purge/archivage.
  • Erreur reseau recurrente : "Network Retry Loop (Bootstrap delete Webhook): Timed out" quasi tous les jours vers 01h12-01h16 (logs/errors.log, 13/08 au 19/08). Le bot Telegram se reconnecte ensuite normalement (pattern auto-guerissant observe sur toute la periode), donc pas d'urgence, mais la regularite de l'horaire suggere une cause identifiable (tache reseau/maintenance concurrente a cette heure) plutot qu'un alea pur -- a investiguer si ca degenere un jour en vraie coupure.
  • MCP nyora-doc / nyora-convert : keepalive failed + reconnect degrade->connected observe plusieurs fois (19-20/08), toujours recupere seul. Meme observation que ci-dessus, pas d'action prise.

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