LAMP スタック:
品質およびセキュリティ
Rich Cerruto
Coverity
Coverity
のベーシックなアプローチ
のベーシックなアプローチ
•
•
静的ソース
静的ソース
コード解析
コード解析
• セキュリティ上の脆弱性 •システムとプロセスのクラッシュ •無限ループ •パフォーマンスの劣化 •サービス拒否 •権限昇格 •データ、メモリ、およびファイルの破損 •予期しない動作 • コードを実行しない •テスト ケースを作成しない •すべてのパスを解析する 検出できる問題 アプローチオープン オープン ソースソース + + Coverity: Coverity: 静的解析技術の改善 静的解析技術の改善 2002 • 当社の技術を求める要 望が殺到 • 継続する Linux 作 業:2000 以上のバグの 検出 Coverity の設立 -- Linux での強化 2003-06 • 150 以上の顧客 --Juniper、Synopsys、 Symantec、nVidia、 PalmOne、およびその他 多数 • 米国国土安全保障省の 研究 -- 次世代解析技術 の開発とオープン ソース への適用 会社の成長と 拡大 2001 Linux でのソー ス コード静的解 析 • 初期バージョンの Linux における数百のバグの 公表 • Linux コミュニティによる ほとんどの欠陥の修正 飛躍的な 研究所技術 1999 • メタレベル コンパイ ル チェッカー ("スタン
トピック
トピック
•
•
32
32
のオープン
のオープン
ソース
ソース
パッケージの品質とセキュリ
パッケージの品質とセキュリ
ティに関する
ティに関する
Coverity
Coverity
の評価方法
の評価方法
•
•
LAMP
LAMP
スタックおよび研究の対象となった他のパッ
スタックおよび研究の対象となった他のパッ
ケージとの比較
ケージとの比較
•
•
この研究が開発コミュニティに公表された後の反応
この研究が開発コミュニティに公表された後の反応
サンプル
サンプル
バグ
バグ
No. 1:
No. 1:
リソース
リソース
リーク
リーク
•
• Perl: Perl: perl/ext/Storable/Storable.xsperl/ext/Storable/Storable.xs •
サンプル
サンプル
バグ
バグ
No. 2:
No. 2:
配列のオーバーラン
配列のオーバーラン
• • phpphp--src/ext/standard/ftp_fopen_wrapper.csrc/ext/standard/ftp_fopen_wrapper.c • • off by 1 (1 off by 1 (1 つつ違い違い) ) エラーエラーCoverity
Coverity
のアプローチ
のアプローチ
:
:
scan.coverity.com
scan.coverity.com
•
•
オープン
オープン
ソース
ソース
パッケージを自動的にスキャンす
パッケージを自動的にスキャンす
るためのインフラストラクチャ
るためのインフラストラクチャ
• • 毎晩スキャン毎晩スキャン •• Coverity Coverity Prevent 2.4.4Prevent 2.4.4 の使用の使用
•
•
結果を
結果を
scan.coverity.com
scan.coverity.com
に自動的に送信
に自動的に送信
•
•
始動
始動
• • 2006 2006 年年 3 3 月月 6 6 日日 • • 32 32 パッケージパッケージ • • 今後さらにパッケージを追加今後さらにパッケージを追加パッケージ一覧の概要
パッケージ一覧の概要
XMMS XMMS Samba Samba OpenLDAP OpenLDAP Gcc Gcc Xine Xine Python Python NetSNMP NetSNMP GAIM GAIM X X ProFTPD ProFTPD MySQL MySQL FreeBSD FreeBSD WxWidgets WxWidgets PostgreSQL PostgreSQL Mplayer Mplayer Firefox Firefox TCL TCL PHP PHP Linux Linux Firebird Firebird Squid Squid Perl Perl Inetutils Inetutils Ethereal Ethereal SQLite SQLite OpenVPN OpenVPN Icecast Icecast Apache Apache Snort Snort OpenSSL OpenSSL Gnome Gnome Amanda Amanda最初の実行結果
最初の実行結果
•
•
比較のための主な評価基準として欠陥密度を選択
比較のための主な評価基準として欠陥密度を選択
•
•
発表する結果
発表する結果
:
:
• • LAMP LAMP スタックのスタックの ““LL”” およびおよび ““PP”” 部分の詳細データ部分の詳細データ • • パッケージ全体の傾向パッケージ全体の傾向 • • LAMP LAMP スタック全体の比較データスタック全体の比較データ生の数字
生の数字
–
–
“
“
L
L
”
”
および
および
“
“
P
P
”
”
14 14 15 15 16 16 187 187 バッファ バッファ オーバーラン オーバーラン 21 21 26 26 23 23 173 173 メモリ メモリ リークリーク 7 7 8 8 40 40 117 117 予期しない 予期しない 動作 動作 54 54 40 40 126 126 585 585 システム システム//プロセプロセ スのクラッシュ スのクラッシュ 96 96 89 89 205 205 1062 1062 バグ合計数 バグ合計数 Python Python Perl Perl PHP PHP Linux Linux欠陥密度
欠陥密度
-
-
“
“
L
L
”
”
および
および
“
“
P
P
”
”
.18 .18 Perl Perl .49 .49 PHP PHP .33 .33 Linux Linux 密度 密度 ( (コードコード 1000 1000 行あたりのバグ行あたりのバグ)) パッケージ パッケージ傾向
傾向
:
:
欠陥密度の基準
欠陥密度の基準
Distribution of Defect Densities in Open Source Packages 0 2 4 6 8 10 12 0.000-0.061 0.062-0.191 0.192-0.313 0.313-0.434 0.434-0.555 0.556-0.677 0.677-0.798 >= 0.798 Defect Density Range
Nu m b er o f P ackag es
比較
比較
:
:
LAMP
LAMP
対基準
対基準
How does LAMP stack up?
0.18 0.22 0.25 0.29 0.33 0.35 0.43 0.49 0.10 0.20 0.30 0.40 0.50 0.60 D e fect s p e r K L O C
PHP
PHP
–
–
値が最も高い理由
値が最も高い理由
• • 88 88 のの ““FORWARD_NULLFORWARD_NULL”” バグバグ ((合計合計 205 205 中中)) • • 非標準アサーションによるフォールス非標準アサーションによるフォールス ポジティブポジティブ (10 (10 のサンプルではのサンプルでは 3/10)3/10) 主な問題点 主な問題点 • • コード内のいくつかの部分におけるコード内のいくつかの部分における NULL NULL ポインタの不ポインタの不 適切な取り扱い 適切な取り扱い例
例
考慮すべき他の要素
考慮すべき他の要素
0.35 0.35 0.18 0.18 0.49 0.49 0.33 0.33 欠陥 欠陥 5,516 5,516 6,613 6,613 3,928 3,928 4,380 4,380 1.0 1.0 以降の以降の 経過 経過 期間 期間 ((日数日数)) 64 64 846 846 57 57 464 464 保守担当者 保守担当者 数 数 272,118 272,118 495,100 495,100 419,192 419,192 3,171,631 3,171,631 コードの行 コードの行 数 数 Python Python Perl Perl PHP PHP Linux Linux“
“
L
L
”
”
および
および
“
“
P
P
”
”
の推定される相関関係
の推定される相関関係
•
•
経過期間対欠陥密度
経過期間対欠陥密度
• • ほとんど完璧な相関関係ほとんど完璧な相関関係 • • 古いプロジェクトほど欠陥が少ない古いプロジェクトほど欠陥が少ない•
•
LOC (
LOC (
コード行数
コード行数
)
)
対欠陥密度
対欠陥密度
• • 相関関係なし相関関係なし • • 最高密度は最高密度は 419,192 419,192 のの LOC LOC を持つを持つ PHPPHP •• 最低密度は最低密度は 495,100 495,100 のの LOC LOC を持つを持つ PerlPerl