undiciにおいて、TLS 1.2の証明書変更による再ネゴシエーションを悪用したサービス拒否(DoS)の脆弱性が存在します。
## 影響
undiciは、TLS 1.2サーバーが接続確立後に再ネゴシエーションを行い、要求されたホスト名と一致しない、CAによって信頼されている別の証明書を提示した場合、クライアントプロセスがクラッシュします。Node.jsは、再ネゴシエーションされたハンドシェイクでホスト名の検証を再度実行し、`ERR_TLS_CERT_ALTNAME_INVALID`エラーでソケットを破棄します。undiciの確立されたソケットエラーハンドラは、このエラーコードが発生することはないと主張していたため、ピア制御のエラーが捕捉されなかった`AssertionError`となり、Node.jsプロセスが終了します。HTTP/1.1とHTTP/2の両方の経路に影響があります。
undiciまたはグローバルな`fetch()`を介して到達される悪意のあるHTTPSエンドポイントは、サーバーが開始した単一の再ネゴシエーションによってクライアントをクラッシュさせ、その過程で進行中のすべてのリクエストやバックグラウンド処理を停止させる可能性があります。影響を受けるのはTLS 1.2のみで、TLS 1.3は再ネゴシエーションをサポートしていません。この脆弱性の悪用には、CAの侵害は必要ありません。攻撃者はエンドポイントを制御し、要求されたURLと一致する通常の有効な証明書を1つ、意図的に一致しない別の証明書を1つ提示することができます。
## 修正
undiciのバージョンを6.29.1、7.30.1、または8.12.2にアップグレードしてください。
## 対策
TLS 1.3への接続を制限することで、再ネゴシエーションを防止できます。例えば、クライアントまたはエージェントで`connect: { minVersion: 'TLSv1.3', maxVersion: 'TLSv1.3' }`を設定します。ただし、これはターゲットエンドポイントがTLS 1.3をサポートしている場合にのみ有効です。
影響を受けるパッケージ:
- npm (JavaScript) undici: 影響を受けるバージョンは4.2.1以上、6.29.1未満。6.29.1で修正済み。
- npm (JavaScript) undici: 影響を受けるバージョンは7.0.0以上、7.30.1未満。7.30.1で修正済み。
- npm (JavaScript) undici: 影響を受けるバージョンは8.0.0以上、8.12.2未満。8.12.2で修正済み。