Sono felice di annunciare ShellShelter, un progetto sperimentale che sto sviluppando per rendere più sicura l'esecuzione dei comandi shell nei workflow assistiti dall'AI. ShellShelter è un motore .NET basato su allowlist, disponibile sia come CLI sia come libreria C#. L'obiettivo principale è semplice: ridurre il rischio di esecuzione quando i comandi arrivano da fonti non affidabili o parzialmente affidabili, come output di LLM, input utente o script generati. Il codice sorgente e i binari per Windows sono disponibili nel repository GitHub di ShellShelter.
L'approccio è ispirato a SafeCmd di Answer.AI, che affronta il problema dell'esecuzione di comandi shell da fonti non affidabili validando i comandi bash tramite allowlist prima dell'esecuzione. Invece di provare a bloccare pattern pericolosi con blacklist (approccio fragile e facile da aggirare), usa una allowlist ampia di comandi in sola lettura e facilmente reversibili. L'innovazione sta nel fatto che i comandi vengono validati tramite parser sintattico e AST (Abstract Syntax Tree), così da gestire meglio pipeline complesse, sostituzioni di comando, sotto-comandi e sub-shell, validando ogni comando, anche annidato, prima che venga eseguito qualcosa.
Perché è utile
Se state sperimentando con coding agent o workflow automatizzati basati su comandi, uno dei problemi più ricorrenti è il confine di fiducia. Un comando può sembrare innocuo a prima vista, ma includere comunque sotto-comandi non sicuri o destinazioni di scrittura rischiose.
ShellShelter affronta questo problema validando due elementi prima dell'esecuzione: comandi estratti e destinazioni di scrittura.
Invece di affidarsi a pattern di denylist fragili, usa allowlist esplicite. Questo non elimina completamente il rischio, ma offre un confine di sicurezza più chiaro e verificabile per automazioni pratiche.
Come funziona
ShellShelter supporta attualmente Bash e PowerShell, con estrazione shell-specific e un modello di policy condiviso.
Per Bash, ShellShelter usa shfmt --to-json per estrarre la struttura del comando dall'AST JSON (Abstract Syntax Tree) e validarla rispetto alla policy. Per PowerShell, ShellShelter usa il parser integrato: costruisce l'AST, applica la normalizzazione degli alias e poi esegue la validazione della policy.
Entrambi i percorsi usano gli stessi concetti di policy:
- Entry
CmdSpecper i comandi consentiti - Allowlist di destinazioni per i percorsi scrivibili
L'esecuzione continua solo quando comandi estratti e destinazioni rispettano la policy.
Funzionalità principali
- Motore .NET basato su allowlist, utilizzabile sia via CLI sia come libreria C#
- Validazione dei comandi estratti e delle destinazioni di scrittura prima dell'esecuzione
- Estrazione Bash tramite AST JSON con
shfmt --to-json - Estrazione PowerShell tramite parser integrato e normalizzazione degli alias
- Modello di policy condiviso tra shell con
CmdSpece allowlist delle destinazioni - Supporto configurazione in formato INI compatibile con safecmd e JSON nativo
- Superficie CLI con
bash,pwsheconfig path
Quick start con la CLI
Prerequisiti:
Dopo aver clonato il repository, potete eseguire comandi come questi:
dotnet run --project src/ShellShelter.Cli -- bash "echo hello"
dotnet run --project src/ShellShelter.Cli -- pwsh "Get-ChildItem"
dotnet run --project src/ShellShelter.Cli -- config path
Un binario CLI precompilato per Windows è disponibile nella pagina delle release.
Potete eseguirlo così:
./shellshelter.exe pwsh "rm *.*" # Verrà bloccato dalla policy se non consentito
Snippet API CSharp
Come libreria C#, potete creare una ShellPolicy e usare BashShell.SafeRunAsync o PsShell.SafeRunAsync per eseguire comandi con validazione:
using ShellShelter.Core;
using ShellShelter.Core.Bash;
var policy = new ShellPolicy(
okCmds: [new CmdSpec("echo"), new CmdSpec("cat")],
okDests: ["./", "/tmp"]);
string output = await BashShell.SafeRunAsync("echo hello", policy);
Console.WriteLine(output);
Stato del progetto
ShellShelter è in fase iniziale e sperimentale, e non è ancora pronto per la produzione.
Il progetto è in sviluppo e test continui. È normale aspettarsi cambiamenti di comportamento, imperfezioni e possibili errori mentre l'implementazione matura. Per ora, è consigliato usarlo in ambienti controllati e a scopo sperimentale.
Se può essere utile nel vostro workflow, provatelo e condividete feedback. Bug report, issue e pull request sono molto benvenuti nel repository GitHub di ShellShelter.