<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>安全 on MoRiv447</title><link>https://moriv447.github.io/tags/%E5%AE%89%E5%85%A8/</link><description>Recent content in 安全 on MoRiv447</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 02 Sep 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://moriv447.github.io/tags/%E5%AE%89%E5%85%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>让 AI 红队自己写的固件：可复现比聪明更重要</title><link>https://moriv447.github.io/posts/red-teaming-firmware/</link><pubDate>Wed, 02 Sep 2026 09:00:00 +0800</pubDate><guid>https://moriv447.github.io/posts/red-teaming-firmware/</guid><description>红队固件听起来很酷，但一个『模型这次崩给你看、下次复现不了』的漏洞等于没发现。Firment 的做法是：确定性语料打底，LLM 只负责探索。</description><content:encoded><![CDATA[<p>让 agent 攻击自己刚写出来的固件，听起来很带感。但有个残酷现实：<strong>一个不能复现的漏洞，等于没发现</strong>。模型这次把固件搞崩了，你换个温度、换个模型再跑，它复现不出来——这种 finding 毫无工程价值。</p>
<p>Firment 的红队功能整个是围绕「可复现」设计的。</p>
<h2 id="两层金字塔">两层金字塔</h2>
<ul>
<li><strong>底层：确定性变异语料</strong>。给定种子 + 一个合法基线帧，生成一串固定顺序的畸形输入（边界长度、逐位翻转、超长、格式串、分隔符混淆、数值极值）。同种子同字节序列，跨机器一致。一个漏洞的复现方式就是 <code>seed + case id</code>，<strong>不需要模型在场</strong>。</li>
<li><strong>上层：LLM 攻击 campaign</strong>。在语料跑完后，让攻击者子 agent 探索语料没覆盖的（构造结构上错但语义相关的帧、竞态两个输入）。但它的发现<strong>必须回填成语料里的一个 case</strong> 才能进报告，否则降级为 UNVERIFIED。</li>
</ul>
<h2 id="崩溃哨兵优先级很关键">崩溃哨兵：优先级很关键</h2>
<p>每个用例发完 payload，收集一段输出窗口，纯文本分类：</p>
<ol>
<li><strong>Crash</strong> —— 命中故障签名（HardFault/panic/…）</li>
<li><strong>Reboot</strong> —— 启动横幅在已有流量后重现（不该出现时又出现了）</li>
<li><strong>Hang</strong> —— 定义了心跳、窗口内没命中、且超时</li>
<li><strong>Alive</strong> —— 心跳命中，或根本没定义心跳契约</li>
</ol>
<p>Crash 压过 Reboot：崩了又被看门狗重启的目标，是 crash 不是神秘重启。沉默不等于死亡：没定义心跳时，一片安静判 Alive——你不能宣称一个从没建立过「存在」的东西缺失了。</p>
<h2 id="证据封顶">证据封顶</h2>
<p>finding 必须引用捕获文件（崩溃还会在复位前抢一份 <code>debug forensic</code> 现场快照）。<code>finalize</code> 检查这些文件真实存在，缺证据的<strong>封顶 low + UNVERIFIED</strong>。模型写的 campaign 证据更严：payload 必填、引用路径必须落在本次运行目录内、且文件里得真的有它引用的那行——防止它拿一个存在的无关文件（甚至报告自己）冒充证据。</p>
<h2 id="恢复与边界">恢复与边界</h2>
<p>崩了的目标在用例之间会被重刷/复位救回来；救不活就<strong>中止整个套件</strong>，而不是对着死板子把后面每个用例都判成假 Hang。headless 实弹必须显式 <code>--live</code>，否则只做语料彩排。</p>
<h2 id="一个诚实的局限">一个诚实的局限</h2>
<p>任何 debug 动作（包括 forensic）退出后目标都停在 halt——所以「碰过调试器之后的沉默」是攻击者自己的产物，不是 hang 的证据。这条我写进了权限闸门和 campaign 提示词里，宁可啰嗦也不让它自证。</p>
<hr>
<p>红队的价值不在「聪明地找到 bug」，在「找到之后别人能复现、能回归」。确定性打底、LLM 探索，这个顺序不能反。</p>
]]></content:encoded></item></channel></rss>