概要
Moodle 3.4.2以前の幅広いバージョンである脆弱性が確認された。
"Evil Teacher: Code Injection in Moodle"という報告者のブログエントリによると、小テストの計算問題を利用して任意コード実行の攻撃ができることになる。"Evil Teacher"となっているのは小テストの編集が必要なため。
question/type/calculated の問題について
同モジュールにはMoodle 2.xの頃にも任意コード実行の脆弱性が確認されている。
脆弱性についての調査
前掲のブログエントリを確認してみると、qtype_calculated_find_formula_errors()
の中で行っているバリデーションが不適切なため、後で行う eval()
で任意コード実行を許しているとなっている。
eval()
の前には入力された $formula に対して以下のバリデーションが行われる。
-
while (preg_match('~\\{[[:alpha:]][^>} <{"\']*\\}~', $formula, $regs)) { $formula = str_replace($regs[0], '1', $formula); }
で $formula の中にあるブレースで囲まれた英字(計算問題中の変数部分)を1に置換する。 - $formula の文字列中にある空白を取り除き、英字を小文字に置き換える。
- max, log, abs などの利用許可されている関数についての取り扱いを行う。
-
preg_match("~[^[-+/*%>:^\~<?=&|!.0-9eE]+~", $formula, $regs)
にヒットする不正な文字が含まれていないかチェック。
このバリデーションで問題ないと判断されれば eval('$str = '.$formula.';')
が実行される。上記のうちで1と2を通過できる攻撃コードを考える必要がある。
少し検討してみたが思ったようなコードが通らず検討中。
おまけ
ブログエントリ中にYouTubeの動画があり、そこでこの脆弱性への攻撃方法を紹介している。その中では $formula に {dGhpcy1pcy1hbi1leHBsb2l0LXByZXZlbnRpb24KdGhpcy1pcy1hbi1leHBsb2l0LXByZXZlbnRpb24K} と入力しているが、どう見てもevalして有効なPHPコードになるようには見えない。
BASE64エンコードしてあるっぽいのでデコードしてみると
$ echo dGhpcy1pcy1hbi1leHBsb2l0LXByZXZlbnRpb24KdGhpcy1pcy1hbi1leHBsb2l0LXByZXZlbnRpb24K | base64 -d
this-is-an-exploit-prevention
this-is-an-exploit-prevention
oh...