# Небезопасная конфигурация Приложение уязвимо если: - среда, где развернуто приложения работает с настройками из "коробки" - включены неиспользуемые функции в работе приложения - в приложении используются учетные записи по-умолчанию со стандартными паролями - отчеты об ошибках показывают информацию о версии и используемом софте - отключены функции защиты после проведения обновления систем - фреймворки и системы веб серверов не настроены в соответствии с безопасными рекомендациями - не производится ревью заголовков безопасности на используемые значения - фрагменты приложения не обновляются и содержат известные уязвимости ## Последствия эксплуатации От получения доступа к конфигурационным файлам приложения до полной компрометации сервера. Приложение само по себе может быть написано без единой ошибки, но за счет отсутствующих настроек и выполнения пунктов предыдущего раздела, может быть уязвимо. ## Основные проблемы администрирования и разработки, приводящие к уязвимостям - оставленные включенными интерфейсы отладки - допущены ошибки в конфигурации веб-сервера - допущены ошибки в конфигурации заголовков из фреймворка (либо используются значения по-умолчанию) ## Заголовки безопасности: ### X-Frame-Options Заголовок отправляется от сервера и используется для того чтобы браузер рендерил, либо нет, данные в тегах **\<frame\>, \<iframe\>, \<embed\>** или **\<object\>**.Основная задача заголовка не дать реальзиоваться click-jacking атакам. Основной принцип таких атак это добавление контента другого ресурса на страницу пользователя. Конечно же работать этот заголовок будет, если у пользователя браузер поддерживает его. Проверить поддерживается ли заголовок можно, например [тут](https://caniuse.com/?search=x-frame-options). Возможные значения: - **deny** - все контроллируемые теги не будут рендериться браузером - **sameorigin** - будут рендериться только те теги, которые попали на страницу с того же origin ::: warning X-Frame-Options внутри \<meta\> элемента не будут использоваться для работы современного браузера, нужно передавать их только в виде заголовка. ::: ### Strict-Transport-Security Заголовок используется для того чтобы настроить безопасное шифрованное соединение, которое будет сложно подвергунть атаке MiTM и down grade атаке. У заголовка могут быть следующие значения: - **max-age=\<expire-time\>** - время в секундах, обычно указывают порядка 3х лет - **includeSubDomains** - дополнительный параметр, применяет правила ко всем поддоменам - **preload** - когда используется max-age директива должна быть установлена значением минимум 1 год, так же должна быть директива includeSubDomains. Данная фича поддерживается google и не является частью спецификации. Проверить preload можно [тут](https://hstspreload.org/?domain=ya.ru). ### X-Content-Type-Options Заголовок, который так же проставляет сервер для браузера. Создан для того чтобы сообщить браузеру, что передаваемые данные будут в типе **MIME**, который прописан в заголовке **Content-Type**. Используется для того чтобы нельзя было подменить тип данных, которые передаются. Потому что в противном случае браузер начнет выполнять команды, которые находятся в данных. Впервые был внедрен в IE. ### Referrer-Policy Заголовок регулирует сколько информации о refer нужно добавить в запрос. Значения директивы: **no-referrer** - не включать никакой информации **no-referrer-when-downgrade** - отправить **origin**, путь отправлять при условии, что меняется протокол по правилам - **(HTTP→HTTP, HTTP→HTTPS, HTTPS→HTTPS)**. Не отправлять заголовок, если протокол меняется по правилам - **(HTTPS→HTTP, HTTPS→file).** **origin** - отправлять только origin **origin-when-cross-origin** When performing a same-origin request to the same protocol level (HTTP→HTTP, HTTPS→HTTPS), send the origin, path, and query string. Send only the origin for cross origin requests and requests to less secure destinations (HTTPS→HTTP). **same-origin** Send the origin, path, and query string for same-origin requests. Don't send the Referer header for cross-origin requests. **strict-origin** Отправлять отлько origin если протокол сохраняется - (HTTPS→HTTPS). Не отправлять заголовок Referer если будет работать правило - (HTTPS→HTTP). **strict-origin-when-cross-origin (default)** Отправлять origin, путь, и строку запроса при взаимодействии с тем же origin. Для кросс origin взаимодействия отправлять данные только если работа происходит по правилам - (HTTPS→HTTPS). Не отправлять заголовок если понижают безопасность канала Referer (HTTPS→HTTP). ## Примеры уязвимостей В большинстве случаев уязвимости данного типа не встречаются по причине только отсутствия заголовка при использовании приложения. Могут быть ситуации, когда в приложении есть релевантная для заголовка уязвимость, и он не включен. Самый распространенный пример - XSS. Об особенностях работы бразуеров и том как можно использовать параметры заголовков чтобы управлять поведением браузера, можно прочитать [тут](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) ## Способы защиты - постоянно проводить аудит параметров, которые используются для конфигурации заголовков