Introduzione a ShellShelter - Esecuzione più sicura dei comandi shell per workflow AI

lunedì 6 aprile 2026

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 CmdSpec per 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 CmdSpec e allowlist delle destinazioni
  • Supporto configurazione in formato INI compatibile con safecmd e JSON nativo
  • Superficie CLI con bash, pwsh e config path

Quick start con la CLI

Prerequisiti:

  • shfmt per il parsing Bash
  • pwsh 7+ per l'esecuzione PowerShell

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.