
🐍 Scanner YARA e IOC multi-thread ad alte prestazioni

Una riscrittura di Loki in Rust. Scanner YARA e IOC ad alte prestazioni, multi-thread, in un singolo binario.
Stato: Beta. Funziona, ma ancora in fase di sviluppo attivo.
La scansione della memoria dei processi su macOS è "best-effort" e richiede generalmente entitlements di debug o privilegi elevati. Senza di essi, Loki-RS scansionerà comunque i file ma non sarà in grado di leggere la maggior parte della memoria dei processi. Usa --no-procs per saltare la scansione dei processi, se necessario.
Su Linux, Loki-RS salta i mapping di processi relativi a dispositivi e kernel speciali prima di leggere /proc/<pid>/mem. Questo evita note instabilità con alcune VMA gestite da driver, pur mantenendo la scansione normale di memoria anonima, heap/stack e file-backed regolari. Se si verificano ancora problemi specifici dell'ambiente, usa --no-procs per disabilitare la scansione dei processi.
Scarica il binario precompilato per la tua piattaforma dalla Pagina delle Release.
# Estrai
tar -xzvf loki-linux-*.tar.gz
cd loki-linux-*
# Aggiorna le firme (consigliato)
./loki-util update
# Esegui
sudo ./loki --help
Le firme sono incluse nella release ma invecchiano rapidamente. Esegui loki-util update per ottenere le ultime regole YARA-Forge Core.
Loki-RS utilizza YARA Forge come fonte predefinita di firme. Loki-RS include e aggiorna il set di regole Core (alta accuratezza, pochi falsi positivi, ottimizzato per le prestazioni). Se hai bisogno di una copertura più ampia, puoi sostituire i set Extended o Full di YARA Forge.
I file IOC in signatures/iocs/ rimangono supportati come contenuto locale/personalizzato opzionale.
# Scansione di base (TUI abilitata per impostazione predefinita)
sudo ./loki
# Scansiona una cartella specifica
sudo ./loki --folder /tmp
# Disabilita TUI, usa output standard da riga di comando
sudo ./loki --no-tui
# Scansiona un'immagine montata (salta scansione processi, usa tutti i core)
sudo ./loki --no-procs --folder ~/image1 --threads 0
# Scansione lenta e cauta (limite CPU basso, singolo thread)
sudo ./loki --cpu-limit 60 --threads 1
# Scansiona e invia log a syslog remoto
sudo ./loki --remote syslog-host.internal:514 --remote-proto udp


| Opzione | Predefinito | Descrizione |
|---|---|---|
-f, --folder <PERCORSO> | / | Cartella da scansionare. Racchiudi tra virgolette i percorsi che contengono spazi, es. -f "J:\SteamLibrary\steamapps\common\SpaceCraft beta" |
Loki-RS fornisce molteplici meccanismi per escludere file e cartelle dalle scansioni.
Per impostazione predefinita, Loki-RS esclude automaticamente:
Directory di sistema (Linux/macOS):
/proc, /dev, /sys/kernel/debug, /sys/kernel/slab, /sys/kernel/tracing, /sys/devices/run, /var/runDirectory di archiviazione cloud (a meno che non venga usato --scan-all-drives):
Unità di rete e montate (a meno che non venga usato --scan-all-drives):
/media, /volumesDirectory del programma:
Puoi escludere file noti come buoni tramite il loro hash. Questo è utile per autorizzare file legittimi che generano falsi positivi.
Configurazione:
Crea un file in signatures/iocs/ che contenga sia hash che falsepositive nel nome
Esempio: hash-falsepositive-custom.txt
Aggiungi hash (MD5, SHA1 o SHA256) con descrizioni opzionali:
# Formato: HASH;descrizione
d41d8cd98f00b204e9800998ecf8427e;File vuoto - noto come buono
a7f5f35426b927411fc9231b56382173;Utility di sistema legittima
I file che corrispondono a questi hash verranno saltati silenziosamente durante la scansione.
Quando aggiungi IOC di nomi file a signatures/iocs/filename-iocs.txt, puoi specificare un'espressione regolare di esclusione per falsi positivi nella terza colonna:
# Formato: REGEX;PUNTEGGIO;REGEX_FALSO_POSITIVO
#
# Questo corrisponde a tutti i file .ps1, ma esclude quelli nelle directory SysInternals
(?i)\\procdump(64)?\.(exe|zip);50;(?i)(SysInternals\\)
Se un file corrisponde sia al pattern principale che all'espressione regolare di falso positivo, non verrà segnalato.
Il file config/excludes.cfg supporta esclusioni di percorso basate su regex:
# Escludi directory di sistema
^/proc/.*
^/dev/.*
^/sys/.*
# Escludi file temporanei
.*\.tmp$
.*\.temp$
.*\.swp$
# Escludi directory specifiche
.*node_modules.*
.*/\.git/.*
Nota: I pattern di esclusione dei percorsi vengono confrontati con il percorso completo del file utilizzando espressioni regolari. Le righe che iniziano con # sono commenti.
# Scansiona ma includi tutte le unità (rete, cloud, montate)
sudo ./loki --scan-all-drives
# Scansiona tutti i tipi di file, non solo eseguibili e script
sudo ./loki --scan-all-files
# Scansiona solo file piccoli (sotto i 10MB)
sudo ./loki --max-file-size 10000000
# Salta la scansione dei processi (utile per immagini montate)
sudo ./loki --no-procs --folder /mnt/image
L'interfaccia a terminale è abilitata per impostazione predefinita e fornisce monitoraggio in tempo reale durante le scansioni.
sudo ./loki --folder /path/to/scan


