
Tutor LMSプラグインにおける認証済みIDOR / アクセス制御の不備
免責事項: このリポジトリは教育目的および倫理的な情報開示のためにのみ作成されています。本脆弱性はベンダーに責任を持って報告され、パッチが適用済みです。この情報を適切な許可なくシステムを悪用するために使用しないでください。
Tutor LMS プラグイン(WordPress 向け、バージョン <= 3.9.5)において、Insecure Direct Object Reference(IDOR)/ アクセス制御の不備(Broken Access Control) が発見されました。この欠陥により、Tutor Instructor ロールを持つ低権限ユーザーが、他のインストラクターや管理者が所有するコースの公開ステータス変更や完全な削除など、承認されていない一括操作を実行できる可能性があります。
正規のバックエンドリクエストを傍受し、コース ID パラメータを改ざんすることで、攻撃者は意図されたアクセス制御を回避できます。実際のシナリオでは、これにより悪意のある攻撃者が複数インストラクターが参加するマーケットプレイス上で競合コースを妨害し、ビジネスの中断、収益の損失、および風評被害を直接引き起こす可能性があります。
<= 3.9.53.9.6根本的な問題は、プラグインの一括アクションハンドラーにおけるオブジェクトレベルの認可チェックの欠如に起因します。
ファイル: tutor/classes/Course_List.php
関数: course_list_bulk_action()
1. 検証されていないオブジェクト識別子:
この関数は、HTTP リクエストからユーザー制御可能な入力(bulk-action および bulk-ids)を直接受け取ります。プラグインはユーザーがコースを管理する一般的な権限を保持していることを検証しますが、bulk-ids 配列で指定された特定の ID について、コースごとの所有権を完全に検証しません。
2. 所有権検証なしでの実行:
ステータス更新パス(update_course_status())または削除パス(bulk_delete_course())がトリガーされると、コードは攻撃者が指定した ID を反復処理します。WHERE ID IN (...) 句を使用してデータベース操作(例: cp_posts.post_status の更新)を実行しますが、$post_author == $current_user_id を保証する条件は追加されません。
ハンドラーがオブジェクトレベルの認可を強制しないため、一括アクションのワークフローにアクセスできるインストラクターは、任意のコース ID を操作できます。
以下の手順は、認証済みの Tutor Instructor が別のインストラクターのコースステータスを変更できる方法を示しています。
course_id を特定します。(例: ID: 27)。/wp-admin/admin.php?page=tutor)に移動します。自分が所有する任意のコースを選択し、ステータス変更アクション(例: 「下書き」に設定)を選択して「適用」をクリックします。/wp-admin/admin-ajax.php への送信 POST リクエストを傍受します。status パラメータを trash(または pending、private)に変更します。id パラメータを自分のコース ID から被害者のコース ID(27)に変更します。{"success":true} で応答します。被害者のコースは正常にゴミ箱へ移動され、公開フロントエンドから消えます。