crypto-jsおよびcrypto-esで弱いハッシュの脆弱性を発見(CVE-2023-46233およびCVE-2023-46133)
2023年10月25日
0 分で読めます10月18日、セキュリティ研究者のZemnmezは、メンテナンスが終了しているオープンソースの暗号標準JavaScriptライブラリcrypto-jsで発見した「弱いハッシュの使用」脆弱性について、責任ある開示の手続きを開始しました。この脆弱性は、ES6およびTypeScript向けのパッケージcrypto-esにも影響します。研究者は、メンテナーに非公開での開示を有効にするよう求める同様のissueも作成しました。crypto-jsとcrypto-esの両リポジトリでは、Zemnmezが要望した「security advisories」と「private vulnerability reporting」の機能が有効になりました。その後、この脆弱性はライブラリの過去のすべてのバージョンに影響することが判明しました。Node.jsコアのcryptoライブラリに影響することを示す情報はありません。
クイックリンク
crypto-jsおよびcrypto-esの脆弱性について
Snykはこの脆弱性に関するアドバイザリを2件公開しました。
SNYK-JS-CRYPTOJS-6028119:
crypto-js(CVE-2023-46233)SNYK-JS-CRYPTOES-6032390:
crypto-es(CVE-2023-46133)
Zemnmezが指摘したセキュリティ脆弱性に対処する新バージョンのcrypto-es(2.1.0)とcrypto-js(4.2.0)がリリースされました。crypto-esのコミットには、「セキュリティ強化のためにデフォルトパラメーターを変更」と記載されています。crypto-jsライブラリにも修正が適用されていますが、deprecatedとされてはいないものの、通常は更新されないライブラリである点に注意が必要です。別の選択肢の検討をおすすめします(詳しくは後述)。
関連するアドバイザリでは、問題が次のように説明されています。
「このパッケージの影響を受けるバージョンは、
PBKDF2 (Algo)クラスのセキュリティ設定が不十分なため、『弱いハッシュの使用』に対して脆弱です。このクラスでは安全でないSHA1が使われ、反復回数も1と少なく設定されています。これらの安全でない設定により、PBKDF2 (Algo)をデフォルトパラメーターで使用した場合、攻撃者がブルートフォース攻撃を実行できる可能性があります(crypto-jsのアドバイザリでは、ライブラリがすでにメンテナンスされていないことも明記されています)。」
修正では、iterationsパラメーターのデフォルト値が1から250000に変更されました。この脆弱性の最大のリスクは、この機能を使ってハッシュ化されたデータ(保存されたパスワードなど)がブルートフォース攻撃にさらされることです。pbkdf2の一般的な用途は、保存されたパスワードや署名(ファイル検証など)です。署名の検証にpbkdf2を使っている場合、同一の暗号署名を生成する選択平文攻撃が可能になることもあります(ただし、コストが高くなる可能性があります)。つまり、攻撃者が暗号検証を通過する入力を作成できるということです。
修正に備える方法
影響範囲を把握する
修正済みバージョンのcrypto-jsとcrypto-esがリリースされる前でも、Snykを使って、影響を受けるオープンソースプロジェクトやコンテナイメージをすばやく見つけることができます。
SnykアプリのUIサイドバーでDependenciesに移動します。Dependenciesビューを開いたら、Dependenciesフィルターを展開して「crypto-js」と入力します。個々のバージョンを選ぶか、Select allのショートカットを選択し、フィルターの外側をクリックして結果を表示します。その後、「crypto-es」についても同じ手順を繰り返します。選択したバージョンのcrypto-esを使用しているプロジェクトがすべて表示されます。プロジェクトと依存関係をさらに確認して影響範囲を把握し、修正の優先順位を決めることができます。

Snyk Advisorでパッケージの健全性を確認する
Snyk Advisorは、次のプロジェクトに最適なパッケージを見つけるのに役立ちます。crypto-jsを検索すると、この暗号ライブラリには活発なコミュニティがある一方、メンテナンスはinactiveで、類似パッケージも表示されます(このスクリーンショットは脆弱性の開示・割り当て前に撮影されたものです。開発者が新しいバージョンを公開したため、現在はメンテナンスレベルがsustainableと判定されています)。

