Security Flashcards
Что такое CORS?
CORS - это Cross-Origin Resource Sharing, браузерный механизм обеспечения безопасности загрузки данных от сторонних хостов.
По умолчанию браузера разрешает все запросы в рамках текущего хоста.
Если сайт совершает запрос к серверу на стороннем хосте, то сервер должен ответить с заголовками, которые содержат правила обработки ответа.
Для проверки перед отправкой основного запроса браузер отправляет prefligh-запрос OPTIONS с заголовками.
~~~
OPTIONS /url HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
~~~
Ответ сервера:
~~~
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 86400
~~~
Какие применяются заголовки запроса OPTIONS?
Браузер автоматически отправляет заголовки:
-
Access-Control-Allow-Origin: <origin> | *
Разрешенные источники.
Необходимо указывать<origin>
для запросов с учетными данными. -
Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header
Разрешенные хедеры для обработки браузером. -
Access-Control-Max-Age: <delta-seconds>
Разрешенная длительность кеширования результата preflight. -
Access-Control-Allow-Credentials: true
Разрешение запросов с учетными данными. -
Access-Control-Allow-Methods: <method>[, <method>]*
Разрешенные методы запросов. -
Access-Control-Allow-Headers: <field-name>[, <field-name>]*
Разрешенные хедеры запросов.
Какие применяются заголовки ответа OPTIONS?
Origin: <origin>
Access-Control-Request-Method: <method>
Access-Control-Request-Headers: <field-name>[, <field-name>]*
Какие применяются заголовки обеспечения безопасности?
-
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains; preload
Запрещает получение доступа к сайту не через HTTPS. -
X-Frame-Options: DENY | SAMEORIGIN
Запрещает сайту быть загруженным внутри IFrame вне источника. -
X-Content-Type-Options: nosniff
Запрещает запрос, если тип ресурса не совпадает с MIME-типом. -
referrerPolicy: strict-origin-when-cross-origin
Указывает возможность передачи информации об источнике перехода.
Как передать авторизационные данные?
Авторизационные данные возможно передать через заголовок Authorization. Стандартом считается значение Bearer <token>
.
Также token принято передавать через cookie.
Что такое CSP?
CSP - Content Security Policy, заголовок Content-Security-Policy
, который указывает разрешения для контента различных типов.
1. Fetch-директивы. Разрешенные источники ресурсов. Например, script-src, img-src и др. В значении указывается источник, hash-сумма и nonce-значение.
2. Директивы документа.
3. Директивы навигации.
Что такое JWT?
JWT - JSON Web Token, стандарт для обмена информацией между элементами системы, обычно клиентом и сервером.
Каждый JWT подписывается, чтобы гарантировать, что содержание не может быть изменено клиентом или вредоносным агентом.
Токен нужен для проверки разрешения для получения данных (авторизации доступа) клиента сервером.
Какова структура JWT?
JWT состоит из трех частей:
1. Заголовок (Header) состоит из дух частей:
- Алгоритм шифрования токена
- Тип токена. Обычно JWT
Например:
json { "alg": "HS256", "type": "JWT" } ~~~ 2. Нагрузка (Payload) содержит JSON Например:json
{
“sub”: “1234567890”,
“name”: “John Joe”,
“admin”: true,
“iat”: 13353443234234
}
~~~
Стандартные свойства, применяемые в JWT:
- iss - инициатор (issuer)
- sub - субъект (subject), идентификатор пользователя
- aud - аудитория (audience), идентификатор приложения или идентификатор API
- exp - время устаревания (expiration)
- nbf - не ранее времени (not before)
- iat - дата создания
- jti - идентификатор токена (JWT ID)
Возможно использование любых свойств, которые помогут идентифицировать пользователя.
3. Подпись (Signature) строка, которая генерируется для проверки правдивости передаваемого Payload.
Как создается JWT-токен?
- Создание Payload
- Генерация ключа подписи
- Создание Header
- Создание подписи:
- Шифрование Payload в Base64
- Шифрование Header в Base64
- Объединение в строку
${Header}.${Payload}
- Генерация Signature по объединенной строке
- Шифрование Signature в Base64
- Объединение в строку
${Header}.${Payload}.${Signature}
Как проверяется JWT-токен?
- Получение Header
- Расшифровка Header из Base64
- Проверка Header
- Отказ при неверном Header
- Создание подписи:
- Генерация Signature по
${Header}.${Payload}
- Шифрование Signature в Base64
- Генерация Signature по
- Проверка равенства сгенерированной и полученной подписей
- Отказ при неравенстве подписей
- Расшифровка Payload
- Отказ при превышении текущего времени “exp”
Какие плюсы и минусы JWT?
Плюсы:
1. Защищенность от модификации с помощью подписи
2. Хранение токена только на клиенте, отсутствует необходимость обращаться с базе данных с целью проверки клиента
3. Быстродействие за счет отсутствия лишних запросов в базе данных
Минусы
1. Невозможно отозвать токен, пока он не устареет.
Необходимо создание черных списков токена, что лишает токен достоинств быстродействия.
Лучшим решением будет создание связки “access” и “refresh” для обращения токенов.
2. Привязанность к ключу подписи влечет за собой кражу данных всех клиентов при его обнародовании.
Как работает обращение токенов?
Для каждого клиента создается пара токенов: прозрачный долгосрочный refresh-токен и приватный краткосрочный access-токена.
Когда пользователь совершает попытку получения доступа к ресурсу, он должен отослать access-токен с каждым запросом.
Когда access-токен устаревает, клиент использует refresh-токен и посылает запрос к сервису авторизации, чтобы получить новый access-токен и новый refresh-токен.
При необходимости отзыва доступа у клиента внедряется проверка на случай устаревания refresh-токена.
Какие существуют варианты храниния токена на клиента? Какие плюсы и минусы?
- Cookie.
Сервер авторизации записывает access- и refresh-токены в недоступном для чтения виде (Http-Only), а также запрещает отсылать такой Cookie вне HTTPS с флагом secure=true и вне контекста с флагом SameSite=Strict.
Сервер автоматически производит ротацию токенов в Cookies при обращении к сервер авторизации.
Для решения такой проблемы возможно запрограммировать редиректы между разными хостами и сервисами авторизации для получения токенов по всем хостам.
Для отправки токена возможно использование флага SameSite=None во и параметра credentials: ‘include’ в запросе в новых браузерах. - Local Storage
Хранение в локальном хранилище токена приводит к вероятности хищения данных в случае внедрения вредоносного кода (XSS-атаки), например, установки вредоносного расширения в браузер.
Возможно частично защититься от внедрения с помощью Content Security Policy, которые гарантируют запуск только подписанного кода. Тем не менее, чтение данных из Local Storage теоретически возможно в неофициальных версиях браузеров. - Session Storage
Действует аналогично Local Storage, но данные стираются при закрытии вкладки. - Память браузера
С целью получения возможностей доступа по access-токен к другим хостам и сохранения защиты от полной кражи токенов возможно хранение access-токена в памяти или Session Storage, а refresh-токена в Cookies.
Какие существуют способы атаки?
- XSS - Cross-Site Scripting.
Атака через внедрение вредоносного кода в JavaScript для кражи секретных данных.
Три варианта атаки:- Stored XSS.
Добавление кода в поле, которое сохранит код.
В дальнейшем этот код будет загружен другими пользователями вместе с полем.
Например, доска объявлений.
Для защиты необходимо проверять данные на промежуточном слое перед сохранением и/или отправкой.
На клиентской стороне необходимо экранировать опасные символы перед отправкой или внедрением на страницу, подписывать ресурсы через CSP, хранить секретные данные в HttpOnly-куки. - Reflected XSS.
Браузер исполняет вредоносный код в ходе обработки ответа HTTP.
Код из ссылки или адресной строки попадают на страницу и исполняются без ведома пользователя.
Для защиты необходимо проверять данные на промежуточном слое перед сохранением и/или отправкой.
На клиентской стороне необходимо экранировать опасные символы перед внедрением на страницу, подписывать ресурсы через CSP, хранить секретные данные в HttpOnly-куки. - DOM XSS.
Браузер исполняет код в результате внедрения на страницу HTML-элемента.
Например, внедрение тега с невалидным src для вызова ошибки и атрибутом onerror для исполнения вредоносного кода.
Для защиты необходимо использовать безопасные источники для записи в DOM.
На клиентской стороне необходимо экранировать опасные символы перед внедрением на страницу, подписывать ресурсы через CSP, хранить секретные данные в HttpOnly-куки.
- Stored XSS.
- CSRF - Cross-Site Request Forgery
Атака через вызов методов взаимодействия с API без ведома пользователя со стороннего ресурса.
Защититься можно с помощью отправки CSRF-токена при выполнении запроса на изменение, либо необходимо использовать защищенные куки. - Перехват траффика.
Атака с помощью подделки запросов или ответов HTTP.
Как реализовать CSRF-токен?