Hook'lar

interpreter hook'u: dinamik kod çalıştırma sink'lerini işaretleyin

Kod tabanını farklı dillerdeki dinamik kod çalıştırma sink'lerine karşı tarayın ya da tek bir kod parçasını doğrudan komut satırından puanlayın.

interpreter hook'u dinamik kod çalıştırma sink'lerini işaretler: eval'den yerel seri durumdan çıkarmaya kadar, veriyi çalışan koda dönüştüren ya da bir kabuğa aktaran yapılar. Dile duyarlıdır, her dosyayı kendi kurallarıyla okur. interpreter uzmanlığının arkasındaki deterministik motordur ve onu scan veya check modunda kendiniz çalıştırabilirsiniz.

Çalıştırma​

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

Bu sink'ler çift kullanımlıdır: saldırganın etkileyebildiği bir girdinin bunlardan birine ulaşıp ulaşmadığına statik bir tarama karar veremez, bu yüzden her eşleşme onaylanmış bir bulgu değil, incelenmesi gereken bir uyarıdır. Tarama, dosyaya göre gruplanmış tek bir Dynamic-execution sinks to review bölümü yazdırır. Temiz bir çalıştırma no dynamic-execution sinks found çıktısını verir.

İşaretlenen kodu okuyun, asla çalıştırmayın!

Her sink'i statik olarak değerlendirin ve güvenilmeyen bir girdinin ona ulaşıp ulaşmadığını izleyin. Ne yaptığını "test etmek" için işaretlenen kodu ya da onun çektiği uzak veya çalışma zamanında indirilen herhangi bir kodu asla çalıştırmayın ve eval ile değerlendirmeyin.

Kararı nasıl okumalı​

KararAnlamı
carefulKod parçası, kendi dili için bir dinamik çalıştırma sink'i içeriyor. Onu çalıştırarak değil, okuyarak inceleyin.
safeVerilen dil için hiçbir dinamik çalıştırma sink'i bulunamadı.

CLI seçenekleri​

SeçenekDeğerAçıklama
--patternbir kod parçasıTek bir kod parçasını kontrol eder. Birkaçını kontrol etmek için tekrarlayın, her satıra bir karar düşer.
--langbir dil--pattern ile zorunludur: javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp dillerinden biri.
--dirbir dizinTaramayı bir dizinle sınırlar. Tekrarlanabilir ve --file ile birleştirilebilir.
--filebir dosyaTaramayı tek bir dosyayla sınırlar. Tekrarlanabilir ve --dir ile birleştirilebilir.

Seçenek verilmezse tüm proje taranır. --pattern, --lang gerektirir ve --dir ya da --file ile birleştirilemez.

Desteklenen diller​

Tarama bu dilleri dosya uzantısına göre tanıyarak okur ve her birini kendi dinamik çalıştırma sink'leri kümesine göre kontrol eder.

#DilUzantılarİşaretlediği sink'ler
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), Function yapıcısı, gövdesi dize olan setTimeout/setInterval, vm modülü, child_process exec, dinamik require(), dinamik import()
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (güvensiz)
3Ruby.rbeval ailesi (instance_eval/class_eval/module_eval/eval), system/exec, ters tırnaklar veya %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), dize üzerinde assert(), create_function(), kabukta çalıştırma (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, çalışma zamanında belirlenen yolla include/require
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsJVM sink'leri: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), exec* ailesi (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), exec* ailesi (execl, execve, execvp, …)
Elden gelenin en iyisi, ama eksiksiz değil

Hook kaynak kodu metin olarak okur, bu yüzden çalışma zamanında oluşturulan, bir takma adın arkasına gizlenen ya da tanımadığı bir biçimde yazılan bir sink gözden kaçabilir. Tabloyu eksiksiz bir envanter olarak değil, sağlam bir başlangıç noktası olarak görün.

ipucu

Hook tabanı garanti eder (bu sink'ler mevcuttur ve yerleri bellidir): güvenilmeyen bir değerin gerçekten bunlardan birine ulaşıp ulaşmadığı ise interpreter uzmanlığının kapsadığı bir değerlendirmedir.

Sıkça sorulan sorular

Hayır. Dinamik çalıştırma sink'lerini onaylanmış bir bulgu olarak değil, incelenmesi gereken bir uyarı olarak işaretler, çünkü saldırganın etkileyebildiği bir girdinin sink'e ulaşıp ulaşmadığına statik bir tarama karar veremez.

Desteklenen diller tablosundaki dilleri dosya uzantısına göre tanıyarak okur ve her birini kendi sink kümesine göre kontrol eder. Diğer dillerde sink bulunmaz.