<?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/categories/%E8%AE%BE%E8%AE%A1/</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/categories/%E8%AE%BE%E8%AE%A1/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><item><title>用逻辑分析仪给 AI Agent 当地面真值</title><link>https://moriv447.github.io/posts/logic-analyzer-ground-truth/</link><pubDate>Tue, 01 Sep 2026 22:30:00 +0800</pubDate><guid>https://moriv447.github.io/posts/logic-analyzer-ground-truth/</guid><description>让 AI 判断『这条 UART 真的是 115200 吗』，不能靠它看串口助手的截图，得靠波形测出来。记录 Firment 里 la 工具的几个设计取舍。</description><content:encoded><![CDATA[<p>AI agent 做固件，最难的不是写代码，是<strong>让它知道自己写对了没有</strong>。运行级证据（串口日志）能覆盖一部分，但很多物理事实——PWM 频率对不对、SPI 时序、总线上真实跑的字节——日志里看不到。逻辑分析仪就是补这一层的。</p>
<p>Firment 的 <code>la</code> 工具接的是 sigrok-cli。几个值得记的设计取舍：</p>
<h2 id="1-外部子进程绝不链接-libsigrok">1. 外部子进程，绝不链接 libsigrok</h2>
<p>sigrok/libsigrok 是 GPL。链接进一个 MIT 程序会传染许可证。所以 <code>la</code> 把 sigrok-cli 当<strong>外部二进制</strong>用 argv 数组调用（和 probe-rs 同一模式），跨进程边界读 stdout，GPL 传染不到。代价是要自己处理进程生命周期，换来的是干净 + 覆盖面广（fx2lafw 克隆机、Saleae、几十种设备走同一驱动层）。</p>
<h2 id="2-频率只给区间不给伪精确值">2. 频率只给区间，不给伪精确值</h2>
<p>边沿只能定位到 ±1 个采样，所以周期带 ±2 采样的误差。报一个 <code>1.33 Hz</code> 是假精确。<code>la measure</code> 一律输出 <code>hz_low .. hz_high</code> 区间，且欠采样（每周期 &lt;4 采样）时降到低置信度。</p>
<h2 id="3-读回设备真实采样率而不是你请求的那个">3. 读回设备真实采样率，而不是你请求的那个</h2>
<p>fx2lafw 这类只支持离散采样率（6/12/24/48 MHz），你请求 8m 它可能跳到 12m。如果用请求值算频率会系统性偏差。所以采集后跑一次 <code>--show</code> 把<strong>真实采样率和通道数</strong>读回来写进元数据。</p>
<h2 id="4-通道名要按-sigrok-的现实来">4. 通道名要按 sigrok 的现实来</h2>
<p>sigrok-cli 按<strong>通道名</strong>匹配，主流驱动叫 <code>D0..D7</code> 不是 <code>0..7</code>。我一开始按索引写示例，真机上直接 <code>unknown channel</code>。这种坑只有对着 sigrok 源码或上板才发现得了。</p>
<h2 id="5-半截数据比报错更糟">5. 半截数据比报错更糟</h2>
<p>采集导出成原始位流时，如果进程被超时/取消打断，可能留下一个写了一半的 <code>.bin</code>。测量层必须查 <code>has_binary</code> + 尺寸校验，宁可报错也不能拿截断波形算出一个自信的假频率。</p>
<h2 id="6-挂进证据阶梯">6. 挂进证据阶梯</h2>
<p>HIL 里 <code>kind = &quot;la&quot;</code> 步骤可以断言 <code>expect_frequency_hz</code> / <code>expect_duty</code> / <code>expect_edges</code> / <code>expect_decoded</code>，规则和其它物理观测一致：<strong>低置信度永远过不了断言</strong>，dry-run 强制 FAIL。</p>
<p>一句话：把「波形测出来」变成 agent 能消费、且<strong>不会说谎</strong>的证据。</p>
]]></content:encoded></item></channel></rss>