Loki-RS genera automaticamente un report HTML stilizzato dopo ogni scansione. Il report viene creato insieme al file di log JSONL e fornisce un riepilogo visivo di tutti i risultati.
Il report include:

Il report HTML condivide lo stesso nome base dell'output JSONL (es. loki_hostname_2025-01-08.html). Per disabilitare la generazione del report, usa --no-html.
Puoi generare report HTML da file JSONL esistenti usando loki-util:
# Genera report HTML da un singolo file JSONL
./loki-util html --input scan_results.jsonl --output report.html
# Genera report HTML combinato da più file JSONL
./loki-util html --input "*.jsonl" --combine --output combined_report.html
# Usa pattern glob per abbinare più file
./loki-util html --input "/path/to/scans/*.jsonl" --combine --output combined.html
Opzioni:
--input <file|glob> - File JSONL di input o pattern glob (obbligatorio)--output <file.html> - File HTML di output (opzionale, per default usa il nome del file di input con estensione .html)--combine - Combina più file JSONL in un unico report (raggruppa i risultati per hostname)--title <str> - Sostituisce il titolo del report--host <str> - Sostituisce l'hostname nel reportLa modalità report combinato è utile per aggregare i risultati di scansione provenienti da più host o periodi di tempo in una singola vista, con risultati raggruppati per hostname di origine.
git clone https://github.com/Neo23x0/Loki-RS.git
cd Loki-RS
cargo build --release
./target/release/loki-util update
sudo ./target/release/loki
Richiede il toolchain Rust. Vedi docs/BUILD.md per la compilazione incrociata.
Loki RS è un progetto secondario. È uno scanner veloce, a singolo binario, costruito per un triage pratico e per sperimentazione, e può cambiare rapidamente man mano che le idee vengono provate e rimosse.
Il supporto è basato sulla comunità e "best-effort" - nessun SLA, nessun tempo di risposta garantito e nessuna promessa che ogni caso limite sia gestito perfettamente. Se lo esegui in produzione, fallo tenendo presente questo.
Per ambienti aziendali e lavoro di incident response con supporto prevedibile e un set di funzionalità più ampio e ben testato, Nextron Systems mantiene THOR (e THOR Lite). THOR è lo scanner professionale con ampia copertura di artefatti, più moduli e formati e supporto del fornitore. THOR Lite è la versione gratuita di base con un ambito ridotto.
GNU General Public License v3.0. Vedi LICENSE.
Copyright (c) 2025 Florian Roth
| Opzione | Predefinito | Descrizione |
|---|
--no-procs | false | Salta la scansione della memoria dei processi |
--no-fs | false | Salta la scansione del filesystem |
--no-archive | false | Salta la scansione all'interno degli archivi (ZIP) |
--scan-all-drives | false | Scansiona tutte le unità incluse quelle montate/rete/cloud |
--scan-all-files | false | Scansiona tutti i file indipendentemente dall'estensione/tipo |
| Opzione | Predefinito | Descrizione |
|---|
-l, --log <FILE> | auto | File di log in testo semplice |
--no-log | false | Disabilita l'output di log in testo semplice |
-j, --jsonl <FILE> | auto | File di output JSONL |
--no-jsonl | false | Disabilita l'output JSONL |
--no-html | false | Disabilita la generazione di report HTML |
--no-tui | false | Disabilita TUI, usa output standard da riga di comando |
-r, --remote <HOST:PORTA> | nessuno | Destinazione syslog remota |
-p, --remote-proto <PROTO> | udp | Protocollo remoto (udp/tcp) |
--remote-format <FORMATO> | syslog | Formato remoto (syslog/json) |
| Opzione | Predefinito | Descrizione |
|---|
--alert-level <PUNTEGGIO> | 80 | Soglia di punteggio per ALLARME |
--warning-level <PUNTEGGIO> | 60 | Soglia di punteggio per AVVISO |
--notice-level <PUNTEGGIO> | 40 | Soglia di punteggio per NOTIFICA |
--max-reasons <NUM> | 2 | Numero massimo di motivi di corrispondenza da mostrare per risultato |
-m, --max-file-size <BYTE> | 64000000 | Dimensione massima del file da scansionare (64MB) |
--yara-timeout <SECONDI> | 10 | Tempo massimo di scansione YARA per ogni file o buffer di memoria del processo (minimo: 1 secondo) |
-c, --cpu-limit <PERCENTUALE> | 100 | Limite di utilizzo CPU (1-100) |
--threads <NUM> | -2 | Numero di thread (0=tutti, -1=tutti-1, -2=tutti-2) |
| Opzione | Predefinito | Descrizione |
|---|
--version | - | Mostra la versione ed esci |
-d, --debug | false | Mostra output di debug |
--trace | false | Mostra output di traccia dettagliato |
--show-access-errors | false | Mostra errori di accesso a file/processi |
| Opzione | Descrizione |
|---|
--scan-all-drives | Include unità montate, unità di rete e archiviazione cloud |
--scan-all-files | Scansiona tutti i file indipendentemente dal tipo/estensione (per impostazione predefinita, vengono scansionati solo i tipi di file rilevanti) |
-m, --max-file-size <BYTE> | Salta file più grandi di questa dimensione (predefinito: 64MB) |
--no-procs | Salta completamente la scansione della memoria dei processi |
--no-fs | Salta completamente la scansione del filesystem |
--no-archive | Salta la scansione all'interno di file di archivio (ZIP) |
| Tasto | Azione |
|---|
q | Esci |
p | Pausa/Riprendi |
s | Salta elementi correnti |
t | Attiva/Disattiva sovrapposizione thread |
+ / - | Regola limite CPU |
| Tasti freccia | Scorri i log |