
C/C++ソースコードの脆弱性を発見するための静的解析ツール
これはDavid A. Wheelerによる「flawfinder」です。
Flawfinderは、C/C++ソースコードをスキャンして潜在的なセキュリティ上の欠陥を報告するシンプルなプログラムです。ソフトウェアの脆弱性を調査するための有用なツールであり、静的ソースコード解析ツールへの簡単な入門としても役立ちます。インストールと使用が簡単になるように設計されています。FlawfinderはCommon Weakness Enumeration(CWE)をサポートしており、公式にCWE互換です。SARIF、SonarQube、HTMLなど、さまざまな出力形式をサポートしています。
FlawfinderはAIベースのコード分析ツールと併用できます。Flawfinderの出力を使用すると、どのコード領域に特に注意を払うべきかをすばやく特定でき、AIシステムがさらに詳細に調査できます。
詳細については、プロジェクトウェブサイトを参照してください。
Flawfinderは、Unix/Linux/POSIXシステム(Cygwin、Linuxベースのシステム、MacOS、各種BSDを含む)でのコマンドラインツールとして使用するように設計されています。Pythonが必要です(Python 3でテストしています。Python 2.7でも動作するはずですが、テストはあまり行われていません)。
単に使用したい場合は、Pythonの「pip」またはシステムのパッケージマネージャーを使用してflawfinderをインストールできます(flawfinderは多くのシステム向けのパッケージがあります)。また、通常の make install によるソースインストールの慣例にも従って簡単にインストールできます。ファイルINSTALL.mdに詳細なインストール手順があります。インストールしなくても実行できますが、インストールした方が簡単です。
Flawfinderを実行するには、ソースファイルまたはディレクトリのリストをexampleに渡すだけです。たとえば、"src/"内のすべてのファイルを再帰的に調査するには:
flawfinder src/
現在のディレクトリ内のすべてのファイルを再帰的に調査するには:
flawfinder ./
ヒット(検出結果)には、0(非常に低リスク)から5(高リスク)までのリスクレベルが割り当てられます。デフォルトでは、リスクレベル1以上の検出結果が表示されます。現在のディレクトリ以下でリスクレベル4以上のヒットのみを表示するには、次のようにします:
flawfinder --minlevel 4 ./
マニュアルページ(flawfinder.1またはflawfinder.pdf)には、flawfinderの使用方法(各種オプションを含む)および関連情報(CWEのサポート方法など)が記載されています。例えば、--html オプションはHTML形式で出力を生成します。--help オプションはオプションの簡単な一覧を表示します。
Flawfinderは、ソースコードの文字エンコーディングを正しく解釈できる必要があります。ほとんどの場合、特にソースコードがUTF-8で正しくエンコードされ、システムがUTF-8を使用するように設定されている場合(圧倒的に一般的な状況)には問題はありません。
ただし、Python3を実行していて文字エンコーディングの問題がある場合、flawfinderが停止する可能性があります。通常の症状は、次のようなエラーメッセージです:
Error: encoding error in FILENAME 'ENCODING' codec can't decode byte ... in position ...: invalid start byte
残念ながら、Python3にはこれに対処するための便利な組み込み関数がありません。そのため、外部ライブラリに依存せずにこの問題に対処するのは簡単ではありません(それは避けたいところです)。
この問題が発生した場合は、flawfinderのマニュアルページで様々な解決策を参照してください。最も簡単な方法の1つは、ソースコードとシステム設定をUTF-8に変換することです。ソースコードをUTF-8に変換するには、システムツールの iconv やPythonプログラム cvt2utf などのツールを使用できます。cvt2utf は pip install cvt2utf でインストールできます。
より技術的には、flawfinderは字句スキャンを使用して、脆弱性の可能性を示唆するトークン(関数名など)を見つけ、そのリスクレベルを推定し(関数呼び出しのテキストなどに基づいて)、結果を報告します。Flawfinderは、制御フロー、データフロー、データ型、名前空間、スコープに関するほとんどの情報を使用したりアクセスしたりしません。そのため、flawfinderは必然的に多くの脆弱性の誤検出を生成し、多くの脆弱性を報告できません。一方で、flawfinderはビルドできないプログラムやリンクできないプログラムの脆弱性を見つけることができます。また、より洗練されたツールが苦手とするマクロ定義やその他の特殊性にもあまり混乱しません。
GitHubを使用している方向けのGitHub Actionが用意されています。
action.yml を参照してください。
.github/workflows の下に以下の内容の .yml ファイルを作成します:
- name: flawfinder_scan
uses: david-a-wheeler/[email protected]
with:
arguments: '--sarif ./'
output: 'flawfinder_results.sarif'
引数には他にも多くのオプションを追加できます。例えば、--error-level=4 とすると、flawfinderがレベル4以上の脆弱性を見つけた場合にエラーを返すようになります。@ 記号の後のバージョン番号に注意してください。別のバージョンを選択することもできます。
アクション名とバージョン文字列は、Marketplace で「Use latest/xxx version」ボタンをクリックして確認できます。
FlawfinderはSonarQubeのcxxプラグインと統合します。最初に以下のオプションを使用してFlawfinderを1回実行し、SonarQubeの「Administration > CXX External Analyers > Other Rule Definitions」でFlawfinderルールを追加します。
flawfinder --listrules --sonar [...]
次に、CI/CDで以下のようにFlawfinderを実行し、SonarQubeが理解できる出力を生成します。
flawfinder -CDQ --sonar [...]
出力をファイルにリダイレクトし、sonar.cxx.other.reportPaths オプションを使用してSonarQubeに読み込ませます。
貢献を歓迎します!貢献の詳細については、ファイルCONTRIBUTING.mdを参照してください。
FlawfinderはGNU GPLライセンスバージョン2以降(GPL-2.0+)の下でリリースされています。ライセンス情報についてはCOPYINGファイルを参照してください。