web-dev-qa-db-ja.com

親のコンテンツセキュリティポリシーを継承するiframe

コンテンツセキュリティポリシーが設定されている親ページがあります。 CSPの主な目的は、XSSを防ぐことではなく、ネットワークアクセスを防ぐことです。このページでは、ユーザーが生成/送信したHTML/CSS/JSを実行する必要があります。 document.writeを使用してユーザーコンテンツをこのiframeに書き込むことにより、iframeでこのユーザーコンテンツを実行しています。

注:私が持っているユーザーコンテンツはサーバーにアップロードまたは存在していませんが、動的に利用できます-なんらかのフォームを使用して言ってください。

また、ユーザーコンテンツには、親ページのCSPと、子iframeによって作成されたすべてのiframeも継承します。

仕様に従ってiframeに適用されるポリシー:

埋め込みリソースのポリシーは、何を埋め込むことができるかを制御します。ただし、埋め込みリソースは、リソースで提供されるポリシー、または埋め込みリソースがグローバルに一意の識別子(またはsrcdocフレーム)の場合は埋め込みリソースのポリシーによって制御されます。

したがって、標準では、親ページはグローバルに一意の識別子ではないため、ポリシーは継承されないことが規定されています。次の理由により、srcdoc iframeを使用したくない

  1. HTMLは非常に大きくなる可能性があります
  2. Srcdocを使用するには、htmlをエスケープする必要があります。srcdocは、信頼性が低く、クリーンではないようです。
  3. ブラウザサポート(エッジ- 検討中

しかし、ひねりがあります:

私がブラウザでこの継承をテストしたところ、cspは実際にはChrome、Safari、Firefoxでは継承されていましたが、Edgeでは継承されていませんでした。これは私にはかなり論理的で正しいようです。

これが私が行ったサンプルテストです:

<html>
<head>
    <!-- CSP just for demo purposes - not the actual csp -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'"/> 
</head>
<body>
    <h1>Parent Content</h1>
    <p style="font-weight: bold; font-family: arial, sans-serif;">
        The image here will be blocked due to CSP (default-src directive). 
        However the iframe's image will not be blocked on Edge since the CSP is not inherited.
    </p>
    <img src="http://www.w3schools.com/html/pic_mountain.jpg"/>
    <script>
        window.addEventListener("DOMContentLoaded", function() {
            // creating the child iframe

            // Some user controlled HTML content.
            var html = "<html><body><h1>Child Content</h1><img src='http://www.w3schools.com/html/pic_mountain.jpg'/></body></html>"; 

            var iframe = document.createElement("iframe");
            iframe.setAttribute("height", "400px");
            iframe.setAttribute("width", "400px");
            document.body.appendChild(iframe); //need to append first to be able to write into the iframe.

            var iframeDoc = iframe.contentWindow.document;
            iframeDoc.open();
            iframeDoc.write(html);
            iframeDoc.close();
        });
    </script>
</body>
</html>

だから、最後に私の質問は:

  1. このCSPの継承をChrome、Firefox、Safariの子iframeに依存できますか? -これはどこにも記載されていません。
  2. エスケープとすべてでsrcdocを使用できるようにするクリーンで信頼できる方法はありますか? srcdocを使用すると、パフォーマンスにどのような影響がありますか?
  3. これを行う他の方法はありますか?

もっと考え:

仕様(およびEdge)がiframeに適用されるCSPを処理すると、XSSを防ぐためにスクリプトの「安全でないインライン」を許可するリスクがさらに高まります。そのため、攻撃者はこのようなdocument.writeを使用して、自分の悪意のあるサイトへのiframeの作成をトリガーすることもできます。 child-src/frame-src 'none'でも、document.writeを使用したiframeの作成を停止しません。これはセキュリティにとって非常に悪いことではありませんか?

11
tapananand

3の場合は、それが存在する可能性があり、他のページ/コンテンツでより厳密なCSPを設定できるようにする必要があります。

https://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/ によると、iframeに特定の権限を与える(または削除する)ことができます。

Iframeサンドボックスはすべてのターゲットブラウザでサポーターのようです: http://caniuse.com/#feat=iframe-sandbox

したがって、純粋に親ページのCSPポリシーに依存するのではなく、適切なサンドボックスを使用してiframeを作成する場合があります。

(私にとって)不明なのは、誰かがiframeのサンドボックスを変更した場合に発生することです

2