主要プロジェクトやエコシステムの改善を追う
提供終了となったcrypto-jsライブラリの以前のメンテナーは、提供終了の理由の一つとして「CryptoJSの開発を続けても、ネイティブのCryptoをラップするだけになってしまう」ことを挙げています。使用しているライブラリの健全性スコアを追跡することで、脆弱性を未然に回避しやすくなります。ただし、エコシステム自体の改善動向を把握しておくことも重要です。このような状況では、エコシステムのネイティブ機能でサードパーティライブラリを置き換えられるかどうかを確認するのが、最善の対応となるチームもあります。
Snykで脆弱性を検出する
Snykを使ってcrypto-jsとcrypto-esの脆弱性を検出する方法はいくつかあります。Snyk CLIを使ってプロジェクトをローカルでテストするほか、SCMインテグレーションでプロジェクトをSnykにインポートしたり、Snykレポートでcrypto-jsとcrypto-esを検索し、すでにSnykにインポートしたすべてのプロジェクトをすばやく確認したりできます。
Snyk CLIでプロジェクトをテストする
Snyk ContainerとSnyk Open Sourceでは、snyk container testおよびsnyk testを実行することで、脆弱なバージョンのcrypto-jsまたはcrypto-esに依存するOSパッケージやオープンソースライブラリを検出できます。Snykでコンテナイメージやオープンソースプロジェクトをモニタリングすると、crypto-jsやcrypto-esに関する今回のような新たな脆弱性が発生した際に通知を受け取れます。コンテナイメージの場合はsnyk container monitor、オープンソースライブラリの場合はsnyk monitorで登録してください。
次の例は、Snyk CLIでNode.jsプロジェクトをスキャンした結果です。このプロジェクトではcrypto-jsバージョン4.0.0が使われており、4.2.0への更新が推奨されています。
SCMインテグレーションでプロジェクトをテストする
サポート対象のSCMインテグレーション(GitHub、Bitbucket、GitLab、Azure Repos)を使ってプロジェクトをSnykにインポートすると、自動的にテストが実行されます。Snyk UIで、プロジェクト内のcrypto-jsおよびcrypto-esの脆弱性を特定し、優先順位を付けて修正できます。
Snyk ReportingまたはSnyk Insightsでプロジェクト全体の脆弱性を検出する
Snykのレポート機能(Enterpriseプラン)とSnyk Insightsを利用できるお客様は、すでにインポートしてSnykでモニタリングしているプロジェクト内のcrypto-jsまたはcrypto-esをすばやく特定できます。2種類のcrypto-脆弱性には共通のCWEがあります。Insightsページで、次のように共通のCWEであるCWE-328をフィルターしてください。

問題が見つかると、どこで使用されているかを正確に確認できます。プロジェクトをクリックすると、問題の詳細や修正手順を確認できます。
SnykのRisk Scoreで修正の優先順位を付ける
プロジェクト内でcrypto-jsやcrypto-esに関する問題が複数見つかると、どこから修正するべきか迷うことがあります。Snykでは優先順位付けに役立つ複数の方法を提供していますが、Risk Scoreの利用をおすすめします。
SnykのRisk Scoreは複数のリスク要因を算出し、最初に対処すべき問題をすばやく特定できるようにします。EPSS、エクスプロイトの成熟度、CVSS、ソーシャルトレンドなどのシグナルをスコア化し、脆弱性の一覧を効率よく確認して、適切な修正の優先順位を付けられます。crypto-jsとcrypto-esの場合、スコアは状況に応じて異なります。

各crypto-jsおよびcrypto-esの問題のスコアは、Projectsページに表示されるほか、Snykのレポートでも確認できます。
オープンソースまたはコンテナのベースイメージにおけるcrypto-脆弱性を修正する方法
脆弱性が修正された新しいタグにベースイメージを更新してください。サポート対象のエコシステムでは、必要な修正を含むプルリクエストをSnykから直接作成できます。
たとえば、SnykはUIまたはCLIで代替となるコンテナベースイメージを推奨します。また、GitHubなどのSCM経由でソースコードリポジトリをインポートすると、DockerfileのFROM行を更新するプルリクエストを作成し、コンテナイメージの修正を自動化できます。

PBKDF2の使用時にiterationsパラメーターを指定すれば、脆弱性の影響を回避できる可能性もあります。ただし、iterationsに低い値を指定していないことも必ず確認してください。
…このようにすると、以前の脆弱性と同じ状態になってしまいます。
crypto-jsおよびcrypto-esの脆弱性への対応に向けた次のステップ
この記事で紹介した方法で、Snykを使ってプロジェクトをテストしましょう。まずは無料のSnykアカウントを作成し、インポートウィザードで影響を受ける可能性のあるプロジェクトをすべてインポートしてスキャンしてください。
優先度スコアまたはInsightsを使って、
crypto-jsおよびcrypto-esの脆弱性に対する優先度の高い修正を特定しましょう(Snyk Enterpriseプランをご利用のお客様向け)。オープンソースプロジェクトの依存関係またはコンテナイメージを更新して修正を適用します。
crypto-jsは4.2.0以降、crypto-esは2.1.0以降に更新してください。状況の進展を引き続き確認し、新たな動きがあればSnyk Blogをご覧ください。Snykのセキュリティチームは、最新情報にあわせてリソースを定期的に更新します。
メンテナンスが終了した
crypto-jsを使用している場合は、crypto-esへの移行、または組み込み関数の利用をご検討ください。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。
