V5: エンコーディングとサニタイゼーション
管理目標
この章では、信頼できないデータの安全でない処理に関する、最も一般的な Web アプリケーションセキュリティの弱点に焦点を当てます。これは、信頼できないデータが、関連するインタプリタの構文ルールを使用して解釈され、さまざまな技術的な脆弱性につながります。
現代の Web アプリケーションでは、パラメータ化されたクエリ、自動エスケープテンプレートフレームワークなどのより安全な API を使用することが常に最善でしょう。それ以外には、出力のエンコード/エスケープやサニタイズを注意深く実行することが、アプリケーションのセキュリティにとって重要です。
入力バリデーションは、予期しない危険なコンテンツから保護するための多層防御メカニズムとして機能します。しかし、その主な目的は、入力されるコンテンツが機能上およびビジネス上の期待に一致することを確保することであるため、これに関する要件は「ビジネスロジック」の章にあります。
V5.6 バリデーションおよびサニタイゼーションアーキテクチャ
下記のセクションでは、セキュリティの脆弱性を回避するために、安全でないコンテンツを安全に処理するためのシンタックス固有またはインタプリタ固有の要件を示しました。このセクションの要件は、この処理が行われるべき順序と場所をカバーしています。また、二重エンコーディング問題を防ぐために、データが保存されるときは常に、エンコードまたはエスケープされた状態 (HTML エンコーディングなど) ではなく、元の状態で保存されることを保証することも目的としています。
5.6.1
[追加] 入力は一度だけ標準形式にデコードまたはアンエスケープされ、その形式でエンコードされたデータが期待される場合にのみデコードされ、これは入力をさらに処理する前に行われる。たとえば、入力バリデーションやサニタイゼーションの後には実行されない。
2
v5.0.be-5.6.1
5.6.2
[修正, 1.5.4 から移動] アプリケーションはそれが意図されているインタプリタまたはインタプリタ自体によって使用される前の最終ステップとして、出力エンコーディングおよびエスケープを実行する。
2
v5.0.be-5.6.2
V5.3 インジェクション防御
潜在的に危険なコンテキストの近くあるいは隣接する場所での出力エンコーディングやエスケープは、あらゆるアプリケーションのセキュリティにとって重要です。通常、出力エンコーディングとエスケープは永続化されるのではなく、適切なインタプリタですぐに使用できるように出力を安全にするために使用されます。これをあまりに早い段階で行おうとすると、不正なコンテンツとなったり、エンコーディングやエスケープが効かなくなることがあります。
多くの場合、ソフトウェアライブラリは自動的にこれを行う安全な関数やより安全な関数を含みますが、それらが現在のコンテキストに対して正しいことを確認する必要があります。
5.3.1
[修正, 5.3.13 へ分割] HTTP レスポンス、HTML ドキュメント、XML ドキュメントの出力エンコーディングは、メッセージやドキュメント構造の変更を避けるために、HTML 要素、HTML 属性、HTML コメント、CSS、HTTP ヘッダフィールドに関連する文字をエンコードするなど、要求されるコンテキストに関連している。
1
v5.0.be-5.3.1
5.3.13
[追加, 5.3.1 から分割] URL を動的に構築する場合、信頼できないデータはそのコンテキストに応じてエンコードされている (例: クエリやパスパラメータの URL エンコーディングや base64url エンコーディング)。安全な URL プロトコルのみが許可されるようにしている (例: javascript: や data: を許可しない)。
1
v5.0.be-5.3.13
5.3.3
[修正, 50.6.2 へ分割, 5.3.6 をカバー] 出力エンコーディングまたはエスケープは、JavaScript コンテンツ (JSON を含む) を動的に構築するときに使用され、メッセージやドキュメント構造の変更を回避している (JavaScript および JSON インジェクションを回避するため)。
1
v5.0.be-5.3.3
5.3.4
[修正, 5.3.5 をカバー] データ選択またはデータベースクエリ (SQL, HQL, NoSQL, Cypherなど) がパラメータ化クエリ、ORM、エンティティフレームワークを使用している、または SQL インジェクションや他のデータベースインジェクション攻撃から保護されている。これはストアドプロシージャを記述する際にも考慮している。
1
v5.0.be-5.3.4
5.3.8
[12.3.5 をカバー] アプリケーションが OS コマンドインジェクションに対して保護していること、およびオペレーティングシステムコールがパラメータ化された OS クエリを使用するか、コンテキストに応じたコマンドライン出力エンコーディングを使用する。
1
v5.0.be-5.3.8
5.3.7
アプリケーションが LDAP インジェクション脆弱性から保護する、または LDAP インジェクションを防ぐために特定のセキュリティ管理策が実装されている。
2
v5.0.be-5.3.7
5.3.10
[修正] アプリケーションは、クエリパラメータ化やコンパイル済みクエリを使用することで、XPath インジェクション攻撃から保護されている。
2
v5.0.be-5.3.10
5.3.12
[追加] LaTeX プロセッサは ("--shell-escape" フラグを使用しないなど) 安全に構成されており、LaTeX インジェクション攻撃を防ぐためにコマンドの許可リストを使用している。
2
v5.0.be-5.3.12
5.3.11
[追加] アプリケーションが CSV インジェクションや数式インジェクションから保護されている。アプリケーションは CSV ファイルをエクスポートする際に RFC4180 2.6 および 2.7 で定義されているエスケープ規則に従う必要がある。アプリケーションは CSV ファイルや xls, xlsx, odf などのその他のスプレッドシート形式をエクスポートする際に、フィールドの最初の文字が '=', '+', '-', '@', '\t' (タブ), '\00' (ヌル文字) などの特殊文字である場合、シングルクォートを使用してエスケープする必要がある。
3
v5.0.be-5.3.11
注: パラメータ化クエリや SQL エスケープの使用は必ずしも十分ではありません。テーブル名やカラム名、ORDER BY などはエスケープできません。これらのフィールドにエスケープされたユーザ指定データを含めると、クエリの失敗または SQL インジェクションを引き起こします。
V5.2 サニタイゼーションとサンドボックス化
信頼できないコンテンツを安全でないコンテキストで使用することに対する理想的な保護は、コンテキスト固有のエンコーディングやエスケープを使用することです。これにより、安全でないコンテンツと同じ意味を維持しながら、この特定のコンテキストで安全に使用できるようになります。これについては、次のセクションで詳しく説明します。
これが不可能な場合、他の選択肢としてサニタイゼーションとサンドボックス化があります。サニタイゼーションは、潜在的に危険な文字やコンテンツを削除します。場合によっては、入力の意味を変えるかもしれませんが、セキュリティ上の理由から選択の余地がないこともあります。サンドボックス化は、潜在的に危険な操作を封じ込め、セキュリティ上の脆弱性が生じても、より広範なアプリケーションを危険にさらすことがないようにします。
5.2.1
[修正] WYSIWYG エディタなどからの信頼できない HTML 入力はすべて、よく知られた安全な HTML サニタイゼーションライブラリまたはフレームワーク機能を使用してサニタイズされている。
1
v5.0.be-5.2.1
5.2.4
[修正, 5.5.4 をカバー] アプリケーションが eval() や Spring Expression Language (SpEL) などの他の動的コード実行機能の使用を回避している。代替手段がない場合には、含まれているユーザ入力を実行する前にサニタイズまたはサンドボックス化する必要がある。
1
v5.0.be-5.2.4
5.2.2
[修正] 潜在的に危険なコンテキストに渡されるデータは、事前にサニタイズして、このコンテキストにとって安全な文字だけを許可したり、長すぎる入力を切り詰めるなどの安全対策を実施している。
2
v5.0.be-5.2.2
5.2.7
[修正] ユーザが提供する Scalable Vector Graphics (SVG) スクリプト可能コンテンツは、スクリプトや foreignObject を含まないなど、アプリケーションにとって安全なタグや属性 (図形描画など) のみを含むように検証またはサニタイズされている。
2
v5.0.be-5.2.7
5.2.8
アプリケーションは、マークダウン、CSS や XSL スタイルシート、BBCode などのユーザが提供するスクリプト可能コンテンツまたは式テンプレート言語コンテンツをサニタイズ、無効化、またはサンドボックス化する。
2
v5.0.be-5.2.8
5.2.6
[修正] アプリケーションは、信頼できないデータをプロトコル、ドメイン、パス、ポートの許可リストに照らして検証し、そのデータを使用して別のサービスを呼び出す前に潜在的に危険な文字をサニタイズすることで、サーバサイドリクエストフォージェリ (SSRF) 攻撃から保護している。
2
v5.0.be-5.2.6
5.2.5
[修正] アプリケーションは信頼できない入力に基づくテンプレートの作成を許可しないことで、テンプレートインジェクション攻撃から保護している。代替手段がない場合、テンプレート作成中に動的に含まれるすべての信頼できない入力はサニタイズまたは厳密に妥当性確認する必要がある。
2
v5.0.be-5.2.5
5.2.9
[追加] アプリケーションは正規表現内の特殊文字をエスケープ (通常はバックスラッシュを使用) し、メタ文字として誤って解釈されることを防いでいる。
2
v5.0.be-5.2.9
5.2.11
[追加] アプリケーションは Java Naming and Directory Interface (JNDI) クエリで使用する前に信頼できない入力を適切にサニタイズし、JNDI を安全に構成して JNDI インジェクション攻撃を防いでいる。
2
v5.0.be-5.2.11
5.2.12
[追加] アプリケーションは memcache に送信する前にコンテンツをサニタイズし、インジェクション攻撃を防いでいる。
2
v5.0.be-5.2.12
5.2.13
[修正, 5.4.2 から移動] 使用時に、予期しないあるいは悪意のある方法で解決される可能性のあるフォーマット文字列は、処理される前にサニタイズされている。
2
v5.0.be-5.2.13
5.2.3
SMTP インジェクションや IMAP インジェクションから保護するため、アプリケーションがメールシステムに渡す前にユーザ入力をサニタイズしている。
2
v5.0.be-5.2.3
5.2.10
[追加] 正規表現に指数関数的なバックトラッキングを引き起こす要素がないことを検証している。また、信頼できない入力をサニタイズし、ReDoS 攻撃や Runaway Regex 攻撃を軽減している。
3
v5.0.be-5.2.10
V5.4 メモリ、文字列、アンマネージドコード
以下の要件は、安全でないメモリ使用に関するリスクをカバーしており、アプリケーションがシステム言語またはアンマネージドコードを使用する場合にのみ適用されます。
5.4.1
アプリケーションはメモリセーフな文字列、安全なメモリコピーおよびポインタ演算を使用して、スタック、バッファ、ヒープのオーバーフローを検出または防止する。
2
v5.0.be-5.4.1
5.4.3
整数オーバーフローを防ぐために符号、範囲、および入力バリデーション技法が使用されている。
2
v5.0.be-5.4.3
5.4.4
[追加] 動的に割り当てられたメモリとリソースが解放され、解放されたメモリへの参照やポインタが削除されるか null に設定されて、ダングリングポインタや use-after-free 脆弱性を防いでいる。
2
v5.0.be-5.4.4
V5.5 安全な逆シリアル化
何らかの保存または転送された表現から実際のアプリケーションオブジェクトへのデータの変換 (逆シリアル化) はこれまでさまざまなコードインジェクション脆弱性の原因となってきました。このような問題を回避するには、このプロセスを慎重かつ安全に実行することが重要です。
5.5.2
[文法] アプリケーションが XML パーサーを制限的な構成を使用するよう構成し、XML 外部エンティティ (XML eXternal Entity, XXE) 攻撃を防止するために外部エンティティの解決などの安全でない機能を無効にする。
1
v5.0.be-5.5.2
5.5.3
[修正, 1.5.2 からマージ] 信頼できないクライアントによる逆シリアル化では、オブジェクトタイプの許可リストを使用したり、クライアント定義のオブジェクトタイプを制限するなど、安全な入力処理を強制して逆シリアル化攻撃を防いでいる。明示的に安全でないと定義されている逆シリアル化メカニズム (BinaryFormatter など) は信頼できない入力では使用してはいけない。
2
v5.0.be-5.5.3
5.5.5
[修正, 13.1.1 から移動, レベル L1 > L2] JSON 相互運用性の脆弱性や、さまざまな URI やファイルの解析動作がリモートファイルインクルージョン (RFI) やサーバサイドリクエストフォージェリ (SSRF) 攻撃で悪用されるような問題を回避するために、同じデータ型に対してアプリケーションで使用されるさまざまなパーサー (JSON パーサー、XML パーサー、URL パーサーなど) は一貫した方法で解析を実行し、同じエンコードメカニズムを使用する。
3
v5.0.be-5.5.5
参考情報
詳しくは以下の情報を参照してください。
自動エスケープの詳細情報はこちらを参照してください。
逆シリアル化やパースの問題の詳細情報はこちらを参照してください。
Last updated
Was this helpful?