Перейти к основному содержимому

WARC-Safe — антивирусная и NSFW-проверка архивов

WARC-Safe — первый open-source сканер для проверки WARC-файлов на вирусы и NSFW-контент (Not-Safe-For-Work). Разработан в University of North Texas. Особенно важен для публичных архивов, где нет модерации каждого файла.

Главная идея: новый WARC из массовой архивации потенциально может содержать вредоносный код (с заархивированных сайтов) или NSFW-контент. WARC-Safe проверяет архив автоматически — так же, как почтовый сервис проверяет вложения.

Зачем нужен​

СценарийРиск без WARC-Safe
Публичный архив (доступен через pywb)Пользователь получает 200 со страницей, на которой эксплойт через XSS
WARC в публичном S3Злоумышленник загружает файл с малварью в HTML-теле, затем скармливает исследователям
Корпоративный архивАрхивирование скомпрометированного сайта → заражение инфраструктуры при индексации
Демо архива на конференцииСлучайный показ NSFW-страницы

WARC-Safe решает это:

  • Антивирусная проверка через ClamAV (или другие движки).
  • NSFW-детекция через ML-классификатор (NSFWJS, GantMan).
  • Отчёт с указанием, какие записи проблемные.

Архитектура​

┌──────────────┐
│ WARC файл │
└──────┬───────┘
│
↓ (стриминг по записям)
┌──────────────────────┐
│ WARC-Safe extractor │ ← extract
│ (warcio) │
└──────────────┬───────┘
│
┌───────┴────────┐
↓ ↓
┌──────────────┐ ┌──────────────┐
│ ClamAV │ │ NSFWJS │
│ daemon │ │ ML model │
└──────┬───────┘ └──────┬───────┘
│ │
↓ ↓
┌────────────────────────────────┐
│ JSON-отчёт per WARC запись │
│ + сводный CSV для коллекции │
└────────────────────────────────┘

Установка​

Быстрая установка​

pip install warc-safe

Для работы нужны:

  • Python 3.10+ (рекомендуется 3.11+).
  • ClamAV (brew install clamav / apt install clamav-daemon).
  • ~2 ГБ RAM для ML-моделей.

Полная установка (с dev-окружением)​

git clone https://github.com/unt-libraries/warc-safe
cd warc-safe
pip install -e .
clamav-daemon &

Использование​

CLI​

# Проверить один WARC
warc-safe scan /path/to/archive.warc.gz

# С выводом в JSON
warc-safe scan /path/to/archive.warc.gz --json > report.json

# С выводом в CSV
warc-safe scan /path/to/archive.warc.gz --csv > report.csv

