m>minicode

Policy & Sandbox

sumber: src/policy/permission.tsEdit di GitHub

Policy & Sandbox

Sumber: src/policy/permission.ts:8, src/policy/bash-guard.ts, src/policy/sandbox-policy.ts, src/sandbox/, docs/USAGE.md bagian Sandbox.

6 permission mode

type PermissionMode = "auto"|"readonly"|"plan"|"allow-all"|"ask"|"allowlist" (permission.ts:8). Keputusan data-driven handlers (:193-269).

ModeSemantik
autoReadonly + gated-prompt + file/internal-write allow; code_run/bash dengan guard. delegate_task/mcp_call/semua MCP bertitik di-gate (prompt saat TTY, tolak tanpa TTY)
askReadonly + NO_PROMPT_TOOLS auto-allow; sisanya prompt/TTY + allowlist persist
readonlyHanya 18 tool READONLY_TOOLS
planreadonly + tolak todo_write, delegate_task, submit_result. Tetap strict (usulan split readonly vs plan ditolak test plan mode: read-only)
allowlistBash hanya pola DEFAULT_BASH_ALLOWLIST/env; file-write/internal-write sesuai set
allow-allAllow semua; tetap tolak bash berbahaya + path jail tetap aktif

Cycle Tab/Shift+Tab hanya 5 (auto,ask,plan,allowlist,allow-allallow-all dilewati agar tak aktif tak sengaja). Mode bisa dioverride: --plan, --allowlist, --ask, --allow-all, MINICODE_PLAN=1, MINICODE_PERMISSION=allowlist, Shift+Tab runtime.

Set terkait: INTERNAL_WRITE_TOOLS 6, FILE_WRITE_TOOLS 5, GATED_TOOLS 6 + *.* MCP, NO_PROMPT_TOOLS 4. move_file/delete_file dijail di permission layer (berlaku semua mode termasuk --allow-all).

Bash-guard ternormalisasi

src/policy/bash-guard.ts: quote pemisah kata dibuang dan assignment sederhana disubstitusi sebelum pemeriksaan.

Dulu lolosSekarang
cat .e""nvditolak
X=.env; cat $Xditolak
p=python3; $p -c 1ditolak
node --eval "1"ditolak
env, set, export -pditolak
curl -F file=@~/.ssh/id_rsaditolak
bash <(curl x)ditolak
rm -rf .., rm --recursive --force /, rm -rf /; :ditolak
command env, nice env, exec 'env' (wrapper geser posisi kata)ditolak via stripCommandWrappers (14 wrapper, 4 lapis)

Allowlist (juga default bila tanpa sandbox): git status/diff/log/branch/show, bun test/run/x tsc, npm run/exec, npx, ls cat head tail wc grep rg find which echo pwd. Tulis via shell (mkdir cp mv rm touch) ditahan — pakai write_file/edit yang ter-jail. npm exec/npx/bun run/bun x tak boleh ada ekspansi shell ($, backtick) atau redirection.

Ukur, bukan klaim:

bun run gate:bash        # korpus manual: 38 pola serangan + 15 perintah sah
bun run extreme:fuzz     # mutasi kombinatorial ber-seed, ~13.000 varian

Hasil: 0 bypass / 0 over-block. Fuzz menemukan 3 kelas yang korpus manual lewatkan, kini terkunci di test/bash-fuzz-regression.test.ts.

Batas jujur: analisis statis atas bahasa Turing-complete. $(curl …) dinamis tak bisa diselesaikan tanpa eksekusi — untuk itu sandbox OS ada.

Sandbox otomatis

KondisiYang terjadi
bwrap (Linux) / seatbelt (macOS) tersediaBash di dalamnya, tanpa flag
Tidak tersedia (termasuk semua Windows)Default turun ke allowlist + alasan dicetak sekali
--allow-all / --ask / --plan / --allowlist diberikanPilihan dihormati, tanpa peringatan
--sandbox noneOpt-out sadar; tanpa downgrade
--sandbox dockerContainer ephemeral (--network none, 512m, 1 CPU, node:22-alpine)
--sandbox docker tapi daemon matiTurun ke allowlist + peringatan (tidak pura-pura terisolasi)

MINICODE_SANDBOX_STRICT=1 = fail-closed bila isolasi yang diminta tak tersedia (default warn + lanjut). MINICODE_SANDBOX_IMAGE ganti image (default node:22-alpine hanya bawa node). code_run selalu lewat sandbox runner dan menolak bila backend tak tersedia.

Lapisan lain

  • Path jail realpath-based + symlink realpath di permission layer; .env/.git/config/node_modules deny; TOCTOU O_NOFOLLOW (src/lib/safe-open.ts: resolveSafePath untuk penulis, safeOpenRead untuk pembaca; POSIX-only, Windows pre-check).
  • Env scrub sanitizeSpawnEnv: strip kata-kunci kredensial dari merge final; GITHUB_WORKSPACE/REDIS_HOST/AWS_REGION tetap ada, GITHUB_TOKEN/AWS_SECRET_ACCESS_KEY/DATABASE_URL tetap di-strip.
  • web_fetch/web_search: redirect manual 5 hop + DNS pinning 30 dtk + body 2 MB.
  • Secret scrubber: sk-, ghp_, AKIA, PEM, JWT, Bearer, api_key=... di-redact sebelum ke LLM (read_file/bash/grep) — tanpa whitelist kata.
  • Config/allowlist: atomic randomUUID tmp+rename + chmod 600. MCP serve curated tools + permission aktif.