【DevSecOps入門】開発初期から始める脆弱性チェック!npm auditとOWASP Dependency-Checkを試してみた

に公開

シフトレフト時代ということもあり開発段階からのセキュリティの強化が大切です。脆弱性チェックを組み込んでいくDevSecOpsに取り組んでいきたいと思います。
今回行ってみるのはnpm auditとOWASP Dependency-Checkです。

それって一体?

これらはSCA(Software Composition Analysis)と呼ばれるものです。SCAは、プロジェクトが利用しているサードパーティ製のライブラリやコンポーネントに既知の脆弱性がないかチェックしてくれるツールです。
自分で書いたソースコードそのものの脆弱性ではなく、pom.xmlやpackage.jsonといった定義ファイル、あるいは組み込まれたライブラリのバージョンをスキャンし、NVD(National Vulnerability Database)が提供するような脆弱性情報と照合します。
つまり、使ってる部品の安全性をチェックしてくれるんですね。
既知の脆弱性を突いたサイバー攻撃は多いので定期的にチェックしておくことが非常に大切です。

npm audit

npm auditは、JavaScriptのプロジェクトが依存しているサードパーティ製パッケージ(ライブラリ)の脆弱性をチェックするコマンドです。
具体的には、プロジェクトのpackage.jsonファイルとpackage-lock.jsonファイルに記載されている依存関係をすべてスキャンし、それらのパッケージのバージョン情報を、npmの公式な脆弱性データベースと照合します。
これにより、プロジェクトが直接的または間接的に利用しているパッケージに、既知のセキュリティ上の問題がないかを確認することができます。

実行するには、プロジェクトルートで以下のコマンドを入力します。

npm audit

結果は

found 0 vulnerabilities

でした。
今回は脆弱性が見つかりませんでしたが、見つかった場合は以下を試します。

npm audit fix

このコマンドは、脆弱性を修正するためにパッケージのバージョンを自動的にアップデートします。多くの場合、これにより脆弱性は解消されます。ただし、メジャーアップデートが必要な場合(例えば、バージョン1.xから2.xへなど)は、npm audit fix --forceを使わないと修正できないことがありますが、これは互換性の問題を引き起こす可能性があるため慎重に対応します。

OWASP Dependency-Check

より包括的に脆弱性をチェックすることができるOSSツールです。

  • 幅広い言語に対応: Java、.NET、Node.js、Python、Rubyなど、多くのプログラミング言語とエコシステムをサポート。
  • 多様な実行形式: コマンドラインツールとしてだけでなく、Maven、Gradle、Antなどのビルドツールや、Jenkins、Azure DevOpsなどのCI/CDツールとのプラグイン連携も可能。

GitHubの公式ページはこちら。

今回はSpringboot環境の脆弱性をチェックするためにMavenに組み込んでいきます。

<plugin>
    <groupId>org.owasp</groupId>
    <artifactId>dependency-check-maven</artifactId>
    <version>12.1.3</version><!--最新バージョンを確認してください-->
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<build><plugins>タグの中に追記します。
backend/pom.xmlなどとしてマルチモジュールプロジェクト配置されている場合は、子POMのビルドセクションに記載します。
設定後は、プロジェクトルートでmvn、もしくはmvnwコマンドを実行します。

./mvnw verify

エラーが出る場合はプロジェクトがビルドできる状態になっているか確認します。
初回はNVDデータを大量にダウンロードするので、かなり時間がかかるので待ちます。プロジェクトなどで永続的に使う場合はNVD APIが推奨されるようです。

依存関係チェックは、NVD データフィードの使用から NVD API に移行しました。依存関係チェックのユーザーは、NVD API キーを取得することを強くお勧めします。

分析が終わるとtargetフォルダにdependency-check-report.htmlが生成されます。


OWASP Dependency-Checkで検出された複数の脆弱性
沢山検出されましたね・・・

下の3つの高深刻性の中でも、組み込みtomcatの脆弱性がやばそうです。

脆弱性を修正する

Spring Bootは、特定のバージョンの組み込みTomcat(またはJetty、Undertow)を使用するように設計されています。脆弱性が修正されたTomcatのバージョンがリリースされると、Spring Bootのチームはそれを組み込んだ新しいバージョンのSpring Bootをリリースします。

ということで、springbootのバージョンをアップデートさせるのが本質的な対策となりますね。
pom.xmlの<parent>タグで指定されているspring-boot-starter-parentのバージョンを、脆弱性が修正された最新のバージョンに変更します。

 <parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <!--<version>3.3.2</version>  修正前のバージョン-->
   <version>3.5.4</version>   <!--最新バージョン-->
 </parent>

変更後また、同じように診断します。

./mvnw verify

再度生成されたdependency-check-report.htmlを見てみると

0件になっています
すべての脆弱性が綺麗に解消されました。

まとめ

JavaScriptプロジェクトにはnpm auditが手軽で便利ですが、JavaやPythonなど複数の言語を扱うプロジェクトや、より包括的なチェックを行いたい場合はOWASP Dependency-Checkが適しているでしょう。
今回は一回限りのチェックでしたが、OSSの脆弱性修正は高頻度なので、これらのツールをCI/CDパイプラインに組み込んで定期的にチェックできる体制を構築しておくことが重要ですね。

Discussion