
バリアント分析と可視化ツール。コードベースをスキャンして類似の脆弱性を検出します。
![]()
C0deVari4ntは、コードベース内の類似する脆弱性を検査するためのバリアント分析および可視化ツールです。セマンティックコード分析エンジンであるCodeQLを活用し、ユーザーが制御するCodeQLクエリテンプレートに基づいてコードをクエリし、その結果をvis.jsとReactで構築されたクライアントインターフェースに渡して、さらなる調査と可視化を行います。これにより、以前の脆弱性レポートに基づいて迅速かつ包括的なバリアント分析が可能になります。vis.jsの可視化機能は、開発者に脆弱なコードパスに対する追加の洞察を提供し、潜在的なバリアントを効果的にトリアージできるようにします。

2021年12月のLog4Shellインシデントは、オープンソース開発者が脆弱性レポートに対応する際に直面する困難を浮き彫りにしました。CVE-2021-44228(未認証のリモート攻撃者が脆弱なバージョンのLog4j 2を実行しているデバイスを制御できるようにする脆弱性)に対する最初のパッチの後、Apacheは関連する脆弱性と未対策のエッジケースに対処するために3つの追加パッチをリリースしました。
オープンソース開発者は包括的なコードレビューの訓練を受けておらず、脆弱性のバリアントを特定する際に問題に直面し、不完全なパッチにつながることがよくあります。CodeQLクエリスイートはコードベースの迅速な分析を容易にするために存在しますが、これらのスイートから返される結果は、有意な偽陽性率をもたらす可能性があります。さらに、これらのスイートは事前定義されたクエリに依存しており、バリアント分析をサポートせず、個別のコードベースにカスタマイズされていません。そのため、オープンソースプロジェクトは脆弱性レポートに対して断片的に対応し、潜在的なバリアントを見逃すことがよくあります。
C0deVari4ntは、開発者が独自のCodeQLクエリを作成する大きなオーバーヘッドなしに、簡単にバリアント分析を実施できるプラットフォームを提供します。これにより、開発者は脆弱性の特定のソースやシンクなどのコードベース固有の情報を提供することで、CodeQLテンプレートをカスタマイズする柔軟性を得られます。結果はvis.jsを利用したグラフデータベースビューで可視化され、開発者が潜在的なバリアントを迅速に特定できるようになります。これにより、開発者は単一の脆弱性レポートからバグのクラス全体に効果的に対処できるようになります。
C0deVari4ntは、Python、CodeQL、vis.js、Reactを使用して構築されており、ユーザー入力を受け取り、異なる脆弱なコードパス間の関係を表示するインタラクティブなGUIアプリケーションを提供します。

C0deVari4ntは、以下の2つの主要コンポーネントで構成されています:
クライアントインターフェースの詳細は以下をご覧ください:

api-serverディレクトリに移動し、dbextractor.py <codeql db zip file> を実行してCodeQLデータベースの内容を解凍します。api-serverに移動pip install -r requirements.txtuvicorn main:app --reload を実行して、ポート8000でローカル開発サーバーを起動します。react-guiに移動npm inpm start を実行してローカル開発サーバーを起動します。
strcat 関数へのすべての呼び出しを見つけるstrncpy 関数へのすべての呼び出しを見つけるsnprintf の呼び出しの戻り値に境界チェックがないすべてのケースを見つける
malloc、calloc、または realloc へのすべての呼び出しを見つけるisAdditionalTaintStep メソッドを使用して、2つの接続されていない関数間で汚染を転送するisAdditionalTaintStep メソッドを使用して、実行時に同じ値を持つポインタ間で汚染を転送する以下は、recvfromをソース、mempool_allocを追加の汚染ステップ、memcpyをシンクとするクエリのCodeQL結果を示しています:

この結果は、合計 27の異なるコードパスにおける180ノード を生成します。結果は以下のシンプルなneo4jインターフェースに表示されます:

このクエリをツールに通すことで、各ノード、ソース、シンクの重複発生を特定し、ノードの関係をマージすることができました。
その結果、11の一意ノード からなる、はるかにクリーンなグラフが得られ、27の一意のコードパスはすべて保持されました:

結果は、パスラベリング機能を使用して、それぞれのパスにさらに分類できます:

