Hooks

Hook interpreter: markér sinks til dynamisk kodeafvikling

Gennemsøg en kodebase for sinks til dynamisk kodeafvikling på tværs af sprog, eller vurdér et enkelt kodeuddrag, fra kommandolinjen.

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​

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

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.

Læs den markerede kode, kør den aldrig!

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ørelseBetydning
carefulKodeuddraget indeholder en sink til dynamisk afvikling for sit sprog. Gennemgå den ved at læse den, aldrig ved at køre den.
safeDer blev ikke fundet nogen sink til dynamisk afvikling for det angivne sprog.

CLI-indstillinger​

IndstillingVærdiBeskrivelse
--patternet kodeuddragTjek ét kodeuddrag. Gentag for at tjekke flere, én afgørelse pr. linje.
--langet sprogPåkrævet med --pattern: et af javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp.
--diren mappeAfgræns en scanning til en mappe. Kan gentages og kombineres med --file.
--fileen filAfgræ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.

#SprogFilendelserSinks, den markerer
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), Function-konstruktøren, setTimeout/setInterval med en streng som krop, modulet vm, exec fra child_process, dynamisk require(), dynamisk import()
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (usikker)
3Ruby.rbeval-familien (instance_eval/class_eval/module_eval/eval), system/exec, backticks eller %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), 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
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsJVM-sinks: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), familien exec* (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), familien exec* (execl, execve, execvp, …)
Efter bedste evne, ikke udtømmende

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.

tip

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.