人気のDockerイメージ上位10個には、それぞれ少なくとも30件の脆弱性が含まれている
2019年2月26日
0 分で読めますSnykの年次レポート「State of Open Source Security 2019」へようこそ。このレポートは複数の記事に分かれています。
人気のDockerイメージ上位10個には、それぞれ少なくとも30件の脆弱性が含まれている
これらすべての情報をまとめた、手作りの素敵なPDFレポートもダウンロードできます。
2019年版オープンソースセキュリティレポートをダウンロード
Dockerイメージに含まれる既知の脆弱性
アプリケーションコンテナ技術の導入は驚異的な速さで進んでおり、451 Researchによると、2020年にはさらに40%成長すると予想されています。多くのDockerイメージにはシステムライブラリが含まれています。これは、Linuxディストリビューションをベースとする親イメージに依存しているためです。
Dockerイメージは大きな価値をもたらす一方で、ほぼ常に既知の脆弱性も含んでいる
Snykが最近リリースしたDockerスキャン機能を使い、最も人気のあるイメージ10個をスキャンしました。
調査の結果、スキャンしたすべてのDockerイメージで、脆弱性のあるバージョンのシステムライブラリが見つかりました。公式Node.jsイメージには脆弱性のあるシステムライブラリが580個含まれており、ほかのイメージにもそれぞれ少なくとも30件の公知の脆弱性が含まれていました。

Snykは最近、開発者がDocker化されたアプリケーションのセキュリティに全面的に責任を持てるよう、コンテナの脆弱性管理ソリューションをリリースしました。この新機能を使うと、開発者はDockerのベースイメージに含まれる既知の脆弱性を見つけ、Snykの修正アドバイスに従って対処できます。Snykは、最小限のアップグレード、または脆弱性がより少ない、あるいは含まれない代替ベースイメージを提案します。
把握していれば、修正は簡単です。イメージの20%はDockerイメージを再ビルドするだけで、44%はベースイメージを入れ替えるだけで脆弱性を修正できます。
Snykユーザーが実施したスキャンによると、Dockerイメージのスキャンの44%で既知の脆弱性が見つかり、それらにはより新しく安全なベースイメージが存在することがわかりました。この修正アドバイスはSnyk独自のものです。開発者はこれに基づいてDockerイメージをアップグレードできます。
またSnykは、Dockerイメージのスキャンの20%で既知の脆弱性が見つかり、イメージを再ビルドするだけで脆弱性の数を減らせることも報告しました。
イメージタグによる脆弱性の違い
Node.jsランタイムの現行の長期サポート(LTS)バージョンはバージョン10です。「10」というタグが付いたイメージ(例:node:10)は、実質的にはnode:10.14.2-jessie(テスト時点)へのエイリアスです。jessieは、現在は積極的に保守されていない古いDebianのバージョンを指します。
Dockerfileのベースイメージにこのイメージを選ぶと、イメージに含まれる脆弱なシステムライブラリ582個にさらされることになります。別の選択肢として、不要な依存関係(manページやその他のアセットなど)を省いた軽量イメージを提供するnode:10-slimタグを使う方法があります。ただし、node:10-slimを選んでも、脆弱なシステムライブラリが71個含まれます。
脆弱性の大半は、選択したベースイメージに由来します。そのため、修正はベースイメージの改善に重点を置くべきです
非常に小さく、システムライブラリを最小限に抑えたベースイメージが必要な場合は、node:10-alpineがより適した選択肢です。ただし、テストしたAlpineイメージのバージョンでは脆弱性が検出されませんでしたが、セキュリティ上の問題が一切ないとは限りません。
Alpine Linuxの脆弱性への対応は、パッチをバックポートすることを好む他の主要ディストリビューションとは異なります。Alpineでは、イメージを頻繁にリリースし、各リリースでシステムライブラリをアップグレードする方針を採用しています。

さらに、Alpine Linuxにはセキュリティ勧告プログラムがありません。そのため、システムライブラリに脆弱性があっても、Alpine Linuxから公式の勧告は発行されません。利用可能な場合、Alpine Linuxは問題を修正する新バージョンのライブラリを含む新しいベースイメージを作成して脆弱性に対処します(前述のバックポート方式とは異なります)。
脆弱なライブラリの修正版がAlpine Linuxですぐに利用可能になる保証はありませんが、多くの場合は速やかに提供されます。それでも、アプリケーションに影響を与えずにAlpine Linuxのバージョンへ安全に移行できれば、使用するライブラリが少なくなるため、環境の攻撃対象領域を縮小できます。
node:10のようなイメージタグは、実際には別のイメージへのエイリアスであり、10の新しいマイナーバージョンやパッチバージョンがリリースされるたびに参照先が変わります。

エイリアスではなく特定のバージョンタグを使い、たとえばベースイメージをnode:10.8.0-jessieに固定するチームもあります。しかし、Node 10の新しいリリースが登場すれば、新しいイメージにはシステムライブラリの脆弱性がより少ない可能性があります。
SnykのDockerスキャン機能を使って調べたところ、node:10.8.0-jessieのような特定のバージョンタグをプロジェクトで使っている場合でも、脆弱性の少ない新しいイメージを推奨できることがわかりました。
システムライブラリに含まれる既知の脆弱性
Debian、RedHat Enterprise Linux、Ubuntuなどの主要なLinuxディストリビューションに影響するシステムライブラリの脆弱性が増加しています。2018年だけで、これらのディストリビューションに関してCVEが割り当てられたシステムライブラリの脆弱性を1,597件追跡しました。これは2017年の4倍を超える数です。

脆弱性の内訳(高および重大)を見ると、こうした深刻度の脆弱性が2017年から2018年にかけて増え続けていることが明らかです。

続きを読む:
実践に役立つリソースやヒントは、SnykのDevSecOps Hubをご覧ください。
Dockerセキュリティのベストプラクティス10選では、Dockerのベースイメージを構築するときや取得するときに従うべきセキュリティ対策を詳しく解説し、Docker Content Trustについても紹介します。
Java開発者の方には、こちらの資料がおすすめです。Java開発者のためのDocker:セキュリティで失敗しないために知っておくべき5つのこと
DockerでNode.jsのWebアプリケーションをコンテナ化するためのベストプラクティス10選。Node.js開発者なら、Node.jsアプリケーション向けに安全で高パフォーマンスなDockerベースイメージを構築する方法を、手順を追って解説するこの記事をぜひご覧ください。
