1/28ページ
ダウンロード(3.6Mb)
誤った認識、継続的インテグレーション、 およびサクセスストーリー
ミッションクリティカルなアプリケーションをデプロイするとき、エラーは致命的です。
静的コード解析(Static Code Analysis)は、ソフトウェア開発のライフサイクルを確実にセ キュアにする一つの方法です。このeBookでは、SCAに関する誤った認識の考察、SCAを継 続的インテグレーション(Continuous Integration)にどのように組み込むか、そして静的 コード解析を使って機能的なパフォーマンスだけでなく全体的なコストパフォーマンス を向上させたお客様のケーススダディーを紹介します。
このeBookには、開発プロセスの早い段階でセキュリティを確保する方法が書かれてい ます。より詳しい内容は、本書の最後に記載されたリソースガイドをご参照ください。
◆詳細はカタログをダウンロードしてご覧下さい。
このカタログについて
ドキュメント名 | 静的コード解析:eBook |
---|---|
ドキュメント種別 | ホワイトペーパー |
ファイルサイズ | 3.6Mb |
登録カテゴリ | |
取り扱い企業 | ローグウェーブ ソフトウェア ジャパン株式会社 (この企業の取り扱いカタログ一覧) |
この企業の関連カタログ
このカタログの内容
Page1
eBook:静的コード解析
誤った認識、継続的インテグレーション、
およびサクセスストーリー
Page2
BUILD YOUR CASE
(ケースの構築)
ミッションクリティカルなアプリケーションをデプロイするとき、エラーは致命的です。
静的コード解析(Static Code Analysis)は、ソフトウェア開発のライフサイクルを確実にセ
キュアにする一つの方法です。このeBookでは、SCAに関する誤った認識の考察、SCAを継
続的インテグレーション(Continuous Integration)にどのように組み込むか、そして静的
コード解析を使って機能的なパフォーマンスだけでなく全体的なコストパフォーマンス
を向上させたお客様のケーススダディーを紹介します。
このeBookには、開発プロセスの早い段階でセキュリティを確保する方法が書かれてい
ます。 より詳しい内容は、本書の最後に記載されたリソースガイドをご参照ください。
Page3
エビデンスの収集.........................................................................................................2
ホワイトペーパー:静的コード解析についての誤った認識について考える..................................... 3
ホワイトペーパー:静的コード解析を継続的インテグレーションに適用する................................13
ケーススタディの検証...............................................................................................16
開発者の声........................................................................................................................................................17
ケーススタディ:株式会社ACCESS..............................................................................................................19
リソースガイド.............................................................................................................24
1 ROGUEWAVE.COM
Page4
エビデンスの収集
組み込みソフトの脆弱性の約90%は、
10種類の違反に起因します。*
このような問題は、静的コード解析で識別・軽減
することができます。
* ローグウェーブソフトウェア -「 自動車業界の主なセキュリティの脆弱性(Top automotive security vulnerabilities)」」 2015年
Page5
ホArワticイleト XペXー —パ ー S:ec1tion Title
静Ar的ticコleー Tドitl解e c析anの g誤o っtoた tw認o識 linにe s
つanいd てsen考teえnるce case
Quote One study found that 98 per-
このcホeワnイtト oペfー aパpーpでlはic、a静t的io解n析sツ cーoルnにt対aiすnるe誤dっ aたt認 識
と本le当aのs価t 値onにeつ いaてp考p察liしcaてtいioまnす 。security risk,
その他w、以h下ilにe関 tすhるeア aドvバeイrスaもgあeり aまpすp。lication
• 誤検出かcらo本n当taのi問n題eをd解 m読oすrるe方 t法han 20.
• 早い段階でバグを発見するための統合プロセス
• テストの問題修正にかかる工数の削減
Page6
なぜ静的コード解析なのか?---静的コード解析(SCA)とは、対象のプログラムを実行することなく、プロ
グラムのソースコード全体を解析することを言います。この技術がどのように開発者に影響を与え、どの
ような利点があるかについて、いくつかの解釈や誤解が生まれてきました。
ご存知のように、より迅速なプロジェクトの実行からチェックイン時のソースコード改良、より低コストの
開発サイクル、市場投入までの時間短縮に至るまで、たくさんのSCAの利点に関する情報があります。ロ
ーグウェーブはまさにこの技術に関わっており、開発者に役立つSCAツールを提供しています。開発者が
デスクトップでコードを書いているとき、開発プロセスの早い段階でソースコードのセキュリティ脆弱性、
欠陥、標準違反などの問題を発見し修正するための手助けをします。
静的解析ツールが開発者やソフトウェア開発ライフサイクル(Systems Development Life Cycle)にもた
らす本当の価値についての「誤った認識」を一掃するためにこのホワイトペ―パーを作成しました。
4 ROGUEWAVE.COM
Page7
誤った認識
静的解析ツールは、見せかけのコンパイラである。
静的解析ツールは見せかけのコンパイラに過ぎないと信じている人がいます。そしてコードの問題にフラグを設定する
コンパイラをすでに持っているので、SCAツールは必要ないと考えています。
本当の価値
静的コード解析は、コンパイラよりもずっと深く解析を行い、より多くの複雑な問題を検
出します。
コンパイラは不可欠なものですが、その解析能力は開発者が作業しているファイルと機能のコンテキストに制限されま
す。コンパイラはそれ以上のことはできません。一方、静的解析は、プロシージャ間の複雑な問題、システム全体にまた
がる問題、余分な依存関係などの問題の検出を手助けします。簡単な例を見てみましょう。
下の図1で、本コンパイラの警告機能をすべてオンにしました。ご覧のとおり、初期化されていない変数が見つかりまし
た。
UNINIT.STACK.MIGHTに対するコンパイラ警告
警告C4701:初期化されていないローカル変数「closingTag」が使用されている可能性がある。
図1|コンパイラ単独で検出した警告
5 ROGUEWAVE.COM
Page8
しかし、このファイルには他にも問題が2つありますが、コンパイラは検出していません。
それは、”–Wall”オプションを有効に設定したUNREACH.GENとNPD.CHECK.MIGHTです。
図2|「コンパイラ+SCA」で検出した問題
静的解析ツールを使うと、NULLポインターの逆参照が見つかりました。これは、「GetDocument」により取得さ
れたdocumentが戻ってきた場合、NULLとして逆参照される可能性があることを意味します。静的解析ツールは
「GetDocument」の動作をより深く調べ、「GetDocument」がNULLを戻し、逆参照になる可能性があることを示します。
静的解析ツールはまた、到達不能コードを検出しています。ここで例にあげた問題は、あまり重大なものではありません
が、静的解析ツールが提供するより深い、特別な価値を示す例です。
6 ROGUEWAVE.COM
Page9
誤った認識
静的解析は初級開発者用である。
「私なら自分で見つけられた。優秀な開発者ならおそらく自分で見つけることができるだろう」このように考える方がい
るかも知れません。
静的解析は経験の浅い開発者の役には立つが、静的解析ツールは基本的なエラーしか発見できないと考えている人
がいることは確かです。
本当の価値
静的解析はすべての開発者の効率を上げます。
大量で複雑なコードベース、特に馴染みのないサードパーティのコードやレガシーコードの場合、脆弱性、エラー、違反
を見つけるのは極めて困難です。そうでないことを望んでも、我々が書くソフトウェアのほとんどは、レガシーコードと依
存関係を持っています。どのようにしてそのコードが書かれたのか、そのコードの本来の意味は何だったのかよく分から
ないような、何ファイルも深いところから起因する問題が出てきます。
こういった場合、SCAツールの複雑なエラー検出および並行チェッカーが非常に役に立ちます。これらは、最も経験のあ
る開発者についても、見つけることができなかった問題を発見・解決し、迅速にそして自力で容易に修復するのを可能
にします。
Namcook Analytics の Capers Jones のリサーチによると、静的解析やコードレビューのようなツールやプロセスがな
いと、開発者による自分のソフトウェア内のバグ発見の効率は実際50パーセント低下するとのことです。
つまりこれが、開発者がチームとして他の開発者と協力し、自分のジョブに最適なツールを取り入れることが重要であ
る理由です。コードを書きながら、いろいろなソースからフィードバックをもらい、問題を早く発見し、解決できるのは非
常に便利であり、よいSCAツールを使えばそれが可能です。
セキュリティの弱さを見つけるのに、静的解析がいかに役に立つかを示す例を見てみましょう。
図3|SCAが見つけたXSS問題
この例では、ウェブアプリケーションセキュリティのベストプラクティスを示すものとしてOWASPが管理している
WebGoat applicationの解析を行いました。WebGoatアプリケーションは、意図的にそのセキュリティが緩く設定されて
います。画面中、ピンクで示した部分は、アプリケーションに見つかったクロスサイトスクリプトエラーです。
7 ROGUEWAVE.COM
Page10
109行目のエラーコードSV.XSS.REFが報告されています。このエラーは反射型クロスサイトスクリプティング(反射型
XSS)脆弱性と呼ばれるものです。本解析は、「transferFunds」は汚染されている可能性のあるHTTPリクエストパラメー
タのデータを含んでおり、これは73行目にあるコードに由来することを示しています。その行の「get RAW parameter」
データ値は、109行目の確認メッセージに使用されています。
画面に示してあるように、このユーザーデータは未検証のままウェブアプリケーション出力に使用され、任意のHTMLお
よびJavaScriptを含んでいる可能性があります。悪意のあるスクリプトが注入されており、ブラウザに機密データが表示
され悪用される可能性があります。
これは、あらゆるレベルの開発者がSCAによりセキュリティ問題をすばやく発見し修復できることの一例です。
8 ROGUEWAVE.COM
Page11
誤った認識
静的解析は、誤検出が多い。
「静的解析はターゲットが明確でなく不正確で、誤検出が多すぎる」という人がいます。
本当の価値
静的解析は「誤検出」と見せ掛けた本当の問題を見逃しません。
静的解析ツールのメーカーが目標にしているのは、検出漏れを減らすことです。コードに存在する問題が大変重大であ
るにもかかわらず見逃すことがあってはなりません。すなわち、本当の問題を見逃すよりも、後で誤検出であったとなる
ほうがいいのです。
言ってみれば、解析の深さと広さ、カスタマイズの正確さと容易さは強力なSCAツールの不可欠な要素です。解析エン
ジンを各顧客が指定する特定のセキュリティ標準、不具合に関する標準およびコーディング標準にチューニングできる
かどうかが重要です。
クラス最高の静的解析ツールは、コードを「無視」または「採用」と分類し、誤検出を直接制御することも可能です。これ
らのツールは、コードの各種特性を正しく処理できるように「教え込む」ことが可能です。
誤検出を減らす一番良い方法は、特定のニーズに合わせて解析動作をチューニングもしくは調整できるツールを使う
ことです。問題を再現させ製品を改良してさらによい結果を生み出すように、簡単な方法で誤検出レポートを出力でき、
フィードバックを反映できるツールこそ良いツールです。
逆の見方をすれば、開発者は本当の問題を誤検出と間違って判断することがあるということに注意してください。本当
の問題を「誤検出」として分類した人は、次のようなことが原因である場合があります。
• ツールが指摘したことが理解できていないか、自分の状況にどのように当てはまるか理解できなかった。
• ルールに従っていない。
• 提示された問題が本当に重要であると思わずに、誤検出とした。
この発生メカニズムを例で示します。これは、顧客が「間違った」誤検出を報告した例です。
9 ROGUEWAVE.COM
Page12
顧客は、静的解析ツールがエラーが起こった時にブレークで11行目のループから抜けることを期待していましたが、
開発者がループ変数「someList」を「2行目の最大値」と設定していたので問題ないと考えました。
しかし、顧客はよく調べると、ループは11行目の「j = 7」で始まっていることに気づきました。ループに入ると13行目では
「j + 1」なので、8ということになり、「someList」には8つの要素が含まれているので、有効なインデックスは0~7になり
ます。
これは、開発者がツールが報告していることを十分理解していない、またはこのエラーレポートが自分の状況にどのよ
うにあてはまるかが分かっていない例です。もっと注意深くコードを調べ、調整を行えば、重大なエラーを回避できるは
ずです。
10 ROGUEWAVE.COM
Page13
誤った認識
欠陥を見つけるのはテスト/QAチームの仕事で、開発者にはそのためのツールは必要
ない。
残念ながら、いまだに多くの開発者や開発マネージャーが、ソースコードの品質やソースコード内に見つかった欠陥に
ついて、解析、監査、報告を行うのは、テストチームや品質保証チームが行ったほうがいいと考えています。開発者や開
発マネージャーは、プロセスやコストの観点から、これが最も有効な組織構造であり、自分たちの責任ではないものに
ついてツールの必要性を感じていないのです。
本当の価値
自分で書いたコードに誇りを持っていただきたいのです。
この誤った認識に真っ向から反対します。ソフトウェアのセキュリティ侵害およびパフォーマンス障害は、どこでも発生
し、もちろんソースコードレベルでも発生します。セキュリティ侵害、悪用が起きたのがあなたのコードであった場合、あ
なたは嫌な思いをするでしょうし、打ち砕かれた気持ちになるでしょう。
実際、欠陥の80パーセントは、開発段階、すなわちコードが書かれているときに入り込んでいます。コードの脆弱性やエ
ラーを、ビルド前のチェックやQAに行く前の早い段階で見つけ修復すれば、メンバー誰もが助かるはずです。あなたの
コードにあるエラーを他者から指摘され、問題を理解し修復するのに余計な時間をとられることは好ましいことではな
いでしょう。
再び Capers Jones のリサーチによると、開発サイクルの後半になればなるほどコード欠陥を修復するのに要する時間
は、大幅に増えるとのことです。
• 実装時では問題を修復するのにかかる時間は15分
• 統合ビルド時では1時間
• テスト時では12.5時間
• 本番環境では25時間
問題を発見するのが早ければ早いほど、早く修復でき、コストを抑えることができます。
静的解析があれば、あなたの書いたコードの品質を誰もが認めるところとなり、チームの一員として下記の動作保証に
集中することができます。
• 製品が意図したとおりに動作する
• 顧客が要求したとおりに機能が動作する
• ソフトウェアが他のコンポーネントと連携動作する
• ソフトウェアが負荷を受けた時、スケールされホールドされる
11 ROGUEWAVE.COM
Page14
もう一つ注目していただきたい重要なポイントがあります。それは、静的コード解析によってのみ発見できる脆弱性・欠
陥があり、それらは多くのQAテストケースでは発見できないということです。テスターがコードを検査するだけでは発見
できない脆弱性があります。次の例を見てみましょう。
図4|SCAが見つけた複雑な問題
これはCVSプログラムに見つかった問題です。考慮すべき可変条件の数が多すぎて、人間がこれを見つけるのはとても
困難です。
スクリーンショット内の小さい青いダイヤモンドはそれぞれ、TrueまたはFalseとして満たさなければならない各種条件
を示しています。テスターがその通りのパスを実行するは事実上不可能で、一方、これを実行しないとオーバーランが
起き、システムクラッシュにつながる可能性があります。
最終的な価値
全ての開発者は良いコードを書きたいと思っています。自慢できるコードを書きたいの
です。
これは真実です。優秀な静的解析ツールは、基本的なエラーから開発者には見えにくい複雑なやりとりやセキュリティ
脆弱性に至るまで、コードの問題を素早く見つける手助けをします。その操作は簡単で問題の修復にかかる費用は安く
済みます。静的解析ツールが提供するフィードバックにより、よりよいコードが書けるようになり、より優秀なソフトウェア
開発者になることができます。
静的解析ツールは、みなさまが誇りに思えるコードを簡単に書くための手助けをします。Klocworkのトライアルにお申
込み下さい。
12 ROGUEWAVE.COM
Page15
ホワイトペーパー:2
静的コード解析と継続的インテグ
レーションの統合
このホワイトペーパーでは、テストにおいてもデプロイにおいて
も、静的コード解析が再現可能なプロセスの作成にどのように役
に立つかをご覧いただきます。どのようにテスト時のギャップをな
くし、ソフトウェアをより早く、より高品質でリリースできるかを見て
みましょう。
Page16
DevOpsはソフトウェア業界に旋風を巻き起こしました。DevOpsは、チームとプロセス自動化の間の連携に重きを置くこ
とによりリリース効率を格段に向上させました。
「優れた業績を達成できるIT企業は、そうでない企業と比較して、障害に見舞われる確
率は60分の1、また障害から回復するスピードも168倍です。さらに、リードタイムは200
分の1と短く、デプロイの頻度も30倍です」1
DevOpsに関し最も注目を集めているトピックは継続的インテグレーション(CI)、すなわちチームのメンバーが頻繁に
(1日に何回も)新しいコードを統合するソフトウェア開発手法です。統合時、自動化ビルドとテストプロセスを開始し、
できるだけ早く欠陥を明らかにしステータスを報告します。
CIのメリットは明確です。コードのバグ発見が早ければ早いほど開発者は修正しやすく、その結果ビルドの修正・稼働
が早くなります。さらに、コードの変更を小さいモジュール単位で行うことにより他の開発者への影響を最小限に抑えつ
つ、リリースへの新規機能の迅速な追加や削除が可能になります。
CIの価値を最大にするということは、手動テストを回避しながら、各統合段階でできるだけ多くの問題を検出することを
意味します。自動化に焦点を当てると、テストの幅、深さおよび再現性を向上させ、開発者は機能に集中できます。また
次のような利点もあります。
「人手の介在は、ヒューマンエラーや再現不能なプロセスの原因となります。これにより
俊敏性が最も低下する2つの領域がテストとデプロイであり、その場合、継続的なインテ
グレーションとデリバリーを迅速に行うことができません。また、手動のテストは欠陥や計
画外の作業を発生させる原因にもなります」2
これには、ビルドが自己テストを行い、統合結果をタイムリー(理想的には同じ日に)にフィードバックすることが必要で
す。では、動的テストによる伝統的な手法が時間内に完了しない場合、どのようにしてコードを100パーセントカバーす
るテストが可能かということが問題になります。テストギャップを解消するために別の方法を見つける必要があります。
動的テストを減らすと品質は落ちるのでしょうか?
CI用の静的コード解析は、動的テストを完全に補うものです。静的コード解析は、カバー率が高く(実行時に発見される
問題数以上にコードの問題を発見する)、ライフサイクルの早い段階でバグを検出できるのでコストパフォーマンスが
高く、走らせるのに時間があまりかかりません。CI用の理想的な静的解析エンジンとは、常にすべてのコードを処理する
のではなく、修正したコードと影響を受ける実行パスのみを処理するものです。静的コード解析はソースコードに対して
実施され、コードを実行する必要はないので、提示されたコード変更を限られた時間内で完全に解析可能です。
1 2015 State of DevOps Report, Puppet Labs.
2「 11個のよくあるDevOpsボトルネック(11 Common DevOps Bottlenecks)」 Mike Kavis, Forbes, 2014年12月18日
14 ROGUEWAVE.COM
Page17
さらに、静的コード解析では新しいコード専用にテストケースを書く必要がありません。品質、セキュリティ、標準準拠違
反を検査するテストが自動的に生成されます。静的コード解析は、高速で、スケーラブルで、自動化されているので、CI
において大きな役割を果たします
継続的インテグレーションと高速化
静的コード解析をCIシステムに統合するとき、欠陥をできるだけ早く開発者に報告し、できるだけ短い時間で欠陥の修
正を行い、ビルドを最適な状態に持って行くことが重要です。解析エンジンの各コンポーネントは、スケーラビリティお
よびパフォーマンスにおいて最適化されている必要があります。たとえば、開発者がコードをチェックインするときに複
数の同時解析を管理する必要があります。この解析では正確さにおいて妥協を許してはいけません。欠陥が抜け穴を
通り抜けたり(検出漏れ)、実際は存在しないのに欠陥と報告されてはなりません(誤検出)。理想的には、修正されたソ
ースコードとその依存関係のみが解析され、欠陥検出に関係ない処理は最小限にすべきです。
スケールアップ
各ソフトウェア開発組織にCIの利点が知られるにつれ、より多くのチームが自分たちのプロジェクトにCIを使うようにな
るでしょう。その結果、(動的解析・静的解析を含めて)日々実行されるビルドの数が飛躍的に増加すると思われます。結
果として、静的解析エンジンの数は、CIのロールアウトにあわせて増えていく必要があります。開発ツールチームの作
業量を軽減するには、新しいCIエージェントにおいて、静的解析エンジンのデプロイが簡単である必要があります。さら
に、他の開発者に起因する欠陥を除外し、特定のコード変更に起因する欠陥のみが該当の開発者に戻されるソリュー
ションが望ましいでしょう。
毎日の自動解析により欠陥を排除
CI用の静的コード解析の実装が成功するには、最後の要素として、解析が完全に自動化され、CIビルドプロセスの1ステ
ップになることが必要です。JenkinsやTeamCityのようなCIビルドツールと統合することにより、静的コード解析はソフト
ウェア検証プロセスの不可欠な一部となり、コード変更のたびに自動的に実行され、開発者にとってトランスペアレント
な存在となります。これを実現するには、解析ツールセットは、カスタマイズ可能なプラグイン、スクリプトインターフェイ
ス、およびAPIを備え、組織のCIワークフローにシームレスに統合される必要があります。
よりよいソフトウェアへの近道
継続的インテグレーションへの移行を成功させるには、ビルドプロセスに静的コード解析のような新しいツールを追加
し、従来のテスト方法を補う必要があります。迅速で、スケーラブルで、自動化された解析は、開発者に最速で結果をも
たらし、高品質でより安全なCIビルドが可能になります。
Klocwork静的解析のCIプロセスへの適用方法については、Klocwork製品の販売代理店にお問い合わせください。
15 ROGUEWAVE.COM
Page18
Article XX — Section Title
Article Title can go to two lines
and sentence case
Quote One study found that 98 per-
cent of applications contained at
least one application security risk,
while the average application
ケーcoスntaスinedタ moデre thィan の20. 紹介
Page19
統計
開発者の声
変更要件に役立つのは実際のデータです。その問題が開発者の
間でどのくらい広まっているか、静的コード解析を実装することが
いかに信頼性が高く安全なソフトウェアの開発コストを下げるか
を認識することによって、業界の標準が強化され、生産性が向上
します。
Page20
コードを本番環境にロールアウトする際の障害/遅延の主な原因は何でしょう?
15%
運用と協力していない
9%
本番環境にアクセスしていない
8% 27%
その他 開発プロセスが自動化されていない
41%
開発/テスト/本番で環境が不統一
ベース:世界4,159の企業、SMBおよび独立開発者
Rogue Wave Software Zend developer pulse: Taking the pulse of the developer community 2013年
これらの問題の多くは、アプリケーション開発プロセスの自動化、共通環境の構築、および開発と運用間の可視化によ
り対応可能と思われます。
コードにバグがないことを保証するため、
あなたもしくはあなたのチームが使っている方法はなんですか?
静的コード解析
動的コード解析
手動テスト
形式検証
マルチスレッドデバッガ
その他
*回答者は複数回答可
ベース:ソフトウェア開発者200名以上
Rogue Wave Software Software security begins with flaw-free, standards-compliant code 2015年
手動ソフトウェアテストが有効な場合もありますが、ソフトウェアがセキュアで欠陥がないと保証するのに必要なカバレ
ッジがありません。
18 ROGUEWAVE.COM