Imchecker Group、[email protected]までお問い合わせください
ライブラリは、呼び出し条件や注文などの使用制約を備えたアプリケーションプログラミングインターフェイス(API)を通じて再利用可能な機能を提供します。制約違反、すなわち、APIの誤用は、一般にバグとセキュリティの問題につながります。研究者は過去数十年でさまざまなAPIミジューズ検出器を開発してきましたが、最近の研究では、APIの誤用が実際のプロジェクトで一般的であることが示されています。既存のアプローチは、スパースの使用問題(つまり、めったに発生しないバグ)に悩まされるか、不正確なセマンティクスのために誤報を報告します。これらの制限を克服するために、Imcheckerを紹介して、APIミズザスバグを効果的に検出します。 Imcheckerの背後にある重要な洞察は、API使用量の制約を指定するためにドメイン固有の言語(DSL)を搭載した制約指向の静的解析手法です。現実世界のAPI-Misuseバグを研究することで、IMSPEC DSLを提案します。これは、API使用量の制約の種類の大部分をカバーし、シンプルだが正確な仕様を可能にします。さらに、Imcheckerを設計および実装して、ImSpecを自動的にターゲットに分析し、静的分析エンジンを使用して潜在的なAPIの誤用を特定し、豊富なセマンティクスで偽陽性を剪定します。 CプログラムのImcheckerをインスタンス化し、広く使用されているベンチマークと大規模な現実世界プログラムで評価しています。
現在、以前に未知の75のバグが発見され、61がLinuxカーネル、OpenSSL、およびUbuntu 16.04のパッケージで確認および固定されています。 imcheckerをより多くのプログラムに適用するために最善を尽くしています。詳細はevaluation_data/new_bugsにアップロードします
私たちの研究原稿とツール原稿は、ICSE'19のレビュープロセス中です。レビュープロセスが終了したらすぐにアップロードします。 (まあ、あなたは私たちに電子メールで彼らにアクセスすることができます学問目的のみによって。)
私たちのツールデモンストレーションビデオは、英語版で入手できます:https://youtu.be/ygdxeyoevim中国語バージョン:https://www.youtube.com/watch?v=3Zanegtwuto
ツール/readme.mdでのツールの使用
Imcheckerはまだ開発中であり、多くのバグとTODOリストが含まれています。バグや機能のリクエストは、[email protected]またはオープンな問題にメールを送信してください。
次の表に示すように、2017年には、実際のCプロジェクトでどのようなタイプのAPI-Misuseバグが発生し、開発者が実際にそれらをどのように修正するかを理解するために、3つのオープンソースプロジェクトとLinux-Kernelの半分のLinux-Kernelの2年間のバージョン履歴を手動で研究しました。これらの履歴は、進行中の開発と、多様なバグ検出作業で頻繁に言及されているために選択されます。合計で、私たちは約13.57mのlocと51.1kのコミットを研究しました。
| プロジェクト | loc | 勉強した期間 | 総コミット | バグ修正 | APIの誤用 |
|---|---|---|---|---|---|
| カール | 112.8k | 20160101-20171231 | 2613 | 135 | 38 |
| gnutls | 35.8k | 20160101-20171231 | 2769 | 86 | 30 |
| openssl | 454.2K | 20160101-20171231 | 6487 | 344 | 115 |
| Linux | 12.96m | 20170701-20171231 | 39295 | 995 | 362 |
| 合計 | 15.57m | 2年 | 51.1K | 1560 | 509 |
読者がコミットメッセージを抽出し、ファイルを変更し、パッチファイルをパッチするのを支援するために、 gitgrabberツールを開きます。また、調査対象の被験者のAPIミズセブに関連するすべてのコミットをアップロードして、さらに使用してください。
読者はempirical_studyフォルダーでそれらを見つけることができます。 GitGrabberの問題があれば、お気軽にお問い合わせください!
広く使用されているベンチマーク、すなわち、Juliet Test Suite V1.3、および最新のバージョンで2つの実際のプログラムを選択します:Linux Kernel-4.18-RC4は2018-7-9にリリースされ、2018-6-20にリリースされたOpenSSL-1-1-1-PRE8を選択します。 2つの視点からアプローチを評価します。
また、APISANでこのケースをテストします。セマンティッククロスチェックとClang-SAを介して、API使用の検出ツールをオープンソースの静的分析ツールにします。
API-Misuseベンチマークと元の結果をevaluation_dataにアップロードします。
Imcheckerの主な動機は、実際のプログラムでAPI-Misuseバグを検出することです。つまり、Imcheckerが以前に未知のバグを見つけることができるかどうかを判断することです。したがって、imcheckerを2つの有名なオープンソースプログラムの最新バージョンに適用します:Linux Kernel-4.18-RC4およびOpenSSL-1-1-PRE8、およびUbuntu 16.04のパッケージ。ターゲットAPIは、経験的研究から誤用されたものから選択されます。
これまで、56人の以前は未知のバグが発見され、開発者は36人が確認されています。
| プロジェクト | バグ(待機応答/確認/修正) |
|---|---|
| openssl | 17(0/5/12) |
| Linux | 30(5/20/5) |
| DMA | 1(0/0/1) |
| exim | 2(0/0/2) |
| hexchat | 2(1/1/0) |
| httping | 1(0/1/0) |
| ipmitool | 1(0/1/0) |
| オープンVMツール | 2(0/0/2) |
| Irssi | 2(1/1/0) |
| Keepalive | 2(0/0/2) |
| thc-ipv6 | 2(0/0/2) |
| Freeradius-Server | 2(0/0/2) |
| 人身売買者 | 3(3/0/0) |
| TINC | 2(0/0/2) |
| sslplit | 2(0/0/2) |
| rdesktop | 2(2/0/0) |
| プロキシトゥンネル | 2(2/0/0) |
| 合計 | 75(16/29/32) |
詳細はevaluation_data/new_bugsにアップロードします
APIの使用制約を説明する行動仕様は、開発者がAPIを効果的に利用するだけでなく、ターゲットAPIの使用法の検証を確保することにより、まばらな使用問題に対処するのに役立つことが示されています。たとえば、BoddenはCryslを提示して、暗号化の専門家と開発者の間の認知ギャップを埋めます。ただし、現在の仕様言語は、BLAST、JMLなどの完全なプログラムプロパティ用に設計されているか、SLICなどの汎用API-USAGE検出に適用するには特異的すぎます。 IMSPECという名前のAPI使用制約のために、軽量ドメイン固有の言語を紹介します。 IMSPECは、使用法が少ない場合でも、ターゲットAPIが検証されていることを同時に保証し、誤用検出をガイドします。 IMSPECのインスタンスは、APIを正しく使用するための一連の制約で満たされたパターンであり、違反はAPIミジューズバグになります。
IMSPECインスタンスをIMPSECフォルダーにアップロードし、このフォルダーをより多くのAPIのために徐々に更新します。また、IMSPECは、テストケースの生成、検証など、他の目的に使用できます。さらに、ToolsでGUI IMSPECライターを提供しています。
現在、IMSPECは手動執筆によって作成されています。ただし、仕様マイニングテクニックから自動的に生成できるようにします。私たちは、マイニングツールの結果をApexなどのIMSPECに変換するために、実験を実施し、パーサーを実装するように最善を尽くしています。しかし、これらのツールはすべての使用制約を解決することはできません。また、OpenSSLなどのユーザーマニュアルに従って生成されたIMSPECインスタンスの改良を支援するように開発者を招待したいと思います。
正しいAPI-USAGEは、一連の使用制約を満たす必要があります。つまり、制約に違反するとAPI-Misuseバグが生じる可能性があります。 Imcheckerは、IMSPECの仕様を使用して、ソースコードでこれらのバグを自動的に検出します。複雑で現実世界のプログラムを処理するには、最小限の精度を犠牲にしながら、Imcheckerの基礎となるメカニズムがスケーラブルでなければなりません。分析コンテキストを構築するための静的分析手法を使用した制約の低いシンボリック実行、分析コンテキストでAPI-Misuseバグを検出する方法論、セマンティック情報と使用統計を使用して偽陽性をフィルタリングする方法を含む、Imcheckerの設計の詳細を詳しく説明します。
Imcheckerのワークフローを説明するために、やる気のある例を使用します。これは、CVE-2015-0288で報告されているOpenSSLのAPI-Misuseバグです。 X509_get_pubkey()の欠落エラーコードチェックにより、ライン4でnullポインター繰り返しのバグが生じました。
1 // Location: crypto/x509/x509_req.c: 70 2 X509_REQ *X509_to_X509_REQ(...){
3 ...
4 pktmp = X509 get pubkey ( x );
5 // missing error code check of pktmp
6 + if ( pktmp == NULL )
7 + goto err ;
8 i = X509_REQ_set_pubkey ( ret , pktmp ); 9 EVP_PKEY_free ( pktmp );
10 ...
11 }
12
13 // Location: /crypto/x509/x509_cmp.c: 390
14 int X509_chain_check_suiteb (...){
15 ...
16 // check error value in usage
17 pk = X509 get pubkey ( x );
18 rv = check_suite_b ( pk , -1 , & tflags );
19 ...
20 }
21 // Location: /crypto/x509/x509_cmp.c: 359
22 static int check_suite_b ( EVP_PKEY * pkey ,...){ 23 ...
24 // ensure pkey not NULL
25 if ( pkey && pkey -> type == EVP PKEY EC )
26 ... // usage of pkey
27 }これがimcheckerのワークフローです:

