アットマーク・アイティ @IT@IT情報マネジメント@IT自分戦略研究所QA@ITイベントカレンダー  
 
 @IT > セキュリティ・ホール対策の効率が大幅に向上、Jtest8.0の新機能「バグ探偵」の秘密
 
@IT Special

 

PR

セキュリティ・ホール対策の効率が大幅に向上
Jtest8.0の新機能「バグ探偵」の秘密


システム開発の早い段階で問題を発見するにはテストツールを使うのが効果的。Java向けテスト・ツールとして知られる「Jtest」の新バージョンに加わった「バグ探偵」では、複数のクラスやモジュールの関連まで調べる「フロー解析」が可能だ。これまでの静的解析や動的解析とどう違うのか、担当者に話を聞いた。
    セキュリティの問題も早期に発見

テクマトリックス システムエンジニアリング事業部 ソフトウェア エンジニアリング技術部部長 西田啓一氏

 「セキュリティ・ホールや脆弱性を引き起こす原因の大部分は、メモリ操作の誤りなどの従来から存在していた、プログラムミスが原因となっていると考えています。高品質のプログラムを作成することが、結果的に、セキュリティ・ホールや脆弱性が少ないプログラムが作成できることにつながると考えています」(テクマトリックス システムエンジニアリング事業部 ソフトウェア エンジニアリング技術部部長の西田啓一氏)。

 セキュリティ問題を含め、バグは早期に発見するほど対応コストが低くなる。反対に、発見が遅れるほど対応コストは高くなる。特にセキュリティ問題は重大である。開発工程で問題を発見して対処できればよいが、開発を終了し、サービスインした後にセキュリティ問題が顕在化してしまうと、開発会社や運営会社の企業責任が問われる事態に発展する場合もある。

 「Jtest8.0の新機能である『バグ探偵』を使えば、コーディングの段階から多くのバグを発見でき、問題解決の効率が大幅に上がります」(西田氏)。

 「バグ探偵」は、ソースコード(厳密には、コンパイル可能な環境)があれば適用が可能である。従って、コーディングの段階から、問題点の発見が可能である。また、検出可能なエラーも、従来は実行時でなければ検出できなかった全体の流れを考慮した複雑なエラーの検出が可能なので、開発の早期の段階から問題の特定が困難なエラーへの対処が可能となる。

    複数モジュールにまたがる問題を
ソースコード段階で検出する「バグ探偵」

 バグ探偵はJavaテスト・ツール「Jtest8.0」で新たに加わった。Jtestは、プログラムを実行させてエラーを検出する「動的解析」と、プログラムのソースコードを解析し、実行する以前にエラーを検出する「静的解析」の両方の機能を備える。この静的解析の機能をさらに進め、複数のクラスやパッケージの関連を調べる「フロー解析」を実現するのがバグ探偵である。40種類以上のバグのパターンを検出する。従来であれば結合テストをすることで初めて検出可能だったような種類の問題も、静的に検出できる点に特徴がある。

 「従来であれば、テストケースを書いて結合テストし、動的解析をしないと見つけられなかった問題も、静的解析で発見できるようになりました」(西田氏)。

 バグ探偵は、複数のソースコードにまたがった「すべての」制御フローを解析して(フロー解析)エラーを検出する。従来の静的解析では、1ソースコード内でのエラーパターンの検出が限度であり、複数のソースにまたがる制御フローを考慮したエラーの検出には、実際にプログラムを動作させてエラーの検出を行う必要があった(動的解析)。また、動的検証で適切なエラーを検出するには、効果的なテストケースとテストデータの準備が必須となる。これには熟練したスキルが要求されるので、熟練プログラマの多くの時間を必要とする。しかし、「バグ探偵」のフロー解析の技術を使用すれば、実行の可能性があるすべてのパスを捜査してエラーを「自動で」検出してくれるので、動的解析実施時の多くの労力を軽減することができる。

    早期の発見で、夜間ビルドで、
