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
- func Canonical(paths []string) []string
- func DefaultDenyRead(home, configDir, dataDir, policyPath string) []string
- func DefaultWrite(project, home string, getenv func(string) string, goos string) []string
- func GitDenyWrite(project string) []string
- func Main(args []string) int
- func MaybeMain()
- func Wrap(cmd *exec.Cmd, s Spec) error
- type Spec
- type Status
Constants ¶
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 ¶
Canonical résout les liens symboliques des chemins existants et nettoie les autres. Les doublons sont retirés, l'ordre est conservé.
func DefaultDenyRead ¶
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 ¶
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 ¶
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 ¶
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.
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.