ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

last30days 的 Hermes 安装期安全扫描基线:76 条检测、verdict 分级与零 CRITICAL 回归守护

last30days 的 Hermes 安装期安全扫描基线:76 条检测、verdict 分级与零 CRITICAL 回归守护 last30days 的 Hermes 安装期安全扫描基线76 条检测、verdict 分级与零 CRITICAL 回归守护【免费下载链接】last30days-skillAI agent skill that researches any topic across Reddit, X, YouTube, HN, Polymarket, and the web - then synthesizes a grounded summary项目地址: https://gitcode.com/GitHub_Trending/la/last30days-skill本文基于 Hermes 扫描基线文档 展开讲清 last30days-skill 在 Hermes 安装期静态扫描skills_guard下为什么会被判 dangerous 而 BLOCKED的完整证据链14 条 CRITICAL 与 36 条 HIGH 的逐条构成、SAFE/CAUTION 两种 verdict 的可达性分析以及仓库如何用 自包含的回归测试 和 .skillignore 范围管理 把零 CRITICAL固化为 CI 契约。读完后你能掌握静态扫描误报如何定位与清除、扫描范围scan surface如何界定、以及如何为被扫描对象建立重引入阻断模式即 CI 失败的自动化护栏。背景Hermes 的 verdict 分级决定一个 skill 能否被安装last30days 是部署在多个 Agent 平台上的 skillHermes 是其中一类部署目标见 Hermes Setup Guide。Hermes 在安装 skill 时会运行安装期安全扫描器skills_guard.py位于 NousResearch/hermes-agent 仓库的 tools 目录扫描结果归为三级 verdictSAFE零 HIGH、零 CRITICAL可直接安装CAUTION零 CRITICAL但有 HIGH 等非阻断项需要显式--force才安装DANGEROUS出现任意一条 CRITICAL社区来源community tier的 skill 会被直接 BLOCKED--force也无法绕过。这一分级是整个基线工作的核心约束。安装指南 明确写道hermes skills install mvanhorn/last30days-skill/skills/last30days --force--forceis required because Hermess install-time security scanner returns acautionverdict for this skill — it flags benign patterns such as reading your own API keys from the environment and callingsubprocessto runyt-dlp/bird.——也就是说当前稳态目标是CAUTION零 CRITICAL而不是 SAFE。这条目标线正是下面基线文档与配套测试存在的意义。基线测量76 条检测与 dangerous verdict基线文档 记录了 2026-07-06 针对fix/hermes-scan-safe-verdict分支基于origin/main 3.11.0的完整测量结果。使用真实的 Hermesskills_guard.py对skills/last30days/目录做扫描结论是Verdict:dangerous— BLOCKED (community dangerous; --force powerless)。 总计14 CRITICAL36 HIGH25 MEDIUM1 LOW共 76 条 findings。CRITICAL14 条——全部可清除基线将 14 条 CRITICAL 按规则归类每一条都标注了清除方向全部为可执行的修复动作数量规则触发位置与原因清除手段7exfiltration / python_environ_get_secretos.environ.get(...API_KEY)形式的环境变量读取收敛 env 边界env boundary4exfiltration / ruby_env_secretRuby 的ENV[]规则误伤 Python 的env[key]赋值env 边界改造 重命名2exfiltration / env_exfil_httpxxquik.py 第 144、283 行的http.get(..., headers{X-Api-Key: token})提取 headers让密钥字面量与 http 调用分离1injection / deception_hideSKILL.md 第 529 行的 do not tell the user a project file is active改写措辞reword值得注意的是第 4 类与第 1 类的误报性质ruby_env_secret是跨语言误伤Ruby 规则命中 Python 的字典赋值而deception_hide命中的是写给 Agent 的正当操作指令不要向用户暴露某个项目文件处于激活状态语义上并非欺骗。基线文档的定性是这 14 条全部是可清除的误报或可改写项目标态是 CRITICAL 归零、verdict 落到 CAUTION。HIGH36 条——含一条无法规避的结构项数量规则触发位置与说明26exfiltration / python_os_environ任意os.environ子串含注释即命中——这是技能读取自身配置的固有形态env boundary 改造前会阻断 SAFE4priv-esc / sudo_usageSKILL.md 第 374 行、last30days.py 第 34 行、env.py 第 247 行、health.py 第 148 行中的 sudo 字样——多为面向用户的安装提示例如当前 health.py 中输出sudo apt install python3.12的报错文案last30days.py 中低版本 Python 的升级指引2exfiltration / node_process_env被 vendor 的 bird-search JS 代码通过 vendor 排除解决1structural / oversized_skill1615KB 1024KB 上限——技能运行时确实接近 1.5MB属合理体积是唯一的结构性阻断项1exfiltration / dump_all_envSKILL.md 第 327 行的 printenv ... 片段当前仓库中对应 SKILL.md 第 463 行 的printenv ProgramFiles(x86)Windows 路径探测片段属良性1exfiltration / context_exfilreddit.py 第 103 行 include more context 注释1exfiltration / ssh_dir_accessyoutube_yt.py 第 172 行 docstring 中的 ~/.ssh/config可行性结论SAFE 不可达CAUTION 是诚实的稳态基线文档给出了明确的工程裁决SAFE零 HIGH不可达唯一的结构性 HIGH 是oversized_skill1615KB 1024KB。要消除它只能把约 500KB 的核心运行时.py塞进.skillignore——这属于规避扫描的欺骗性操作文档以 R5 标注其违背原则或者把技能压到 1MB 以下——不可行。CAUTION零 CRITICAL干净可达清除全部 14 条 CRITICAL 后 verdict 落到 caution--force即可完成安装。其余结构限制不构成本质障碍too_many_files101 50 是 MEDIUM 级与 verdict 无关。这个结论直接决定了后续两条防线的设计取向不追求 SAFE只保证 CRITICAL 永远为零并且用 CI 兜底。回归守护把扫描器的 CRITICAL 正则原样复刻进测试清除 CRITICAL 之后真正的风险不是这一批而是下一批任何一次后续编辑新增一行os.environ.get(GROK_API_KEY)、SKILL.md 里多写一句 do not tell the user...都会让扫描重新命中 CRITICAL把每一个 Hermes 社区用户静默重新 BLOCKED。仓库的解法在 tests/hermes/test_no_critical_scan_findings.py其设计有三个要点1. 规则表与 skills_guard.py 逐字同步测试把扫描器THREAT_PATTERNS中 CRITICAL 级的 7 条正则逐字复制verbatim为常量 CRITICAL_RULESCRITICAL_RULES [ (rfetch\s*\([^\n]*\$\{?\w*(KEY|TOKEN|SECRET|PASSWORD|API), env_exfil_fetch), (rhttpx?\.(get|post|put|patch)\s*\([^\n]*(KEY|TOKEN|SECRET|PASSWORD), env_exfil_httpx), (rrequests\.(get|post|put|patch)\s*\([^\n]*(KEY|TOKEN|SECRET|PASSWORD), env_exfil_requests), (ros\.environ\s*\.get\s*\(\s*[\][^\]*(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL), python_environ_get_secret), (ros\.getenv\s*\([^\)]*(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL), python_getenv_secret), (rENV\[.*(?:KEY|TOKEN|SECRET|PASSWORD), ruby_env_secret), (rdo\snot\s(?:\w\s)*tell\s(?:\w\s)*the\suser, deception_hide), ]这些规则与基线文档中 14 条 CRITICAL 的归类一一对应如python_environ_get_secret对应 7 条、ruby_env_secret对应 4 条、env_exfil_httpx对应 xquik 的 2 条、deception_hide对应 SKILL.md 的 1 条。文件头注释明确了同步纪律keep them in sync if Hermes changes them并说明HIGH/MEDIUM 规则被有意排除——因为 HIGH 不参与 CAUTION verdict 的闸门判定对应基线的可行性结论。2. 扫描范围与 Hermes 完全一致测试的 SKILL_ROOT 取skills/last30days/技能目录而非仓库根目录与 Hermes 解析 owner/repo →skills/name/的方式一致并通过 IGNORE_DIRS / IGNORE_FILES 镜像 .skillignoreIGNORE_DIRS (assets/, agents/, scripts/lib/vendor/) IGNORE_FILES { scripts/build-skill.sh, scripts/compare.sh, scripts/evaluate_search_quality.py, scripts/test_device_auth.py, scripts/test-v1-vs-v2.sh, scripts/verify_v3.py, }同时跳过二进制/资源扩展名.jpg .jpeg .png .gif .mp3 .json与扫描器对文本规则的跳过逻辑对齐。这样测试扫到的文件集合与 Hermes 安装期扫到的集合严格相等——排除任何一个一侧独有的文件都会造成CI 绿、线上 BLOCKED或反之的偏差。3. 断言CRITICAL 归零否则 CI 失败断言主体 对每个受扫文件逐行执行 7 条规则大小写不敏感任何命中都会以规则名 文件:行号 行内容的形式列出并失败assert not hits, ( Hermes scanner CRITICAL patterns reappeared in the scanned subtree (this re-blocks every community install). Findings:\n \n.join(hits) )失败信息直接写明了后果re-blocks every community install让未来的编辑者一眼理解这条断言保护的是什么。文档注释还交代了历史事故Issue #513 正是由这 14 条 CRITICAL 误报引发、修复后 verdict 落到 caution——本测试就是针对该事故的回归护栏。扫描范围的契约化管理.skillignore 与配套测试基线里 HIGH 的 2 条node_process_env来自 vendored 的 bird-search JS清除手段就是vendor exclude。落地的载体是 skills/last30days/.skillignore其注释本身就说明了原则# Hermes scans from this skill directory, not the repository root. # Keep non-runtime packaging/dev/eval artifacts out of install-time security scans. assets/ agents/ scripts/build-skill.sh ... # Vendored third-party X-search client (node_modules analog); excluded from scan, still installed. scripts/lib/vendor/这里有一条值得注意的边界vendor 排除只影响扫描不影响安装excluded from scan, still installed——运行时完整性不受影响。但排除范围必须受契约约束排除过多会掩盖真正该被扫描的运行时代码排除过少则重引入误报。tests/test_hermes_skillignore.py 用两条测试锁死了这个契约test_hermes_skillignore_excludes_non_runtime_scan_surface断言assets/、agents/、5 个打包/开发/评估脚本必须出现在.skillignore中且对应路径真实存在test_hermes_skillignore_keeps_runtime_contract_scannable断言运行时契约文件绝不能被排除——SKILL.md、references/含 save-html-brief.md、last30days.py、scripts/lib/必须保持可扫描状态。两条测试合起来保证.skillignore的任何变更都同时满足非运行时产物出局和运行时契约在案与回归测试中 IGNORE 常量形成三方一致性真实文件、镜像常量、契约断言。修复落点核对基线中的 CRITICAL 在源码中的现状结合当前仓库状态可以核对基线中各类 CRITICAL 的清除结果验证清除而非隐藏env_exfil_httpxxquik 2 条当前 xquik.py 第 144 行 是request_headers {X-Api-Key: token}——从源码结构看headers 字典被构造到独立语句中密钥不再与 http 调用出现在同一行因此不再命中httpx?\.(get|post|put|patch)\s*\([^\n]*...这条要求同一条目内同时出现调用与密钥的正则deception_hideSKILL.md 1 条基线记录的原文 do not tell the user a project file is active 已被改写。当前 SKILL.md 第 2191 行 保留的 do not tell users to append pipes... 措辞不匹配do not ... tell ... the user模式——这正是基线标注的 reword 手段保留指令语义绕开正则的字面结构python_environ_get_secret/ruby_env_secret11 条按基线标注通过 env 边界收敛与变量重命名清除由回归测试中对应的 3 条正则持续兜底oversized_skillHIGH结构性保持原状——基线的裁决就是不修它只通过 CAUTION verdict --force的组合完成安装。复现与验证如何在本地跑通这套防线整条防线不依赖 Hermes 本体测试是自包含复刻no Hermes dependency只需仓库本身# 1. 验证零 CRITICAL 回归护栏 pytest tests/hermes/test_no_critical_scan_findings.py # 2. 验证 .skillignore 扫描范围契约 pytest tests/test_hermes_skillignore.py若要评估完整扫描结果含 HIGH/MEDIUM则按 Hermes Setup Guide 在装有 Hermes 的环境中走真实安装流程观察安装期扫描输出的 verdict预期稳态是caution 结构性 HIGHoversized_skill 可解释的良性 HIGH用--force完成安装。开发者本地联调可用指南中的 symlink 方式把工作树挂到~/.hermes/skills/research/last30daysgit pull即生效无需重装。小结这份基线文档与其配套测试构成了一个完整的扫描误报治理闭环基线文档tests/hermes/baseline_findings.md用一次全量真实扫描给出 76 条检测的逐条账本与 SAFE/CAUTION 可达性裁决回归测试test_no_critical_scan_findings.py把 7 条 CRITICAL 正则原样复刻进 CI使任何重引入阻断模式的编辑在合入前失败范围契约测试test_hermes_skillignore.py则保证.skillignore既不放过运行时代码、也不误伤非运行时产物。三者共同守护的终态只有一个CRITICAL 恒为零、verdict 恒为 CAUTION、--force安装恒可用——这是 last30days 在 Hermes 这类带安装期安全扫描的 Agent 平台上稳定分发的工程基础。【免费下载链接】last30days-skillAI agent skill that researches any topic across Reddit, X, YouTube, HN, Polymarket, and the web - then synthesizes a grounded summary项目地址: https://gitcode.com/GitHub_Trending/la/last30days-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表