Imcheckerは、ソースコードとAPI使用の制約を入力として取得し、具体的な場所と出力としての理由でバグレポートを生成します。まず、APIの使用制約は、IMSPECという名前の軽量ドメイン固有の言語で記述されます。たとえば、 「x509_get_pubkey()の返品値は、nullで確認する必要があります」 。これらの仕様を使用することにより、ImcheckerはターゲットAPIの使用を直接検証します。これにより、スパースの使用問題が解放され、バグ検出プロセスがガイドされます。次に、3つのフェーズでAPI-Misuseバグを検出します。 (1)フェーズ-1では、分析コンテキストは、制御フローグラフを構築し、ポイントツー範囲、パスに敏感な分析を使用して、制約不足のシンボリック実行を使用することにより、仕様で定義された各ターゲットAPIのプログラムパストレースを作成することにより構築されます。この例では、上記のプログラムパストレースに示すように、2つのトレース、T1とT2が生成されます。このようにして、imcheckerはX509_get_pubkey() 、 EVP_PKEY_free()の使用状況コンテキストを正常にキャプチャできます。 (2)フェーズ-2では、Imcheckerは、潜在的なバグとして制約の違反を検出するためにトレースを使用します。たとえば、 X509_get_pubkey()の2つのAPI-MISUSEインスタンスは、潜在的なバグとしてラベル付けされたエラーコードチェックが欠落しているために見つかります。 (3)フェーズ3では、Imcheckerは複数の使用法とセマンティック情報を活用することにより、検出精度を改善します。次に、2番目の誤用は、 X509_to_X509_REQ()で行われたチェックに対して、25行目で除外されます。
私たちのツールの使用はこちらにあります:ツール/readme.md
Imcheckerによって生成されたバグレポートを調査している間、いくつかの興味深いバグを見つけ、オープンソース開発者とのバグレポートプロセスで有用なエクスペリエンスを獲得します。次の経験を共有しています。
著者は、Linux Kernelの開発者に感謝し、IMSPECを改良し、バグレポートを確認するのに役立ちます。