<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sandbox on yzchen.space</title>
    <link>https://www.yzchen.space/tags/sandbox/</link>
    <description>Recent content in Sandbox on yzchen.space</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 15 Jul 2026 12:00:00 +0800</lastBuildDate>
    <atom:link href="https://www.yzchen.space/tags/sandbox/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Pi 与沙箱</title>
      <link>https://www.yzchen.space/posts/20260715/pi-sandbox-security/</link>
      <pubDate>Wed, 15 Jul 2026 12:00:00 +0800</pubDate>
      <guid>https://www.yzchen.space/posts/20260715/pi-sandbox-security/</guid>
      <description>&lt;h2 id=&#34;为什么只靠正则拦截命令不够&#34;&gt;为什么只靠正则拦截命令不够&lt;/h2&gt;&#xA;&lt;p&gt;在之前介绍 pi 的扩展系统时，我展示了一个 &lt;code&gt;permission-gate.ts&lt;/code&gt; 的例子，用正则表达式拦截危险命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;// permission-gate 的思路：正则匹配，匹配到就弹窗确认&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;const&lt;/span&gt; rules = [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { pattern: &lt;span style=&#34;font-style:italic&#34;&gt;/\bfind\s+\/(?![a-zA-Z0-9_./])/i&lt;/span&gt;, label: &lt;span style=&#34;font-style:italic&#34;&gt;&amp;#34;find-root&amp;#34;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种基于模式匹配的&amp;quot;权限门&amp;quot;看似有用，但在现代大模型面前形同虚设。一个足够聪明的 LLM 可以轻松绕过&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 绕过正则的方式：&#xA;find . -path &amp;#39;*&amp;#39;              # 等价 find /&#xA;x=&amp;#34;f&amp;#34;; y=&amp;#34;ind&amp;#34;; $x$y /        # 变量拼接绕过&#xA;exec 3&amp;lt;&amp;gt;/dev/tcp; ...          # 使用完全不同的原语&#xA;python -c &amp;#34;import os; ...&amp;#34;     # 用解释器写文件&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Claude Code 和 Codex 等主流 agent 的做法是：&lt;strong&gt;在权限规则之外，再加一层操作系统层面的沙箱隔离&lt;/strong&gt;。权限规则控制&amp;quot;能不能执行&amp;quot;，沙箱控制&amp;quot;执行后能碰什么&amp;quot;两者互补。一旦沙箱生效，不管 LLM 想出多诡异的命令，它也破坏不了沙箱允许范围之外的东西。&lt;/p&gt;&#xA;&lt;h2 id=&#34;沙箱做什么&#34;&gt;沙箱做什么&lt;/h2&gt;&#xA;&lt;p&gt;讲沙箱之前，先从最熟悉的 Docker 开始。&lt;/p&gt;&#xA;&lt;h3 id=&#34;从-docker-到沙箱&#34;&gt;从 Docker 到沙箱&lt;/h3&gt;&#xA;&lt;p&gt;Docker 大家应该都用过&lt;code&gt;docker run&lt;/code&gt; 起一个容器，里面有独立的文件系统，端口要显式映射才能访问。这其实就是一个比较重的沙箱实现。&lt;/p&gt;&#xA;&lt;p&gt;但当前主流的 agent 的沙箱一般不用 Docker。原因是 agent 要把你的项目目录挂进去让 LLM 改代码，还要实时拿到 stdout/stderr 反馈给 LLM，每次跑一条命令就起一个容器实在太慢了。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
