トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

V5 検証、サニタイズ、エンコーディング検証の要件

Last-modified: 2020-08-10 (月) 14:02:44
Top/V5 検証、サニタイズ、エンコーディング検証の要件

OWASP ASVS 4.0

管理目標

最も一般的なWebアプリケーションのセキュリティ上の弱点は、クライアントや環境からの入力を、出力エンコーディングなしで直接使用する前に適切に検証できないことです。この弱点は、クロスサイトスクリプティング(XSS)、SQL インジェクション、インタプリタインジェクション、ロケール/Unicode攻撃、ファイルシステム攻撃、バッファオーバーフローなど、Webアプリケーションの重要な脆弱性のほとんどすべてにつながっています。 検証するアプリケーションが、以下の高レベルの要件を満たすことを確認してください。

  • 入力のバリデーションと出力エンコーディングのアーキテクチャは、インジェクション攻撃を防ぐために合意されたパイプラインを持っています
  • 入力データは強力に型付けされ、バリデーションされ、範囲や長さがチェックされ、最悪の場合、サニタイズされ、フィルタリングされていること
  • 出力データは、データのコンテキストに応じて、可能な限りインタプリタに近い形でエンコード、エスケープされること モダンなWebアプリケーションのアーキテクチャにおいては、出力エンコーディングはこれまで以上に重要です。特定のシナリオでは、堅牢な入力バリデーションを行うことは難しく、パラメータ化されたクエリ、テンプレートフレームワークによる自動エスケープ、または慎重に選択された出力エンコーディングのようなより安全なAPIを使用することは、アプリケーションのセキュリティにとって非常に重要です。

V5.1 入力バリデーション要件

ポジティブホワイトリストと強力なデータ型付けを使用して適切に実装された入力バリデーション制御は、すべてのインジェクション攻撃の90%以上を排除することができます。長さと範囲のチェックは、これをさらに減らすことができます。アプリケーションのアーキテクチャ、設計スプリント、コーディング、ユニットテストと統合テストの間に安全な入力バリデーションの組み込みが要求されます。これらの項目の多くは、ペネトレーションテストでは発見できませんが、実装しなかった場合の結果は、通常、V5.3(出力エンコーディングとインジェクション防止要件)に記載されています。開発者やセキュアコーディングのレビュー担当者は、インジェクションを防ぐためにすべての項目にL1が必要であるのと同じように、このセクションを扱うことが推奨されます。

項番説明L1L2L3CWE Noタイトル概要
5.1.1アプリケーションが HTTP変数汚染攻撃に対する防御策を備えている。特にアプリケーションフレームワークが、リクエストパラメータのソース(GET、POST、Cookie、ヘッダ、環境など)を区別しない場合はこの防御が必要。235余分なパラメータの不適切な処理同名のパラメータ、フィールド、または引数の数が期待された数を超えている場合に、ソフトウェアが適切に処理しないか、または誤って処理します。
5.1.2フレームワークが大量のパラメータ割り当て攻撃から保護している、またはフィールドを非公開にするなど安全でないパラメータの代入を防ぐための対策が行われている。 (C5)915動的に決定されたオブジェクト属性の不適切に制御された変更ソフトウェアは、オブジェクトで初期化または更新される複数の属性、プロパティ、またはフィールドを指定するアップストリーム コンポーネントからの入力を受け取りますが、どの属性を変更できるかを適切に制御していません。
5.1.3すべての入力データがバリデーションされている。入力データには、HTML のフォームのフィールド、REST 呼び出し、クエリパラメータ、HTTP ヘッダ、Cookie、バッチファイル、RSS フィードなども含む。バリデーションはホワイトリスト方式で行う。 (C5)20不適切な入力検証製品は入力またはデータを受け取りますが、入力がデータを安全かつ正しく処理するために必要なプロパティを持っていることを検証しないか、誤って検証します。
5.1.4構造化データが強く型付けされており、使用可能な文字、長さ、パターン等の定義されたスキーマに基づいてバリデーションされる。(例:クレジットカード番号や電話番号などのバリデーションや、地区名と郵便番号等 2つの関連するフィールドのデータが妥当なことのバリデーション)(C5)20不適切な入力検証製品は入力またはデータを受け取りますが、入力がデータを安全かつ正しく処理するために必要なプロパティを持っていることを検証しないか、誤って検証します。
5.1.5URLのリダイレクト先と転送先がホワイトリストに登録された宛先のみ許可されている、または信頼できない可能性のあるコンテンツにリダイレクトするときに警告を表示する。601信頼されていないサイトへのURLリダイレクト(「オープンリダイレクト」)ウェブアプリケーションは、外部サイトへのリンクを指定するユーザー制御の入力を受け入れ、そのリンクをリダイレクトで使用します。これにより、フィッシング攻撃が簡単になります。


