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

  • Автор темы Автор темы zer0coder
  • Дата начала Дата начала
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 помогает понять, что находится внутри файла, но окончательное решение всегда должен принимать человек.

Сервис:

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