MS_WebAppVulnerabilityCountermeasures - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

Webアプリケーション脆弱性対策

概要

Web アプリケーション脆弱性対策のポイント。

主な脆弱性と、その対策

SQLインジェクション対策の実装方針

SQLインジェクション対策の実装方針

XSS対策の実装方針

XSS対策の実装方針

CSRF(XSRF)対策の実装方針

CSRF(XSRF)対策の実装方針

その他、一般的な脆弱性

ネットワークの暗号化(HTTPSやSSL-VPN)

  • 基本的に、電文の内容をガードする。
  • Session にデータを格納すれば、電文には乗らないが、
    下記セッション ハイジャックで、漏洩する危険はある。

インジェクションに注意

他システム、エンドユーザからの入力データは信用しない。

  • エンドユーザ入力は、必ずチェックしてから利用する。
  • これは、各種を防ぐ、基本的な防護策である。
  • ASP.NET では、以下の方法でインジェクション系の攻撃をチェックできる。

クライアント スクリプト インジェクション

  • 別名、クロスサイト スクリプティング(XSS)
  • ASP.NET で検証される(デフォルトの設定で検証は有効)。
  • 詳細:XSS対策の実装方針

補足(要求検証だけでは不十分): ASP.NET の
要求検証(Request Validation)は「<script のような
疑わしい入力を弾く」だけの保険的な機構
であり、XSS 対策の本体ではない。

対策
入力 要求検証(保険)。業務的な入力チェック
出力 エスケープ(HTML / 属性 / JavaScript / URL の文脈ごと) ← 本体
ブラウザ Content Security Policy (CSP)HttpOnly / Secure Cookie

本質は出力時のエスケープである。
ASP.NET Core の Razor は既定で HTML エスケープするため、
@Html.Raw() を使う箇所だけが危険箇所になる。

なお、ASP.NET Core には要求検証が存在しない
(出力エスケープで守る設計に移行している)。

SQLインジェクション

補足: 「検証される」というより、
パラメータ化すると値が SQL 文の一部として解釈されなくなる
というのが正確なところである。
実装はADO.NETSQLを参照。

注意すべきは、パラメータ化できない箇所である。

これらは許可リスト方式(想定される値の集合と突き合わせる)で守る。

OSコマンド インジェクション

チェックが必要な部位は、アプリケーションでチェックする必要がある。

バッファ オーバー フロー

.NET では発生しないが、アンマネージド・モジュールに入力データを渡す場合は注意。

補足: マネージドコードとアンマネージドコードのブリッジ
P/Invoke や COM相互運用を行う場合、
バッファ長を呼び出し側が正しく渡す責任がある
unsafe / stackalloc を使う箇所も同様。
現在は Span<T> を使うことで境界チェックを効かせやすくなっている。

セッション ハイジャックの防止

特に Session Cookie を盗み、ユーザの Session 情報を盗み出す方法。

ネットワークの暗号化(HTTPSやSSL-VPN)

  • ネットワークのパケット キャプチャを行い、Session Cookie を盗む事ができる。
  • このため、ネットワークの暗号化(HTTPS や SSL-VPN)が必要になる。

XSS対策を行う

  • ネットワークの暗号化(HTTPS や SSL-VPN)をしていても、
    クロスサイト スクリプティング(XSS)で、
    Session Cookie、認証チケットなどが漏洩する。
  • 詳細:XSS対策の実装方針

補足(Cookie 側の防御): XSS 対策と併せて、
Cookie 自体に属性を付けるのが現在の標準である。

属性 効果
HttpOnly JavaScript から読めなくする(XSS で盗まれない)
Secure HTTPS でのみ送信する
SameSite=Lax / Strict クロスサイトからの送信を制限(CSRF 対策にもなる)
__Host- プレフィックス ドメイン・パスを固定し、サブドメインからの上書きを防ぐ

また、ログイン成功時にセッション ID を再発行する
(セッション固定化攻撃への対策)ことも重要である。
詳細はASP.NET Session
ASP.NETの状態管理方式を参照。

