知識マップ: Windowsアプリ開発のセキュリティ最低限チェックリスト
記事「Windowsアプリ開発のセキュリティ最低限チェックリスト」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事はWPF/WinForms/WinUI/C++/C#のWindows業務アプリを対象に、リリース前に外したくない最低限のセキュリティ対策をチェックリスト化しています。中心は、アプリ全体をrequireAdministratorにせず必要な処理だけを別プロセスやサービスへ分離すること、配布物にコード署名とタイムスタンプを付けて未署名配布や証明書検証の常時スキップを避けること、秘密情報を平文設定に置かずDPAPIなどで保護することです。あわせて、SQLの文字列連結が招くSQLインジェクションをプレースホルダで防ぐこと、DLLを名前だけで読み込むと検索順序ハイジャックを招くこと、ログへ機密情報を出すとログ自体が漏えい経路になることも扱っています。
flowchart LR
accTitle: Windowsアプリセキュリティ最低限チェックリストの知識マップ
accDescr: 管理者権限の扱い、コード署名と更新物の検証、秘密情報の保護、SQLインジェクションやDLL読み込みなどの入力・実行時リスク、ログでの機密漏えいという最低限のセキュリティ項目どうしの関係を示す図
admin_rights["管理者権限"]
code_signing_cert["コード署名証明書"]
app_secrets["アプリの秘密情報"]
execution_level_asinvoker["asInvoker実行レベル"]
execution_level_requireadministrator["requireAdministrator実行レベル"]
desktop_app["対話ユーザーのデスクトップアプリ"]
admin_privilege_separation["管理者権限処理の分離"]
dll_search_order_hijacking["DLL検索順序ハイジャック"]
unvalidated_dll_loading["DLLの名前だけでの読み込み"]
unsigned_binary["未署名バイナリ"]
code_signing_timestamp["コード署名のタイムスタンプ"]
certificate_expiry["証明書の期限切れ"]
update_integrity_verification["更新物の署名・ハッシュ検証"]
unverified_update_application["未検証の更新適用"]
certificate_pinning["証明書のピン留め"]
certificate_validation_bypass["証明書検証の常時スキップ"]
certificate_revocation_check["証明書の失効確認"]
sql_string_concatenation["SQL文字列連結"]
sql_injection["SQLインジェクション"]
prepared_statement["プレースホルダ(プリペアドステートメント)"]
secret_logging["ログへの機密情報出力"]
secret_log_exposure["ログ経由の機密情報露出"]
dpapi["DPAPI"]
plaintext_secret_storage["秘密情報の平文保存"]
windows_service["Windowsサービス"]
admin_rights -->|"で構成できる"| execution_level_asinvoker
admin_rights -->|"で構成できる"| execution_level_requireadministrator
execution_level_requireadministrator -->|"用いるのは非推奨"| desktop_app
admin_privilege_separation -->|"推奨される対応"| execution_level_requireadministrator
execution_level_requireadministrator -.->|"原因になり得る"| dll_search_order_hijacking
unvalidated_dll_loading -->|"原因になり得る"| dll_search_order_hijacking
code_signing_cert -->|"防止する"| unsigned_binary
code_signing_timestamp -->|"軽減する"| certificate_expiry
update_integrity_verification -->|"防止する"| unverified_update_application
code_signing_cert -->|"推奨される対応"| update_integrity_verification
certificate_pinning -->|"推奨される対応"| certificate_validation_bypass
certificate_pinning -.->|"前提とする"| certificate_revocation_check
certificate_validation_bypass -->|"用いるのは非推奨"| desktop_app
sql_string_concatenation -->|"原因になり得る"| sql_injection
prepared_statement -->|"防止する"| sql_injection
secret_logging -->|"原因になり得る"| secret_log_exposure
dpapi -->|"推奨される対応"| plaintext_secret_storage
app_secrets -.->|"前提とする"| dpapi
admin_privilege_separation -.->|"利用する"| windows_service
code_signing_cert -.->|"前提とする"| code_signing_timestamp
prepared_statement -->|"推奨される対応"| desktop_app
概念間の関係(全21件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 管理者権限はasInvoker実行レベルで構成できます。
- 管理者権限はrequireAdministrator実行レベルで構成できます。
- requireAdministrator実行レベルを対話ユーザーのデスクトップアプリに用いることは推奨されません。
- 管理者権限処理の分離はrequireAdministrator実行レベルに対する本記事の推奨です。
- requireAdministrator実行レベルはDLL検索順序ハイジャックの原因になることがあります。
- DLLの名前だけでの読み込みはDLL検索順序ハイジャックの原因になることがあります。
- コード署名証明書は未署名バイナリを防ぎます。
- コード署名のタイムスタンプは証明書の期限切れを軽減します。
- 更新物の署名・ハッシュ検証は未検証の更新適用を防ぎます。
- コード署名証明書は更新物の署名・ハッシュ検証に対する本記事の推奨です。
- 証明書のピン留めは証明書検証の常時スキップに対する本記事の推奨です。
- 証明書のピン留めは証明書の失効確認を前提とします。
- 証明書検証の常時スキップを対話ユーザーのデスクトップアプリに用いることは推奨されません。
- SQL文字列連結はSQLインジェクションの原因になることがあります。
- プレースホルダ(プリペアドステートメント)はSQLインジェクションを防ぎます。
- ログへの機密情報出力はログ経由の機密情報露出の原因になることがあります。
- DPAPIは秘密情報の平文保存に対する本記事の推奨です。
- アプリの秘密情報はDPAPIを前提とします。
- 管理者権限処理の分離はWindowsサービスを利用します。
- コード署名証明書はコード署名のタイムスタンプを前提とします。
- プレースホルダ(プリペアドステートメント)は対話ユーザーのデスクトップアプリに対する本記事の推奨です。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。