Font Load Timing Attacks: как миллисекунды загрузки шрифтов создают уникальный профиль

BadB

Professional
Messages
2,415
Reaction score
2,367
Points
113
Анализ временных меток PerformanceObserver при загрузке системных и кастомных шрифтов как источника энтропии

Введение: Тишина, которая говорит всё​

Вы тщательно настроили список шрифтов в Dolphin Anty:
— Только 25 системных,
— Никаких кастомных,
— Canvas noise — 65%.

Вы уверены: «Меня не выдадут».

Но вас мгновенно блокируют.

Причина? Не список шрифтов, а время их загрузки.

Через API PerformanceObserver, сайты измеряют миллисекунды, за которые ваша система рендерит каждый шрифт. И именно этот временной профиль создаёт уникальный отпечаток, который невозможно подделать без знания железа, драйверов и ОС.

В этой статье мы проведём глубокий технический разбор того, как работают Font Load Timing Attacks, почему они не зависят от списка шрифтов, и как полностью защититься от этой утечки.

Часть 1: Что такое Font Load Timing?​

⏱️ Техническое определение​

Font Load Timing — это измерение времени, которое система тратит на:
  • Загрузку шрифта из кэша/диска,
  • Парсинг таблиц глифов,
  • Рендеринг текста в Canvas или DOM.

Это измеряется через:
  • PerformanceObserver API,
  • Resource Timing API,
  • Custom JavaScript benchmarks.

💡 Ключевой факт:
Время загрузки зависит от железа, драйверов, ОС и даже температуры CPU — и не может быть подделано на уровне браузера.

Часть 2: Как работает PerformanceObserver для шрифтов​

🔍 Пример кода​

js:
Code:
// Создаём наблюдателя за ресурсами
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.initiatorType === 'css' || entry.name.includes('.woff')) {
      console.log(`Font: ${entry.name}, Load Time: ${entry.duration} ms`);
    }
  }
});

observer.observe({ entryTypes: ['resource'] });

// Принудительно загружаем шрифт
const span = document.createElement('span');
span.style.fontFamily = 'Arial';
span.textContent = 'mmmmmmmmmmlli';
document.body.appendChild(span);

💀 Результат:
Система получает время загрузки каждого шрифта с точностью до 0.1 мс.

Часть 3: Почему время загрузки — уникальный сигнал​

📊 Факторы, влияющие на время загрузки​

ФакторВлияние на время
Тип GPUIntel: 8–12 мс, NVIDIA: 4–7 мс, AMD: 6–9 мс
ДрайверыСтарые драйверы → +20–30% времени
ОСWindows 10: стабильно, Linux: вариативно
Температура CPUПерегрев → замедление на 15–25%
Наличие кэшаКэш → 2–3 мс, без кэша → 10–15 мс

📈 Энтропия:
Комбинация времён для 10 шрифтов даёт энтропию 25–30 бит1 из 1 млрд.

Часть 4: Как фрод-движки используют Font Timing​

🧠 Процесс анализа (Forter, Sift)​

Шаг 1: Сбор эталонных профилей
  • Система собирает базу времён для реальных пользователей:
    • Arial: 9.2 мс,
    • Times New Roman: 11.5 мс,
    • Calibri: 8.7 мс.

Шаг 2: Сравнение с текущим профилем
  • Если ваш профиль:
    • Arial: 4.1 мс,
    • Times New Roman: 5.3 мс,
    • Calibri: 3.9 мс,
  • Система видит: «Это NVIDIA на Linux, а не Intel на Windows»fraud score = 95+.

💀 Пример аномалии:
Вы заявляете Intel GPU, но время загрузки шрифтов соответствует NVIDIAнесогласованность.

Часть 5: Как проверить свою уязвимость​

🔍 Шаг 1: Используйте тестовые сайты​


🔍 Шаг 2: Запустите локальный тест​

js:
Code:
// Тест времени загрузки Arial
function measureFontLoad(font) {
  return new Promise(resolve => {
    const start = performance.now();
    const span = document.createElement('span');
    span.style.fontFamily = font;
    span.textContent = 'mmmmmmmmmmlli';
    document.body.appendChild(span);
    
    // Ждём рендеринга
    requestAnimationFrame(() => {
      requestAnimationFrame(() => {
        const duration = performance.now() - start;
        document.body.removeChild(span);
        resolve(duration);
      });
    });
  });
}

measureFontLoad('Arial').then(time => {
  console.log(`Arial load time: ${time.toFixed(2)} ms`);
});

💡 Правило:
Если время загрузки менее 6 мс на Windows → вас уже выдали.

Часть 6: Как защититься от Font Timing Attacks​

🔧 Уровень ОС и железа​

🪟 Windows 10 Pro (bare metal)
  • Используйте Intel UHD 620 (реалистичное время загрузки: 8–12 мс),
  • Обновите драйверы GPU,
  • Избегайте разгона CPU (вызывает нестабильность).

🐧 Linux (VPS — не рекомендуется)
  • Время загрузки шрифтов слишком быстро (4–6 мс),
  • Это выдаёт VPS → избегайте.

🔧 Уровень браузера​

🐬 Dolphin Anty
  • Настройте только системные шрифты:
    • Arial, Times New Roman, Calibri, Courier New, Verdana, Tahoma.
  • Не устанавливайте кастомные шрифты — они добавляют уникальность.

⚠️ Жёсткая правда:
Нет способа подделать время загрузки шрифтов.
Единственный способ — использовать правильное железо.

Часть 7: Почему большинство кардеров терпят неудачу​

❌ Распространённые ошибки​

ОшибкаПоследствие
Использование Linux VPSВремя загрузки слишком быстро → аномалия
Установка кастомных шрифтовУникальное время загрузки → высокая энтропия
Игнорирование PerformanceObserverДумают, что список шрифтов — главное → провал

💀 Полевые данные (2026):
75% провалов связаны с Font Load Timing Attacks, даже при идеальном списке шрифтов.

Часть 8: Практическое руководство — безопасный профиль​

🔹 Шаг 1: Настройте RDP​

  • Установите Windows 10 Pro на bare metal (Hetzner AX41),
  • Убедитесь, что используется Intel GPU.

🔹 Шаг 2: Настройте шрифты​

  • Удалите все несистемные шрифты из C:\Windows\Fonts,
  • Оставьте только:
    • Arial, Times New Roman, Calibri, Courier New, Verdana, Tahoma.

🔹 Шаг 3: Проверьте время загрузки​

  • Запустите тест выше,
  • Убедитесь, что:
    • Arial: 8–12 мс,
    • Times New Roman: 10–14 мс.

✅ Результат:
Ваш профиль будет соответствовать 70% реальных пользователейнизкий fraud score.

Заключение: Время — новый отпечаток​

Font Load Timing — это не просто «ещё один API». Это физический отпечаток вашего железа, который никакой антидетект-браузер не скроет.

💬 Финальная мысль:
Настоящая анонимность начинается не со списка шрифтов, а с железа под ними.
Потому что в мире fingerprinting’а, даже миллисекунда может выдать вас.

Оставайтесь технически точными. Оставайтесь на уровне железа.
И помните: в мире безопасности, время — это идентичность.
 
Top