JDK 20 Security Enhancements

原文はこちら。
The original article was written by Sean Mullan (Java Security Tech Lead, Oracle).
https://seanjmullan.org/blog/2023/03/22/jdk20

2023年3月21日にJDK20がリリースされました。

JDK 20
https://openjdk.java.net/projects/jdk/20/

以前のブログと同様、今回のリリースで最も興味深く、有用だと思われるセキュリティ強化点をリストアップしてみました。また、それらを適切なカテゴリ(暗号、PKIなど)に分類し、各領域で何が変わったかを簡単に見つけられるようにしました。JDK 20のリリースノートには、これらの機能強化やその他の機能強化に関する詳細も記載されています。

Sean Mullan’s Blog
https://seanjmullan.org/blog/
JDK 20 Release Notes
https://jdk.java.net/20/release-notes

セキュリティに関連するものの、セキュリティ・ライブラリの領域には含まれない他の重要なJDK 20の機能の一つとして、JNDI/LDAPおよびJNDI/RMIコンテキストからJavaオブジェクトの再構築を許可するオブジェクト・ファクトリー・クラスを制御するための新しいシステムおよびセキュリティ・プロパティの導入があげられます。これらの新しいプロパティの詳細については、リリースノートを参照してください。

Table of Contents

  1. General
  2. Crypto
  3. TLS
  4. Tools

General

New InvalidParameterException constructors that take cause as a parameter
(原因をパラメータとして受け取るInvalidParameterExceptionコンストラクタを新たに追加)

InvalidParameterException APIに、原因(Throwable)をパラメータとして受け取る新しいコンストラクタが追加されました。

InvalidParameterException (Java SE 20 & JDK 20)
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/security/InvalidParameterException.html

これにより、initCauseメソッドを個別に呼び出す必要がなくなり、より便利なオプションが提供されます。

例えば、InvalidParameterExceptionを以下の2方法でスローできるようになりました。

// (1)
throw new InvalidParameterException(new NullPointerException());
// (2)
throw new InvalidParameterException("parameter is null", new NullPointerException());

[JDK-8296226] Add constructors (String,Throwable) and (Throwable) to InvalidParameterException
https://bugs.openjdk.org/browse/JDK-8296226

New service attributes added to the Standard Algorithm Names specification
(Standard Algorithm Names仕様に新たなサービス属性を追加)

Java Security Standard Algorithm Names仕様のService Attributesセクションに、4つのサービス属性(SupportedKeyClassesSupportedKeyFormatsSupportedModes、およびSupportedPaddings)が追加されました。

Java Security Standard Algorithm Names
https://docs.oracle.com/en/java/javase/20/docs/specs/security/standard-names.html#service-attributes

これらの属性は、以前からJDKのセキュリティプロバイダで定義され使用されていましたが、これまで標準属性として定義されていませんでした。

[JDK-8297161] Add additional Service Attributes to Standard Algorithm Names guide
https://bugs.openjdk.org/browse/JDK-8297161

An error is now thrown if the java.security file fails to load
(java.securityファイルのロードに失敗した場合にエラーが発生するようになった)

セキュリティプロパティが取得されたものの、java.securityファイルが存在しないか、読み込みに失敗した場合、実行時にInternalErrorが発生するようになりました。この変更以前は、java.securityファイルの読み込みに問題がある場合、ハードコードされたデフォルトを持つ重要なプロパティのサブセットが使用されていました。しかしこの回避策は、ハードコードされたデフォルトが適切であることを確認するために継続的なメンテナンスを必要とし、さらに、問題のある構成という潜在的に深刻な問題が潜んでいました。

この問題が発生すると、次のような例外スタックトレースが表示されます:

Exception in thread "main" java.lang.InternalError: Error loading java.security file at
java.base/java.security.Security.initialize(Security.java:105) at
java.base/java.security.Security.lambda$static$0(Security.java:84) at
java.base/java.security.AccessController.doPrivileged(AccessController.java:319) at
java.base/java.security.Security.<clinit>(Security.java:83) ...

[JDK-8155246] Throw error if default java.security file is missing
https://bugs.openjdk.org/browse/JDK-8155246

Crypto

Crypto performance related improvements
(暗号のパフォーマンスに関する改善)

暗号領域において、パフォーマンスに関連するいくつかの改良が行われました。以下で、より重要な改善点の詳細と、対応するIssueをご紹介します。

ChaCha20 intrinsics for x86_64 and aarch64 platforms
(x86_64 および aarch64 プラットフォーム用の ChaCha20 intrinsics)

