pyLoad: REST API を使用した権限の取り消しやパスワードの変更は、ユーザーのセッションを無効にしません。

REST API を使用してユーザーの権限を取り消す管理者は、実際には権限を取り消していません。なぜなら、その権限を持つセッションは決して無効化されないからです。

pyLoad は、ログイン時に Flask セッションにコピーされた値に基づいて、各リクエストを認証します。webui/app/helpers.py の set_session は、ロールと権限を一度だけ書き込みます。login_required と apikey_auth のセッション部分は、データベースからではなく、セッションからこれらの情報を読み取ります。GHSA-66hx-chf7-3332 の修正は、ユーザーのセッションファイルを削除することでこの問題を解決しましたが、この呼び出しは webui/app/blueprints/json_blueprint.py の 3 つの WebUI フォームハンドラでのみ追加されました。core/api/__init__.py の Api.set_user_permission と Api.change_password は、データベースに書き込み、値を返します。これらはどちらも /api/<func> を通じて公開されており、プロジェクトが /api で提供する OpenAPI 仕様にも記載されています。したがって、ドキュメント化された管理インターフェースは、修正されていないルートを使用します。

最初に、重複があることを認めます。GHSA-66hx-chf7-3332 は、詳細の中で core メソッドを特定しており、set_user_permission を指し、データベースのロールと権限のみを更新することに注意しています。ただし、このアドバイザリは、/api/set_user_permission を到達可能なルートとして明示的に示しておらず、change_password については一切言及していません。これが、私が新しいと考える部分です。

私は、PyPI からインストールされた pyload-ng 0.5.0b3.dev101 を、実際のユーザーがいる実際の環境で実行しました。管理者のロールを 0 から 1 に、権限を 0 に変更するために /api/set_user_permission に POST リクエストを送信すると、データベースはすぐに更新されました。降格されたユーザーの既存のセッションは、/api/get_userdir に対して依然として 200 を返し、/settings を依然として読み込み、/api/set_config_value を通じて reconnect.script を依然として書き込みました。これは、CVE-2026-33509 で報告された、管理者のみが使用できるオプションです。一方、/json/update_users を使用した同じ変更により、そのセッションはすぐに終了しました。同じリクエストは 401 を返し、/settings はログインページにリダイレクトされました。

パスワード変更機能も同様の動作をします。ユーザーが`/api/change_password`にPOSTリクエストを送信した後、古いパスワードはログイン時に拒否され、新しいパスワードが受け入れられますが、古いパスワードで開始されたセッションは引き続き有効です。`/json/change_password`を使用すると、このセッションは終了します。したがって、APIを通じてパスワードを変更して誰かを排除しようとしても、実際には排除できません。

注意すべき点として、`apikey_auth`のAPIキー認証機能は、リクエストごとにデータベースからユーザー情報を読み込むため、認証されたクライアントの情報が古くなることはありません。これはセッション機能にのみ影響します。

`webui.session_lifetime`のデフォルト値は44640分であり、古いセッションは、無効化されてから約1ヶ月間は有効な状態が続く可能性があります。

私は、無効化処理は、データベースへの書き込み処理と同じように、コアAPIの一部として実装されるべきだと考えています。blueprintではなく、そうすることで、これらの操作を呼び出すすべてのクライアントがその影響を受けるようになります。リクエストごとにデータベースからロールと権限を再読み込みすると、システム全体に影響が及ぶ可能性がありますが、それはより大きな変更であり、そのコストを測定していません。

この問題を調査する際に、AIの支援を利用しました。上記のすべての結果は、私がリリースされたバージョンに対して実行したものであり、対応するコントロールテストの結果も示されています。

影響を受けるパッケージ:
- pip (Python) pyload-ng: 影響を受けるバージョンは0.5.0b3.dev101以下、修正は未実施。