セキュリティの弱点のないプログラムを目指せ! ポイントは上流工程10個のツールで学ぶ、備える!情報セキュリティの脅威と対策

IPA提供のツールを活用して企業が留意すべきセキュリティについて学ぶ連載の9回目。IPAが公開している開発者のための「セキュア・プログラミング講座」の紹介です。プログラミングにおいてセキュリティの弱点(脆弱性)を作り込まないポイントについて解説します。

» 2012年01月23日 08時00分 公開
[情報処理推進機構]

 これまで本連載は、管理者、あるいは利用者の立場から情報セキュリティの脅威と対策についてみてきました。今回と次回は開発者の視点で情報セキュリティ対策について考えてみます。情報システムに存在する脆弱性は、前回に説明したように、OSやミドルウェアが内包する脆弱性と、その上で動くプログラムが内包する脆弱性の2階層が存在します。ミドルウェアなどの下位階層での脆弱性は、ベンダーによるパッチ情報などに注意を払うべきでしょう。ここまではシステム管理者の担当範囲と言えます。

 一方、ミドルウェア層の上位階層で動くプログラムの幾つかは自社で作成したり、外部委託によって作成されたりしたものです。この階層の脆弱性対策は、システム管理者ではなく開発者の守備範囲となります。上位階層のプログラムはOSやミドルウェアとは違い、直接ユーザーの操作を受け付ける、いわば情報システムの最前線です。特にWebを利用したシステムでは不特定多数の利用者によって操作される部分となるため、悪意を持った攻撃者から意図せぬ使い方をされ、システム内の情報を詐取されたり、破壊されたりする危険性を伴っています。いわゆるSQLインジェクションやクロスサイト・スクリプティング(XSS)といった攻撃に対して、きちんと対応できる堅牢性が求められます。

プログラマーに対する啓発と情報の提供

 多くの書籍や雑誌、インターネット上に掲載されている開発系の情報は、単純に目的を果たすためだけに解説されていることがあり、実際の情報システムにそのまま取り入れてしまうと、脆弱な部分が生じるリスクがあります。例えば、SQLデータベースを使った掲示板システムのようなサンプルではSQLインジェクションやXSSの対策にまで触れているケースはほとんどみることができません。それは、データベースからデータを読み書きする、最も基本的な部分についての解説が目的であるからです。

 しかし、経験の浅い開発者の中には、こうした脆弱性を生じさせかねないサンプルをそのまま情報システムとして提出してしまうことがあります。機能要件を満たしていることと、想定し得る脆弱性に対処できているというのは同義ではありません。特に経験の浅いプログラマーは機能面に気を取られがちで、脆弱性対策などセキュリティに配慮した開発方法について、熟知していない場合があります。

 また開発者ではなく、情報システムの新人管理者が、インターネット上で無償配布されている掲示板や発注システムを自社サイトに設置するというケース(例として第5回も合わせてご覧ください)もあります。こうしたフリーソフトの中にも、セキュリティ対策が十分ではないものが存在しています。

 開発者やシステム管理者は、利用者に対するインタフェースとなるアプリケーションの中に、どういった脆弱性の問題が発生し得るのかを理解しておくべきでしょう。脆弱性やその対策に関する情報は、積極的に探し出して学習する必要があります。

 情報処理推進機構(IPA)は、Webサイトで幾つかのセキュア・プログラミングについてのドキュメントを公開しています。2003年2月にVer1.7になった「セキュア・プログラミング講座」は、2000年代の情報システム普及期において、多くのプログラマーから「脆弱性とは何か?」、「どう対策していけばいいのか?」を学ぶことができるテキストとして評価をいただきました。

新版「セキュア・プログラミング講座」の方向性

 IPAは、現在Ver2を公開しています(Ver1.7も公開継続中です)。旧版ではまず大きく「Webプログラマコース」と「製品プログラマコース」の2つに分けて、それぞれを言語やプラットフォーム別に章立てして解説していくという体裁でした。

 Ver2では「Webアプリケーション編」と「C/C++言語編」に分けた上で、それぞれが開発工程に沿う形で解説されています。Ver1.1を公開した当時とは、セキュア・プログラミングに対する考え方に変化がありました(図1)。

図1:上流工程で脆弱性対策を行えばコストも危険性も抑制できる

 従来の開発は、実装後の稼働によって脆弱性が発覚し、そこから脆弱性対策が始まるという事後処理的な対応が多く見られました。事後対応は問題の発覚後に対応を取るため、それまでの工程に潜在している多くの問題を一度に処理せねばならず、工期もコストもかさみます。

 開発の理想像は、要件定義や設計といった上流工程の段階から、どんな問題が発生し得るのか、どう対処しておくべきかを十分に検討し、下流工程に問題を持ち越さない体制作りが要求されます。問題を検討するために必要とされるのが”知識”であり、セキュア・プログラミング講座は、開発者に対して知識を提供することを目的として刷新されました。実際にコードを書くプログラマーだけでなく、案件開発に関わる全ての人にぜひ一度は通読をお勧めします。

Webアプリケーション編での解説

 本稿で取り上げているのはドキュメントであるため、前回までのように動作画面などを交えての紹介はできません。そこでドキュメントの内容を紹介します。

 Webアプリケーション編は次の章立てで構成されます。

  • 総論
  • アクセス制御対策
  • サイトデザインに関わる対策
  • セッション対策
  • 暴露対策
  • 入力対策
  • エコーバック対策

 これらの章立ての下に幾つかの項目で、図を交えた解説をしています。一つの記事は本稿とほぼ同じ文量で、自分のペースで少しずつ学習を進めていくことができます(図2)。

図2:「第3章 サイトデザインにかかわる対策」から「メールの第三者中継対策」の解説ページの例

 旧版と異なり、新版では特定言語に依存した解説がほぼないため、実装コードの例は少ないですが、システム開発の経験があるプログラマーなら、自身が使う言語では「どう実装すべきか」といったことを容易に想像できるでしょう。

 新人プログラマーの教育が目的であれば、先輩が実際のコードと照らし合わせる形で解説をするなどの方法を取ってください。セキュア・プログラミング講座の内容に沿って新人トレーニングを進めることで、トラブルが起きる度にコードを見せて教えていくOJTのようなトレーニング法よりも、効率的に理解してもらえるでしょう。

 企業の情報漏えいなどではWebアプリケーションが関係する事例が多いのですが、C言語やC++も同様にセキュリティ上の脆弱性を内包しやすい開発環境です。C/C++言語編ではバッファオーバーフローやフォーマット文字列、整数オーバーフローなどに起因する脆弱性について解説しています。アプリケーション・プログラマも是非C/C++言語編を読んで学習してください。

 「セキュア・プログラミング講座」が掲げているように、上流工程の段階から、いかにしてセキュアなプログラミングを行うことが大切なのかを早い段階で学び、後進にも伝えていくことが大切です。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