Важно Zer0Kernel AV: локальный статический анализ подозрительных файлов без запуска

1785436134376.png


Zer0Kernel AV — экспериментальный сервис для статического анализа подозрительных файлов, скриптов, исполняемых программ, документов Microsoft Office и архивов.

Сервис доступен по адресу:


Главный принцип работы:

Загруженный файл исследуется как набор данных, но не запускается как программа.

Zer0Kernel AV не открывает EXE через Wine, не выполняет загруженные PHP-, Bash- или PowerShell-скрипты и не разрешает образцу самостоятельно обращаться в Интернет.

---

## Для чего нужен Zer0Kernel AV

Сервис предназначен для первичного исследования файлов, происхождение или назначение которых вызывает вопросы.

Например, с его помощью можно проверить:
  • неизвестный EXE, DLL, SYS или SCR;
  • PHP-плагин или дополнение для сайта;
  • подозрительный PHP-файл на сервере;
  • PowerShell-, Bash-, Python- или JavaScript-скрипт;
  • BAT/CMD-файл;
  • документ Microsoft Office с макросами;
  • ZIP-архив с программой или исходным кодом;
  • архив плагина XenForo, WordPress или другого веб-приложения;
  • файл, найденный во время расследования инцидента;
  • вложение из электронной почты;
  • скрипт установки, скачанный с неизвестного сайта;
  • набор файлов, в котором могут находиться веб-шеллы, загрузчики или обфусцированный код.

Zer0Kernel AV особенно полезен в тех случаях, когда файл ещё рано запускать даже в тестовой системе, но необходимо быстро понять:
  • из чего он состоит;
  • какие действия он потенциально может выполнять;
  • присутствуют ли подозрительные функции;
  • имеются ли URL, IP-адреса, домены, пути или ключи реестра;
  • используется ли обфускация;
  • есть ли макросы;
  • содержит ли архив вложенные EXE, PHP, Bash или PowerShell-файлы;
  • какие элементы требуют ручного анализа.
---

# Важное предупреждение

Статический анализ не доказывает, что файл является вредоносным. Обнаруженные признаки требуют проверки специалистом.

Наличие функции unserialize() в PHP, eval() в JavaScript, сетевого API в EXE или высокой энтропии PE-секции само по себе не означает, что перед нами вредоносная программа.

Многие легитимные приложения используют потенциально опасные возможности:
  • установщики запускают процессы;
  • отладчики работают с памятью других процессов;
  • плагины десериализуют данные;
  • браузерные библиотеки используют динамический JavaScript;
  • обновляторы скачивают файлы;
  • системные программы изменяют реестр;
  • защитное ПО применяет API, похожие на техники внедрения кода.
Zer0Kernel AV не выдаёт юридически или технически окончательный вердикт. Он помогает быстро выделить места, которые необходимо исследовать вручную.

---

# Как устроен анализ

Общая последовательность выглядит так:

Код:
Пользователь загружает файл
        ↓
FastAPI принимает файл и проверяет размер
        ↓
Файл получает случайный идентификатор задания
        ↓
Определяется тип файла
        ↓
Задание помещается в очередь Redis/RQ
        ↓
Изолированный analyzer-worker выполняет статический анализ
        ↓
При необходимости архив безопасно распаковывается
        ↓
Каждый вложенный файл анализируется отдельно
        ↓
Находки объединяются и рассчитывается оценка риска
        ↓
Формируется технический JSON-отчёт
        ↓
Zer0Kernel формирует русскоязычное заключение
        ↓
Исходный файл и распакованные данные удаляются
        ↓
Отчёт доступен 24 часа

Анализ выполняется отдельным Docker-контейнером. Контейнер не имеет доступа к основной файловой системе сервера и не получает Docker Socket.

---

# Какие файлы поддерживаются

| Категория | Примеры |
|---|---|
| PowerShell | .ps1, .psm1, .psd1 |
| Bash и Shell | .sh, .bash, .zsh |
| Python | .py, .pyw |
| JavaScript | .js, .mjs, .cjs |
| PHP | .php, .phtml |
| BAT/CMD | .bat, .cmd |
| VBA | .vba, .bas |
| PE | .exe, .dll, .sys, .scr, .cpl, .ocx |
| Microsoft Office | .doc, .docm, .docx, .xls, .xlsm, .xlsx, .xlsb, .ppt, .pptm, .pptx, .rtf |
| Архивы | .zip, .tar, .tar.gz, .tgz, .gz, .bz2, .xz |
| Прочие текстовые файлы | конфигурации, исходный код, неизвестные текстовые форматы |
| Прочие бинарные файлы | базовые хеши, строки, YARA и IOC |

Тип файла определяется не только по расширению.

Например:
  • PE определяется по заголовку MZ;
  • старый формат Microsoft Office определяется по OLE-сигнатуре;
  • ZIP и TAR дополнительно проверяются средствами архивных библиотек;
  • неизвестный файл проверяется на наличие текстового содержимого.
Поэтому переименование payload.exe в document.txt не обязательно скроет реальный тип файла.

---

# Ограничения размеров

Для защиты сервера от слишком больших файлов и архивных бомб используются лимиты.

