unsloth/studio/backend
danielhanchen 736e8a6477 Harden sandbox: extend workdir-module import vetter (ctypes, dynamic import, closure/frame gadgets, indirect import-machinery, subscripted builtins); block openssl file output
Close six bypasses Codex found on the round-45 branch. Five harden the workdir-module
import vetter (the only scan of a helper .py the user wrote before import); the sixth
adds an openssl output-file scan.

- ctypes / native modules: the vetter only treated subprocess / pty as execution
  modules, so a helper doing import ctypes reached UNGUARDED native libc
  (ctypes.CDLL(None).open/write) bypassing the patched Python open / os.open. Refuse
  ctypes / _ctypes / cffi and the source-executing runpy / code / codeop.

- dynamic import: a helper bypassed the literal import subprocess check with
  importlib.import_module('subprocess'). Refuse import_module / reload whose target
  is a denied module (constant or module name); a dynamic import_module target fails
  closed.

- closure / frame gadgets: __closure__ / cell_contents / f_locals / __globals__ /
  __subclasses__ (etc.) recover a runtime guard wrapper's original unguarded callable
  or walk to os / builtins. Refuse the top-level _GADGET_DUNDERS set inside a workdir
  helper too.

- indirect import-machinery access: the vetter caught only the literal
  sys.meta_path attribute, so vars(sys)['meta_path'][:] = [...] (or
  getattr(sys, 'meta_path')) removed the vetter and imported an unscanned sibling.
  Refuse getattr / vars namespace-dict access on sys / os / builtins / importlib /
  deserializer modules (constant sink name, or a non-constant name that cannot be
  proven benign).

- subscripted builtins: imported helpers run with __builtins__ as a dict, so
  __builtins__['ev'+'al'](...) reached eval past the attribute checks. Refuse a
  subscript into __builtins__ / a builtins alias whose (statically foldable) key is
  an execution builtin, and fail closed on a non-constant key.

- openssl output files: openssl rand -out /tmp/p 4 (and -writerand / -keyout /
  -CAout / ...) writes a host file in an unguarded child. Block an openssl output-file
  flag whose value escapes the workdir; a workdir-local -out and the no-output forms
  (openssl rand -hex, openssl dgst) stay allowed. openssl joins the argv tail-scan set
  so the subprocess.run(['openssl', ...]) form is covered too.

Regression coverage: TestRound46Bypasses in tests/test_sandbox_tools.py (openssl
escaping output blocked in the shell-string and argv forms; -hex / dgst / workdir-local
-out allowed) and six workdir-module vetter cases in
tests/test_sandbox_runtime_backstop.py (ctypes, dynamic import, __closure__, indirect
vars(sys) meta_path, subscripted __builtins__['eval'] denied; importlib.import_module of
json still allowed).
2026-07-10 18:20:30 +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: extend workdir-module import vetter (ctypes, dynamic import, closure/frame gadgets, indirect import-machinery, subscripted builtins); block openssl file output 2026-07-10 18:20:30 +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: extend workdir-module import vetter (ctypes, dynamic import, closure/frame gadgets, indirect import-machinery, subscripted builtins); block openssl file output 2026-07-10 18:20:30 +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