サイキックシグネチャー - 知っておくべきこと

2022年4月27日発行
チャーリー・エリクセン著
ケーススタディ

サイキックシグネチャー - 知っておくべきこと

2022年4月27日発行
チャーリー・エリクセン著
リソースを見る
リソースを見る

2022年4月19日、Neil Maddenは、Oracle Java 15から18、およびOpenJDK 15、17、18における脆弱性を公開しました。この脆弱性は、ECDSA署名の暗号にあり、攻撃者はこれらの署名の署名チェックを完全にバイパスすることが可能です。 

ECDSA署名があまり知られていないため、この脆弱性に関する見出しを目にしても、すぐに見過ごしてしまいがちです。しかし、ECDSA署名は、認証のような重要なタスクにおいて、インターネット上のシステムを保護する上で重要な役割を担っています。

詳細について説明する前に、ハッカーがどのようにサイキックシグネチャを悪用するのかを実際に体験してみたいという方は、無料のラボに直接アクセスしてみてください。無料のラボ(Missions)にアクセスし、ご自身で試してみてください。

ECDSAの何が問題なのか?

ECDSAという言葉を聞いたことがない人もいるかもしれない。Elliptic Curve Digital Signature Algorithmの略で、楕円曲線の数学的性質を利用した暗号の一種で、現時点では業界で最も強力な暗号のセキュリティを提供するものです。

というように、重要な機能に多く使われているということです。

  • SSL証明書の署名について
  • 暗号化通信時のハンドシェイク
  • サムル
  • JWT署名
  • OpenID Connectの署名

つまり、ECDSAはシステムを保護するための最も機密性の高い機能の多くで重要な役割を担っているのです。署名チェックを回避することができれば、非常に大きな被害を受ける可能性があります。

脆弱性はどのように悪用されるのですか?

ECDSAの数学は、残念ながらやや複雑です。しかし、知っておくべき重要なことは、ECDSA署名は2つの情報、すなわちrと sを含むということである。 

これらの数値は、署名の有効性を計算するために使用される。値rは、右辺のrと sの両方を使った計算の「結果」(左辺)である。0を掛けるのは良くないということから、ECDSAの仕様では、rや sの値が0になることがあれば、それらを破棄するように明示的に呼びかけている。 

しかし、ECDSAのJava実装はこれを考慮するのを忘れていた。そのため、rと sの両方が0である署名を受け入れることになり、これは常に真となる。JWTの例でこれを実証し、いかに簡単であるかを示しましょう。https://token.dev/ を使って、アプリケーションで生成されるのと同じような ES256 アルゴリズムのトークンを生成することができます。

アルゴES256で生成されたトークン

JWTは3つのパートに分かれていることを思い出してください。

  • ヘッダー(青字)
  • ペイロード(緑色の部分)
  • サイン(赤色)

さて、署名チェックを回避したい場合、どのようにすればよいのだろうか。署名はrとsの値を指定し、DER形式でエンコードされています。 

署名値のDERエンコード

この新しい署名を使用するようにJWTを変更しましょう。JWTでは、等号は含まれないことに注意してください。

DERエンコードされた署名を使用した新しいJWT

これで、署名のrと sが0に設定され、脆弱なバージョンのJavaでは、指定したペイロードに対して署名チェックが成功するようになりました。 

誰が影響を受けるのか、どう軽減するのか?

この脆弱性は、Oracle JavaとOpenJDKの両方に影響します。これらは以下の通りです。

Oracle Java SE(および旧バージョン、非サポート)。 

  • 18
  • 17.0.2

Oracle GraalVM Enterprise Editionです。 

  • 22.0.0.2
  • 21.3.1

OpenJDKです。

  • 18
  • 17.0.2
  • 15.0.6
  • 13.0.10
  • 11.0.14
  • 8u322
  • 7u331

Oracle社OpenJDK社ともに勧告を発表しており、すぐにでも適用可能なパッチがあります。 

本脆弱性に対する防御のためのハンズオンプラクティス

ここSecure Code Warrior では、サイキックシグネチャーのような最新の脆弱性から、何年も前から存在する脆弱性まで、重要な脆弱性に関する最も適切な情報と実践的な演習を開発者に提供するよう努力しています。

私たちは、リスクを真に抑えるには、開発者が防御メカニズムを理解し、最初から安全なコードを書けるようにすることが必要だと考えています。そのため、この脆弱性(および他の多くの脆弱性)の段階的なウォークスルーを作成し、あなたと影響を受けるチームのために提供しています。 

ウォークスルーでは、指示に従ってJWTのPhysic Signatureを悪用し、機能しているアプリへの影響をリアルタイムに確認することができます。

