おことわり
脆弱性を試すときは必ず自分の管理する検証用のシステムで実行してください。
この脆弱性について
2020年7月12日にあったMoodle 3.9.1を始めとする全てのアップデートで修正された、「コース内で教師ロールを持つユーザが、本来の権限を超えたロール割り当てが可能」な脆弱性。つまり、この脆弱性の影響を受けるのは、悪意のあるユーザが教師としてコースに割り当てられている場合となる。
Moodleでは通常、教師ロールを持つユーザはコース内で学生や、編集権限のない教師(TA)を割り当てることが可能であっても、他のユーザに教師ロールを割り当てたり、教師ロールを剥奪することは出来ないようになっている。マネージャなどの、それ以上の権限についても同様である。
しかしながら、この権限チェックの不備の脆弱性を利用する事で、自分にマネージャ権限を割り当てることが可能となり、他の教師の権限を剥奪することも可能となる。とは言ってもシステム管理者には勝てないので、三日天下に終わるわけだが…
脆弱性を試してみる
脆弱性があるとして修正された部分から、ロール割り当てをAjaxで行うところだと分かる。適当なテスト用環境を作成し、教師1と教師2を割り当ててみる。ここで教師1が悪意のあるユーザだとする。
教師1で目的のコースにアクセスし、ユーザを登録するモーダルウインドウを開いて、適当なユーザを学生として登録してみる。
このとき、ウェブブラウザの開発ツールでリクエストを確認すると、https://<MOODLE.YOURDOMAIN>/enrol/manual/ajax.php?mform_showmore_main=0&id=2&action=enrol&enrolid=1&sesskey=<SESSION_KEY>&_qf__enrol_manual_enrol_users_form=1&mform_showmore_id_main=0&userlist[]=3&roletoassign=5&duration=&startdate=4
のようなURIへのGETリクエストが確認できる。
ここで、userlist[]=3 が対象ユーザのID、roletoassign=5 がロールIDとなる。他のパラメータは説明省略。
このURIのうち、ユーザIDを自分のIDに、ロールIDを1に変更して、ウェブブラウザのアドレスバーに突っ込んでリクエストを送る。なぜかXMLHttpRequestで無くても問題ない。ウェブブラウザのリロード機能などでページを更新すると、マネージャ権限が付与されていることがわかる。マネージャ権限が割り当てられているので、邪魔な教師2をコースから消し去ることが可能になっている。
ログで確認
ログを確認すると、変更した履歴がちゃんと残っている。