Csrf токен истек что это значит

от admin

Как работает CSRF Token защита: что делать, если CSRF токен истек

CSRF-token — это рабочий способ защититься от CSRF-атак. Даже самый простой способ генерации CSRF-токена обеспечивает надежную защиту. А защитой, как известно, не нужно пренебрегать.

Мы будем очень благодарны

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

Методы защиты от CSRF-атаки

Ознакомиться с самой идеей атаки CSRF можно на классических ресурсах:

Выдержка из ответа на SO:

Причина CSRF кроется в том, что браузеры не понимают, как различить, было ли действие явно совершено пользователем (как, скажем, нажатие кнопки на форме или переход по ссылке) или пользователь неумышленно выполнил это действие (например, при посещении bad.com , ресурсом был отправлен запрос на good.com/some_action , в то время как пользователь уже был залогинен на good.com ).

Как от нее защититься?

Эффективным и общепринятым на сегодня способом защиты от CSRF-Атаки является токен. Под токеном имеется в виду случайный набор байт, который сервер передает клиенту, а клиент возвращает серверу.

Защита сводится к проверке токена, который сгенерировал сервер, и токена, который прислал пользователь.

А что, собственно, защищать?

Если вы пишете свой Web-Сервис в соотвествии со стандартом RFC7231, то методы GET , HEAD , OPTIONS и TRACE являются безопасными: они предназначены только для получения информации и не должны изменять состояние сервера.

Таким образом, защищать необходимо небезопасные методы, к которым относятся: POST , PUT , DELETE , PATCH .

На Habrahabr опубликована статья от Yandex, в которой описано, почему писать свои сервисы нужно, руководствуясь стандартом.

Требования к токену:

  • Уникальный токен для каждой операции
  • Действует единожды
  • Имеет размер, устойчивый к подбору
  • Сгенерирован криптографически стойким генератором псевдослучайных чисел
  • Имеет ограниченное время жизни

На первом MeetUp’е PDUG Тимур Юнусов (руководитель отдела безопасности банковских
систем Positive Technologies
) рассказывал, почему именно такие требования предъявляются к CSRF-Токену и чем грозит пренебрежение ими.

Требования к Web-Сервису и окружению:

Отсутствие XSS уязвимостей

Внедренный злоумышленником скрипт имеет возможность отправлять запрос к серверу от имени пользователя и читать его без каких-либо препятствий.

Таким образом, XSS уязвимости могут быть использованы для получения текущего токена.

Отсутствие malware на машине клиента

Если злоумышленник имеет возможность запускать софт на машине клиента, то он может получить любые данные, имеющиеся в браузере.

Методы защиты

Существует 3 метода использования токенов для защиты web-сервисов от CSRF атак:

    (Statefull) (Stateless) (Stateless)

Synchronizer Tokens

Простой подход, использующийся повсеместно. Требует хранения токена на стороне сервера.

При старте сессии на стороне сервера генерируется токен.

Токен кладется в хранилище данных сессии (т.е. сохраняется на стороне сервера для последующей проверки)

В ответ на запрос (который стартовал сессию) клиенту возвращается токен.

Если рендеринг происходит на сервере, то токен может возвращаться внутри HTML, как, например, одно из полей формы, или внутри <meta> тега.

В случае, если ответ возвращается для JS приложения, токен можно передавать в header (часто для этого используют X-CSRF-Token )

При последующих запросах клиент обязан передать токен серверу для проверки.

При рендере контента сервером токен принято возвращать внутри POST данных формы.

JS приложения обычно присылают XHR запросы с header ( X-CSRF-Token ), содержащим токен.

При получения запроса небезопасным методом ( POST , PUT , DELETE , PATCH ) сервер обязан проверить на идентичность токен из данных сессии и токен, который прислал клиент.

Если оба токена совпадают, то запрос не подвергся CSRF-Атаке, в ином случае — логируем событие и отклоняем запрос.

На выходе имеем:

Защита от CSRF на хорошем уровне

Токен обновляется только при пересоздании сессии, а это происходит, когда сессия истекает

Во время жизни одной сессии все действия будут проверяться по одному токену.

Если произойдет утечка токена, то злоумышленник сможет выполнить CSRF-Атаку на любой запрос и в течение долгого срока. А это не есть хорошо.

Бесплатная поддержка multi-tab в браузере.

Токен не инвалидируется после выполнения запроса, что позволяет разработчику не заботиться о синхронизации токена в разных табах браузера, так как токен всегда один.