今すぐお試しください。

リソースを見る
リソースを見る

著者

Charlie Eriksen

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

サイキックシグネチャー - 知っておくべきこと

2022年4月27日発行
チャーリー・エリクセン著

2022年4月19日、Neil Maddenは、Oracle Java 15から18、およびOpenJDK 15、17、18における脆弱性を公開しました。この脆弱性は、ECDSA署名の暗号にあり、攻撃者はこれらの署名の署名チェックを完全にバイパスすることが可能です。 

ECDSA署名があまり知られていないため、この脆弱性に関する見出しを目にしても、すぐに見過ごしてしまいがちです。しかし、ECDSA署名は、認証のような重要なタスクにおいて、インターネット上のシステムを保護する上で重要な役割を担っています。

詳細について説明する前に、ハッカーがどのようにサイキックシグネチャを悪用するのかを実際に体験してみたいという方は、無料のラボに直接アクセスしてみてください。無料のラボ(Missions)にアクセスし、ご自身で試してみてください。

ECDSAの何が問題なのか?

ECDSAという言葉を聞いたことがない人もいるかもしれない。Elliptic Curve Digital Signature Algorithmの略で、楕円曲線の数学的性質を利用した暗号の一種で、現時点では業界で最も強力な暗号のセキュリティを提供するものです。

というように、重要な機能に多く使われているということです。

  • SSL証明書の署名について
  • 暗号化通信時のハンドシェイク
  • サムル
  • JWT署名
  • OpenID Connectの署名

つまり、ECDSAはシステムを保護するための最も機密性の高い機能の多くで重要な役割を担っているのです。署名チェックを回避することができれば、非常に大きな被害を受ける可能性があります。

脆弱性はどのように悪用されるのですか?

ECDSAの数学は、残念ながらやや複雑です。しかし、知っておくべき重要なことは、ECDSA署名は2つの情報、すなわちrと sを含むということである。 

これらの数値は、署名の有効性を計算するために使用される。値rは、右辺のrと sの両方を使った計算の「結果」(左辺)である。0を掛けるのは良くないということから、ECDSAの仕様では、rや sの値が0になることがあれば、それらを破棄するように明示的に呼びかけている。 

しかし、ECDSAのJava実装はこれを考慮するのを忘れていた。そのため、rと sの両方が0である署名を受け入れることになり、これは常に真となる。JWTの例でこれを実証し、いかに簡単であるかを示しましょう。https://token.dev/ を使って、アプリケーションで生成されるのと同じような ES256 アルゴリズムのトークンを生成することができます。

アルゴES256で生成されたトークン

JWTは3つのパートに分かれていることを思い出してください。

  • ヘッダー(青字)
  • ペイロード(緑色の部分)
  • サイン(赤色)

さて、署名チェックを回避したい場合、どのようにすればよいのだろうか。署名はrとsの値を指定し、DER形式でエンコードされています。 

署名値のDERエンコード

この新しい署名を使用するようにJWTを変更しましょう。JWTでは、等号は含まれないことに注意してください。

DERエンコードされた署名を使用した新しいJWT

これで、署名のrと sが0に設定され、脆弱なバージョンのJavaでは、指定したペイロードに対して署名チェックが成功するようになりました。 

誰が影響を受けるのか、どう軽減するのか?

この脆弱性は、Oracle JavaとOpenJDKの両方に影響します。これらは以下の通りです。

Oracle Java SE(および旧バージョン、非サポート)。 

  • 18
  • 17.0.2

Oracle GraalVM Enterprise Editionです。 

  • 22.0.0.2
  • 21.3.1

OpenJDKです。

  • 18
  • 17.0.2
  • 15.0.6
  • 13.0.10
  • 11.0.14
  • 8u322
  • 7u331

Oracle社OpenJDK社ともに勧告を発表しており、すぐにでも適用可能なパッチがあります。 

本脆弱性に対する防御のためのハンズオンプラクティス

ここSecure Code Warrior では、サイキックシグネチャーのような最新の脆弱性から、何年も前から存在する脆弱性まで、重要な脆弱性に関する最も適切な情報と実践的な演習を開発者に提供するよう努力しています。

私たちは、リスクを真に抑えるには、開発者が防御メカニズムを理解し、最初から安全なコードを書けるようにすることが必要だと考えています。そのため、この脆弱性(および他の多くの脆弱性)の段階的なウォークスルーを作成し、あなたと影響を受けるチームのために提供しています。 

ウォークスルーでは、指示に従ってJWTのPhysic Signatureを悪用し、機能しているアプリへの影響をリアルタイムに確認することができます。

今すぐお試しください。

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。