PyMongo: PYTHON-5986 PyMongoの接続文字列の解析における、パーセントエンコードされた区切り文字によるホスト名の注入
### 概要
PyMongoは、接続文字列のホスト名部分全体をパーセントデコードしてから、個別の`host:port`のエントリに分割していました。そのため、ホスト名にパーセントエンコードされた`,`または`:`が含まれている場合、それらは実際の区切り文字として解釈され、攻撃者が指定した追加のホスト名とポートが、クライアントの初期リストに注入されてしまうという問題がありました。
### 影響
MongoDBの接続文字列に、信頼できない入力(例えば、リクエストから取得したテナント名やホスト名の一部)を埋め込むアプリケーションは、攻撃者が制御するサーバーを初期リストに追加される可能性があります。`%2C`と`%3A`は、ほとんどのURLの安全性のチェックを通過し、PyMongoのパーサー内でのみ区切り文字として機能するため、アプリケーションから見ると単一のホスト名に見える入力が、ドライバーからは2つのホスト名として認識されます。その結果、クライアントは攻撃者のホストに対してトポロジーの検出や認証を行い、認証情報が漏洩したり、操作がそのホストにルーティングされたりする可能性があります。
Unixドメインソケットのパスは、正当な理由でパーセントエンコードを必要とするホスト名識別子であり、この問題の影響を受けません。
### 修正
PyMongo 4.18.2で修正されました。パーセントデコードは`split_hosts`関数内に移動され、現在はUnixドメインソケットのパスにのみ適用されます。これは、`.sock`というエスケープされていないサフィックスを持つホスト名として識別され、区切り文字としての`,`で分割された後にのみデコードされます。
### 対策
ホスト名部分に信頼できない入力を埋め込まないでください。どうしても必要な場合は、URIを構築する前に、値を拒否するか、パーセントデコードして検証してください。
### 詳細
この問題は、PyMongo 3.5.0(PYTHON-1282)で導入されました。`_validate_uri`および、後には`_parse_srv`関数で、`unquote_plus`関数がホスト名部分全体に適用され、その後で文字列が`,`と`:`で分割されていました。
影響を受けるパッケージ:
- pip (Python) pymongo: 3.5.0以上、4.18.1以下に影響、4.18.2で修正。