.NET依存関係の脆弱性を自動修正する機能を発表
2021年11月17日
0 分で読めますSnyk Open Sourceで.NETアプリケーションのサポートを強化しました。実用的なアドバイスと自動プルリクエストを活用して、開発者が.NET依存関係の脆弱性を修正できるようになります。
この記事の執筆時点で、Microsoftがサポートする.NETの事実上の標準パッケージマネージャーNuGetには、276,266個の固有パッケージがあり、週平均で10億回以上ダウンロードされています。2020年には、npmに次いで、NuGetがパッケージ数の前年比成長率で最大となりました。
この数字は、.NETフレームワークの人気を示すとともに、.NET開発チームが直面する主要な課題の一つも浮き彫りにしています。それは、こうしたパッケージに見つかった既知の脆弱性がもたらすセキュリティリスクの管理と軽減です。脆弱性は、ほかのパッケージが取り込むパッケージである推移的依存関係に見つかることも少なくありません。そのため可視性が低下し、必要な修正も複雑になります。
Snyk Open Sourceの新機能により、開発者は.NETの直接依存関係と推移的依存関係の脆弱性を正確に特定できるだけでなく、自動で修正できるようになりました。
Snyk Open Sourceで実現する.NETのセキュリティ
Snyk Open Sourceでは、.NET依存関係の脆弱性の特定と修正を、依存関係ツリーの正確な分析と、その結果をSnyk Intel(業界をリードするSnykの脆弱性データベース)と照合するという2つの重要なプロセスによって実現しています。
依存関係の分析
.NETエコシステムには複数の階層の依存関係があり、開発者にとって明らかなものもあれば、完全に隠れているものもあります。
.NETアプリケーションの脆弱性を正しく特定するには、こうした依存関係を正確に解決する必要があります。
Snyk CLIとソースコード管理(SCM)システム(Azure Repos、GitHubなど)では、依存関係の解決方法が異なります。たとえばCLIでは、PackageReferenceやpackages.configなど、プロジェクトの依存関係の管理方法に応じて、前者の場合はobj/project.assets.jsonを、後者の場合はpackagesディレクトリをスキャンします。この方法により、非常に正確な分析が可能になります。
SCM連携を通じてプロジェクトをスキャンする場合、前述の生成ファイルは利用できないため、別のプロセスが必要です。そのため、NuGetの依存関係解決アルゴリズムに従って依存関係ツリーを構築します。ランタイム依存関係(環境から提供されるメタパッケージ)は、アプリを実行するサーバーと同じようなランタイムSDKをホストマシンが使用している場合、CLIでより正確に解決できる点にご留意ください。
脆弱性インテリジェンス
依存関係ツリーを特定すると、Snyk Open Sourceは依存関係のリストをSnyk Intelと照合します。.NETの脆弱性を網羅的に収録しており(次に利用可能な公開データベースの4.4倍)、Snyk Intelは迅速な修正に役立つ、正確で実用的な情報を提供します。これには、影響を受けるパッケージのバージョンや、問題を修正するために必要なアップグレード先のバージョンが含まれます。Snyk Intelには、合計700件を超える.NETの脆弱性が収録されており、その63%は重大または高深刻度の脆弱性です。
UbracoFormsパッケージは興味深い例です。アプリケーションにフォームやアンケートを組み込むために使われるUbracoFormsは、数十万回ダウンロードされています。パッケージの最新バージョンであるバージョン8.8.0には脆弱性がありませんが、それ以前のバージョンには、重大なリモートコード実行(RCE)の脆弱性が含まれています。

Snyk Open Sourceはこの情報を使って必要な修正を算出し、修正に関するアドバイスと、自動で作成される修正プルリクエストの両方に反映します。
詳しく見ていきましょう。
Snyk Open Sourceの.NET向け修正アドバイス
SnykはGitHub、GitHub Enterprise、Azure Repos、GitLab、Bitbucket Server、Bitbucket CloudなどのGitベースのSCMと連携します。プロジェクトを簡単にインポートし、既存の開発ワークフローの中で、特定された脆弱性やライセンスの問題を見つけて修正できます。
プロジェクトのインポートは簡単です。Projectsページに移動し、ページ右上のAdd projectをクリックして、インポートするプロジェクトの種類(GitHub、Bitbucketなど)と、プロジェクトを含むリポジトリを選択するだけです。ここでは、意図的に脆弱性を含めたサンプルアプリケーションをインポートします。
プロジェクトをインポートすると、Snykが自動的にスキャンして問題を検出します。この例では、Snyk Codeがカスタムコード内の問題(1)を特定し、Snyk Open Sourceが使用しているオープンソースの.NETパッケージから、より多くの問題(2)を特定しました。

