OpenPGP.js の脆弱性 CVE-2025-47934 が FIX:メッセージへの偽装署名の恐れ

Critical OpenPGP.js Flaw Allows Message Signature Spoofing

2025/05/21 SecurityOnline — 安全なメッセージングと暗号化のために広く利用される、JavaScript ライブラリを提供する OpenPGP.js プロジェクトが、深刻な脆弱性 CVE-2025-47934 を修正した。この脆弱性を悪用する攻撃者は、メッセージの署名を偽装し、本物を装いながらコンテンツ操作を可能にするという。この脆弱性は、ブラウザベースのメール・クライアント/エクステンション/Web サービスなどの、OpenPGP.js を利用する広範なアプリケーションにおける、署名付き通信と暗号化された通信の整合性を脅かすものだ。

OpenPGP.js は、ネイティブ GPG (GNU Privacy Guard) のインストールを不要にするために設計された、JavaScript によるオープンソースの OpenPGP 実装である。

ブラウザまたはサーバの環境内で、メッセージの署名/暗号化/復号化/検証をサポートする。したがって、メールの暗号化や、安全なメッセージング・アプリ、本人確認ツールにとって不可欠なビルディング・ブロックとなっている。

OpenPGP.js のアドバイザリには、「悪意を持って改変されたメッセージを openpgp.verify/openpgp.decrypt 関数に受け渡すと、これらの関数は有効な署名検証結果を返すが、実際には署名されていないデータを返す可能性がある」と説明されている。

この脆弱性は、OpenPGP.js バージョン 5/6 に影響を及ぼす。攻撃者は、署名済みメッセージまたは署名および暗号化されたメッセージを改変することで、データが改竄されている状態であっても、有効な署名があると見せかけることが可能になる。

この署名偽装は、以下のメッセージに適用される:

  • インライン署名メッセージ (openpgp.verify を使用して検証済み)
  • 署名/暗号化されたメッセージ(openpgp.decrypt と verificationKeys を使用)

なお、分離署名検証は影響を受けない。

この脆弱性を悪用するには、攻撃者は以下のものが必要となる:

  • 有効な署名 (インライン署名または分離署名)
  • 署名されたオリジナルの平文メッセージ

攻撃者は、新しいコンテンツを作成し、オリジナル署名を用いて署名することで、アプリケーションを欺き、正当なものとして受け入れさせることが可能になる。

すでに、この問題は、バージョン v5.11.3v6.1.1 で修正されている。

パッチが適用されるまでの間、ユーザーは以下の回避策を適用できる。

  • インライン署名メッセージの場合:
    openpgp.readMessage() を用いて、データと署名を抽出する。
    openpgp.verify() を用いて、分離署名として検証する。
    .
  • 署名付き暗号化メッセージの場合:
    verificationKeys を指定せずに openpgp.decrypt() を呼び出す。
    復号されたコンテンツから新しいメッセージを作成し、手動で検証する。

メールなどの通信の暗号化に広く利用されている OpenPGP.js に、脆弱性が発見されました。ご利用のチームは、迅速なアップデートをご検討下さい。よろしければ、カテゴリ _OpenSource も、ご参照ください。