Вы когда-нибудь слышали об XSS-атаках, связанных с внедрением (инъекцией) вредоносного кода в DOM (далее — DOM XSS)? Если не слышали, то
Инъекции могут происходить разными способами, например:
TTA позволяет устранить саму причину возникновения проблем, связанных с XSS.
По умолчанию
Во все эти сниппеты легко внедрить вредоносный скрипт или HTML.
Во избежание этого TTA позволяет установить HTTP-заголовок ответа Content-Security-Policy в значение
Включить TTA можно одним из следующих способов:
Директива
Основная идея заключается в передаче специальных объектов вместо строк. DOM поддерживает такую передачу.
Проверка уязвимостей
Для выполнения такой проверки добавьте следующий заголовок ответа:
После этого все нарушения будут отправлены на
Отчет о нарушениях
При обнаружении нарушения доверенных типов, будет отправлен отчет, настроенный с помощью
Это помогает определить, какие строки кода и в каком файле подвержены DOM XSS-атакам.
Устранение нарушений
Существует несколько способов устранения нарушений доверенных типов. Рассмотрим некоторые из них.
Данное правило будет заменять все символы < во избежание создания новых HTML-элементов, возвращая объект политики, содержащий значение правильного типа, в данном случае
При невозможности изменения кода, используемого приложением (например, при получении сторонних библиотек из CDN), можно применять политику по умолчанию:
После устранения всех нарушений применение доверенных типов можно включить так:
Обратите внимание на отсутствие префикса
В данном разделе мы рассмотрели разрешение только тех нарушений, которые связанны с HTML. Однако, TTA позволяет определять нарушения и применять правила к:
К сожалению, поддержка TTA браузерами оставляет желать лучшего. Будем надеяться, что это скоро изменится.
Одним из лучших решений для защиты наших приложений от XSS-атак на стороне клиента на сегодняшний день является использование TTA.
Автор оригинала: Viduni Wickramarachchi
Это может привести к тому, что на стороне клиента будет выполнен посторонний код. Таким образом, на стороне клиента появляется уязвимость безопасности. Злоумышленники используют объекты, позволяющие внедрять вредоносную полезную нагрузку. Вот почему такие атаки называются инъекциями.DOM XSS — это тип атаки на веб-приложение, когда хакер использует полезную нагрузку (payload), которая выполняется как результат модификации DOM в браузере.
Инъекции могут происходить разными способами, например:
- через сеттеры для атрибутов
Element, которые принимают URL со ссылкой на код для загрузки, например,HTMLScriptElement.src - через сеттеры для атрибутов
Element, которые принимают код для выполнения, например,HTMLScriptElement.text - через функции, выполняющие код напрямую, такие как
eval - через URL вида
javascript:
Интерфейс доверенных типов
Команда Google Chrome представила Trusted Types API (далее — TTA) для решения данной проблемы. Основной причиной разработки названного интерфейса является увеличение количества XSS-уязвимостей, основанных на DOM, в сравнении с числом аналогичных уязвимостей на стороне сервера.Как доверенные типы предотвращают DOM XSS-атаки?Это объясняется легкостью реализации и сложностью обнаружения `DOM XSS`.
TTA позволяет устранить саму причину возникновения проблем, связанных с XSS.
По умолчанию
DOM API не является безопасным. Вот несколько примеров:
Код:
eval('foo()');
document.createElement('div').innerHTML = '<foo>';
document.createElement('a').setAttribute('onclick'', 'foo()');
Во избежание этого TTA позволяет установить HTTP-заголовок ответа Content-Security-Policy в значение
trusted-types * для допуска только доверенных типов. Это делает веб-приложение безопасным по умолчанию посредством блокировки опасных инъекций.Включить TTA можно одним из следующих способов:
Код:
Content-Security-Policy: trusted-types;
Content-Security-Policy: trusted-types 'none';
Content-Security-Policy: trusted-types <policyName>;
Content-Security-Policy: trusted-types <policyName> <policyName> 'allow-duplicates';
trusted-types предписывает браузеру создавать неподдающиеся подделке типизированные значения для передачи в приемники данных (sink) DOM вместо строк.Основная идея заключается в передаче специальных объектов вместо строк. DOM поддерживает такую передачу.
Код:
elem.innerHTML = { toString: function() { return "Привет, народ" }};
elem.innerHTML // возвращается "Привет, народ"
Это позволяет приемникам DOM отклонять строки и принимать только совпадающие (matching) типы.`TTA` рекомендует передавать типизированные объекты вместо обычных `JS-объектов`.
Использование доверенных типов
Если вы планируете использовать TTA в своем проекте, то, прежде всего, необходимо определить, где имеются соответствующие уязвимости.Проверка уязвимостей
Для выполнения такой проверки добавьте следующий заголовок ответа:
Код:
Content-Security-Policy-Report-Only: require-trusted-types-for 'script'; report-uri //mysite.com/cspViolations
//mysite.com/cspViolations. Это не повлияет на функциональность приложения.Отчет о нарушениях
При обнаружении нарушения доверенных типов, будет отправлен отчет, настроенный с помощью
report-uri. Например, если в нашем коде имеется innerHTML, отчет будет выглядеть примерно так:
Код:
{
"csp-report": {
"document-uri": "https://mysite.com",
"violated-directive": "require-trusted-types-for",
"disposition": "report",
"blocked-uri": "trusted-types-sink",
"line-number": 20,
"column-number": 12,
"source-file": "https://mysite.com/dashboard.js",
"status-code": 0,
"script-sample": "Element innerHTML <img src=x"
}
}
Устранение нарушений
Существует несколько способов устранения нарушений доверенных типов. Рассмотрим некоторые из них.
- Изменение кода, содержащего уязвимость
el.innerHTML = '<img src=xyz.jpg>' может быть переписан следующим образом:
Код:
el.textContent = '';
const img = document.createElement('img');
img.src = 'xyz.jpg';
el.appendChild(img);
- Использование библиотеки
- Создание политики доверенных типов
- Шаг 1 — создание политики
Код:
if (window.trustedTypes && trustedTypes.createPolicy) {
const escapeHTMLPolicy = trustedTypes.createPolicy('escapePolicy',
{
createHTML: string => string.replace(/\</g, '<')
});
}
TrustedHTML.- Шаг 2 — использование политики
Код:
const escaped = escapeHTMLPolicy.createHTML('<img src=x onerror=alert(1)>');
console.log(escaped instanceof TrustedHTML); // true
el.innerHTML = escaped; // '<img src=x onerror=alert(1)>'
Код:
if (window.trustedTypes && trustedTypes.createPolicy) {
trustedTypes.createPolicy('default', {
createHTML: (string, sink) => DOMPurify.sanitize(string, { RETURN_TRUSTED_TYPE: true })
});
}
Код:
Content-Security-Policy: require-trusted-types-for 'script'; report-uri //mysite.com/cspViolations
-Report-Only по сранению с предыдущим примером.В данном разделе мы рассмотрели разрешение только тех нарушений, которые связанны с HTML. Однако, TTA позволяет определять нарушения и применять правила к:
- HTML
- Script
- URL
- ScriptURL
Преимущества использования доверенных типов
Ниже представлен список преимуществ, предоставляемых использованием доверенных типов в приложении:- уменьшение поверхности для атаки — приложение становится более безопасным
- проверка безопасности приложения, выполняемая во время компиляции и выполнения кода
- обратная совместимость — возможность использования доверенных типов вместо строк
- реализация других решений, связанных с безопасностью, таких как CSP для защиты от XSS на сервере
К сожалению, поддержка TTA браузерами оставляет желать лучшего. Будем надеяться, что это скоро изменится.
Заключение
В настоящее время XSS-атаки, связанные с внедрением вредоносного кода в DOM, являются очень распространенными и их количество растет с каждым днем. Обнаружение таких уязвимостей — задача не из легких.Одним из лучших решений для защиты наших приложений от XSS-атак на стороне клиента на сегодняшний день является использование TTA.
Автор оригинала: Viduni Wickramarachchi