「ぐっすり眠れる」

 バグ探偵の機能は、個々の開発者単位で実行する場合より、ソースコードがまとまった単位で実施する方がより効果を発揮する。特に、システム全体のコードが集約されている構成管理ツールの各プロジェクト別(すなわち、ビルドの単位)に適用する運用方法が、最も効果を発揮する。

 例えば、夜間の全体ビルドシステム(ナイトリービルド)にバグ探偵の処理を統合することで、1日の作業の結果できてしまった不具合を、翌日には修正することができる。このサイクルを、開発期間全体に渡って運用することで、不具合の修正作業の負担をより小さくすることが可能になる(下図)。

運用サイクル図

 「機能テストや結合テストで、開発者やマネージャを悩ます問題は、リソースリーク、セキュリティ、あるいは、パフォーマンスの問題などの非機能要件に関する問題が多いものです。ナイトリービルドにバグ探偵を組み込んで運用することで、これら非機能要件に関係する問題の多くを『自動で』取り除くことができます。ひいては、プロジェクトメンバーの健康の維持も可能になります」と西田氏は笑う。

 もちろん、従来からのJtestの機能である静的解析、動的解析の両方とも、バグをつぶすうえでは有用であることはいうまでもない。

    SQLインジェクションなど
脆弱性のパターンを検出

 セキュリティ・ホールの典型的な例として「SQLインジェクション」を題材に説明しよう。SQLインジェクションは、インターネット・サービスでの情報漏えいが発生した際に、原因の第一候補としてあがるほど、過去たくさんの事例がある。また、いまだに後を絶たないセキュリティ・ホールの代表例でもある。

 下図はSQLインジェクションの概要を説明したものである。インターネットに公開されているWebのフォームに書き込まれた文字列を取得して、その文字列を検査せずにデータベース検索プログラムに渡すようなプログラムを作ると、SQLインジェクションの脆弱性が発生してしまう。

SQLインジェクションの概念図

 SQLインジェクションの脆弱性を悪用されると、データベース管理システムへの不正なクエリ(問い合わせ)命令をフォームの文字列にまぎれこませる手口により、情報漏えいや侵入被害などを招く場合がある。

 このように重大な問題なのだが、SQLインジェクションを検出することはプログラム・モジュールの単体テストや、単独のプログラム・モジュールに関する静的解析だけでは難しい。例えば、文字列をWebのフォームから取得するモジュールと、データベース検索のプログラムがあった場合、それぞれ単体のプログラム・モジュールとして見れば正常に動作しているといえる。だが、この2つのプログラム・モジュールの間で、適切な検査とエスケープ処理を施さずに文字列を受け渡していれば、SQLインジェクションの脆弱性が生じてしまう。

 フロー解析機能を備えたバグ探偵を使うと、関連性がある複数のプログラム・モジュールにまたがってソースコードに対する静的解析を施し、エラーのパターンを検出する。もちろん、SQLインジェクションも検出対象となる。

検出されたSQLインジェクションの脆弱性。該当するコード部分が表示されるため、問題個所の修正が容易(クリックで拡大)

 

    問題の特定、原因正箇所も検出、
熟練プログラマの時間を奪わない

 開発現場にとって重要なこととして、バグ探偵では具体的な問題の種類と、プログラム・コード中の問題箇所を指摘してくれることが挙げられる。通常のテスト工程では、バグが顕在化した場合でも、問題の特定や、修正すべき個所を探り当てるのに、熟練プログラマの多くの時間が費やされることが多いだろう。だが、バグ探偵では、「SQLインジェクション」や「機密データの公開」(オブジェクトの内部構造を察知できるような形で公開してしまうバグ)、「初期化していない変数」など、問題の種類を特定し、さらにソースコード中の問題の箇所までも明示してくれる。問題の特定と解決に要する時間を大幅に短縮し、熟練プログラマの貴重な時間を節約してくれるのである。

 「バグをつぶす作業は、バグが顕在化してから、そのバグの問題の特定や、原因個所を探り当てるのに時間がかかります。バグ探偵を使うことで、バグを直す作業を、体感では10分の1ほどに短縮できます。SQLインジェクションなどの脆弱性をプログラムの外部から検出するツールはありますが、プログラム内部の問題の原因を特定してくれてプログラマの作業時間を無駄に使わないという点で、Jtestには値打ちがあると思っています」(西田氏)。

    大規模プロジェクトで特にメリットが大きい

 大規模プロジェクトとなると、複数の人間が開発したプログラム・モジュールが連携する過程で思わぬバグにつながる場合がある。このように大きなプロジェクトでは、バグ探偵によるフロー解析が特に効果を発揮する。

 さらに、大規模なソースコードで発生する複雑な問題に対しても、問題の種類を的確に報告してくれる点がありがたい。

 「開発現場での感覚として、バグ探偵が強力だと感じる理由の一つがノイズの少なさです。ノイズが多いツールだと大変です。問題がない場合もバグの候補として報告してしまうので、必要な情報を探し出すのに時間がかかります。バグ探偵は大事な情報をノイズに埋もれさせずに報告してくれる点がいいと思います」(西田氏)。

    従来からの動的解析、静的解析と