.NETのプロジェクトファイルをクリックすると、これらの問題を詳しく確認できます。

合計18件の問題が特定されました。Snykは複数の方法で修正を支援します。
まず、Dependenciesタブには依存関係ツリー全体が表示され、プロジェクトの構築に使用されているすべての.NETパッケージと、それらが引き起こす問題(既知のセキュリティ脆弱性とライセンスの問題の両方)をすべて確認できます。

ツリーをフィルタリングして、脆弱性のある依存関係だけ、またはライセンスの問題がある依存関係だけを表示できます。これにより、直接依存関係または推移的依存関係のどちらを通じて問題が持ち込まれたのか、明確に把握できます。
次に、Fixesタブでは、脆弱性の修正に関するアドバイスが表示されます。すべての問題を修正できるわけではありませんが、修正可能な問題については、修正を適用するために必要なアップグレード経路を正確に確認できます。
注:Snyk Open Sourceは、直接依存関係と推移的依存関係の両方で特定された脆弱性について、アップグレード経路を推奨します。ただし、脆弱性を修正する新しいバージョンの直接依存関係が存在する場合に限ります。
この例では、TinyMCEパッケージをバージョン4.8.2からバージョン5.6.0にアップグレードすると、4件の脆弱性を修正できるとSnykが示しています。

メインのIssuesタブに戻りましょう。ここでは、Snyk Open Sourceが問題の一覧を確認し、修正の優先順位を決めるための豊富な情報を提供します。これには、問題の緊急度をすばやく把握できる、課題カード右上の優先度スコア(Snykの優先度スコアについてはこちら)と、アップグレード経路が含まれます。
以下の例では、Snyk Open SourceがHalibutパッケージに重大な脆弱性を特定し、バージョン4.4.7へのアップグレードを推奨しています。

脆弱性を修正するには、Fix this vulnerabilityボタンをクリックして、プルリクエストを手動で作成できます。修正可能な脆弱性が一覧表示されたページが開くので、修正する脆弱性を1つ以上選択できます。

この場合は、修正したいHalibutパッケージの脆弱性1件だけを選択します。
ページ下部のOpen a Fix PRをクリックするとプルリクエストが作成され、GitHub上の該当リポジトリで確認できます。

プルリクエストには、マージするかどうかを判断するために必要な情報がすべて含まれています。脆弱性そのものに関する情報や、提案された修正の範囲などを確認できます。

新たな脆弱性が見つかった場合や、既存の脆弱性に対する新しい修正が利用可能になった場合、Snykはリポジトリにプルリクエストを自動で作成します。
プロジェクトに新たな問題が誤って持ち込まれるのを防ぐため、Snyk Open Sourceは、あなたやリポジトリのほかのコントリビューターが新しいプルリクエストを作成するたびに、脆弱性や問題のあるライセンスがないか自動でテストします。

さっそく始めましょう!
.NETエコシステムは、ほかのエコシステムと比べて比較的複雑です。オープンソースの.NETパッケージがもたらすリスクを適切に管理・軽減するには、依存関係ツリーを正確に把握するだけでなく、見つかった脆弱性に対処して修正できるよう、必要な情報とワークフローを提供することが重要です。
Snyk Open Sourceの新しい修正機能により、開発チームとセキュリティチームはアプリケーションのさまざまな問題を見つけ、日々のワークフローの中で積極的に修正し、新たな問題の混入を防げます。利用を始める方法については、公式のSnyk for .NETドキュメントをご覧ください。
まだお試しでない方は、ぜひSnykに登録してください。修正を楽しみましょう!
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。