Hooki

Hook interpreter: Zgłaszanie sinków dynamicznego wykonywania kodu

Przeszukuj bazę kodu w wielu językach pod kątem sinków dynamicznego wykonywania kodu albo oceniaj pojedynczy fragment kodu z wiersza poleceń.

Hook interpreter zgłasza sinki dynamicznego wykonywania kodu: konstrukcje, które zamieniają dane w uruchamiany kod albo przekazują je do powłoki, od eval po natywną deserializację. Rozpoznaje język i czyta każdy plik według jego własnych reguł. To deterministyczny silnik stojący za specjalizacją interpreter, który możesz uruchomić samodzielnie w trybie scan lub check.

Uruchamianie​

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

Te sinki mają podwójne zastosowanie: statyczne skanowanie nie rozstrzygnie, czy docierają do nich dane wejściowe zależne od atakującego, więc każde dopasowanie jest ostrzeżeniem do przejrzenia, nigdy potwierdzonym ustaleniem. Skanowanie wypisuje jedną sekcję Dynamic-execution sinks to review, pogrupowaną według plików. Gdy nic nie znajdzie, hook wypisuje no dynamic-execution sinks found.

Czytaj zgłoszony kod, nigdy go nie uruchamiaj!

Analizuj każdy sink statycznie, śledząc, czy docierają do niego niezaufane dane wejściowe. Nigdy nie uruchamiaj zgłoszonego kodu, nie przekazuj go do eval i nie uruchamiaj żadnego zdalnego ani pobieranego w czasie działania kodu, który on dociąga, tylko po to, aby "przetestować", co robi.

Jak odczytać werdykt​

WerdyktZnaczenie
carefulFragment kodu zawiera sink dynamicznego wykonywania typowy dla swojego języka. Przejrzyj go, czytając kod, nigdy go nie uruchamiając.
safeNie znaleziono sinka dynamicznego wykonywania dla podanego języka.

Opcje CLI​

OpcjaWartośćOpis
--patternfragment koduSprawdza jeden fragment kodu. Powtórz, aby sprawdzić kilka, po jednym werdykcie w linii.
--langjęzykWymagana razem z --pattern: jeden z języków javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp.
--dirfolderOgranicza skanowanie do folderu. Można powtarzać i łączyć z --file.
--fileplikOgranicza skanowanie do jednego pliku. Można powtarzać i łączyć z --dir.

Bez żadnej opcji hook przeszukuje cały projekt. Opcja --pattern wymaga --lang i nie można jej łączyć z --dir ani --file.

Wybierz, co hook przeszukuje​

Hook pomija to, co ignoruje Git. Aby pominąć więcej albo przeszukać to, co ignoruje Git, nadaj hookowi interpreter własne ustawienia:

npx lagune write add --ignore test/fixtures --checker interpreter
{
"checkers": {
"interpreter": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

Konfiguracja hooków opisuje każde ustawienie.

Obsługiwane języki​

Skanowanie czyta poniższe języki, rozpoznając je po rozszerzeniu pliku, i każdy sprawdza pod kątem jego własnego zestawu sinków dynamicznego wykonywania.

#JęzykRozszerzeniaZgłaszane sinki
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), konstruktor Function, setTimeout/setInterval z ciałem w postaci ciągu znaków, moduł vm, exec z child_process, dynamiczne require(), dynamiczny import()
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (niebezpieczne)
3Ruby.rbrodzina eval (instance_eval/class_eval/module_eval/eval), system/exec, backticki lub %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), assert() na ciągu znaków, create_function(), wykonywanie w powłoce (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require ze ścieżką ustalaną w czasie działania
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsSinki JVM: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), rodzina exec* (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), rodzina exec* (execl, execve, execvp, …)
Staranny, ale niewyczerpujący

Hook czyta kod źródłowy jako tekst, więc może przeoczyć sink składany w czasie działania, ukryty za aliasem lub zapisany w formie, której nie rozpoznaje. Traktuj tabelę jako solidny punkt wyjścia, a nie pełny spis.

wskazówka

Hook gwarantuje minimum (że te sinki istnieją i gdzie są): to, czy niezaufana wartość faktycznie do któregoś z nich dociera, wymaga oceny, którą zapewnia specjalizacja interpreter.

Najczęściej zadawane pytania

Nie. Zgłasza sinki dynamicznego wykonywania jako ostrzeżenie do przejrzenia, nigdy jako potwierdzone ustalenie, bo statyczne skanowanie nie rozstrzygnie, czy dane wejściowe zależne od atakującego docierają do sinka.

Czyta języki z tabeli "Obsługiwane języki", rozpoznając je po rozszerzeniu pliku, i każdy sprawdza pod kątem jego własnego zestawu sinków. W innych językach nie zgłasza żadnych sinków.