Hook

Hook interpreter: segnala i sink di esecuzione dinamica del codice

Analizza una codebase alla ricerca di sink di esecuzione dinamica del codice in vari linguaggi, oppure valuta un singolo frammento, dalla riga di comando.

L'hook interpreter segnala i sink di esecuzione dinamica del codice: costrutti che trasformano dati in codice in esecuzione o li passano a una shell, da eval alla deserializzazione nativa. È consapevole del linguaggio, legge ogni file con le sue regole, ed è il motore deterministico dietro la specializzazione interpreter, che puoi eseguire tu stesso in modalità scan o check.

Come eseguirlo​

npx lagune read interpreter # scans the whole project
npx lagune read interpreter --dir src # scans a directory
npx lagune read interpreter --file app.py # scans a single file

Questi sink sono a doppio uso: se un input influenzato da un attaccante ne raggiunga uno non si può stabilire con un'analisi statica, quindi ogni corrispondenza è un avviso da rivedere, mai un rilievo confermato. L'analisi stampa un'unica sezione Dynamic-execution sinks to review, raggruppata per file. Un'esecuzione pulita stampa no dynamic-execution sinks found.

Leggi il codice segnalato, non eseguirlo mai!

Ragiona su ogni sink in modo statico, tracciando se un input non attendibile lo raggiunge. Non eseguire mai né passare a eval il codice segnalato, né alcun codice remoto o scaricato a runtime che esso richiami, per "testare" cosa fa.

Come leggere il verdetto​

VerdettoSignificato
carefulIl frammento contiene un sink di esecuzione dinamica per il suo linguaggio. Rivedilo leggendolo, mai eseguendolo.
safeNon è stato trovato alcun sink di esecuzione dinamica per il linguaggio indicato.

Opzioni della CLI​

OpzioneValoreDescrizione
--patternun frammento di codiceControlla un frammento. Ripetila per controllarne diversi, un verdetto per riga.
--langun linguaggioObbligatoria con --pattern: uno tra javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp.
--diruna directoryLimita l'analisi a una directory. Si ripete e si combina con --file.
--fileun fileLimita l'analisi a un singolo file. Si ripete e si combina con --dir.

Senza opzioni analizza l'intero progetto. --pattern richiede --lang e non si può combinare con --dir o --file.

Linguaggi supportati​

L'analisi legge questi linguaggi, riconosciuti dall'estensione del file, ognuno controllato rispetto al proprio insieme di sink di esecuzione dinamica.

#LinguaggioEstensioniSink che segnala
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), costruttore Function, setTimeout/setInterval con corpo stringa, modulo vm, exec di child_process, require() dinamico, import() dinamico
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess con shell=True, pickle.load/loads, yaml.load (non sicuro)
3Ruby.rbfamiglia eval (instance_eval/class_eval/module_eval/eval), system/exec, backtick o %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), assert() su stringa, create_function(), esecuzione in shell (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require con percorso a runtime
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsI sink della JVM: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), la famiglia exec* (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), la famiglia exec* (execl, execve, execvp, …)
Al meglio delle possibilità, non esaustivo

Legge il sorgente come testo, quindi un sink costruito a runtime, nascosto dietro un alias o scritto in una forma che non riconosce può sfuggirgli. Considera la tabella un solido punto di partenza, non un inventario completo.

suggerimento

L'hook garantisce la base (questi sink esistono, e dove): se un valore non attendibile ne raggiunga davvero uno è la valutazione coperta dalla specializzazione interpreter.

Domande frequenti

No. Segnala i sink di esecuzione dinamica come avviso da rivedere, mai come rilievo confermato, perché se un input influenzato da un attaccante raggiunga il sink non si può stabilire con un'analisi statica.

Legge i linguaggi della tabella Linguaggi supportati, riconosciuti dall'estensione del file, ognuno controllato rispetto al proprio insieme di sink. Gli altri linguaggi non producono sink.