第1章 総論
開発工程と脆弱性対策

Webアプリケーションの脆弱性対策にはさまざまなものがあり、実装段階で考慮すれば済むものもあれば、設計の上流段階から考慮したほうがよいものもある。
この一連のコンテンツが述べる脆弱性対策は、Webアプリケーションの開発工程と次のように関連づけられる。

開発工程の想定

Webアプリケーションの開発工程については、さまざまな考え方があり得るが、この一連のコンテンツでは次を想定する。

(1) 要件定義

構築対象システムがどのようなものであらねばならないかを決める段階。どのようにコンピュータおよびネットワークを配し、どのようなデータ処理を行うか、人々はシステムにどのようにアクセスするかといった枠組みを決める。

(2) 開発基盤の選定

対象システムを稼働させるための技術的な基盤を選定する段階。プログラミング言語、アプリケーションフレームワーク、OS、サーバマシン等を決める。これ以降の工程は、ここにおける意思決定に強く束縛される。

(3) 設計

対象システムをどのような構造や仕様で実現するかを決める段階。設計の中は、さらに次のような細かな工程に分かれる。

1) ソフトウェア構造設計

システムの主要な構造を決める工程。ここでは骨格のレベルで、サブシステム、コンポーネント、データベース、主要ファイル等の配置を決める

  • サイト設置に関する設計
    Webサイトのホストをどのように設け、それらを実現するサーバコンピュータをどう設置するかを決める
  • アクセス制御に関する設計
    • 本人認証
      ユーザ認証をどのように行うかを決める
    • アクセス認可
      ユーザに対してどのような仕組みでアクセスの許可/制限をコントロールするかを決める
  • セッションに関する設計
    • ページの連続性追跡の方式
      ページの連続性を追跡する方式をどのように実現するかを決める
    • ログイン維持の方式
      ユーザ認証結果を維持する方式を決める
    • リクエスト強要(いわゆるクロスサイトリクエストフォージェリ)対策の方式
      第三者からの干渉によるリクエスト投入を防ぐために講じる手段を決める
  • ログ記録に関する設計
    ユーザのオペレーションや重要なデータ処理をどの程度ログ記録し、記録をどのように保護するかを決める

2) 業務仕様設計

ページ遷移の体系、各ページのレイアウト、各入出力項目の仕様を決める

  • トランザクションに関する設計
    WebブラウザとWebサーバの間のデータ項目のやりとり、およびサーバ側におけるデータベース検索・更新のありかたを決める
  • ユーザインタフェ−スに関する設計
    ユーザへのページの見せ方や、会話の進め方を決める
  • コードに関する設計
    データの値の、ユーザに見せる表現、メモリ内や電文における表現、データベースに保存する際の表現を決める
  • データレイアウトに関する設計
    プログラム内部で取り扱うデータ項目の集団を電文上やデータベース内でどのようにレイアウトするかを決める

3) モジュール分割設計

プログラム実装にあたってのモジュール構造、共通モジュールの持ち方等を決める

  • システム全体のモジュール構成
    システム全体をどのようなモジュールの配置で構成するかを決める
  • 共通モジュールの持ち方の企画
    どのような機能を共通モジュールにまとめるかを決める
  • エラー処理モジュールの配置とAPI
    エラー処理を共通モジュールにまとめるとともに、各業務処理からの呼び出し方を決める
  • 個別の業務のモジュール化
    業務処理をどのようなモジュールとして配置するかを決める

4) テスト計画

対象システムをどのように実装するかを決めてゆく。設計工程の他の作業と並行して、実装の誤りを検出し排除するためのテスト計画を立てる

(4) プログラム実装

それぞれのモジュールを実装する段階。詳細ロジックの設計、コーディング、および単体テストを含む

(5) テストと統合

実装されたプログラムをテスト計画にもとづいてテストし、段階的に大きな単位に統合する段階

(6) 運用

対象システムを運用する段階

脆弱性対策と工程

この一連のコンテンツの脆弱性対策の各記事は、その対策の考慮を開始する段階ごとに分けると、開発工程との間に次のような関係がある(図2)。

(1) 要件定義段階あるいはそれ以前から考慮するとよいもの

  • 総論
    • 総論と対策の分類
    • 開発工程と脆弱性対策(本稿)
    • より良いWebアプリケーション設計のヒント
  • アクセス制御対策
    • ユーザ認証対策
    • アクセス認可対策
  • サイトデザインに関わる対策
    • メールの第三者中継対策

(2) 設計段階から考慮するとよいもの

  • サイトデザインに関わる対策
    • 真正性の主張
  • セッション対策
    • リクエスト強要(CSRF)対策
    • セッション乗っ取り : #1 セッションID侵害手口
    • セッション乗っ取り : #2 セッションIDの強度を高める
    • セッション乗っ取り : #3 https:の適切な適用
    • セッション乗っ取り : #4 セッションIDお膳立てへの対策
    • セッション乗っ取り : #5 兆候の警戒と被害の不拡大
  • 暴露対策
    • Webサーバからのファイル流出対策
    • プログラムからのファイル流出対策
  • 入力対策
    • コマンド注入攻撃対策
    • SQL注入 : #2 設定における対策

(3) 概ね実装段階で考慮するもの

  • 暴露対策
    • コンテンツ間パラメータ対策
    • デバッグオプション対策
    • プロキシキャッシュ対策
  • 入力対策
    • SQL注入 : #1 実装における対策
    • 入力検査漏れ対策
  • エコーバック対策
    • スクリプト注入(XSS): #1 対策
    • スクリプト注入(XSS): #2 攻撃の解説
    • HTTPレスポンスによるキャッシュ偽造攻撃対策

[拡大図]

脆弱性対策と工程
図2: 脆弱性対策と工程