Визуальный ML-детектор PhishIntention показывает 100% accuracy на бенчмарках - пока на фишинговую страницу не добавляют пятисекундную задержку рендеринга логотипа. После этого detection rate падает до нуля. Не до 80%, не до 30% - до абсолютного нуля. Пять строк CSS и JavaScript ломают state-of-the-art pipeline, на который потрачены годы исследований. Работа Apruzzese et al., принятая на IEEE European Symposium on Security and Privacy, впервые показала: целый класс антифишинговых ML-систем архитектурно уязвим к тривиальной timing-атаке. Русскоязычных разборов техники delayed rendering phishing не существует - материалы по обходу ML-детекторов фишинга в рунете описывают атаки на уровне URL-признаков, HTML-содержимого или adversarial perturbations пикселей, но ни один не рассматривает атаки на временно́е окно визуального pipeline детектирования. Разберёмся, как это работает и почему фикс не так очевиден, как кажется.
Как визуальные ML-детекторы фишинга принимают решение
Современные системы обнаружения фишинговых страниц - PhishPedia, PhishIntention, VisualPhishNet - работают по одному архитектурному принципу. Pipeline сводится к трём шагам, и каждый критичен для понимания уязвимости.Шаг 1: захват скриншота. Детектор открывает целевую страницу в headless-браузере (Chromium через Puppeteer/Playwright или системный API рендеринга) и делает снимок экрана через фиксированный интервал после начала загрузки. В PhishIntention этот интервал - 2 секунды, захардкожено в коде. Headless-браузер выполняет JavaScript, но не ждёт завершения всех асинхронных операций, таймеров и отложенных анимаций. Просто щёлкает снимок и идёт дальше.
Шаг 2: визуальное сравнение. Скриншот передаётся ML-модели, которая извлекает ключевые визуальные элементы. В PhishIntention pipeline состоит из нескольких компонентов: layout detector определяет позицию логотипа и формы ввода учётных данных, затем Siamese network вычисляет visual similarity score между извлечённым логотипом и эталонным набором (reference list) из 277 известных брендов. Под капотом - свёрточные нейронные сети (CNN) для feature extraction и cosine similarity для финального сравнения.
Шаг 3: верификация домена. Если визуальное сходство с одним из брендов в reference list превышает порог, детектор проверяет: совпадает ли домен страницы с легитимным доменом этого бренда. Несовпадение → фишинг. Если визуального совпадения ни с одним брендом не найдено - страница считается легитимной (benign), чтобы минимизировать false positive rate.
Подход работает против стандартного фишинга: атакующий клонирует страницу PayPal на домене
paypa1[.]com, детектор распознаёт логотип PayPal, видит несовпадение домена → фишинг. Против визуальных детекторов не помогают даже adversarial ML-пертурбации (imperceptible pixel-level modifications): они либо не переносятся из feature-space в problem-space (реальный HTML/CSS), либо заметны человеческому глазу.Вся конструкция держится на одном допущении: снимок экрана корректно отражает содержимое страницы. Допущение оказалось ложным.
Архитектурная уязвимость: timing gap между снимком и полной отрисовкой
По данным Apruzzese et al., PhishIntention захватывает скриншот через 2 секунды после начала загрузки. Параллельное исследование (Csontos, 2021) установило, что среднее время полной загрузки веб-страницы - 7.2 секунды. Разница в 5.2 секунды - timing gap, в который атакующий может целенаправленно отложить отрисовку критических визуальных элементов.[Применимо: целевой фишинг (spearphishing-кампании); среда - headless-browser crawlers визуальных ML-детекторов; внешняя атака]
Сценарий эксплуатации по шагам:
- Детектор открывает фишинговую страницу в headless-браузере
- Через 2 секунды делает скриншот
- На скриншоте отсутствуют ключевые элементы - логотип, формы ввода, брендинг
- ML-модель не находит совпадений с reference list → нет brand match
- Страница маркируется как benign (легитимная)
- Через 5–7 секунд все элементы полностью отрисовываются для реального пользователя в обычном браузере
- Пользователь видит полноценный клон целевого бренда и вводит учётные данные
Систематический обзор литературы (SLR), проведённый авторами как мотивационное исследование (RQ0), установил: ни одна из предшествующих публикаций по adversarial robustness визуальных фишинг-детекторов не учитывала timing-атаки. Все работы предполагали, что скриншот захватывается корректно, и фокусировались на двух направлениях: (a) видимые манипуляции - изменение цвета, шрифтов, позиции логотипа; (b) imperceptible adversarial perturbations через стандартные adversarial ML-методы (FGSM, PGD). Timing-вектор оставался за пределами threat model всех предыдущих работ. Никто просто не подумал, что атакующий может сыграть на секундомере.
Две стратегии отложенного рендеринга
Исследование предложило две практические стратегии delayed rendering. Обе реализуются в problem-space (HTML/CSS/JavaScript), работают в black-box режиме (атакующий не знает параметров детектора) и не требуют серверной логики.Curtain effect: постепенное раскрытие сверху вниз
Curtain effect - техника, при которой визуальный элемент (логотип, фоновое изображение) загружается сразу в DOM, но отображается пользователю постепенно, «разворачиваясь» сверху вниз. Название - по аналогии с театральным занавесом.
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Оценка воздействия: от полной детекции к полному обходу
Центральный экспериментальный результат: state-of-the-art визуальные детекторы полностью побеждены техниками delayed rendering.PhishIntention - один из наиболее продвинутых визуальных детекторов, комбинирующий layout detection, logo identification, credential page classification и domain verification - показал detection rate 100% на стандартном бенчмарке без evasion. После применения curtain effect detection rate упал до 0%. Авторы характеризуют это как «completely defeated». Не «снизилась эффективность» - полное поражение.
Это не adversarial perturbation и не feature engineering attack. Это problem-space атака, которая эксплуатирует архитектурное ограничение - фиксированный таймаут захвата скриншота. Атака не модифицирует ML-модель, не требует знания весов или архитектуры нейронной сети, не создаёт артефактов в HTML/DOM для альтернативных feature extractors. Авторы опубликовали все ресурсы (код, данные, воспроизводимые эксперименты) в открытом доступе.
Контекст угрозы: по данным Verizon DBIR 2025, фишинг - вектор initial access в 36% подтверждённых инцидентов. IBM X-Force Threat Intelligence Index 2025 фиксирует, что генерация фишинговых писем с помощью GenAI происходит в 11.4 раза быстрее при сопоставимом качестве. CrowdStrike Global Threat Report 2025 отмечает удвоение вредоносного использования GenAI для социальной инженерии и фишинга в 2024 году. Техника, которая за 5 строк CSS полностью обнуляет визуальный pipeline детекции - не академическое упражнение, а операционная проблема.
Реакция пользователей: замечают ли люди задержку
Исследование включало user study - участникам демонстрировали фишинговые страницы с delayed rendering и без него.Результат: конечные пользователи не смогли надёжно идентифицировать «пертурбации». Curtain effect и pixelation воспринимались как стандартная загрузка страницы. Люди привыкли к прогрессивной загрузке контента - lazy loading изображений, skeleton screens, progressive JPEG, поэтапная отрисовка SPA-приложений. Delayed rendering органично вписывается в эти паттерны.
Получается двойной удар по обоим уровням защиты:
- Machine: ML-детектор не видит ключевых визуальных элементов в момент анализа
- Human: пользователь воспринимает задержку как норму, не как индикатор угрозы
Место в цепочке атаки и маппинг MITRE ATT&CK
Delayed rendering занимает специфическую позицию в kill chain - это evasion-слой на этапе initial access. Техника не самостоятельна: она встраивается в существующую фишинговую инфраструктуру и усиливает её, снимая один из слоёв защиты.Полная цепочка:
- Подготовка инфраструктуры: атакующий разворачивает фишинговую страницу - клон целевого бренда (PhishKit, ручная вёрстка) или MitM-прокси (EvilGinx2 для reverse proxy phishing)
- Добавление evasion-слоя: в HTML/CSS/JS внедряется delayed rendering с задержкой, превышающей таймаут скриншота целевого детектора (5+ секунд для обхода PhishIntention)
- Доставка ссылки: Phishing (T1566, Initial Access) → Spearphishing Link (T1566.002)
- Evasion: визуальный ML-детектор захватывает скриншот → не обнаруживает фишинг → страница не блокируется
- Взаимодействие пользователя: Malicious Link (T1204.001, Execution) - пользователь переходит по ссылке, видит полностью отрисованную фишинговую страницу
- Credential harvesting: пользователь вводит учётные данные
- Post-exploitation: использование похищенных credentials → lateral movement, persistence
| Техника ATT&CK | ID | Тактика | Роль в атаке |
|---|---|---|---|
| Phishing | T1566 | Initial Access | Общий вектор доставки |
| Spearphishing Link | T1566.002 | Initial Access | Метод доставки ссылки |
| Time Based Checks | T1497.003 | Defense Evasion, Discovery | Ядро evasion - задержка рендеринга |
| Obfuscated Files or Information | T1027 | Defense Evasion | Визуальная обфускация содержимого |
| Impair Defenses | T1562 | Defense Evasion | Результат: ML-детектор не срабатывает |
Наиболее точный маппинг для ядра техники - T1497.003 (Time Based Checks): атака эксплуатирует временну́ю разницу между моментом анализа (2 секунды) и моментом полной отрисовки (7+ секунд). По сути, это sandbox evasion: детектор «видит» страницу в момент, когда она ещё не готова. Тот же принцип, по которому малварь спит 10 минут перед выполнением payload - только здесь спит не код, а визуал.
Контрмеры и слепые зоны визуальных ML-детекторов
Delayed rendering атакует исключительно screenshot-based визуальные ML-детекторы. Другие классы антифишинговых систем не подвержены:| Класс детектора | Подвержен delayed rendering | Причина |
|---|---|---|
| URL-based ML (анализ URL-признаков) | Нет | Не использует скриншоты |
| HTML feature extractors | Нет | Анализирует DOM, не визуал |
| Blocklist/reputation (Safe Browsing) | Нет | Проверяет домен/URL по спискам |
| Email sandbox (Proofpoint TAP) | Частично | Зависит от таймаута sandbox |
| Визуальные ML-детекторы | Да | Зависят от скриншота |
| Комбинированные системы | Частично | Визуальный слой обходится, остальные - нет |
По конкретным продуктам:
- PhishIntention (таймаут 2с) - экспериментально подтверждено: 100% → 0% detection rate. Полный разгром.
- PhishPedia - архитектурно аналогичен PhishIntention (screenshot → logo detection → domain check), уязвим по дизайну
- VisualPhishNet - аналогичный pipeline, уязвим
- Google Safe Browsing - комбинированный подход (URL reputation, safe browsing lists, ML-классификация), визуальный анализ не единственный слой - delayed rendering не обнуляет всю систему, но ослабляет один из компонентов
- Microsoft Defender SmartScreen - аналогично: комбинированный подход снижает критичность обхода визуального компонента
Multiple screenshots. Захват нескольких скриншотов с разными интервалами (2с, 5с, 10с) и сравнение. Существенное изменение содержимого страницы между снимками - индикатор delayed rendering. Ограничение: кратно увеличивает время анализа и вычислительную нагрузку. Когда краулер обрабатывает тысячи URL в час, утроение числа скриншотов может оказаться неприемлемым.
DOM mutation monitoring. Отслеживание изменений в DOM после
DOMContentLoaded. Появление новых визуальных элементов через несколько секунд - подозрительный паттерн. Ограничение: легитимные сайты активно используют lazy loading и dynamic content injection - высокий false positive rate. Попробуйте отличить delayed rendering от обычного React-приложения, которое подтягивает данные через API.Browser extension. Авторы предложили расширение для браузера, которое без обращения к внешним сервисам предупреждает пользователя о потенциальном фишинге, мониторя визуальные изменения страницы после загрузки. Провели оценку производительности предложенного решения.
Фундаментальная проблема: любой фиксированный таймаут может быть превышен атакующим. Детектор увеличивает таймаут до 10 секунд - атакующий устанавливает задержку 15 секунд. Гонка вооружений, в которой атакующий всегда на шаг впереди, потому что ему достаточно изменить одну цифру в
setTimeout. Единственный теоретически надёжный подход - event-driven pipeline, который ожидает стабилизации rendering tree (отсутствие визуальных изменений в течение N миллисекунд). Но и он уязвим к баннерам, анимациям и динамическому контенту, которые не дают зафиксировать «стабильное» состояние.Комбинация визуального анализа с URL-based, HTML-based и reputation-based методами снижает критичность обхода одного слоя - это согласуется с OWASP A09:2021 (Security Logging and Monitoring Failures) и с принципом defense in depth. Ни один single-layer подход к детекции фишинга не может быть надёжным; delayed rendering демонстрирует это на конкретном примере.
Весь класс визуальных ML-детекторов фишинга построен на допущении, которое до этого исследования никто не проверял: «скриншот отражает реальное содержимое страницы». Это не баг конкретной реализации PhishIntention - это архитектурный дефект, заложенный в фундамент подхода. За последние годы ни одна из значимых работ по adversarial robustness визуальных детекторов не рассматривала timing-вектор, потому что исследователи фокусировались на модификации визуального контента (adversarial examples, logo perturbations, font changes), принимая как данность, что контент присутствует в момент анализа.
Здесь просматривается закономерность, которая выходит за рамки антифишинга: любая ML-система, принимающая решение на основе моментального снимка динамического объекта, уязвима к манипуляции с временны́м окном этого снимка. Аналогичные timing-атаки потенциально применимы к детекторам вредоносных мобильных приложений (screenshot-based app store scanners), сканерам defacement-ов, мониторам brand impersonation.
Индустрии visual phishing detection придётся ответить на два вопроса в ближайший год-два. Первый: переходить к event-driven pipeline с кратным увеличением latency или принять, что визуальный слой обходится тривиально. Второй: как строить multi-layer detection так, чтобы обход одного слоя не обнулял всю систему - и при этом не раздувать false positive rate до неприемлемых значений.
По данным Verizon DBIR 2025, 68% утечек связаны с человеческим фактором, а delayed rendering атакует одновременно и машину, и человека. Research community этот вызов пока только сформулировала - ответа на него нет. Если вы строите или эксплуатируете антифишинговую систему с визуальным компонентом - проверьте, что происходит с вашим detection rate при задержке рендеринга в 5 секунд. Результат может неприятно удивить.