File size: 3,253 Bytes
16f6f5c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | <svg viewBox="0 0 720 380" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Layered sandbox: each ring rejects a class of unsafe operations before tools run.">
<defs>
<style>
text { font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace; }
.title { font-size: 14px; fill: #c9d1d9; font-weight: 700; }
.layer { font-size: 12px; fill: #c9d1d9; font-weight: 700; }
.dim { font-size: 10px; fill: #8b949e; }
.ok { font-size: 11px; fill: #3fb950; font-weight: 700; }
.deny { font-size: 11px; fill: #f85149; font-weight: 700; }
.ring1 { fill: #161b22; stroke: #30363d; stroke-width: 1; }
.ring2 { fill: #1c2128; stroke: #30363d; stroke-width: 1; }
.ring3 { fill: #21262d; stroke: #30363d; stroke-width: 1; }
.ring4 { fill: #1f2937; stroke: #58a6ff; stroke-width: 1.5; }
.denyline { stroke: #f85149; stroke-width: 1.5; fill: none; stroke-dasharray: 4 3; }
.okline { stroke: #3fb950; stroke-width: 1.5; fill: none; }
</style>
<marker id="dx" markerWidth="9" markerHeight="9" refX="7" refY="4" orient="auto">
<path d="M0,0 L8,4 L0,8 z" fill="#f85149"/>
</marker>
<marker id="ok" markerWidth="9" markerHeight="9" refX="7" refY="4" orient="auto">
<path d="M0,0 L8,4 L0,8 z" fill="#3fb950"/>
</marker>
</defs>
<rect width="720" height="380" fill="#0d1117"/>
<text x="30" y="32" class="title">Layered sandbox</text>
<text x="30" y="50" class="dim">Each ring blocks a different class of unsafe call before it ever reaches the OS.</text>
<!-- nested rings centered around (380, 215) -->
<rect class="ring1" x="200" y="80" width="360" height="270" rx="10"/>
<text x="218" y="100" class="layer">Workspace boundary</text>
<text x="218" y="116" class="dim">safe_path() rejects ../ and absolute paths</text>
<rect class="ring2" x="240" y="135" width="280" height="200" rx="8"/>
<text x="258" y="155" class="layer">Command allowlist</text>
<text x="258" y="170" class="dim">exec_cmd: only ls, cat, rg, …</text>
<rect class="ring3" x="280" y="190" width="200" height="125" rx="6"/>
<text x="298" y="210" class="layer">Output cap</text>
<text x="298" y="225" class="dim">clip(result, MAX_CHARS)</text>
<rect class="ring4" x="320" y="240" width="120" height="60" rx="6"/>
<text x="345" y="265" class="layer">Tool runs</text>
<text x="338" y="282" class="dim">exec(code, …)</text>
<!-- attack arrows on the left, blocked at outer ring -->
<text x="30" y="100" class="deny">../../etc/passwd</text>
<path d="M 30 110 L 196 145" class="denyline" marker-end="url(#dx)"/>
<text x="30" y="170" class="deny">curl evil.com</text>
<path d="M 30 175 L 236 200" class="denyline" marker-end="url(#dx)"/>
<text x="30" y="240" class="deny">read 999999 chars</text>
<path d="M 30 245 L 276 245" class="denyline" marker-end="url(#dx)"/>
<!-- legitimate request goes through -->
<text x="600" y="100" class="ok">read_file("README.md")</text>
<path d="M 690 110 C 600 130 500 200 442 268" class="okline" marker-end="url(#ok)"/>
<!-- legend -->
<text x="30" y="350" class="dim">red = blocked at the first ring it violates · green = passes every ring and reaches the tool</text>
</svg>
|