ChaCha20 Cipher アルゴリズムの SunJCE プロバイダ実装で、x86_64 および aarch64 プラットフォーム向けに最適化されたintrinsicを提供し、パフォーマンスを大幅に向上させました。

JDK Providers Documentation
https://docs.oracle.com/en/java/javase/20/security/oracle-providers.html#GUID-A47B1249-593C-4C38-A0D0-68FA7681E0A7
Java Security Standard Algorithm Names
https://docs.oracle.com/en/java/javase/20/docs/specs/security/standard-names.html#cipher-algorithms
Cipher (Java SE 20 & JDK 20)
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/javax/crypto/Cipher.html

これらの最適化されたルーチンは、AVX、AVX2、AVX512 命令セットをサポートする x86_64 チップセット、および Advanced SIMD 命令セットをサポートする aarch64 チップ向けに設計されています。サポートされているプラットフォームでは、intrinsicsはデフォルトで有効になっていますが、Javaに-XX:-UseChaCha20Intrinsicsコマンドラインオプションを渡すと無効にできます。intrinsicsを制御するフラグには、 -XX:+UnlockDiagnosticVMOptions というオプションが必要です。

[JDK-8247645] ChaCha20 Intrinsics
https://bugs.openjdk.org/browse/JDK-8247645

Poly1305 intrinsics for ByteBuffers
(ByteBuffer向けPoly1305のintrinsics)

Poly1305 (ChaCha20 Cipher アルゴリズムの認証として使用) の SunJCE プロバイダー実装の x86_64 intrinsicが ByteBuffer にも適用できるように強化されました。このintrinsicは CipherSpi.engineUpdate(byte[], ...) および CipherSpi.engineUpdate(ByteBuffer, ...) メソッドで利用できるようになっています。

CipherSpi (Java SE 20 & JDK 20)
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/javax/crypto/CipherSpi.html#engineUpdate(byte[],int,int)
CipherSpi (Java SE 20 & JDK 20)
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/javax/crypto/CipherSpi.html#engineUpdate(java.nio.ByteBuffer,java.nio.ByteBuffer)

[JDK-8297379] Enable the ByteBuffer path of Poly1305 optimizations
https://bugs.openjdk.org/browse/JDK-8297379

Improved MD5 intrinsics for x86_64 platforms
(x86_64プラットフォーム用MD5 intrinsicsの改善)

x86_64プラットフォーム用MD5のMessageDigestというintrinsicのパフォーマンスが大幅に改善されています。

Java Security Standard Algorithm Names
https://docs.oracle.com/en/java/javase/20/docs/specs/security/standard-names.html#messagedigest-algorithms
MessageDigest (Java SE 20 & JDK 20)
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/security/MessageDigest.html

[JDK-8296548] Improve MD5 intrinsic for x86_64
https://bugs.openjdk.org/browse/JDK-8296548

Improved EC point multiplication for secp256r1 curve
(secp256r1曲線の楕円曲線ポイント乗算を改善)

secp256r1曲線の楕円曲線ポイント乗算のパフォーマンスを大幅に改善しました。これは、事前計算されたテーブルとより効率的なアルゴリズムを使用したことによるものです。この性能向上は、SunECセキュリティプロバイダにも適用されます。

JDK Providers Documentation
https://docs.oracle.com/en/java/javase/20/security/oracle-providers.html#GUID-091BF58C-82AB-4C9C-850F-1660824D5254

[JDK-8295011] EC point multiplication improvement for secp256r1
https://bugs.openjdk.org/browse/JDK-8295011

Improved ECC math operations
(ECC演算の改善)

BigIntegerと曲線ポイント演算の改良により、楕円曲線計算のパフォーマンスが若干向上しています。この性能向上は、SunECセキュリティ・プロバイダに適用されます。

JDK Providers Documentation
https://docs.oracle.com/en/java/javase/20/security/oracle-providers.html#GUID-091BF58C-82AB-4C9C-850F-1660824D5254

[JDK-8294997] Improve ECC math operations
https://bugs.openjdk.org/browse/JDK-8294997

TLS

DTLS 1.0 is now disabled by default
(DTLS 1.0はデフォルトで無効化)

DTLS 1.0プロトコルはデフォルトで無効化されており、標準でのセキュリティが向上しています。このプロトコルにはさまざまな弱点があり、もはや推奨されません。詳しくはRFC 8996を参照してください。

