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
本番環境にはアプリケーションの機能に必要な機能のみを含み、テストコード、サンプルスニペット、開発機能などの不要な機能を公開していない。
2
v5.0.be-14.1.9
15.2.4
サードパーティコンポーネントとそのすべての推移的依存関係は、内部所有であるか外部ソースであるかに関わらず、想定されたリポジトリから組み込まれており、依存関係攪乱攻撃のリスクはない。
3
v5.0.be-10.6.2
15.2.5
アプリケーションは、「危険な機能」を含む、あるいは「リスクのあるコンポーネント」とみなされるサードパーティライブラリを使用していると文書化されているアプリケーションのパーツに対して、追加の保護を実装している。これは、サンドボックス化、カプセル化、コンテナ化、ネットワークレベルの分離などの技法を含み、アプリケーションの一部分を侵害した攻撃者がアプリケーションの他の部分に侵入するのを遅らせたり阻止する。
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 アドレスを正しく転送し、アプリケーションと Web サーバは、動的 IP、VPN、企業のファームウェアによってオリジナル 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
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?