Double Submit Cookie

Этот подход не требует хранения данных на стороне сервера, а значит, является Stateless. Используется, если вы хотите уметь быстро и качественно масштабировать свой Web-сервис горизонтально.
Идея в том, чтобы отдать токен клиенту двумя методами: в куках и в одном из параметров ответа (header или внутри HTML).

При запросе от клиента на стороне сервера генерируется токен. В ответе токен возвращается в cookie (например, X-CSRF-Token ) и в одном из параметров ответа (в header или внутри HTML).

В последующих запросах клиент обязан предоставлять оба полученных ранее токена. Один как cookie, другой либо как header, либо внутри POST данных формы.

При получении запроса небезопасным методом ( POST , PUT , DELETE , PATCH ) сервер обязан проверить на идентичность токен из cookie и токен, который явно прислал клиент.

Если оба токена совпадают, то запрос не подвергся CSRF-Атаке, в ином случае — логируем событие и отклоняем запрос.

На выходе имеем:

Stateless CSRF защиту.

Необходимо учитывать, что поддомены могут читать cookie основного домена, если явно это не запрещать (т.е. если cookie установлена на .site.ru , то её могут прочитать как a.site.ru , так и b.site.ru ).

Таким образом, если ваш сервис доступен на домене 3-го уровня, а злоумышленник имеет возможность зарегистрировать свой ресурс на вашем домене 2-го уровня, то устанавливайте cookie на свой домен явно.

Encrypted Token

Так же как и Double Submit, является Stateless подходом. Основная — если вы зашифруете надежным алгоритмом какие-то данные и передадите их клиенту, то клиент не сможет их подделать, не зная ключа. Этот подход не требует использования cookie. Токен передаётся клиенту только в параметрах ответа.

В данном подходе токеном являются факты, зашифрованные ключом. Минимально необходимые факты — это идентификатор пользователя и timestamp времени генерации токена. Ключ не должен быть известен клиенту.

При запросе от клиента на стороне сервера генерируется токен.

Генерация токена состоит в зашифровке фактов, необходимых для валидации токена в дальнейшем.

Минимально необходимые факты — это идентификатор пользователя и timestamp. В ответе токен возвращается в одном из параметров ответа (В header или внутри HTML).

В последующих запросах клиент обязан предоставлять полученный ранее токен.

При получения запроса небезопасным методом ( POST , PUT , DELETE , PATCH ) сервер обязан валидировать токен, полученный от клиента.

Валидация токена заключается в его расшифровке и сравнения фактов, полученных после расшифровки, с реальными. (Проверка timestamp необходима для ограничения времени жизни токена)

Если расшифровать не удалось либо факты не совпадают, считается, что запрос подвергся CSRF-Атаке.

На выходе имеем:

Stateless CSRF защиту

Нет необходимости хранить данные в cookie

О реализации

Давайте генерировать новый токен на каждый запрос, не важно, каким HTTP-методом и с какой целью этот запрос сделан.

Таким образом мы получаем токен, который меняется постоянно.

Конечно, возникает вопрос организации multi-tab работы.

Синхронизация токенов между табами может быть реализована с использованием localStorage и его StorageEvent

Ограничиваем время жизни cookie, которое содержит токен, разумным значением. Например 30 минут.

Читать:
Почему текст отображается некорректно в телефоне

Делаем cookie недоступной из JS (ставим HTTPOnly=true)

Используем TLS для предотвращения MITM

При этом отправляем cookie только по HTTPS (ставим Secure=true)

Размер токена не менее 32 байт.

Генерируем токен криптографически стойким генератором псевдослучайных чисел.

Для этого можно использовать системные функции:

Что еще нужно знать?

Токены — обязательная защита от CSRF.

Проверяйте, но не полагайтесь только на X-Requested-With: XMLHttpRequest

Проверяйте, но не полагайтесь только на заголовки: Host , Origin , Referer

Не передавайте токены в URL

Same Site

Сейчас идет работа над спецификацией атрибута «Same-Site» у cookies (последняя версия на момент написания статьи).

Такой атрибут даст возможность разработчикам явно указывать, что cookie не нужно передавать, если запрос идет с сайта, отличного от того, на котором cookie была установлена. А, значит, у нас появится возможность защищать ресурсы от CSRF без использования дополнительных инструментов.

Ошибка pfSense: Missing or expired CSRF token