RFC 8996: Deprecating TLS 1.0 and TLS 1.1
https://rfc-editor.org/rfc/rfc8996

アプリケーションは、JDKがサポートする、より安全なDTLS 1.2プロトコルを使用する必要があります。ただし、問題が発生し、アプリケーションを動作させる必要がある場合は、java.security設定ファイルの jdk.tls.disabledAlgorithms securityプロパティから「DTLSv1.0」を削除すれば、(自己責任で)DTLS 1.0 を再度有効化できます。

[JDK-8256660] Disable DTLS 1.0
https://bugs.openjdk.org/browse/JDK-8256660

ECDH cipher suites disabled by default
(ECDH暗号スイートをデフォルトで無効化)

TLS_ECDH 暗号スイートが jdk.tls.disabledAlgorithms セキュリティプロパティに追加され、デフォルトで無効化されました。これらの暗号はforward secrecyを保持しないため、実際に使用されることはほとんどありません。一部の TLS_ECDH 暗号スイートは、3DES、RC4、anon、または NULL を使用しているため、すでに無効化されています。この操作により、残りのすべてのECDH暗号スイートが無効化されます。

ただし、問題が発生してアプリケーションを動作させる必要がある場合は、(自己責任で)java.security 設定ファイルの jdk.tls.disabledAlgorithms セキュリティプロパティから “ECDH” を削除して、これらの暗号スイートを再度有効にできます。

[JDK-8279164] Disable TLS_ECDH_* cipher suites
https://bugs.openjdk.java.net/browse/JDK-8279164

New APIs for customizing TLS and DTLS named groups
(TLSおよびDTLS名前付きグループのカスタマイズのための新たなAPI)

TLSまたはDTLS接続の鍵交換メカニズムのネゴシエーションに使用される名前付きグループの優先順位リストを、アプリケーションがカスタマイズしたり取得したりできる2つの新しいAPI(javax.net.ssl.SSLParameters::setNamedGroupsjavax.net.ssl.SSLParameters::getNamedGroups)が追加されました。

以下は名前付きグループを設定する例です。

SSLParameters params = new SSLParameters();
params.setNamedGroups(new String[] { "x25519", "secp256r1" }); 

SSLParameters (Java SE 20 & JDK 20)
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/javax/net/ssl/SSLParameters.html#setNamedGroups(java.lang.String[])
SSLParameters (Java SE 20 & JDK 20)
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/javax/net/ssl/SSLParameters.html#getNamedGroups()

[JDK-8281236] TLS key exchange named groups
https://bugs.openjdk.org/browse/JDK-8281236

Tools

New JFR event for recording initial security properties
(セキュリティプロパティの初期値を記録するための新しいJFRイベント)

Java Flight Recorderに、セキュリティプロパティの初期値を記録するための新しいイベントが追加されました。これは、セキュリティ構成の初期スナップショットを記録するのに便利です。このイベントはjdk.InitialSecurityPropertyと名付けられ、デフォルトで有効になっています。jdk.SecurityPropertyModificationイベントと一緒に使用すると、JFRはすべてのセキュリティプロパティの初期設定とその後の設定を記録し、アプリケーションで使用するセキュリティ環境の重要な詳細をもたらします。

以下は、jdk.InitialSecurityPropertyイベントのスクリーンショットと、各セキュリティプロパティの取得値の一部を示したサンプルです。

Initial Security Properties

[JDK-8292177] InitialSecurityProperty JFR event
https://bugs.openjdk.org/browse/JDK-8292177

New JFR event for security provider usage
(セキュリティプロバイダー利用状況を取得するための新しいJFRイベント)

Java Flight Recorderツールに、セキュリティプロバイダにアクセスする都度記録するための新たなイベントが追加されました。これは、アプリケーションが使用する各暗号アルゴリズムやサービスを記録するのに便利で、アプリケーションのセキュリティに関する追加的なインサイトを提供します。このイベントはjdk.SecurityProviderServiceという名前で、サービスの種類、アルゴリズム、プロバイダ名の3つのフィールドが含まれています。このイベントはデフォルトで無効になっていますが、JFR設定ファイルまたは標準のJFRオプションで有効にすることができます。

以下は、jdk.SecurityProviderServiceイベントのスクリーンショットと、要求された各アルゴリズムの取得値の一部です。

Security Provider Service Requests

[JDK-8254711] Add java.security.Provider.getService JFR Event
https://bugs.openjdk.org/browse/JDK-8254711

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中