Hooken interpreter markerer sinks til dynamisk kodeafvikling: konstruktioner, der gør data til kørende kode eller giver dem videre til en shell, fra eval til indbygget deserialisering. Den er sprogbevidst og læser hver fil efter dens egne regler, og den er den deterministiske motor bag specialiseringen interpreter, som du selv kan køre i tilstanden scan eller check.
Kørsel
- Scan kodebasen
- Tjek et kodeuddrag
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
npx lagune read interpreter --lang javascript --pattern 'eval(x)' # => careful
npx lagune read interpreter --lang python --pattern 'json.loads(x)' # => safe
Disse sinks har dobbelt anvendelse: om input, som en angriber kan påvirke, når frem til en af dem, kan ikke afgøres af en statisk scanning, så hvert match er en advarsel at gennemgå, aldrig et bekræftet fund. Scanningen udskriver et enkelt afsnit, Dynamic-execution sinks to review, grupperet efter fil. En ren kørsel udskriver no dynamic-execution sinks found.
Ræsonnér om hver sink statisk, og følg, om ikke-betroet input når frem til den. Kør aldrig den markerede kode, og brug aldrig eval på den eller på kode, den henter eksternt eller under kørslen, for at "teste", hvad den gør.
Sådan læser du afgørelsen
| Afgørelse | Betydning |
|---|---|
careful | Kodeuddraget indeholder en sink til dynamisk afvikling for sit sprog. Gennemgå den ved at læse den, aldrig ved at køre den. |
safe | Der blev ikke fundet nogen sink til dynamisk afvikling for det angivne sprog. |
CLI-indstillinger
| Indstilling | Værdi | Beskrivelse |
|---|---|---|
--pattern | et kodeuddrag | Tjek ét kodeuddrag. Gentag for at tjekke flere, én afgørelse pr. linje. |
--lang | et sprog | Påkrævet med --pattern: et af javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp. |
--dir | en mappe | Afgræns en scanning til en mappe. Kan gentages og kombineres med --file. |
--file | en fil | Afgræns en scanning til en enkelt fil. Kan gentages og kombineres med --dir. |
Uden indstillinger scanner den hele projektet. --pattern kræver --lang og kan ikke kombineres med --dir eller --file.
Vælg, hvad den scanner
Den udelader det, Git ignorerer. For at udelade mere, eller for at scanne det, Git ignorerer, så giv interpreter sine egne indstillinger:
npx lagune write add --ignore test/fixtures --checker interpreter
{
"checkers": {
"interpreter": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}
Konfigurér hooks beskriver alle indstillinger.
Understøttede sprog
Scanningen læser disse sprog, bestemt ud fra filendelsen, og hvert sprog tjekkes mod sit eget sæt af sinks til dynamisk afvikling.
| # | Sprog | Filendelser | Sinks, den markerer |
|---|---|---|---|
| 1 | JavaScript / TypeScript | .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot | eval(), Function-konstruktøren, setTimeout/setInterval med en streng som krop, modulet vm, exec fra child_process, dynamisk require(), dynamisk import() |
| 2 | Python | .py, .pyi | eval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (usikker) |
| 3 | Ruby | .rb | eval-familien (instance_eval/class_eval/module_eval/eval), system/exec, backticks eller %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load |
| 4 | Go | .go | exec.Command/exec.CommandContext, plugin.Open |
| 5 | PHP | .php | eval(), assert() på en streng, create_function(), shell-exec (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require med en sti fra kørslen |
| 6 | Rust | .rs | Command::new, process::Command |
| 7 | Java | .java | Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 8 | Kotlin | .kt, .kts | JVM-sinks: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject |
| 9 | C# | .cs | Process.Start / new Process, BinaryFormatter, Assembly.Load |
| 10 | C | .c, .h | system(), popen(), familien exec* (execl, execve, execvp, …) |
| 11 | C++ | .cc, .cpp, .cxx, .hpp, .hh, .hxx | system(), popen(), familien exec* (execl, execve, execvp, …) |
Den læser kildekoden som tekst, så en sink, der sættes sammen under kørslen, skjules bag et alias eller skrives i en form, den ikke genkender, kan slippe forbi. Betragt tabellen som et solidt udgangspunkt, ikke en komplet oversigt.
Hooken garanterer minimummet (at disse sinks findes, og hvor): om en ikke-betroet værdi faktisk når frem til en af dem, er den vurdering, som specialiseringen interpreter dækker.
Ofte stillede spørgsmål
Nej. Den markerer sinks til dynamisk afvikling som en advarsel at gennemgå, aldrig et bekræftet fund, fordi en statisk scanning ikke kan afgøre, om input, som en angriber kan påvirke, når frem til sinken.
Den læser sprogene i tabellen Understøttede sprog, bestemt ud fra filendelsen, og hvert sprog tjekkes mod sit eget sæt af sinks. Andre sprog giver ingen sinks.
