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/"