V5.2 無害化とサンドボックス化要件

項番説明L1L2L3CWE Noタイトル概要
5.2.1WYSIWYG エディタ等から取得した信頼できないHTML入力が、HTMLサニタイザライブラリもしくはフレームワークの機能によって適切に無害化され、入力バリデーションやエンコードにより適切に処理されている。 (C5)116出力の不適切なエンコードまたはエスケープ不適切なエンコーディングまたは出力のエスケープソフトウェアは、別のコンポーネントと通信するために構造化されたメッセージを準備しますが、データのエンコーディングまたはエスケープが欠落しているか、正しく行われていません。その結果、メッセージの意図した構造が保持されません。
5.2.2非構造化データが無害化され、使用可能な文字や長さなど一般的な対策が適用されている。138特殊要素の不適切な中和ソフトウェアは上流コンポーネントからの入力を受信しますが、下流コンポーネントに送信されたときに制御要素や構文マーカとして解釈される可能性のある特殊な要素を中和したり、誤って中和したりしません。
5.2.3SMTP または IMAP インジェクションから保護するため、アプリケーションがメールシステムに渡す前にユーザ入力を無害化する。147入力ターミネータの不適切な中和このソフトウェアは、上流コンポーネントからの入力を受信しますが、下流コンポーネントに送信されたときに入力ターミネータと解釈される可能性のある特殊な要素を中和しないか、または誤って中和します。
5.2.4eval()もしくは動的コード実行機能を使用しない。代替方法がない場合は、実行前に含まれるユーザ入力の無害化もしくはサンドボックス化する。95動的に評価されたコード( 'Eval Injection')のディレクティブの不適切な無効化ソフトウェアは上流コンポーネントから入力を受け取りますが、動的評価呼び出し(たとえば、「eval」)で入力を使用する前に、コード構文を無効化または誤って無効化しません。
5.2.5テンプレートインジェクション攻撃に対して、ユーザ入力の無害化もしくはサンドボックス化によってアプリケーションが保護されている。94コード生成の不適切な制御(「コードインジェクション」)ソフトウェアは、上流コンポーネントからの外部から影響を受ける入力を使用してコードセグメントのすべてまたは一部を構築しますが、目的のコードセグメントの構文または動作を変更する可能性のある特別な要素を無効化または無効化しません。
5.2.6信頼できないデータやファイル名やURL入力フィールドなどHTTPファイルメタデータのバリデーションまたは無害化や、プロトコル、ドメイン、パス、ポートにホワイトリストを使用することで、アプリケーションがSSRF攻撃から保護されている。918Server-Side Request Forgery (SSRF)ウェブサーバは、上流のコンポーネントから URL またはそれに類する要求を受信し、この URL の内容を取得しますが、その要求が期待される宛先に送信されていることを十分に確認していません。
5.2.7ユーザの指定したSVGスクリプト化可能コンテンツ(特にXSSに関連するインラインスクリプトやforeignObject)に対して、アプリケーションが無害化またはサンドボックス化している。159特殊要素の使用が無効な場合の不適切な処理本製品は、ユーザーが制御する入力において、特殊な要素の無効な使用を適切にフィルタリング、削除、引用、またはその他の方法で管理していないため、その動作や完全性に悪影響を及ぼす可能性があります。
5.2.8ユーザ指定のMarkdown、CSS、XSLスタイルシート、BBCodeのようなスクリプト可能もしくは式のテンプレート言語コンテンツに対して、アプリケーションが無害化、無効化またはサンドボックス化されている。94コード生成の不適切な制御(「コードインジェクション」)ソフトウェアは、上流コンポーネントからの外部から影響を受ける入力を使用してコードセグメントのすべてまたは一部を構築しますが、目的のコードセグメントの構文または動作を変更する可能性のある特別な要素を無効化または無効化しません。


V5.3 出力エンコーディングとインジェクション防御の要件

項番説明L1L2L3CWE Noタイトル概要
5.3.1出力エンコーディングがインタプリタとコンテキストが要求するものに関連している。例えば特に信頼できない入力("ねこ" や "O'Hara" など、Unicode 文字やアポストロフィを含む名前など) に対して、HTML値、HTML属性、JavaScript、URLパラメータ、HTMLヘッダ、SMTP、その他コンテキストが必要とするものに対して個別のエンコードを使用する。(C4)116出力の不適切なエンコードまたはエスケープ不適切なエンコーディングまたは出力のエスケープソフトウェアは、別のコンポーネントと通信するために構造化されたメッセージを準備しますが、データのエンコーディングまたはエスケープが欠落しているか、正しく行われていません。その結果、メッセージの意図した構造が保持されません。
5.3.2どのUnicode文字でも有効かつ安全に処理されるように、出力エンコーディングがユーザが選択した文字コードセット、ロケールが保持されている。 (C4)176Unicodeエンコーディングの不適切な処理入力にUnicodeエンコーディングが含まれているときに、ソフトウェアが適切に処理しません
5.3.3HTML や他の Web クライアントコード中に存在するすべての文字列変数が、コンテキストに応じて適切に手動でエンコードされる、もしくはコンテキストに応じて自動的にエンコードを行うテンプレートを使用しており、アプリケーションが、反射型、格納型、および DOMベースクロスサイトスクリプティング (XSS) 攻撃の影響を受けない。 (C4)79Webページ生成中の入力の無効化(「クロスサイトスクリプティング」)ソフトウェアは、他のユーザーに提供されるWebページとして使用される出力に配置される前に、ユーザー制御可能な入力を無効化または誤って無効化しません。
5.3.4データ選択またはデータベースクエリ(例、SQL、HQL、ORM、NoSQL)がクエリのパラメータ化、ORM、エンティティフレームワークもしくは他の方法により保護されており、データベースインジェクション攻撃の影響を受けない。 (C3)89SQLコマンドで使用される特殊要素の不適切な無効化( 'SQLインジェクション')ソフトウェアは、上流コンポーネントからの外部から影響を受ける入力を使用してSQLコマンドのすべてまたは一部を構築しますが、下流コンポーネントに送信されるときに目的のSQLコマンドを変更する可能性のある特別な要素を無効化または誤って無効化しません。
5.3.5パラメータ化もしくはより安全な機構が存在しない場合、SQLインジェクションから保護するためのSQLエスケープの使用など、コンテキスト固有の出力エンコーディングによりインジェクション攻撃から保護されている。 (C3, C4)89SQLコマンドで使用される特殊要素の不適切な無効化( 'SQLインジェクション')ソフトウェアは、上流コンポーネントからの外部から影響を受ける入力を使用してSQLコマンドのすべてまたは一部を構築しますが、下流コンポーネントに送信されるときに目的のSQLコマンドを変更する可能性のある特別な要素を無効化または誤って無効化しません。
5.3.6eval攻撃、リモートJavaScriptインクルード、CSPバイパス、DOM XSS、JavaScriptの式の評価を含むJavaScriptもしくはJSONインジェクション攻撃からアプリケーションが保護されている。 (C4)830信頼できないソースからのWeb機能の取り込みこのソフトウェアには、別のドメインからのウェブ機能(ウェブウィジェットなど)が含まれており、このため、このソフトウェアのドメイン内で動作するようになり、信頼されていないソースにソフトウェアの完全なアクセスと制御を与える可能性があります。
5.3.7アプリケーションが LDAP インジェクションの影響を受けない、またはセキュリティ管理策によって LDAP インジェクションが防止される。 (C4)943データ・クエリ・ロジックにおける特殊要素の不適切な中和アプリケーションは、データベースなどのデータ・ストア内のデータへのアクセスや操作を目的としたクエリを生成しますが、クエリの意図したロジックを変更する可能性のある特殊要素を中和しなかったり、不適切に中和したりします。
5.3.8OSコマンドインジェクションに対して保護していること、およびオペレーティングシステムコールがパラメータ化されたOSクエリを使用、もしくはコンテキストコマンドライン出力エンコーディングを使用する。 (C4)78OSコマンド(「OSコマンドインジェクション」)で使用される特殊要素の不適切な無効化ソフトウェアは、上流コンポーネントからの外部から影響を受ける入力を使用してOSコマンドのすべてまたは一部を構築しますが、下流コンポーネントに送信されたときに目的のOSコマンドを変更する可能性のある特別な要素を無効化または誤って無効化しません。
5.3.9アプリケーションが、リモートファイルインクルード (RFI) やローカルファイルインクルード (LFI) の影響を受けない。829信頼されていない制御領域からの機能の包含ソフトウェアは、意図された制御領域外のソースから実行可能な機能(ライブラリなど)をインポート、要求、またはインクルードします。
5.3.10アプリケーションがXPathインジェクション攻撃やXML インジェクション攻撃から保護されている。 (C4)643XPath 式内のデータの不適切な中和(「XPath インジェクション」)このソフトウェアは、XML データベースからデータを取得するために使用される XPath 式を動的に構築するために外部入力を使用しますが、その入力を中和しなかったり、誤って中和したりします。これにより、攻撃者はクエリの構造を制御することができます。

