Help us shape the future of Go! Take the 2026 Go Developer Survey

sandbox

package
v0.9.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2026 License: EUPL-1.2 Imports: 16 Imported by: 0

Documentation

Overview

Package sandbox confine les commandes shell et les serveurs MCP stdio : écriture limitée à une liste de chemins, lecture interdite sur les secrets, réseau coupé par défaut. Ce fichier et ses voisins (paths.go, seatbelt.go) sont la partie pure, indépendante du système ; les mécanismes macOS (sandbox-exec) et Linux (Landlock) s'appuient dessus.

Index

Constants

View Source
const SpecEnv = "TENON_SANDBOX_SPEC"

SpecEnv est la variable d'environnement qui porte la Spec (JSON) jusqu'à l'assistant interne `tenon __sandbox`. L'assistant la retire avant execve.

Variables

This section is empty.

Functions

func Canonical

func Canonical(paths []string) []string

Canonical résout les liens symboliques des chemins existants et nettoie les autres. Les doublons sont retirés, l'ordre est conservé.

func DefaultDenyRead

func DefaultDenyRead(home, configDir, dataDir, policyPath string) []string

DefaultDenyRead renvoie les chemins interdits en lecture et en écriture : les secrets usuels du dossier personnel (dont le trousseau macOS ~/Library/Keychains, où tenon range les clés des fournisseurs ; absent sous Linux, donc ignoré), puis les dossiers de tenon et le fichier de politique. Les arguments vides sont ignorés.

func DefaultWrite

func DefaultWrite(project, home string, getenv func(string) string, goos string) []string

DefaultWrite renvoie les chemins inscriptibles par défaut : projet, temporaires, périphériques usuels, cache utilisateur et ~/.npm. goos vaut "linux" ou "darwin" ; toute autre valeur se comporte comme linux. Les valeurs vides (TMPDIR absent, home inconnu) ne produisent aucune entrée.

func GitDenyWrite

func GitDenyWrite(project string) []string

GitDenyWrite renvoie les chemins de project/.git à interdire en écriture (Spec.DenyWrite), présents ou non : hooks et config (un hook ou un core.fsmonitor s'exécuterait hors bac à sable à la prochaine commande git de l'utilisateur), commondir (redirigerait git vers une copie piégée de .git) et config.worktree. Seul un dossier .git ordinaire est traité ; un fichier .git (worktree, sous-module) pointe hors du projet. Les dépôts imbriqués et les dossiers git des sous-modules (.git/modules) ne sont pas couverts.

func Main

func Main(args []string) int

Main est l'assistant interne `tenon __sandbox` : `--probe` sonde le mécanisme, `-- <argv>` applique la Spec (variable SpecEnv) puis exécute la commande. Les échecs écrivent `sandbox: <raison>` sur stderr et rendent 126.

func MaybeMain

func MaybeMain()

MaybeMain quitte avec le code de Main quand le processus est lancé en assistant (`__sandbox` en premier argument) ; sinon elle ne fait rien.

func Wrap

func Wrap(cmd *exec.Cmd, s Spec) error

Wrap réécrit cmd en `<exécutable> __sandbox -- <argv>` avec la Spec en JSON dans SpecEnv ; Dir, Cancel, WaitDelay et les champs existants de SysProcAttr restent intacts. Réseau fermé : espaces de noms si la sonde les a validés, sinon repli Landlock TCP (Spec.TCP) si l'ABI le permet.

Types

type Spec

type Spec struct {
	// Dir est le dossier de travail de la commande.
	Dir string `json:"dir"`
	// Write liste les chemins inscriptibles (la lecture est permise partout).
	Write []string `json:"write"`
	// DenyRead liste les chemins interdits en lecture et en écriture ;
	// cette interdiction prime sur Write.
	DenyRead []string `json:"deny_read"`
	// DenyWrite liste les chemins interdits en écriture seule (lecture
	// permise), même sous un chemin de Write : voir GitDenyWrite. Leurs
	// dossiers parents ne peuvent être ni supprimés ni renommés. Seul macOS
	// l'applique ; l'assistant Linux l'ignore (une exclusion d'écriture
	// empêcherait git de créer ses fichiers à la racine de .git, voir R9).
	DenyWrite []string `json:"deny_write,omitempty"`
	// Network ouvre le réseau quand il vaut true ; fermé sinon.
	Network bool `json:"network"`
	// TCP demande à l'assistant Linux de refuser connect et bind TCP par
	// Landlock (repli quand les espaces de noms sont indisponibles). Seul
	// Wrap le positionne ; la valeur fournie par l'appelant est ignorée.
	TCP bool `json:"tcp,omitempty"`
}

Spec décrit ce que voit une commande isolée.

type Status

type Status struct {
	// Available indique que l'isolation des fichiers est utilisable.
	Available bool
	// Mechanism vaut "landlock", "sandbox-exec" ou "none".
	Mechanism string
	// Network vaut "full", "tcp" ou "none".
	Network string
	// Reason explique une indisponibilité ou une isolation réseau partielle.
	Reason string
	// UnixSockets indique que les connexions aux sockets Unix sont
	// confinées : Linux, ABI Landlock ≥ 9 ; macOS, (deny network*) les couvre.
	UnixSockets bool
}

Status est le résultat de la sonde d'isolation.

func Probe

func Probe() Status

Probe vérifie une fois l'ABI Landlock, puis tente de lancer l'assistant dans de nouveaux espaces de noms utilisateur et réseau (délai 2 s). Sans espace de noms, le repli Landlock TCP (ABI ≥ 4) donne un réseau "tcp".

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL