V15: セキュアコーディングアーキテクチャと実装
管理目標
多くの ASVS 要件は、認証や認可などの特定のセキュリティ領域に関連しているか、ログ記録やファイル処理などの特定のタイプのアプリケーション機能に関連しています。
しかし、この章ではアプリケーションの設計と開発の際に考慮すべき、より一般的なセキュリティ要件を提供します。クリーンなアーキテクチャとコード品質の観点からだけでなく、アプリケーションを安全にするために従う必要がある特定のアーキテクチャとコーディングプラクティスについても説明します。
V15.1 セキュアコーディングドキュメント
安全で防御可能なアーキテクチャを確立するための要件の多くは、特定のセキュリティコントロールの実装とアプリケーション内で使用されるコンポーネントに関する決定を明確に文書化することに依存します。
このセクションでは、その起源や機能により「危険」とみなされるコンポーネントの特定を含む、そのためのドキュメント要件について概説します。コンポーネントは保守が不十分であったり、サポートされていなかったり、サポートを終了していたり、重大な脆弱性の履歴がある場合、そのコンポーネントは危険とみなされる可能性があります。さらに、コンポーネントが信頼できないデータのデシリアライゼーション、生ファイルの解析、直接的なメモリ操作などの操作を実行する場合、そのコンポーネントは危険に分類される可能性があります。
また、このセクションでは、サードパーティコンポーネントの脆弱性に対処するための適切な期間を定義することの重要性も強調しています。
15.1.1
アプリケーションドキュメントでは、脆弱性があるサードパーティコンポーネントのバージョンやライブラリ全般の更新について、リスクに基づく修復時間枠を定義して、これらのコンポーネントからのリスクを最小限に抑えている。
1
v5.0.be-1.10.5
15.1.2
使用しているすべてのサードパーティライブラリについて、ソフトウェア部品表 (SBOM) などのインベントリカテゴリを保守している。コンポーネントは事前定義済みで信頼でき、継続的に保守されているリポジトリから取得している。
2
v5.0.be-1.10.2
15.1.3
アプリケーションドキュメントでは、時間のかかる機能やリソースを必要とする機能を特定している。これには、この機能の過剰使用による可用性の損失を防ぐ方法や、レスポンスの構築にコンシューマのタイムアウトよりも長い時間がかかる状況を避ける方法を含む必要がある。可能性のある防御策としては、非同期処理、キューの使用、ユーザごとおよびアプリケーションごとの並列処理の制限などがある。
2
v5.0.be-1.10.6
15.1.4
アプリケーションドキュメントでは「危険な」サードパーティライブラリを強調している。これには、セキュリティの観点から危険な操作を実行するライブラリ、メンテナンスが不十分なライブラリ、サポートされていないライブラリ、サポートが終了したライブラリ、歴史的にいくつかの重大な脆弱性を抱えているライブラリを含む必要がある。
3
v5.0.be-1.10.3
15.1.5
アプリケーションドキュメントではアプリケーションで「危険な」操作が実行されている部分を強調している。このコンテキストでの「危険な」とは、信頼できないデータのデシリアライゼーション、生のファイルの解析、直接的なメモリ操作など、危険な悪用が行われる可能性が高いものを意味する。
3
v5.0.be-1.10.4
V15.2 セキュリティアーキテクチャと依存関係
このセクションでは、依存関係管理を通じてリスクのある、古い、または安全でない依存関係とコンポーネントを処理するための要件を含みます。また、サンドボックス化、カプセル化、コンテナ化、ネットワーク分離などのアーキテクチャレベルの技法を使用して、リスクのある操作やライブラリの影響を軽減し、リソースを必要とする機能の過剰使用による可用性の損失を防ぐことも含みます。
15.2.1
アプリケーションは、文書化された更新および修復の時間枠に違反していないコンポーネントのみを含む。
1
v5.0.be-10.6.1
15.2.2
アプリケーションは、これに関する文書化されたセキュリティ上の決定と戦略に基づいて、時間のかかる機能やリソースを必要とする機能による可用性の損失に対する防御策を実装している。
2
v5.0.be-10.6.4
15.2.3
サードパーティコンポーネントとそのすべての推移的依存関係は、内部所有であるか外部ソースであるかに関わらず、想定されたリポジトリから組み込まれており、依存関係攪乱攻撃のリスクはない。
3
v5.0.be-10.6.2
15.2.4
アプリケーションは、アプリケーションで「危険な」操作を実行したり「危険な」サードパーティライブラリを使用していると文書化されている部分に対して追加の保護を実装している。これには、サンドボックス化、カプセル化、コンテナ化、ネットワークレベルの分離などの技法が含まれ、アプリケーションの一部分を侵害した攻撃者がアプリケーションの他の部分に侵入するのを遅らせたり阻止する。
3
v5.0.be-10.6.3
V15.3 防御的コーディング
このセクションでは、型ジャグリング、プロトタイプ汚染、大量割り当てなど、特定の言語における安全でないコーディングパターンの使用に起因する脆弱性の種類について説明します。一部はすべての言語に関係しないかもしれない一方で、他のものは言語固有の修正があったり、特定の言語やフレームワークが HTTP パラメータなどの機能を処理する方法に関係するかもしれません。また、アプリケーションの更新を暗号的に検証しないことのリスクも考慮します。
15.3.1
アプリケーションはユーザがアクセスするためのパーミッションを持つデータのみを返している。たとえば、API レスポンスは、データオブジェクト自体にアクセスするためのパーミッションを持っていたとしても、ユーザがアクセスするためのパーミッションを持たない値を含む属性での完全なオブジェクトを返さない。
1
v5.0.be-10.4.5
15.3.2
アプリケーションバックエンドが外部 URL を呼び出す場合、意図した機能でない限りリダイレクトに従わないように設定されている。
2
v5.0.be-10.4.8
15.3.3
アプリケーションには、コントローラやアクションごとに許可されるフィールドを制限することで、大量割り当て攻撃から保護する対策がある。たとえば、そのアクションの一部となることを意図していないフィールド値を挿入または更新することはできない。
2
v5.0.be-10.4.4
15.3.4
アプリケーションはレート制限やログ記録などの機密性の高い機能を提供するために、ユーザの実際の IP アドレスを識別して利用できる。
2
v5.0.be-10.4.6
15.3.5
アプリケーションは変数が正しい型であることを明示的に保証し、厳密な等価演算と比較演算を実行している。これは、アプリケーションコードが変数の型について仮定することによって引き起こされる型ジャグリングや型コンフュージョンの脆弱性を回避するためである。
2
v5.0.be-10.4.1
15.3.6
JavaScript コードはオブジェクトリテラルの代わりに Set() や Map() を使用するなど、プロトタイプ汚染を防ぐ方法で記述している。
2
v5.0.be-10.4.3
15.3.7
アプリケーションが HTTP 変数汚染攻撃に対する防御策を備えている。特にアプリケーションフレームワークがリクエストパラメータのソース (クエリ文字列、ボディパラメータ、クッキー、ヘッダフィールド) を区別しない場合はこの防御が必要である。
2
v5.0.be-10.4.7
15.3.8
アプリケーションは、明示的な変数宣言の採用、厳密な型チェックの実行、document オブジェクトへのグローバル変数の保存の回避、名前空間分離の実装によって、クライアントサイド JavaScript を使用する際の DOM clobbering を回避している。
3
v5.0.be-10.4.2
15.3.9
アプリケーション (バックエンドまたはフロントエンド) がリクエストを構築して送信する場合、バリデーション、サニタイゼーション、またはその他のメカニズムを使用して、受信コンポーネントで受け入れられるには長すぎる URI (API 呼び出しのためなど) や HTTP リクエストヘッダフィールド (認可やクッキーのためなど) の作成を回避している。長すぎるリクエスト (長いクッキーヘッダフィールドなど) を送信すると、サーバが常にエラーステータスで応答するなど、サービス拒否を引き起こす可能性がある。
3
v5.0.be-10.4.9
15.3.10
アプリケーションに自動更新機能がある場合、更新はデジタル署名され、更新をインストールまたは実行する前にデジタル署名が検証されている必要がある。
3
v5.0.be-10.4.10
V15.4 同時並行性
競合状態、チェック時間と使用時間 (TOCTOU) の脆弱性、デッドロック、ライブロック、スレッド枯渇、不適切な同期などの同時並行性の問題は、予期しない動作やセキュリティリスクにつながる可能性があります。このセクションではこれらのリスクを緩和するためのさまざまな技法と戦略を説明します。
15.4.1
マルチスレッドのコンテキストではスレッドセーフな型のみが使用されるか、スレッドセーフでない型が同期して競合状態を防いでいる。
3
v5.0.be-10.7.1
15.4.2
共有リソースへの同時アクセスは同期プリミティブ (ロック、ミューテックス、セマフォなど) を使用して制御され、競合状態を防ぎ、これらのリソースに対するアトミック操作を保証している。
3
v5.0.be-10.7.2
15.4.3
共有リソースへのすべてのアクセスは一貫してチェックされて、単一のアトミック操作でアクセスされ、チェック時間と使用時間 (TOCTOU) の競合状態を防ぎ、チェックと使用の間のリソース状態の一貫性を確保している。
3
v5.0.be-10.7.3
15.4.4
リソース取得では一貫したロック戦略を使用して循環依存関係を回避し、デッドロックとライブロックの両方のシナリオを防いで前進を確保している。
3
v5.0.be-10.7.4
15.4.5
リソース割り当てのポリシーは、スレッドプールを活用するなどしてリソースへの公平なアクセスを確保し、優先度の低いスレッドが妥当な時間枠内で処理を進められるようにすることで、スレッドの枯渇を防いでいる。
3
v5.0.be-10.7.5
15.4.6
ロックプリミティブは、所有するクラスまたはモジュールにのみアクセス可能で、パブリックに変更可能ではなく、ロックが外部のクラスやコードによって不注意にまたは悪意を持って変更できないようにしている。
3
v5.0.be-10.7.6
参考情報
詳しくは以下の情報を参照してください。
Last updated
Was this helpful?