发布时间:2026/9/5 17:11:04
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),仅供参考

相关新闻

2026/9/5 17:06:04

OpenCV-Python人脸模型训练:从检测对齐到LBPH识别全流程

简介:本资源是一套面向Python初学者与计算机视觉入门者的OpenCV人脸模型训练与识别实践项目,聚焦解决“理论难懂、代码难跑、调试无头绪”的常见学习痛点。项目基于OpenCV-Python生态,完整实现从本地人脸图像采集、灰度化预处理、LBPH模型训练…

2026/9/5 19:01:10

Mac 菜单栏整理实操:用 Ice 隐藏图标、拖拽重排的完整指南

Mac 菜单栏整理实操:用 Ice 隐藏图标、拖拽重排的完整指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 先看一个完成状态:MacBook 顶部只留下 Wi-Fi、电池、时间和一两个自…

2026/9/5 2:46:54

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/5 2:46:52

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/5 2:44:34

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/5 0:04:47

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流在大模型流式输出(Streaming)与智能体实时推流的架构中,生产环境中经常出现一种“上下游生产消费速率严重失衡”的极端情况: 生产端极速产出:大模型…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/5 2:46:50

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…