| Объект | Максимальный размер |
|---|---:|
| Скрипт или текстовый файл | 2 МБ |
| PE-файл | 20 МБ |
| Документ Microsoft Office | 20 МБ |
| Загружаемый архив | 20 МБ |
| Один файл после распаковки | 20 МБ |
| Все распакованные данные | 100 МБ |
| Количество файлов в архивном дереве | 500 |
| Вложенность архивов | 3 уровня |
| Коэффициент сжатия одного элемента | не более 100:1 |
| Хранение отчёта | 24 часа |

Если файл превышает лимит, он получает статус skipped, а причина отображается в отчёте.

Если достигнут предел вложенности архива, анализ получает статус partial.

---

# Что проверяется у каждого файла

Независимо от типа файла Zer0Kernel AV выполняет несколько базовых операций.

## 1. Расчёт хешей

Для каждого файла рассчитываются:
  • MD5;
  • SHA-1;
  • SHA-256.
SHA-256 удобно использовать для:
  • сравнения файлов;
  • поиска повторно загруженных образцов;
  • проверки целостности;
  • сопоставления с другими отчётами;
  • ручного поиска в репутационных системах.
Хеш сам по себе ничего не говорит о поведении файла, но однозначно идентифицирует конкретное содержимое.

---

## 2. Извлечение строк

Из бинарных и исполняемых файлов извлекаются:
  • ASCII-строки;
  • UTF-16LE-строки.
Минимальная длина обычной строки — пять символов.

Строки могут содержать:
  • URL;
  • домены;
  • IP-адреса;
  • команды;
  • пути к файлам;
  • имена процессов;
  • ключи реестра;
  • User-Agent;
  • имена служб;
  • названия Scheduled Tasks;
  • сообщения об ошибках;
  • внутренние имена функций;
  • сведения о конфигурации программы.
Наличие строки не доказывает, что программа обязательно её использует. Строка может находиться в неиспользуемом коде, отладочной информации или документации.

---

## 3. Поиск IOC

IOC — это индикаторы, которые могут быть полезны при расследовании.

Zer0Kernel AV извлекает:
  • HTTP- и HTTPS-ссылки;
  • IPv4-адреса;
  • доменные имена;
  • адреса электронной почты;
  • MD5;
  • SHA-1;
  • SHA-256;
  • Windows-пути;
  • ключи реестра.
Например:

Код:
https://example.org/update.bin
192.0.2.10
C:\Users\Public\update.exe
HKCU\Software\Microsoft\Windows\CurrentVersion\Run

Важно понимать, что IOC извлекаются синтаксически.

Сервис не утверждает, что каждый найденный URL или домен является вредоносным. В коде могут встречаться:
  • обычные CDN;
  • адреса документации;
  • тестовые домены;
  • ссылки на GitHub;
  • имена библиотек;
  • строки, лишь похожие на домены.
IOC необходимо проверять в контексте файла.

---

## 4. YARA

Для файлов запускается проверка YARA-правилами.

В базовой конфигурации присутствуют правила для обнаружения:
  • PowerShell-цепочки «загрузка и динамическое выполнение»;
  • PHP-конструкций вида eval(base64_decode(...));
  • одновременного использования нескольких Windows LOLBins.
Например, сочетание:

Код:
Invoke-WebRequest
Invoke-Expression

может быть отмечено как подозрительная PowerShell-цепочка.

YARA-совпадение добавляется в отчёт как отдельная находка с:
  • категорией;
  • уровнем риска;
  • уверенностью;
  • названием правила;
  • описанием.
Текущий набор YARA не является полной антивирусной базой. Эффективность этого слоя можно постепенно увеличивать, добавляя новые проверенные правила.

---

## 5. Безопасное декодирование Base64

В текстовых файлах ищутся длинные последовательности, похожие на Base64.

Сервис пытается декодировать их как:
  • UTF-8;
  • UTF-16LE;
  • Latin-1.
Декодированный результат только отображается и повторно исследуется как текст.

Он не передаётся в:

Код:
eval()
exec()
compile()

и не запускается.

Установлены ограничения:
  • количество кандидатов;
  • максимальная длина закодированной строки;
  • максимальный размер результата;
  • проверка доли печатных символов.
Это помогает находить скрытые команды в PowerShell, PHP, Bash, Python и других скриптах.

---

# Анализ PowerShell

Для PowerShell проверяются конструкции, часто встречающиеся в загрузчиках, административных скриптах и вредоносном коде.

Обнаруживаются:
  • Invoke-Expression;
  • сокращение IEX;
  • Invoke-WebRequest;
  • iwr;
  • DownloadString;
  • Net.WebClient;
  • -EncodedCommand;
  • FromBase64String;
  • Add-MpPreference;
  • Set-MpPreference;
  • создание Scheduled Tasks;
  • загрузка .NET-сборок через Reflection.Assembly::Load;
  • сочетание сетевой загрузки и выполнения кода.
Особенно подозрительной считается цепочка:

Код:
загрузка данных
        ↓
декодирование
        ↓
динамическое выполнение

Но даже такая цепочка требует проверки: подобные конструкции могут использоваться и в легитимных скриптах развёртывания.

---

# Расширенный анализ Bash и Shell

Bash-анализатор проверяет не только отдельные слова, но и некоторые сочетания действий.

## Загрузка и немедленное выполнение

Проверяются конструкции вида:

Bash:
curl ... | bash
wget ... | sh
bash <(curl ...)
bash -c "$(curl ...)"
eval "$(wget ...)"

Также проверяется декодирование с передачей результата в оболочку:

Код:
Base64 → shell
Hex → shell
OpenSSL decode → shell