CSRF (Cross-Site Request Forgery) – это «межсайтовая подделка запроса» или ещё называют “подделка HTTP-запросов”, также известна как XSRF. Суть атаки заключается в том, что браузер пользователя отправляет сайту значение Cookie, т.е. запрос будет воспринят как исходящий от аутентифицированного пользователя.

В нашем случае надо знать версию pfSense. До версии 2.4.2, веб-интерфейс был уязвим для Clickjacking. Уязвимость имела название “CVE-2017-1000479” и позволяла злоумышленнику выполнить произвольный код с привилегиями root. Поэтому обновляемся.

Если у вас версия pfSense 2.4.2 и выше, то скорее всего вы были авторизованны в веб-интерфейсе администрирования и после работы не вышли.

Missing or expired CSRF token

Form session may have expired, cockies may not be enabled, or possible CSRF-based attack.

Resubmitting this request may put the firewall at risk or lead to unintended behavior.

I undestand this warning and wish to resubmit the form data.

Resubmit Request with New Token

Поэтому не забываем выходит “logout”. Сделать это можно через иконку в виде стрелочки вправо и расположенной в правой, верхней части окна веб-интерфейса.

CSRF Protection Problem and How to Fix it

CSRF Protection Problem and How to Fix it

One day I was working on a feature at work. I had many branches created in JIRA tickets, so I wanted to open a bunch of PRs (Pull Requests) all at once in different tabs.

This is how I usually work – I have a lot of tabs open and this speeds things up, because I don’t need to wait for the next page to load.

But after I’d created the first PR in BitBucket and tried to go on to the next page, I was welcomed with an error message about an invalid CSRF token. This is a common problem with web applications that have CSRF protection.

So in this article you’ll learn what CSRF is and how to fix this error.

Table of contents:

What is CSRF?

CSRF is an acronym for Cross-Site Request Forgery. It is a vector of attack that attackers commonly use to get into your system.

The way you usually protect against CSRF is to send a unique token generated by each HTTP request. If the token that is on the server doesn’t match with the one from the request, you show an error to the user.

Standard CSRF protection

This is one way you can protect against CSRF with a token:

This code uses the fetch API to send and receive a secure token in HTTP headers. On the backed, you should generate the first initial token when the page loads. On the server, on each AJAX request, you should check to see if the token is valid.

The Problem with Tokens

This works fine unless you have more than one tab open. Each tab can send requests to the server, which will break this solution. And power users may not be able to use your application the way they want.

But there is a simple solution to this problem which is cross-tab communication.

Cross-tab Communication Solution

Sysend library

You can use the Sysend library, an open source solution that I’ve created specifically for this purpose. It simplifies cross-tabs communication.

If you want, you can use a native browser API like Broadcast Channel to do the same. More on how to do that later in this article.

But the Sysend library will work for browsers that don’t support Broadcast Channel. It also works in IE (it has some bugs, which is not a surprise). You may also need to support some old mobile browsers. It also has a much simpler API.

This is the simplest example:

Simple example of using base function of sysend library

And this is how you would use this library to fix CSRF protection:

secure_fetch function with CSRF protection using sysend

All you have to do is to send and receive a single message from other tabs when sending the request. And your CSRF protected app will work on many tabs.

And that’s it. This will let advanced users use your app that has CSRF protection when they want to open many tabs.

Broadcast Channel

Here is the simplest possible example of using Broadcast Channel:

Basic usage of Broadcast Channel

So with this simple API you can do the same thing that we did before:

secure_fetch function with CSRF protection using BroadcastChannel

As you can see from the above example, Broadcast Channel doesn’t have any namespace for events. So if you want to send more than one type of event you need to create types of events.

Here is an example of using Broadcast Channel to do more than the CSRF protection fix we’ve discussed so far.

You can synchronize login and logout for your application. If you login into one tab, your other tabs will also sign you in. In the same way, you can synchronize the shopping cart in some e-commerce websites.

Using Broadcast Channel with different type of messages

Conclusion

It’s great if you protect your app against attackers. But keep in mind how people will be using your application, too so you don’t make it unnecessarily hard to use. This applies not only to this particular problem.

The Sysend library is a simple way to communicate between open tabs in the same browser. And it can fix major issues with CSRF protection. The library has more features, and you can check its GitHub repo for more details.

Broadcast Channel is also not that complicated. If you don’t need to support old browsers or some older mobile devices, you can use this API. But if you need to support older browsers, or want to make your code simpler, you use can the sysend library.

If you want to see browser support for Broadcast Channel, you can see Can I Use.

Похожие статьи