原文はこちら。
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
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つのサービス属性(SupportedKeyClasses
、SupportedKeyFormats
、SupportedModes
、および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::setNamedGroups
とjavax.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
イベントのスクリーンショットと、各セキュリティプロパティの取得値の一部を示したサンプルです。
[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
イベントのスクリーンショットと、要求された各アルゴリズムの取得値の一部です。
[JDK-8254711] Add java.security.Provider.getService JFR Event
https://bugs.openjdk.org/browse/JDK-8254711