データの格納場所、暗号化・改ざん防止

クライアントに見せられないデータ、改ざんの危険性があるデータは、

データの格納場所

サーバ側の Session などに持たせクライアントから見えないようにする。

暗号化・改ざん防止ロジック

または、ネットワークの暗号化(HTTPS や SSL-VPN)とは別に、
ロジックにより個別に暗号化・改ざん防止する。

この際、

補足(ケルクホフスの原理): ここで述べられているのは、
暗号の世界でケルクホフスの原理と呼ばれる原則である。
アルゴリズムが公開されても、鍵さえ秘密なら安全であるべき」というもので、
その裏返しが「独自の暗号を作らない(Don't roll your own crypto)」。

.NET での具体的な選択は
.NETの署名・暗号化アルゴリズムを参照。
ASP.NET Core では Data Protection APIIDataProtector)が
鍵管理まで含めて面倒を見るため、自前実装は原則不要である
ASP.NETの状態管理方式
machineKey に関する補足も参照)。

設計面

多重防御に基づいた設計

全体のセキュリティ バランスをとった、多重防御に基づいた設計

  • 部分的にセキュリティを高めても、費用対効果が高いとはいえない。
  • 複数の手段を組み合わせて実施したほうが、セキュリティ強度は高めやすい。
  • 従って、要求されるセキュリティ強度をバランスよく実現する。

最小特権の原則に従って設計

  • 予め、定められた以上のことができないようにアプリケーションを設計する。
  • ロックダウンの原則を受け入れ、必要なサーバ機能だけを利用可能にする。
  • ASP.NET の実行ユーザ アカウント、DB へのログイン アカウントも、
    適切な権限になるようにする。

補足: DB のログイン アカウントについては
リソース アクセス ストラテジ
SQL Server の認証を参照。
アプリ用アカウントに db_ownersysadmin を与えないこと、
可能ならマネージド ID などパスワードを持たない認証にすることが要点である。

運用面

セキュリティ アップデートの適用

  • セキュリティ アップデートは必ず適用すること。
  • テスト環境でテストした後、タイムリーにアップデートを実施する。
    • セキュリティ アップデートをタイムリーに適用することが重要。
    • このため、製品修正情報の収集 ~ テスト環境などの整備が必要となる。

補足(依存パッケージも対象): 現在は OS / ミドルウェアだけでなく、
NuGet パッケージなどの依存ライブラリが攻撃経路になることが多い
(サプライ チェーン)。

手段 内容
dotnet list package --vulnerable 既知の脆弱性を持つパッケージを検出
Dependabot / Renovate 依存の更新を自動で PR 化
ロック ファイル packages.lock.json で解決結果を固定(ビルド
SBOM 何を使っているかを機械可読な形で管理

CIに組み込んで継続的に検査するのが現在の定石である。

補足(最新化:現在の指針): 本ページの分類は
OWASP Top 10 の 2010 年前後の版に近い。
現在(2021 年版)では以下が上位に来ており、
アクセス制御の不備が第 1 位である点が大きな変化である。

順位 項目 本ページとの対応
A01 アクセス制御の不備 「最小特権の原則」に相当。現在は最重要
A02 暗号化の失敗 「データの格納場所、暗号化・改ざん防止」
A03 インジェクション(XSS を含む) 「インジェクションに注意」
A04 安全でない設計 「多重防御に基づいた設計」
A05 セキュリティ設定ミス 「運用面」
A06 脆弱で古くなったコンポーネント 「セキュリティ アップデートの適用」
A07 識別と認証の失敗 「セッション ハイジャックの防止」

注目すべきは、XSS が単独項目からインジェクションに統合された一方で、
アクセス制御(認可)の不備が 1 位に上がったことである。
「ログインはできるが、他人のデータが見える」という類の欠陥が
実際に最も多い、という実態を反映している。

参考

プロダクト(診断ツール)

セキュリティ脆弱性対策ツール

関連


Tags: 移行, テスト, ツール類

⚠️ **GitHub.com Fallback** ⚠️