Такие цепочки считаются значительно опаснее, чем простое присутствие curl или wget.

---

## Работа с /tmp и /dev/shm

Проверяется:
  • загрузка файлов в /tmp;
  • загрузка в /dev/shm;
  • создание скрытых файлов вроде /tmp/.update;
  • установка права на выполнение;
  • запуск файла из временного каталога.
Если в одном скрипте обнаруживается:

Код:
загрузка в /tmp или /dev/shm
        ↓
chmod +x
        ↓
запуск

создаётся отдельная корреляционная находка высокого риска.

---

## Reverse shell

Проверяются признаки обратных оболочек через:
  • /dev/tcp;
  • /dev/udp;
  • bash -i;
  • nc;
  • ncat;
  • netcat;
  • socat EXEC;
  • FIFO и netcat;
  • Python one-liner;
  • Perl one-liner;
  • PHP one-liner.
Сам скрипт не запускается. Анализатор только ищет характерные конструкции.

---

## SSH persistence

Обнаруживаются операции с:

Код:
~/.ssh/authorized_keys
/root/.ssh/authorized_keys
/home/*/.ssh/authorized_keys

Особенно важный признак:

Код:
SSH-ключ → запись в authorized_keys

Также проверяются обращения к:
  • SSH private keys;
  • .ssh/config;
  • id_rsa;
  • id_ed25519.
---

## Cron, systemd и автозапуск

Проверяются:
  • crontab;
  • /etc/crontab;
  • /etc/cron.d;
  • /var/spool/cron;
  • systemd service units;
  • systemctl enable;
  • daemon-reload;
  • /etc/rc.local;
  • /etc/init.d;
  • .bashrc;
  • .profile;
  • .zshrc;
  • /etc/profile.d;
  • задания через at.
Это может указывать на попытку закрепления в системе.

---

## Очистка следов

Проверяются:

Bash:
history -c
unset HISTFILE
HISTFILE=/dev/null
set +o history

Также обнаруживаются:
  • удаление файлов в /var/log;
  • обнуление журналов;
  • truncate -s 0;
  • запись /dev/null в журнал;
  • journalctl --vacuum-*;
  • удаление .bash_history;
  • удаление .zsh_history.
---

## Отключение защиты

Анализатор отмечает:
  • остановку auditd;
  • остановку rsyslog;
  • отключение firewall;
  • ufw disable;
  • iptables -F;
  • nft flush ruleset;
  • setenforce 0;
  • остановку ClamAV;
  • остановку Falco;
  • остановку osquery;
  • отключение некоторых endpoint-агентов.
---

## Поиск учётных данных

Проверяются обращения к:

Код:
/etc/shadow
/etc/gshadow
~/.ssh/id_rsa
~/.ssh/id_ed25519
.aws/credentials
.config/gcloud/credentials
.kube/config
.docker/config.json
.bash_history
.mysql_history

Также отмечается поиск файлов:

Код:
id_rsa
.env
credentials
wallet.dat
Login Data

Если в одном скрипте присутствуют поиск учётных данных и команда отправки файла, формируется корреляция возможной эксфильтрации.

---

## Повышение привилегий и разрушительные команды

Проверяются:
  • изменение /etc/sudoers;
  • установка SUID;
  • setcap cap_setuid;
  • setcap cap_setgid;
  • рекурсивное удаление системных каталогов;
  • mkfs;
  • запись через dd непосредственно на диск;
  • fork bomb.
---

## Майнеры и эксфильтрация

Проверяются:
  • XMRig;
  • cpuminer;
  • minerd;
  • Stratum URL;
  • загрузка файлов через curl;
  • передача архивов в сетевую утилиту;
  • упаковка данных перед отправкой.
Bash-анализатор объединяет строки, продолженные через обратный слеш:

Bash:
curl https://example.org/install \
    | bash

Обычные неисполняемые комментарии стараются исключаться из проверки.

---

# Анализ Python

Для Python проверяются:
  • os.system;
  • os.popen;
  • subprocess.Popen;
  • subprocess.run;
  • subprocess.call;
  • subprocess.check_output;
  • marshal.loads;
  • pickle.loads;
  • socket.socket;
  • ctypes;
  • winreg;
  • keyring.
Обнаруживаются потенциальные признаки:
  • запуска системных команд;
  • создания процессов;
  • работы с сокетами;
  • загрузки сериализованных данных;
  • доступа к Windows API;
  • обращения к реестру и хранилищам учётных данных.
---

# Анализ JavaScript

Для JavaScript проверяются:
  • eval;
  • Function;
  • child_process;
  • child_process.exec;
  • child_process.spawn;
  • fetch;
  • XMLHttpRequest;
  • WebSocket;
  • ActiveXObject;
  • WScript.Shell;
  • document.cookie.
Сервис различает потенциально опасные возможности, но не всегда может определить контекст.

Например:

JavaScript:
fetch("/api/data")

является обычной конструкцией веб-приложения.

А сочетание:

JavaScript:
require("child_process")
child_process.exec(...)

уже требует более внимательного анализа.

Минифицированный JavaScript сам по себе не считается доказательством вредоносности.

---

# Расширенный анализ PHP

PHP-анализатор предназначен в том числе для поиска:
  • веб-шеллов;
  • загрузчиков;
  • обфусцированного PHP;
  • небезопасной десериализации;
  • выполнения пользовательских команд;
  • опасной загрузки файлов;
  • динамического подключения кода.
PHP-файл не передаётся интерпретатору и не выполняется.

---

## Выполнение команд и кода

Проверяются:

PHP:
eval()
assert()
system()
exec()
shell_exec()
passthru()
popen()
proc_open()
pcntl_exec()

Также проверяется оператор обратных кавычек PHP:

PHP:
$output = `id`;

Необходимо учитывать, что обратные кавычки внутри SQL-запросов могут быть обычным экранированием имён таблиц и столбцов. Поэтому найденный фрагмент всегда нужно проверять вручную.

---

## Обфускация

Обнаруживаются:

PHP:
base64_decode()
gzinflate()
gzuncompress()
gzdecode()
str_rot13()
hex2bin()
convert_uudecode()
pack()

Особенно опасны цепочки:

PHP:
eval(base64_decode(...));

PHP:
eval(gzinflate(base64_decode(...)));

PHP:
assert(gzuncompress(...));

Также проверяются:
  • длинные последовательности chr();
  • крупные Base64-литералы;
  • длинные \xNN-последовательности;
  • очень длинные строки исходного кода;
  • variable functions;
  • variable variables;
  • динамические callbacks;
  • create_function;
  • call_user_func;
  • call_user_func_array.
---

## Небезопасная десериализация

Проверяется:

PHP:
unserialize(...)

Само наличие unserialize() не означает выполнение произвольного кода.

Реальный риск зависит от:
  • происхождения данных;
  • доступных PHP-классов;
  • наличия magic methods;
  • проверки целостности;
  • версии приложения;
  • возможности пользователя управлять сериализованной строкой.
Значительно опаснее ситуация:

Код:
$_POST / $_GET / $_COOKIE
        ↓
переменная
        ↓
unserialize()

---

## Облегчённый taint-анализ

Zer0Kernel AV отслеживает простое движение пользовательских данных.

Источники:

PHP:
$_GET
$_POST
$_REQUEST
$_COOKIE
$_FILES
$_SERVER
$GLOBALS
php://input
filter_input()
getenv()

Опасные точки назначения:

Код:
eval / assert
system / exec / shell_exec
include / require
unserialize
file_put_contents
move_uploaded_file
SQL query
curl
file_get_contents
socket
динамический callback

Например:

PHP:
<?php

$cmd = $_POST['cmd'];
$copy = trim($cmd);

system($copy);

Анализатор построит упрощённую цепочку:

Код:
POST
  ↓
$cmd
  ↓
$copy
  ↓
system()

И отметит возможный канал удалённого выполнения команд.

Это не полноценный межпроцедурный PHP-анализатор. Он может пропускать:
  • сложные массивы;
  • объекты;
  • reflection;
  • данные между несколькими файлами;
  • динамически создаваемые имена;
  • код, формируемый во время выполнения.
---

## Подключение файлов и PHP streams

Проверяются:

PHP:
include
include_once
require
require_once

Особое внимание уделяется схемам:

Код:
http://
https://
ftp://
data://
php://
phar://

Например, динамический include через пользовательский параметр может указывать на Local File Inclusion или Remote File Inclusion.

---

## Запись файлов и persistence

Проверяются:

PHP:
file_put_contents()
fwrite()
fputs()
copy()
rename()
chmod()
touch()
unlink()
move_uploaded_file()

Также ищутся ссылки на:

Код:
.user.ini
.htaccess
auto_prepend_file
authorized_keys
/etc/cron
/var/spool/cron

Это помогает обнаруживать PHP-код, способный изменять конфигурацию сайта или закрепляться в системе.

---

## Другие PHP-признаки

Проверяются:
  • обработка $_FILES;
  • сетевые функции;
  • curl;
  • fsockopen;
  • stream_socket_client;
  • подавление ошибок через @;
  • отключение вывода ошибок;
  • unlink(__FILE__);
  • extract($_POST);
  • set_time_limit(0);
  • ignore_user_abort(true).

Если в одном файле одновременно обнаруживаются:

Код:
сеть
    +
запись файла
    +
выполнение

создаётся отдельная находка возможной цепочки:

Код:
download → write → execute

---

# Анализ BAT и CMD

Проверяются:
  • PowerShell с -EncodedCommand;
  • certutil;
  • bitsadmin;
  • mshta;
  • rundll32;
  • regsvr32;
  • создание Scheduled Task;
  • создание Windows Service;
  • удаление теневых копий через vssadmin.
Такие инструменты могут использоваться как легитимными администраторами, так и в атаках Living off the Land.

---

# Анализ документов Microsoft Office

Для документов Office используется статический анализ макросов.

Поддерживаются старые OLE-документы и современные Office-контейнеры.

Проверяется:
  • наличие VBA-макросов;
  • список модулей;
  • исходный код макросов;
  • автоматически запускаемые процедуры;
  • подозрительные функции;
  • IOC;
  • распространённые способы обфускации.
Особое внимание уделяется:

Код:
AutoOpen
Document_Open
Workbook_Open
Shell
CreateObject
GetObject
WScript.Shell
URLDownloadToFile

Макросы не запускаются.

---

# Анализ EXE, DLL, SYS и других PE-файлов

PE-анализ состоит из нескольких уровней.

---

## Уровень 1: структура PE через pefile

Из файла извлекаются:
  • архитектура;
  • timestamp из заголовка;
  • точка входа;
  • Image Base;
  • subsystem;
  • imphash;
  • секции;
  • виртуальные размеры;
  • физические размеры;
  • характеристики секций;
  • энтропия;
  • импортируемые DLL;
  • импортируемые функции;
  • предупреждения PE-парсера.
---

## Подозрительные импорты

Отмечаются API, связанные с потенциально опасными возможностями.

Например:

Код:
CreateRemoteThread
WriteProcessMemory
VirtualAllocEx
WinExec
ShellExecuteA
ShellExecuteW
URLDownloadToFileA
URLDownloadToFileW
InternetOpenUrlA
InternetOpenUrlW
RegSetValueExA
RegSetValueExW
IsDebuggerPresent
CheckRemoteDebuggerPresent

Комбинация:

Код:
VirtualAllocEx
    ↓
WriteProcessMemory
    ↓
CreateRemoteThread

может быть связана с внедрением кода в другой процесс.

Но наличие импорта ещё не доказывает вызов функции. Эти API могут использовать:
  • отладчики;
  • EDR;
  • инструменты администрирования;
  • редакторы памяти;
  • установщики;
  • защитное ПО.
Поэтому находки по импортам имеют ограниченную уверенность.

---

## Энтропия секций

Для каждой секции PE рассчитывается энтропия.

Высокая энтропия крупной секции может указывать на:
  • упаковщик;
  • сжатие;
  • шифрование;
  • обфускацию;
  • встроенный архив;
  • зашифрованную конфигурацию.
Секция отмечается как подозрительная примерно при условиях:

Код:
энтропия не ниже 7.2
размер не меньше 4096 байт

Это эвристика. Сжатые изображения и другие легитимные ресурсы тоже могут иметь высокую энтропию.

---

## Уровень 2: capa

capa анализирует машинный код и пытается определить потенциальные возможности программы.

Он способен находить признаки:
  • создания процессов;
  • загрузки кода;
  • process injection;
  • shellcode;
  • process hollowing;
  • сетевого взаимодействия;
  • HTTP, DNS и сокетов;
  • создания служб;
  • Scheduled Tasks;
  • persistence;
  • доступа к учётным данным;
  • keylogging;
  • anti-debug;
  • anti-VM;
  • упаковки;
  • обфускации;
  • системной разведки;
  • разрушительных действий.

В отчёт сохраняются:
  • название правила capa;
  • namespace;
  • описание;
  • количество совпадений;
  • адреса совпадений;
  • ATT&CK-метаданные;
  • MBC-метаданные.
Чтобы сотни низкоуровневых правил не завышали риск до 100/100, результаты capa дополнительно группируются.

Например, множество сетевых capa-правил может сформировать одну оценочную технику:

Код:
capa_network_capabilities

Полный список capabilities остаётся в техническом отчёте.

---

## Уровень 3: FLOSS

FLOSS предназначен для извлечения строк, которые могут отсутствовать среди обычных ASCII- и UTF-16-строк.

В текущей конфигурации Zer0Kernel AV использует FLOSS для поиска:
  • decoded strings — строк, восстановленных функциями декодирования;
  • stack strings — строк, собираемых на стеке.
Обычные статические строки Zer0Kernel AV извлекает самостоятельно.

Режим tight strings может быть отключён для уменьшения времени анализа.

FLOSS способен восстановить, например:

Код:
powershell.exe -EncodedCommand ...
https://example.org/gate
Software\Microsoft\Windows\CurrentVersion\Run
schtasks /create ...
vssadmin delete shadows ...

Восстановленные строки повторно проверяются на:
  • URL;
  • сетевые индикаторы;
  • PowerShell;
  • CMD;
  • LOLBins;
  • process injection API;
  • persistence;
  • доступ к браузерным данным;
  • удаление теневых копий;
  • разрушительные команды.
FLOSS может работать долго, особенно на:
  • больших PE;
  • упакованных программах;
  • файлах с большим количеством функций;
  • повреждённых образцах.
Для capa и FLOSS установлены таймауты. Если один из инструментов не успел завершиться или вернул ошибку, остальные части анализа продолжают работать.

---

# Как анализируются архивы

Архив распаковывается в отдельный временный каталог.

После распаковки каждый файл проходит повторное определение типа:

Код:
plugin.zip
├── addon.json
├── install.php
├── src/
│   ├── Service.php
│   └── Listener.php
├── js/
│   └── library.min.js
└── tools/
    └── helper.exe

В этом примере:
  • PHP-файлы пройдут PHP-анализ;
  • JavaScript пройдёт JavaScript-анализ;
  • EXE пройдёт pefile, capa и FLOSS;
  • JSON и неизвестные тексты пройдут базовый анализ;
  • вложенный архив будет распакован рекурсивно.
---

## Защита при распаковке

Проверяются:
  • пути с ../;
  • абсолютные пути;
  • UNC-пути;
  • Windows drive paths;
  • NUL-байты;
  • символические ссылки;
  • hard links;
  • размер каждого файла;
  • общий распакованный объём;
  • количество элементов;
  • степень вложенности;
  • коэффициент сжатия.
Таким образом, архив не должен получить возможность записать файл, например, в:

Код:
/etc/cron.d/

или:

Код:
/root/.ssh/authorized_keys

через путь вида:

Код:
../../../../root/.ssh/authorized_keys

---

## Неподдерживаемые и зашифрованные архивы

В текущей версии:
  • ZIP распаковывается;
  • TAR распаковывается;
  • TAR.GZ и TGZ распаковываются;
  • GZ распаковывается;
  • BZ2 распаковывается;
  • XZ распаковывается;
  • 7z распознаётся, но не распаковывается;
  • RAR распознаётся, но не распаковывается;
  • зашифрованные элементы ZIP пропускаются.
Информация о пропущенных элементах добавляется в примечания отчёта.

---

# Как рассчитывается оценка риска

Оценка риска рассчитывается обычным программным кодом.

Локальная нейросеть не назначает баллы и не может произвольно изменить итоговую оценку.

Каждая находка имеет уровень:

| Уровень | Вес |
|---|---:|
| Low | 2 |
| Medium | 7 |
| High | 15 |
| Critical | 25 |

---

## Повторные находки не суммируются бесконечно

Оценка строится по уникальной комбинации:

Код:
категория + техника

Если одна и та же техника найдена в 100 строках, для расчёта используется её максимальный уровень, а не сумма всех 100 совпадений.

Это защищает от ситуации, когда библиотека с большим количеством одинаковых вызовов автоматически получает 100/100.

---

## Дополнительные корреляции

К основной сумме добавляются баллы за опасные сочетания категорий.

### Сеть и выполнение

Код:
network + execution = +15

Пример:

Код:
скачивание файла
        +
запуск процесса

### Выполнение и persistence

Код:
execution + persistence = +15

Пример:

Код:
выполнение команды
        +
создание Scheduled Task

### Доступ к учётным данным

Код:
credential_access = +20

### Разрушительная активность

Код:
destructive_activity = +20

Максимальная итоговая оценка ограничена:

Код:
100/100

---

## Пример расчёта

Предположим, в скрипте обнаружены:

| Находка | Баллы |
|---|---:|
| Загрузка данных — Medium | 7 |
| Выполнение команды — High | 15 |
| Создание cron-задачи — High | 15 |
| Сочетание network + execution | 15 |
| Сочетание execution + persistence | 15 |
| Итого | 67 |

Итог:

Код:
67/100

Это означает высокий приоритет для ручной проверки, но не вероятность вредоносности в 67%.

---

## Как отображается оценка

Интерфейс использует три диапазона:

| Оценка | Отображение |
|---|---|
| 0–29 | низкий уровень |
| 30–59 | средний уровень |
| 60–100 | высокий уровень |

Эти диапазоны нужны для сортировки и первичного триажа.

---

# Почему легитимный плагин может получить 58/100

Оценка 58/100 не означает:

Файл вредоносный с вероятностью 58%.

Например, обычный плагин может одновременно содержать:
  • unserialize() в PHP;
  • сетевые функции;
  • минифицированный JavaScript;
  • динамические callbacks;
  • работу с файлами;
  • внешние CDN-ссылки;
  • код установки и удаления;
  • SQL-запросы;
  • обработку пользовательского ввода.
Каждая из этих функций может быть легитимной, но потенциально опасной при неправильном использовании.

Поэтому результат следует читать так:

В архиве обнаружено несколько технически опасных примитивов. Необходимо проверить, как именно они используются.

Особенно важно смотреть не только на балл, но и на:
  • источник находки;
  • уровень уверенности;
  • строку кода;
  • доказательство;
  • описание;
  • сочетание нескольких действий.
---

# Источники находок

В отчёте можно встретить разные значения источника.

| Источник | Значение |
|---|---|
| yara | совпадение с YARA-правилом |
| heuristic | регулярная эвристическая проверка |
| correlation | сочетание нескольких признаков |
| php_taint | движение пользовательских данных к опасной функции |
| pe_import | импорт Windows API |
| pe_structure | структурная аномалия PE |
| capa | возможность, найденная capa |
| floss | строка или группа строк, восстановленная FLOSS |
| olevba | результат анализа VBA-макросов |

---

# Уровень опасности и уверенность — разные параметры

У находки есть два независимых свойства.

## Severity

Потенциальная серьёзность действия:

Код:
low
medium
high
critical

## Confidence

Насколько уверенно статический анализатор интерпретировал признак:

Код:
low
medium
high

Например:

Код:
CreateRemoteThread

может иметь высокий потенциальный риск, но низкую уверенность, потому что наличие импорта не доказывает фактическое внедрение кода.

---

# Какую роль выполняет Zer0Kernel

После технического анализа готовый отчёт передаётся локальной модели Zer0Kernel.

Модель не получает исходный EXE, PHP, Bash или архив.

Она получает сокращённый JSON, содержащий:
  • общую оценку;
  • основные находки;
  • наиболее рискованные файлы;
  • IOC;
  • результаты capa;
  • результаты FLOSS;
  • сведения PHP-анализатора;
  • ограничения статического анализа.
Zer0Kernel формирует:
  • краткий вердикт;
  • уровень уверенности;
  • понятное русскоязычное описание;
  • подтверждённые признаки;
  • возможные действия;
  • IOC;
  • рекомендации;
  • ограничения анализа.
---

## Zer0Kernel не рассчитывает оценку

Оценка риска уже рассчитана до обращения к модели.

Схема:

Код:
Статические анализаторы
        ↓
Детерминированный расчёт риска
        ↓
Готовый JSON
        ↓
Zer0Kernel объясняет результат

Это важно, потому что языковая модель может:
  • неправильно понять контекст;
  • переоценить обычную функцию;
  • принять имя JavaScript-объекта за домен;
  • спутать SQL-кавычки с выполнением команд;
  • сделать слишком уверенный вывод.
Поэтому заключение Zer0Kernel является дополнительным пояснением, а не главным доказательством.

Основным источником считаются технические находки и фрагменты кода.

---

# Что происходит с загруженными файлами

При загрузке создаётся временный каталог задания:

Код:
/var/lib/zkav/jobs/<случайный-job-id>/

Файл сохраняется под нейтральным внутренним именем:

Код:
sample.bin

Пользовательское имя используется только для отображения в отчёте.

Каталог создаётся с ограниченными правами, а сам файл недоступен другим обычным пользователям системы.

---

## Удаление после анализа

После окончания статического анализа выполняется удаление всего рабочего каталога задания.

Удаляются:
  • исходный файл;
  • распакованные архивы;
  • вложенные файлы;
  • временные данные анализатора.
Удаление выполняется даже при исключении или ошибке анализа через блок finally.

---

## Аварийная очистка

Отдельный контейнер janitor проверяет временные каталоги каждые пять минут.

Если каталог остался после:
  • аварийного завершения worker;
  • перезапуска контейнера;
  • системной ошибки;
  • незавершённого задания,
он будет удалён после истечения резервного срока.

В текущей конфигурации резервная очистка удаляет зависшие каталоги старше двух часов, если они не помечены как активно анализируемые.

---

# Как хранятся отчёты

Технический отчёт хранится в Redis.

Для каждого задания создаются:

Код:
zkav:job:<job-id>:meta
zkav:job:<job-id>:report

Для отчёта устанавливается TTL:

Код:
86400 секунд

То есть:

Код:
24 часа

После истечения TTL Redis автоматически удаляет отчёт и метаданные.

Также пользователь может нажать:

Код:
Удалить отчёт

и удалить данные раньше.

---

## Защита доступа к отчёту

Для каждого задания создаётся случайный токен доступа.

В Redis хранится не сам токен, а его SHA-256-хеш.

Получить отчёт без правильного токена невозможно через обычный API.

Это не заменяет полноценную пользовательскую авторизацию, но защищает отчёт от простого перебора UUID.

---

## Важное уточнение об удалении

Удаление из Redis и Docker Volume является логическим удалением.

Оно не гарантирует криптографическое стирание каждого физического блока диска.

Копии данных теоретически могут временно оставаться:
  • в свободных блоках файловой системы;
  • в Redis AOF до его перезаписи;
  • в снапшотах сервера;
  • в резервных копиях провайдера.
Для обычного временного анализа этого достаточно, но сервис не заявляет уровень secure erase для секретных государственных или военных данных.

---

# Изоляция анализатора

Основные компоненты работают в отдельных Docker-контейнерах.

Код:
API
        ↓
Redis
        ↓
Analyzer worker
        ↓
Технический отчёт

Redis
        ↓
Zer0Kernel enrichment worker
        ↓
Русскоязычное заключение

---

## Analyzer worker

Контейнер анализатора:
  • не имеет доступа в Интернет;
  • не монтирует / сервера;
  • не видит /root;
  • не видит /etc хоста;
  • не видит /var/www;
  • не получает /var/run/docker.sock;
  • работает с read-only root filesystem;
  • использует cap_drop: ALL;
  • использует no-new-privileges;
  • ограничен по CPU, RAM и количеству процессов;
  • использует отдельный временный tmpfs;
  • не запускает исследуемые PE и скрипты.
---

## Zer0Kernel enrichment worker

Контейнер Zer0Kernel:
  • не монтирует каталог с загруженными файлами;
  • не может прочитать исходный образец;
  • получает только JSON;
  • подключается к локальному vLLM;
  • не отправляет файл во внешние нейросети.
---

## Остаточный риск

Docker-контейнеры используют общее ядро Linux.

Теоретически абсолютную защиту невозможно гарантировать из-за:
  • уязвимостей ядра;
  • container escape;
  • уязвимостей Docker или runc;
  • уязвимостей самих парсеров;
  • специально повреждённых PE или Office-документов.
Поэтому Zer0Kernel AV использует несколько уровней ограничений, но не заявляет, что контейнер равен отдельной физической машине или полноценной виртуальной песочнице.

---

# Преимущества Zer0Kernel AV

## 1. Файл не запускается

Главное преимущество статического анализа — исследование файла без нормального исполнения его кода.

Это значительно безопаснее, чем открывать неизвестный EXE или запускать подозрительный скрипт на рабочем компьютере.

---

## 2. Локальная обработка

Исходные файлы не отправляются:
  • в VirusTotal;
  • в публичные облачные песочницы;
  • во внешние AI API;
  • сторонним поставщикам репутационных сервисов.
Это полезно при анализе:
  • закрытого исходного кода;
  • коммерческого плагина;
  • внутреннего скрипта;
  • конфигурации компании;
  • ещё не опубликованного программного обеспечения.
---

## 3. Многослойный анализ

Один инструмент редко даёт полную картину.

Zer0Kernel AV объединяет:

Код:
YARA
+ строки
+ IOC
+ эвристики
+ PHP taint-анализ
+ oletools
+ pefile
+ capa
+ FLOSS
+ корреляции
+ локальное AI-заключение

Это позволяет увидеть файл с разных сторон.

---

## 4. Рекурсивный анализ архивов

Сервис проверяет не только сам ZIP, но и его содержимое.

Например, в архиве с плагином можно отдельно увидеть:
  • PHP-файлы;
  • JavaScript;
  • вложенные архивы;
  • неизвестные бинарные файлы;
  • EXE или DLL;
  • макросы Office.
---

## 5. Объяснимый результат

Отчёт показывает:
  • какой файл вызвал находку;
  • какая техника обнаружена;
  • уровень опасности;
  • уверенность;
  • источник;
  • строку;
  • фрагмент доказательства.
Это полезнее, чем сообщение:

Код:
Threat detected

без объяснения причины.

---

## 6. Оценка не зависит от языковой модели

Риск рассчитывается детерминированно.

Даже если Zer0Kernel временно недоступен, технический отчёт и оценка сохраняются.

---

## 7. Временное хранение

Исходный файл удаляется после анализа, а отчёт автоматически исчезает через 24 часа.

---

## 8. Подходит для первичного триажа

Zer0Kernel AV позволяет быстро решить:
  • файл можно изучать дальше;
  • файл требует отдельной виртуальной машины;
  • необходимо проверить конкретную функцию;
  • следует искать оригинальную версию;
  • нужно сравнить SHA-256;
  • необходимо провести динамический анализ;
  • файл выглядит обычным, но содержит потенциально опасные возможности.
---

# Ограничения сервиса

Zer0Kernel AV не является заменой:
  • полноценного антивируса;
  • EDR;
  • динамической песочницы;
  • ручного реверс-инжиниринга;
  • аудита исходного кода специалистом;
  • VirusTotal;
  • репутационных баз;
  • анализа сетевого поведения.
Сервис не видит фактические:
  • созданные процессы;
  • сетевые соединения;
  • изменения реестра;
  • созданные файлы;
  • обращения к командному серверу;
  • действия в памяти после запуска;
  • поведение в зависимости от окружения;
  • anti-sandbox поведение;
  • полезную нагрузку, получаемую только из Интернета.
---

## Возможны ложные срабатывания

Особенно часто они возникают на:
  • фреймворках;
  • минифицированном JavaScript;
  • установщиках;
  • административных утилитах;
  • обновляторах;
  • плагинах сайтов;
  • отладчиках;
  • защитных программах;
  • коде миграции базы данных;
  • легитимной сериализации.
---

## Возможны пропуски

Статический анализ может пропустить:
  • полностью зашифрованную полезную нагрузку;
  • динамически вычисляемые API;
  • API hashing;
  • код, загружаемый из сети;
  • сложную обфускацию;
  • неизвестный упаковщик;
  • полиморфный код;
  • поведение, активируемое только на определённой машине;
  • код внутри зашифрованного архива;
  • shell-команды, формируемые в runtime.
---

## Нет полноценной проверки цифровой подписи

Текущая версия извлекает PE-структуру, но не выполняет полноценную проверку:
  • Authenticode;
  • цепочки сертификатов;
  • отзыва сертификата;
  • репутации издателя.
Наличие цифровой подписи также не гарантирует безопасность, но её проверка полезна и может быть добавлена в будущих версиях.

---

# Как правильно читать отчёт

Рекомендуемый порядок:

1. Посмотреть общую оценку риска.
2. Проверить число файлов в архиве.
3. Найти файлы с наибольшей индивидуальной оценкой.
4. Открыть критические и высокие находки.
5. Посмотреть источник находки.
6. Проверить строку и доказательство.
7. Изучить IOC.
8. Прочитать заключение Zer0Kernel.
9. Сравнить SHA-256 с официальным источником.
10. При необходимости провести ручной или динамический анализ.

---

# Когда файл требует особого внимания

Особенно внимательно следует исследовать файл, если одновременно присутствуют:

Код:
загрузка данных
+
выполнение
+
persistence

или:

Код:
доступ к учётным данным
+
упаковка
+
передача данных в сеть

или:

Код:
обфускация
+
декодирование
+
eval/exec

или:

Код:
process injection
+
anti-debug
+
сетевое взаимодействие

Одно совпадение может быть случайным. Несколько связанных действий значительно важнее.

---

# Можно ли считать Zer0Kernel AV антивирусом

В привычном смысле — нет.

Сервис:
  • не работает в реальном времени;
  • не контролирует процессы;
  • не блокирует запуск;
  • не проверяет каждую запись на диск;
  • не имеет драйвера;
  • не заменяет Microsoft Defender или EDR;
  • не имеет огромной коммерческой базы сигнатур.
Правильнее называть его:

статическим анализатором угроз

или:

сервисом первичного анализа подозрительных файлов

Название AV используется как короткое и понятное обозначение проекта.

---

# Итог

Zer0Kernel AV объединяет классические инструменты статического анализа и локальную нейросеть.

Сервис позволяет:
  • безопасно принять подозрительный файл;
  • определить его тип;
  • проверить хеши;
  • извлечь строки;
  • найти IOC;
  • обнаружить обфускацию;
  • исследовать PHP и Bash;
  • извлечь VBA-макросы;
  • разобрать PE;
  • определить возможности через capa;
  • восстановить скрытые строки через FLOSS;
  • рекурсивно проверить архив;
  • рассчитать понятную оценку риска;
  • получить русскоязычное заключение;
  • удалить исходные данные после анализа.

При этом главный принцип остаётся неизменным:

Zer0Kernel AV помогает понять, что находится внутри файла, но окончательное решение всегда должен принимать человек.

Сервис:

 
Последнее редактирование:
Назад
Верх Низ