注:クエリのパラメータ化やSQLのエスケープだけでは必ずしも十分ではありません。テーブル名やカラム名、ORDER BYなどはエスケープできません。これらのフィールドにエスケープされたユーザ作成データが含まれていると、クエリの失敗やSQLインジェクションが発生します。
注: SVGフォーマットは、ほとんどすべてのコンテキストでECMAスクリプトを明示的に許可しているため、すべてのSVG XSSベクターを完全にブロックすることは不可能かもしれません。SVGのアップロードが必要な場合は、アップロードされたファイルをtext/planeとして提供するか、別のユーザ指定コンテンツドメインを使用して、アプリケーションから引き継がれたXSSを防止します。

V5.4 メモリ、文字列、アンマネージドコードの要件

以下の要件は、アプリケーションがシステム言語またはアンマネージドコードを使用している場合にのみ適用されます。

項番説明L1L2L3CWE Noタイトル概要
5.4.1メモリセーフな文字列、安全なメモリコピー、ポインタ演算を使って、スタック、バッファ、ヒープのオーバーフローをアプリケーションが検出または防止する。120入力のサイズを確認せずにバッファをコピー ('Classic Buffer Overflow')このプログラムは、入力バッファのサイズが出力バッファのサイズよりも小さいことを確認せずに、入力バッファを出力バッファにコピーします。
5.4.2フォーマット文字列は悪意のある入力を受け取らず、定数となっている。134外部制御された書式文字列の使用このソフトウェアは、フォーマット文字列を引数として受け取る関数を使用しますが、フォーマット文字列は外部ソースからのものです。
5.4.3整数オーバーフローを防ぐために符号、範囲および入力のバリデーションが使用されている。190整数オーバーフローまたはラップアラウンド結果の値が常に元の値よりも大きいと仮定して計算を行うと、整数オーバーフローまたはラップアラウンドが発生することがあります。これは、計算がリソース管理や実行制御に使用される場合に、他の弱点をもたらす可能性があります。


V5.5 デシリアライゼーション防御の要件

項番説明L1L2L3CWE Noタイトル概要
5.5.1シリアライズされたオブジェクトが整合性チェックを使用していること、または悪意のあるオブジェクトの作成やデータの改ざんを防ぐために暗号化されている。 (C5)502信頼されていないデータのデシリアライズアプリケーションは、結果として得られるデータが有効であることを十分に検証することなく、信頼されていないデータをデシリアライズします。
5.5.2アプリケーションがXMLパーサを可能な限り最も制限の厳しい構成のみを使用するように正しく制限し、外部エンティティの解決などの危険な機能を無効にしてXXEを防ぐようにしている。611XML 外部エンティティ参照の不適切な制限ソフトウェアは、意図された制御範囲外のドキュメントに解決する URI を持つ XML エンティティを含む XML ドキュメントを処理し、製品の出力に不正なドキュメントを埋め込む原因となります。
5.5.3信頼できないデータのデシリアライズが回避されている、またはカスタムコードとサードパーティのライブラリ(JSON、XML、YAMLパーサなど)の両方で保護されている。502信頼されていないデータのデシリアライズアプリケーションは、結果として得られるデータが有効であることを十分に検証することなく、信頼されていないデータをデシリアライズします。
5.5.4ブラウザもしくはJavaScriptベースのバックエンドでJSON をパースするときはJSON.parse を使用する。eval() を使用しない。95動的に評価されたコード( 'Eval Injection')のディレクティブの不適切な無効化ソフトウェアは上流コンポーネントから入力を受け取りますが、動的評価呼び出し(たとえば、「eval」)で入力を使用する前に、コード構文を無効化または誤って無効化しません。


参考情報

詳しくは以下の情報を参照してください。