Защита от атак через кэш

Workbox предоставляет ряд инструментов для управления кэшем в сервис-воркере, однако неправильная конфигурация кэша может стать вектором атак. Основные угрозы включают подмену ресурсов, атаки повторного воспроизведения (replay attacks) и кэш-перенаправления.

Валидация и контроль версий ресурсов

Workbox позволяет использовать стратегии кэширования, такие как CacheFirst и NetworkFirst. Для защиты важно не только выбирать стратегию, но и контролировать версию ресурсов:

workbox.precaching.precacheAndRoute([
  { url: '/index.html', revision: '12345' },
  { url: '/main.js', revision: '67890' },
]);
  • revision — уникальный хэш версии ресурса, обеспечивающий, что устаревшие файлы не будут подставлены из кэша.
  • При изменении файла следует обновлять revision, иначе пользователи могут получать старые версии скриптов, что создаёт уязвимость для атак с подменой кода.

Использование политик CORS и безопасного кэширования

Ресурсы, получаемые через сторонние источники, требуют строгой проверки. Workbox позволяет задать фильтры для кэширования:

workbox.routing.registerRoute(
  ({url}) => url.origin === 'https://trusted.cdn.com',
  new workbox.strategies.CacheFirst({
    cacheName: 'trusted-resources',
    plugins: [
      new workbox.expiration.ExpirationPlugin({
        maxEntries: 50,
        maxAgeSeconds: 7 * 24 * 60 * 60, // 1 неделя
      }),
      new workbox.cacheableResponse.CacheableResponsePlugin({
        statuses: [0, 200],
      }),
    ],
  })
);
  • CacheableResponsePlugin ограничивает кэш только успешными ответами (200) и ответами без статуса (0), что предотвращает сохранение ошибок или перенаправлений.
  • ExpirationPlugin предотвращает бесконтрольный рост кэша и снижает риск хранения устаревших уязвимых файлов.

Контроль обновлений и стратегия stale-while-revalidate

Стратегия StaleWhileRevalidate позволяет отдавать пользователю кэшированную версию, одновременно проверяя обновления на сервере. Для безопасности важно настроить фильтрацию обновлений:

workbox.routing.registerRoute(
  ({request}) => request.destination === 'script',
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'js-cache',
    plugins: [
      new workbox.cacheableResponse.CacheableResponsePlugin({
        statuses: [200],
      }),
    ],
  })
);
  • Отбрасываются все ответы с ошибками, что предотвращает загрузку вредоносного кода из кэша.
  • При каждом обновлении можно добавить проверку цифровой подписи или хэша ресурса, чтобы гарантировать целостность.

Защита от атак повторного воспроизведения

Атаки повторного воспроизведения возможны, если устаревший кэш подставляется в критические запросы, например, формы или JSON-API. В Workbox для защиты используются фильтры по HTTP-методу и заголовкам:

workbox.routing.registerRoute(
  ({request}) => request.url.endsWith('/api/data') && request.method === 'GET',
  new workbox.strategies.NetworkFirst({
    cacheName: 'api-cache',
    plugins: [
      new workbox.expiration.ExpirationPlugin({
        maxAgeSeconds: 60, // кэшировать только 1 минуту
      }),
    ],
  })
);
  • Использование NetworkFirst гарантирует, что всегда будет проверка актуальности данных.
  • Короткий срок жизни кэша предотвращает возможность использования устаревших ответов для повторных атак.

Защита от кэш-перенаправлений

Проблема возникает, когда кэш перезаписывает URL с вредоносным редиректом. Workbox позволяет ограничить кэширование редиректов:

new workbox.cacheableResponse.CacheableResponsePlugin({
  statuses: [0, 200],
})
  • Любые 3xx ответы не кэшируются, что предотвращает подмену маршрутов.
  • В сочетании с контролем версий ресурсов это снижает риски атак через поддельные маршруты.

Рекомендации по безопасности

  1. Использовать только проверенные источники: кэширование сторонних ресурсов должно быть строго ограничено.
  2. Регулярно обновлять revision: любые изменения файлов должны сопровождаться изменением версии.
  3. Ограничивать время жизни кэша критических данных: особенно для API и динамического контента.
  4. Применять фильтры кэшируемых ответов: сохранять только успешные статусы и проверять заголовки.
  5. Верифицировать ресурсы через хэши или цифровую подпись: это исключает возможность подмены кода через кэш.

Эти методы обеспечивают многоуровневую защиту кэша и предотвращают распространённые виды атак на сервис-воркеры при работе с Workbox.