Valkyrie
Valkyrie предназначен для оперативного обнаружения подозрительных конструкций в файловой структуре веб-сервера. Инструмент объединяет сигнатурный анализ, эвристический поиск по регулярным выражениям и контроль целостности файлов. Работает автономно, не требует внешних СУБД, очередей сообщений или сторонних фреймворков.
Режимы работы
Возможности
| Функция | Описание |
|---|---|
| Сигнатурный анализ | Сопоставление хэшей файлов (MD5/SHA1) с локальной базой известных угроз |
| Эвристический анализ | Проверка содержимого по настраиваемым регулярным выражениям |
| Быстрый поиск | Детектирование опасных PHP-функций без глубокого анализа (obuscan.php) |
| Сканирование архивов | Анализ ZIP-архивов на наличие вредоносных скриптов |
| Контроль целостности | Создание контрольных снимков (snapshots) и сравнение изменений между состояниями |
| Изоляция объектов | Перемещение подозрительных файлов в директорию карантина |
| Отчётность | Генерация HTML-отчётов, JSON-ответов для API, структурированное логирование |
| Ограничение ресурсов | Настраиваемые лимиты размера файлов и потребления памяти, потоковое чтение |
| Защита интерфейса | Предотвращение path traversal, экранирование вывода, запрет листинга директорий |
Системные требования
| Компонент | Версия | Примечание |
|---|---|---|
| PHP | 7.4+ |
Рекомендуется 8.0+ |
| Веб-сервер | Apache 2.4+ / Nginx | Требуется mod_rewrite для Apache |
| Обязательные расширения | json, pcre |
— |
| Опциональные расширения | zip |
Для сканирования архивов |
| Права на запись | logs/, quarantine/, snapshots/ |
Для работы карантина и логирования |
Установка
- Разместите содержимое проекта в отдельной директории веб-сервера, например
/var/www/valkyrie/ - Установите владельца и права доступа:
chown -R www-data:www-data /var/www/valkyrie/{logs,quarantine,snapshots} chmod 755 /var/www/valkyrie/{logs,quarantine,snapshots} chmod 644 /var/www/valkyrie/*.php - Убедитесь, что для директории проекта включён
AllowOverride All(Apache) или настроенtry_files(Nginx) - Откройте
http://ваш-домен/valkyrie/в браузере
Использование
Веб-интерфейс
Перейдите на главную страницу и нажмите кнопку запуска. Результаты отобразятся асинхронно. Для просмотра
содержимого подозрительных файлов используйте ссылки «Посмотреть» (безопасный просмотр через
details.php).
Командная строка
# Полное сканирование
php scan.php --scan
# Сравнение двух снимков
php scan.php --compare snapshot-20250101-120000.json snapshot-20250115-180000.json
# Справка
php scan.php --help
Быстрый поиск бэкдоров
php obuscan.php
Сканирует рекурсивно все .php файлы в текущей директории на наличие опасных функций
(eval, base64_decode, shell_exec и др.).
API
GET /api/scan.php возвращает массив результатов в формате JSON. Пустой массив означает
отсутствие угроз.
Настройка
Правила детектирования (rules/rules.json)
Формат массива объектов:
{
"name": "уникальное_имя",
"pattern": "регулярное_выражение",
"description": "описание правила",
"case_sensitive": false
}
Изменения применяются автоматически при следующем запуске. Валидация синтаксиса выполняется перед применением.
База сигнатур (hashes/hashes.json)
{
"md5": { "хеш": "название_угрозы" },
"sha1": { "хеш": "название_угрозы" }
}
Параметры ядра
В scan.php или собственном wrapper-скрипте:
$scanner = new Valkyrie($scanDir);
$scanner->setMaxFileSize(50); // Лимит 50 МБ на файл
$scanner->setMemoryLimit(256); // Лимит памяти 256 МБ
$scanner->enableArchiveScanning(true); // Сканировать ZIP
$scanner->enableHashing(true); // Включить отслеживание изменений
$scanner->enableQuarantine(true); // Перемещать угрозы в карантин
$scanner->addExcludedDir('vendor'); // Исключить директории
Структура проекта
Valkyrie/
├── index.php # Веб-интерфейс
├── scan.php # CLI-сканер
├── obuscan.php # Экспресс-поиск опасных функций
├── details.php # Безопасный просмотр файлов
├── api/scan.php # JSON API
├── core/
│ ├── Valkyrie.php # Ядро: обход, анализ, карантин, отчёты
│ ├── Analyzer.php # Движок правил (regex)
│ └── Diff.php # Сравнение снимков
├── hashes/hashes.json # Сигнатуры по хэшам
├── rules/rules.json # Эвристические правила
├── logs/ # Журналы операций и ошибок
├── quarantine/ # Изолированные подозрительные файлы
└── snapshots/ # Контрольные снимки состояния
Метрики производительности
| Показатель | Значение | Примечание |
|---|---|---|
| Скорость сканирования | ~500-2000 файлов/сек | Зависит от размера и CPU |
| Потребление памяти | ~50-200 МБ | На 100k файлов |
| Максимальный размер файла | 10-100 МБ | Настраивается |
| Сканирование архива ZIP | До 500 МБ | Опционально |
Расширенные настройки
Оптимизация для больших проектов
// scan.php
$scanner = new Valkyrie('/var/www/large-project');
$scanner->setMaxFileSize(5); // Меньше 5 МБ
$scanner->setMemoryLimit(512); // 512 МБ
$scanner->enableArchiveScanning(false); // Отключить архивы
$scanner->enableHashing(true); // Инкрементальное сканирование
$scanner->addExcludedDir('vendor'); // Исключить Composer
$scanner->addExcludedDir('node_modules'); // Исключить npm
$scanner->addExcludedDir('storage'); // Исключить кэш
Кастомные правила для специфичных угроз
{
"name": "cryptominer_detect",
"pattern": "(cryptonight|stratum\\\\+|miner\\.php)",
"description": "Cryptominer detection",
"case_sensitive": false
}
API спецификация
Endpoint: GET /api/scan.php
| Параметр | Тип | Описание |
|---|---|---|
path |
string | Директория для сканирования (по умолчанию: корень) |
format |
string | Формат ответа: json или html |
callback |
string | JSONP callback (опционально) |
Пример ответа:
[
{
"file": "/var/www/shell.php",
"line": 1,
"code": "<?php eval($_POST['cmd']);",
"rule": "eval_post_cmd"
}
]
Развертывание в Docker
version: '3.8'
services:
valkyrie:
build: .
ports:
- "8080:80"
volumes:
- ./scans:/var/www/html/snapshots
- ./quarantine:/var/www/html/quarantine
- ./logs:/var/www/html/logs
environment:
- PHP_MEMORY_LIMIT=512M
- SCAN_MAX_FILE_SIZE=20
restart: unless-stopped
Безопасность и рекомендации
- Ограничьте доступ к директории сканера средствами веб-сервера (HTTP-аутентификация, whitelist IP)
- Регулярно обновляйте
rules.jsonиhashes.jsonна основе актуальных данных по угрозам для PHP - Инструмент предназначен для статического анализа и не заменяет WAF, межсетевые экраны или антивирусы общего назначения
- Перед удалением файлов из
quarantine/проведите ручной анализ содержимого - Используйте сканер только в отношении систем, находящихся в вашей зоне ответственности
Устранение неполадок
rules.json ежемесячно или после сообщений о новых уязвимостях в
используемых CMS.
rules.json с учётом особенностей шифрования.
setMemoryLimit() или в php.ini. Также проверьте
настройку setMaxFileSize() для ограничения размера сканируемых файлов.
Клиенты и партнеры


Свидетельства и сертификаты
Популярные вопросы
json и pcre. Опционально требуется zip для анализа архивов. Все конфигурации, правила и журналы хранятся локально в структурированных файлах.- Сигнатурный анализ: сверка хэшей файлов с локальной базой известных угроз (
hashes/hashes.json). - Эвристический поиск: проверка содержимого по настраиваемым регулярным выражениям (
rules/rules.json). - Встроенные паттерны: статический массив подозрительных PHP-конструкций в ядре сканера.
eval, include, system и подобные анализируются как строки. Риск случайного запуска malware или модификации рабочих файлов сведён к нулю.- Отредактируйте или отключите проблемное правило в
rules/rules.json. - Добавьте директории с тестовым/документационным кодом в исключения через
addExcludedDir(). - Уточните регулярные выражения (экранирование, границы слов
\b, флаги чувствительности к регистру). - Используйте режим
showAllFiles(false)для отображения только файлов с подтверждёнными совпадениями.
setMaxFileSize()— пропуск файлов свыше лимита;setMemoryLimit()— динамическое ограничение потребления RAM;- Потоковое чтение (
readFileSafely) для файлов >5 МБ с проверкойmemory_get_usage(true); - Рекурсивное исключение служебных директорий (
vendor,node_modulesи т.д.).
.php файлы, анализируются по правилам, после чего временные данные удаляются. Поддержка TAR, GZ, RAR и других языков (JS, Python, Go) не реализована, но архитектура движка позволяет расширить её через новые парсеры и правила.- CLI:
php scan.php --scanс кодами возврата0(угроз нет) /1(найдены угрозы). - JSON API:
GET /api/scan.phpвозвращает массив результатов для программной обработки. - Логирование: структурированные записи в
logs/scan.log.
rules/rules.json и hashes/hashes.json редактируются вручную или через скрипты автоматизации. Изменения применяются мгновенно при следующем запуске без перезагрузки сервера. Рекомендуется: - Регулярно актуализировать правила на основе отчётов по новым PHP-угрозам;
- Валидировать JSON перед заменой;
- Тестировать новые правила на контрольных образцах перед внедрением в production.
- Используйте CLI-режим или cron вместо постоянного веб-сканирования;
- Исключайте кэш, сессии, загрузки и временные директории из проверки;
- Настраивайте лимиты памяти и размера файлов под характеристики сервера.