一緒に使いこなすことで効果が出る

 ここまで、Jtest8.0の「バグ探偵」を中心に説明してきた。バグ探偵のフロー解析はJtest8.0の最大の強化点であるが、Jtestそのものは幅広いテスト機能を提供するツールである。

 例えば動的解析については、「自動的にテストケースを作ってくれる点が大きいですね。特に、例外処理に関するエラーは、実行させないと発見が難しい。このためのテストケースを自分で作っていると、これは時間を食います。Jtestによる自動テストケース生成は、作業時間を大幅に短縮できます」(西田氏)。

 従来からある単体テスト、結合テストの効率を高め、さらにソースコードの静的解析による検出機能を備えるのが、Jtest8.0なのである。

    保守運用プロセスへの適用でも品質向上のメリット

 Jtestがメリットを発揮する局面は開発工程だけではない。保守運用への適用でも効果がある。

 「すでにリリースしたシステムでも、改修の時、1回Jtestを通しておくと、品質を向上できます」(西田氏)。改修時に、既存のコードの問題点も含めて対応が可能となる。

 こうしたJtestのメリットは、実際に使ってみると一目瞭然だという。

 「Jtestの導入を検討しているユーザーのため、ユーザーが持ち込んだソースコードをJtestにかけて、結果を見ていただくことがあります。特にバグ探偵の機能は、現時点では無償版では試すことはできませんから、お持ちいただく形です。それで、実際にJtestにソースコードをかけてみると、『買わざるを得ない』といっていただけます。バグが続々と検出されてしまうからです」(西田氏)。

 あなたの手元のソースコードに、まったく問題が発見されないという自信があるだろうか。もし多少なりとも不安があるのであれば、Jtestのようなテスト・ツールは、解決手段として有力な候補といえるだろう。

ホワイトペーパーダウンロード

 Java アプリケーションに潜むバグは誤動作を引き起こすだけでなく、システムのセキュリティホールや脆弱性の原因にもなる。逆にいえば、バグを取り除きプログラムの品質を高めることは、セキュリティの強化にもつながるのである。
 Parasoft社が開発した「Jtest」は、以下のような3つのアプローチで Javaアプリケーションの品質向上をサポートする。

1.実行時例外を検出する自動単体テスト機能
2.処理フローを自動解析するバグ探偵機能
3.650種類のコーディングルールで実施する自動静的解析機能

 2の処理フロー解析と、1の自動単体テストと2の処理フローを組み合わせることによるテスト結果の絞込みについて、本資料で詳しく紹介する。


提供:テクマトリックス株式会社
企画:アイティメディア 営業局
制作:@IT 編集部
掲載内容有効期限:2007年12月26日
 
ホワイトペーパーダウンロード
Jtest8.0の新機能、バグ探偵の秘密とは
Jtestの静的処理フロー解析機能「バグ探偵」と、「バグ探偵」を利用した単体テスト結果の重要度付け機能について紹介した資料。ツールの機能を最大限に活用して、テスト結果の精査を効率化しよう。

関連リンク
テクマトリックス
Jtest
バグ探偵

関連記事
.NETアプリケーションの単体テストと静的検証を自動化する「Parasoft .TEST 4.0」、テクマトリックスが発売(@IT 情報マネジメント)
テクマトリックス、J2SE5.0に対応したJtest 7.5を出荷開始(@IT 情報マネジメント)
SOA環境に必須のテストとは、テクマトリックスが新ツール発売(@IT NewsInsight)
開発作業の70%はデバッグ? テクマトリックス (@IT NewsInsight)


 
@ITトップ@IT Special インデックス会議室利用規約プライバシーポリシーサイトマップ