unsloth/studio/backend
danielhanchen 8814d7de3b Harden sandbox: fail closed on unvetted __code__ stores; workdir getattr sink obfuscation; honor subprocess cwd= and GNU env glued -C/-u for git writes
Close four bypasses Codex found on the round-44 branch:

- fn.__code__ = <code object>: rebinding a function's code runs it via fn()
  WITHOUT eval / exec, the __code__ twin of the FunctionType gadget. The
  assignment visitor only checked container-stored exec aliases, so
  co = codeop.compile_command('...'); f.__code__ = co; f() ran unanalyzed
  source. Flag a __code__ store whose RHS is not a vetted code object; an
  in-source function's code (g.__code__) and a compile() result (analyzed at
  the compile site) stay allowed.

- workdir-module getattr obfuscation: the import vetter caught direct
  os.system(...) but not getattr(os, 'system')('...') in an imported helper,
  so the top-level analyzer saw only the file write / import and the vetter
  passed. Refuse getattr on a sink-module receiver (os / posix / builtins /
  deserializers) -- a constant sink attribute name, and a non-constant name
  that cannot be proven benign.

- subprocess cwd= ignored for child writes: the argv scan reconstructed the
  git command but dropped cwd=, so subprocess.run(['git','init','repo'],
  cwd='/tmp') created /tmp/repo outside the workdir. Model a literal escaping
  cwd= as a synthetic `env -C <cwd>` wrapper on the reconstructed command so
  the existing git cwd backscan resolves the escape; a workdir-relative cwd
  adds no wrapper and stays allowed.

- GNU env glued -C / -u operands: env -C/tmp git init repo (and
  env -uGIT_CONFIG_COUNT git ...) glue the chdir / unset operand directly onto
  the short flag, which the separated and --long= scans missed, so the git cwd
  and hook-suppression backscan never saw the escape. Parse the glued short
  forms alongside the separated ones.

Regression coverage: TestRound45Bypasses in tests/test_sandbox_tools.py
(__code__ store of a producer / opaque code object blocked while a compile()
result and g.__code__ stay allowed; subprocess git under an escaping cwd
blocked while a workdir-relative cwd is allowed; env -C/tmp and
-uGIT_CONFIG_COUNT before git blocked while plain env git init is allowed) and
two workdir-module vetter cases in tests/test_sandbox_runtime_backstop.py
(getattr(os,'system') helper denied, benign getattr on a plain object allowed).
2026-07-10 17:51:12 +00:00
..
assets Add DeepSeek-V4-Flash-GGUF to Studio with none/high/max reasoning (#6908) 2026-07-07 06:13:43 -07:00
auth Studio: opt-in OpenAI /v1 model auto-switch and idle keep-warm (#6392) 2026-07-01 06:42:23 -07:00
core Harden sandbox: fail closed on unvetted __code__ stores; workdir getattr sink obfuscation; honor subprocess cwd= and GNU env glued -C/-u for git writes 2026-07-10 17:51:12 +00:00
hub fix(studio/hub): apply repo_id length limit per segment, not whole string (#6946) (#6953) 2026-07-08 15:38:06 +03:00
loggers Studio: trim serving-log noise and surface llama-server engine stats (#6377) 2026-06-17 05:37:57 -07:00
models Studio /v1/messages: accept thinking and unknown content blocks (#7017) 2026-07-09 12:20:02 +02:00
plugins Reduce and tighten code comments and docstrings repo-wide (#6095) 2026-06-08 23:09:51 -07:00
requirements Studio: exclude mlx-lm 0.31.3 (broke gemma4/qwen3_5 QK-norm load on Apple Silicon) (#6803) 2026-07-06 19:40:06 -07:00
routes Studio /v1/messages: accept thinking and unknown content blocks (#7017) 2026-07-09 12:20:02 +02:00
state Studio: shareable per-checkpoint preview links (#6486) 2026-06-24 06:31:53 -07:00
storage Sort chat recents by last activity (#6844) 2026-07-07 17:54:32 +01:00
tests Harden sandbox: fail closed on unvetted __code__ stores; workdir getattr sink obfuscation; honor subprocess cwd= and GNU env glued -C/-u for git writes 2026-07-10 17:51:12 +00:00
utils Studio: add Vulkan llama.cpp support (#5819) 2026-07-09 03:39:48 -07:00
__init__.py Final cleanup 2026-03-12 18:28:04 +00:00
_platform_compat.py Reduce and tighten code comments and docstrings repo-wide (#6095) 2026-06-08 23:09:51 -07:00
cloudflare_tunnel.py Reap Studio child processes when the parent dies abnormally (#6425) 2026-06-18 05:51:22 -07:00
colab.py Studio Colab: opt-in shareable Cloudflare tunnel link (#6684) 2026-06-26 00:56:23 -07:00
main.py Studio: multi-select export formats, portable FP8/INT8, GGUF LoRA, and source parity (#6767) 2026-07-03 08:25:10 -07:00
run.py Studio: fix torch CUDA undefined-symbol errors from a conflicting LD_LIBRARY_PATH (#6905) 2026-07-06 23:48:23 -07:00
startup_banner.py Fix Windows Studio UTF-8 startup handling (#6614) 2026-07-01 13:47:33 +01:00