Valkyrie

Статический анализатор исходного кода для выявления вредоносных скриптов, веб-шеллов и скрытых бэкдоров в PHP-приложениях
ПО для ЭВМ "Valkyrie" зарегистрировано Федеральной службой по интеллектуальной собственности. Свидетельство о регистрации №2025686746.

Valkyrie предназначен для оперативного обнаружения подозрительных конструкций в файловой структуре веб-сервера. Инструмент объединяет сигнатурный анализ, эвристический поиск по регулярным выражениям и контроль целостности файлов. Работает автономно, не требует внешних СУБД, очередей сообщений или сторонних фреймворков.

Режимы работы

Веб-интерфейс
Асинхронный запуск и визуализация результатов через удобный браузерный интерфейс.
Командная строка (CLI)
Для автоматизации и интеграции в CI/CD пайплайны.
API
Для программной интеграции с другими системами.

Возможности

Функция Описание
Сигнатурный анализ Сопоставление хэшей файлов (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/ Для работы карантина и логирования

Установка

  1. Разместите содержимое проекта в отдельной директории веб-сервера, например /var/www/valkyrie/
  2. Установите владельца и права доступа:
    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
                    
  3. Убедитесь, что для директории проекта включён AllowOverride All (Apache) или настроен try_files (Nginx)
  4. Откройте 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 с учётом особенностей шифрования.

Используйте API endpoint с exporter-скриптом, который преобразует JSON в метрики Prometheus.

Увеличьте лимит памяти через setMemoryLimit() или в php.ini. Также проверьте настройку setMaxFileSize() для ограничения размера сканируемых файлов.

Клиенты и партнеры

Свидетельства и сертификаты

Популярные вопросы

Инструмент предназначен для статического анализа файловой структуры и исходного кода PHP-приложений. Он ищет веб-шеллы, скрытые бэкдоры, обфусцированные конструкции и подозрительные вызовы системных функций. Предназначен для системных администраторов, DevOps-инженеров, разработчиков и специалистов информационной безопасности, которым требуется автономный контроль целостности веб-проектов.

Нет. Valkyrie полностью автономен. Не требует СУБД, очередей сообщений, фреймворков или сетевых зависимостей. Для работы достаточно PHP 7.4+ с расширениями json и pcre. Опционально требуется zip для анализа архивов. Все конфигурации, правила и журналы хранятся локально в структурированных файлах.

Нет, искусственный интеллект не применяется. Детектирование базируется на трёх прозрачных механизмах:
  • Сигнатурный анализ: сверка хэшей файлов с локальной базой известных угроз (hashes/hashes.json).
  • Эвристический поиск: проверка содержимого по настраиваемым регулярным выражениям (rules/rules.json).
  • Встроенные паттерны: статический массив подозрительных PHP-конструкций в ядре сканера.
Такой подход обеспечивает низкое потребление ресурсов, предсказуемость результатов и возможность точечной настройки.

Исключено. Valkyrie работает только в режиме чтения и статического анализа. Интерпретация PHP-кода не происходит, функции eval, include, system и подобные анализируются как строки. Риск случайного запуска malware или модификации рабочих файлов сведён к нулю.

Ложные срабатывания типичны для эвристических сканеров. Рекомендуемые действия:
  • Отредактируйте или отключите проблемное правило в rules/rules.json.
  • Добавьте директории с тестовым/документационным кодом в исключения через addExcludedDir().
  • Уточните регулярные выражения (экранирование, границы слов \b, флаги чувствительности к регистру).
  • Используйте режим showAllFiles(false) для отображения только файлов с подтверждёнными совпадениями.

В ядре предусмотрены встроенные механизмы контроля:
  • setMaxFileSize() — пропуск файлов свыше лимита;
  • setMemoryLimit() — динамическое ограничение потребления RAM;
  • Потоковое чтение (readFileSafely) для файлов >5 МБ с проверкой memory_get_usage(true);
  • Рекурсивное исключение служебных директорий (vendor, node_modules и т.д.).
Для production рекомендуется запускать сканирование в часы низкой нагрузки через CLI или cron.

В текущей версии поддерживается только PHP и ZIP-архивы. Архивы распаковываются в оперативную память, извлекаются только .php файлы, анализируются по правилам, после чего временные данные удаляются. Поддержка TAR, GZ, RAR и других языков (JS, Python, Go) не реализована, но архитектура движка позволяет расширить её через новые парсеры и правила.

Да. Инструмент предоставляет:
  • CLI: php scan.php --scan с кодами возврата 0 (угроз нет) / 1 (найдены угрозы).
  • JSON API: GET /api/scan.php возвращает массив результатов для программной обработки.
  • Логирование: структурированные записи в logs/scan.log.
Результаты легко парсятся bash/Python-скриптами, отправляются в мессенджеры или встраиваются в пайплайны GitLab CI/GitHub Actions.

Файлы rules/rules.json и hashes/hashes.json редактируются вручную или через скрипты автоматизации. Изменения применяются мгновенно при следующем запуске без перезагрузки сервера. Рекомендуется:
  • Регулярно актуализировать правила на основе отчётов по новым PHP-угрозам;
  • Валидировать JSON перед заменой;
  • Тестировать новые правила на контрольных образцах перед внедрением в production.

Да, при соблюдении рекомендаций:
  • Используйте CLI-режим или cron вместо постоянного веб-сканирования;
  • Исключайте кэш, сессии, загрузки и временные директории из проверки;
  • Настраивайте лимиты памяти и размера файлов под характеристики сервера.
Инструмент не заменяет WAF, антивирусы или системы обнаружения вторжений, но эффективно дополняет их на уровне статического контроля кода.
Остались вопросы?
Будем рады пообщаться с вами и ответить на любые ваши вопросы
Напишите нам!
DevStarter Technology Products

Задайте вопрос или запросите демо

Оставьте свои контактные данные, и наши специалисты свяжутся с вами в ближайшее время