津村氏は現在のソフト開発が抱える課題として、「ソフトウエア開発の短期化への要求」「オープンソースやサードパーティのコードの活用」「組織の硬直化」を挙げた。1つ目は、ビジネスの変化に伴い、限られたコストで開発スピードと品質を実現することが要求されている。2つ目は、完全なスクラッチ開発よりも、オープンソースのライブラリなど既存のプログラムを活用した開発が一般的になったことが背景にあり、そういった外部の組織が開発したコードを活用しつつ、ソフトウエアのセキュリティを高めることが必要になっている。また3つ目は、開発現場は慣れ親しんだ従来通りの開発の流れを変えるような新しい取り組みに反発する傾向にあり、従来からのワークフローを変えにくい事情もあるという。
そのような開発における3つの課題を解決するためには、、「サインオフ」という考え方を導入する必要性が高まっている。サインオフは、開発フローの中にテストゲートを導入し、製品が仕様通りにつくられているかどうかを確認してから次のステップに進むという検証方法だ。半導体設計の分野ではごく一般的に行われている。「課題解決のためにサインオフをソフトウエア開発の世界でも取り入れるべきだと考えています」。津村氏はこう提言する。
津村氏はサインオフに必要な要素として、ソフトウエアが要件を確かに満たしているかどうかをテストする技術、既存のワークフローへの統合するための方法論、組織で使うための方策の3つが必要と指摘した。それを実現するソリューションとして日本シノプシスは「Synopsys Software Integrity Platform」を用意している。静的コード解析や不正入力テスト、ソフトウエアコンポジション解析やWebアプリのセキュリティテスト、テスト最適化の5つの製品群から成るソリューションだ。
その中から津村氏は今回の講演で静的コード解析ツールの「Coverity」とセキュリティテストツール「Seeker」に絞って、その概要を解説した。Coverityは、プログラムがテストフェーズに入る前にコードに含まれる不具合を検出するツール。プログラムの不具合は、通常、後の工程で見つかるものほど対応にコストがかかる。前工程のコードの段階で不具合を見つけ出すことで、トータルでの開発期間短縮やコスト低減をはかることができる。
静的コード解析では、コーディングの規約に違反するコードやランタイムエラーも検出することができる。コーディング規約は直接的なバグを検出するわけではないが、潜在的にバグを引き起こすようなコードを指摘し、ソフトウエアの品質の低下を防ぐことができる。Coverityではコーディング規約への準拠や、ベストプラクティスに基づいたコードの書き方になっているかどうかを確認することができる。ランタイムエラーはメモリリークやデータ破壊、データ競合などによって生じ、通常はプログラムを実際に動かしてみないと検出できない。Coverityなら、プログラムを動かさずに静的な状態で不具合を検出できる。
こうした不具合は、Coverityの様々な解析ロジックによって検出されている。例えば、個々の関数がどの関数を呼び出しているかどうかをチェックすることは、プログラムの不具合を見つけ出すために重要な作業だ。それには解析ツールを使わなくても可能だが、膨大なコードでは現実的ではない。「コード量が大きくなると、アプリケーション全体にわたって人間の目で追いかけていくことはほとんど不可能になります。Coverityならその作業を自動化し、関数同士の呼び出しを網羅的にたどることで、人のスキルや経験に頼った作業では困難な不具合を検出できます」(津村氏)。
また、プログラムの目的をもとにコードの内容をチェックする点もCoverityの大きな特徴だ。プログラムで使われている関数からその開発者の意図を推測し、意図に反した書き方が行われていないかどうか、予期しない動作をさせようとしていないかどうかをチェックする。一例を挙げれば、既に書き終えた機能と似たような機能のコードを書くときに、コードをコピーして貼り付け、それをベースにコードを完成させることがあるが、開発者が必要な変数の修正を忘れることが少なくない。Coverityでは統計的な解析をもとに開発者の意図を読み取り、書き換えるべき変数を放置している場合はアラートを表示させるなど、開発者に自然に誤りに気づかせるための機能が設けられている。
このほか、Coverityには、複数のレビュアーによる作業を効率化するために、不具合や類似問題へのリンクなどをレポート化する機能や、不具合や脆弱性の回避方法を具体的に表示する機能もある。ビルド段階で検出された不具合に対して優先度を割り当て、問題対応に適切な開発者をアサインして結果を構成管理システムに登録する。「Coverityなら不具合対応を徹底させることができます。不具合の誤検知率は10%未満と低く、無駄の少ないレビューを可能にします」。津村氏はこう話す。
津村氏が紹介したもう1つのツール「Seeker」は、Webアプリケーションの脆弱性検査を自動化するものだ。Webアプリケーションの脆弱性検査には、静的解析と動的解析があるが、Seekerではその両者を組み合わせたインタラクティブなテストを行う。具体的には、実際にアプリケーションに投げ込んだリクエストに対してどう動くかを検査するもので、高い精度で脆弱性を検出できる。
津村氏はSeekerによる検査を特徴付けるキーワードとして、「正確」「明解」「シンプル」の3つを挙げた。「正確」とは、重要なデータに影響を及ぼすような脆弱性に絞って検知すること。実行中のアプリケーションに対し疑似的な攻撃を仕掛け、攻撃が成功する部分を特定し、データがどのような影響を受けるかを調べる。これによって現実的な脅威を受ける部分にフォーカスした対応が可能になる。
また、「明解」とは脆弱性の修正に必要な情報を、開発者に分かりやすく提供することを指す。どのようなリスクがあり、どのようなセキュリティ問題を引き起こすかを具体的に提示するとともに、修正すべきコードと修正方法を提示する。例えば、フォームからの入力によりSQLコマンドを受け付けてしまうことでデータ全体を抜き取られてしまうSQLインジェクションでは、その攻撃がどのように仕掛けられ、どのような結果になるかを再現した動画を生成し、開発者に見せることで、リスクのレベルを明らかにする。同時にコードの中で脆弱性が存在する具体的な位置を示し、すぐに対応を始めることができる。
最後の「シンプル」とは、開発部門に負担をかけずに利用できることを意味する。「現在の開発フローの中にテストゲートをスムーズに導入するには、開発現場に余計な作業と感じさせないことが重要です」と津村氏は指摘する。Seekerは既存の自動テストを活用するなど、脆弱性テストをシームレスに統合することができ、開発組織内ですぐに脆弱性検査ができる工夫を凝らしている。
「不具合や脆弱性を開発者に必ず修正させるために、テストゲートは開発者やテスト担当者に余計な負担をかけず、従来の開発フローを変更せずに対応できるようにしておく必要があります。CoverityやSeekerのように、シームレスな検査を実現するソリューションを提供し、ソフトウエア開発でのサインオフの実現に貢献していきたいと考えています」。津村氏はこう言って講演を終えた。
TEL:03-6746-3600
URL:http://www.synopsys.com/JP2/Software/Pages/default.aspx
メールでのお問い合わせはこちら