# Проверить несколько WARC
warc-safe scan /path/to/warcs/*.warc.gz --csv > all-reports.csv

# Только вирусы (без NSFW)
warc-safe scan /path/to/archive.warc.gz --only-virus

# Только NSFW
warc-safe scan /path/to/archive.warc.gz --only-nsfw

Python API​

from warc_safe import Scanner

scanner = Scanner(
virus_scanner="clamav",
nsfw_model="nsfwjs",
clamav_socket="/var/run/clamav/clamd.ctl",
)

# Сканировать один файл
report = scanner.scan_file("archive.warc.gz")
for finding in report.findings:
print(finding.url, finding.threat_type, finding.confidence)

# Сканировать коллекцию
for report in scanner.scan_directory("./warcs/"):
print(f"{report.filename}: {len(report.findings)} проблем")

Конфигурация​

config.yaml:

virus_scanner:
engine: "clamav"
socket: "/var/run/clamav/clamd.ctl"
fallback: "clamd-cli" # если сокет не работает

nsfw_detector:
engine: "nsfwjs"
model: "Inferse/nsfwjs-v2"
threshold: 0.6

logging:
level: "info"
format: "json"

output:
default_format: "json"
default_path: "./reports/"

Что обнаруживается​

Вирусы и малварь​

  • HTML/JavaScript с известными эксплойтами (CVE-2024-XXXX и др.).
  • Файлы EICAR тест-сигнатуры (стандарт для проверки антивируса).
  • Macro malware в документах.
  • Любой сигнатурный вирус в файлах внутри WARC.

ClamAV обновляет базы ежедневно; freshness проверки настраивается.

NSFW-контент​

  • Изображения (NSFWJS или YOLO-based).
  • Категории: porn, hentai, sexy (настраивается).
  • Порог уверенности (по умолчанию 0.6).
  • Не применяется к тексту (только изображения и метаданные).

Интеграция с SolrWayback​

WARC-Safe интегрирован с SolrWayback — после индексации WARC, прежде чем пользователи смогут искать, проверка применяется автоматически:

# В pipeline SolrWayback
solrwayback-indexer archive.warc.gz --prescan=warc-safe

Интеграция с UK Web Archive​

UK Web Archive использует WARC-Safe в production для защиты от известных угроз.

Защищаемые сценарии​

Сценарий 1. Публичный Ruarxive-архив​

#!/bin/bash
# publish-archive.sh
set -e

ARCHIVE=$1

echo "[validate]"
warc-validate "$ARCHIVE"

echo "[virus-scan]"
warc-safe scan "$ARCHIVE" --json > /tmp/scan.json
if python -c "import json,sys;d=json.load(open('/tmp/scan.json'));sys.exit(0 if d['total_threats']==0 else 1)"; then
echo "[safe] публикуем в S3..."
aws s3 cp "$ARCHIVE" "s3://ruarxive-public/..."
else
echo "[WARNING] угрозы обнаружены, проверить вручную"
cat /tmp/scan.json
exit 2
fi

Сценарий 2. CI/CD для ежедневных архивов​

# Каждое утро — проверка вчерашних архивов
0 6 * * * cd /opt/ruarxive && warc-safe scan /data/archives/$(date -d 'yesterday' +%Y-%m-%d)/*.warc.gz --csv > /var/log/warc-safe/daily.csv

Сценарий 3. Real-time на загрузке в pywb​

Демонстрирует интеграцию с pywb через webhook после успешной валидации:

warc-safe scan archive.warc.gz \
--json \
--on-success "wb-manager add my-coll archive.warc.gz" \
--on-threat "echo 'THREAT FOUND' | mail -s 'WARC threat' [email protected]"

Отчёт и алертинг​

Формат отчёта​

{
"filename": "archive.warc.gz",
"scanned_at": "2026-11-09T12:00:00Z",
"summary": {
"total_records": 12345,
"scanned_records": 11000,
"skipped_records": 1345,
"threats_found": 3,
"scan_duration_seconds": 90
},
"findings": [
{
"url": "https://infected-site.example/payload.html",
"threat_type": "virus",
"engine": "clamav",
"signature": "Win.Test.Eicar",
"confidence": 1.0,
"warc_record_id": "<urn:uuid:abc>"
},
{
"url": "https://example.com/nsfw/image.jpg",
"threat_type": "nsfw-image",
"engine": "nsfwjs",
"category": "porn",
"confidence": 0.87,
"warc_record_id": "<urn:uuid:def>"
}
]
}

Алертинг​

# Email при обнаружении угроз
warc-safe scan archive.warc.gz --csv | \
awk -F, 'NR>1 && $3>0 {print}' | \
mail -s "WARC-Safe: $ARCHIVE — угрозы найдены" [email protected]

Точность и false positives​

ТипТочностьFalse positive rate
ClamAV~95 % известных угроз< 0.1 %
NSFW (NSFWJS)~90 % очевидных случаев~3–5 % (фото искусства, медицина)

Что делать с false positives:

  • Пометить вручную и сохранить.
  • Использовать tag вместо удаления.
  • Настроить threshold для NSFW (выше — меньше false positives).

Когда использовать​

✅ Подходит:

  • Публичные веб-архивы перед публикацией.
  • Публичные репозитории WARC (Academic Torrents, IA).
  • Корпоративные коллекции для внутренней безопасности.
  • OSINT-архивы при работе с непроверенным контентом.
  • Демо на конференциях — гарантия, что не покажут вредонос.
  • Compliance (GDPR, COPPA) — доказательство должной проверки.

❌ Не подходит:

  • Малые приватные архивы — overhead не оправдан.
  • Полная замена модерации — это дополнение к модерации, не замена.
  • Анализ видеофайлов — нужны специализированные инструменты.
  • Realtime per-page — это batch-инструмент.

Юридический аспект​

[!TIP] Проведение антивирусной и NSFW-проверки показывает должную осмотрительность (due diligence) архиватора. Это критично для публичных архивов в случае претензий правообладателей или провайдеров.

Ресурсы​

Связанные материалы​