※脆弱性診断を行う上でのスキルアップとして検証を行っております。この記事で知り得たことを悪用することは禁止とします。
普段jquery UIの古いのをよく見る気がするので、報告されている脆弱性の挙動を確かめてみた。
個人的な検証なので、間違いなどありましたら教えてください。
CVE-2021-41182
概要
Datepickerの「altField」オプションに与えられた入力をエスケープしてない問題
動作確認
そもそもjquery-UIの使い方がわからなかった、、、
ということでサンプルを丸コピして、対象のところだけ残した。

とりあえず検証元ソースコードできた。
<!-- CVE-2021-41182 -->
<h2 class="demoHeaders">CVE-2021-41182</h2>
<input type="text" id="CVE202141182_text" >
<input type="button" onclick="CVE202141182()" value="CVE-2021-41182">
<div id="CVE202141182"></div>
<script>
//CVE-2021-41182
function CVE202141182(){
let element = document.getElementById('CVE202141182_text');
$( "#CVE202141182" ).datepicker({
altField: element.value,
inline: true
});
};
</script>
そしてjavascript実行!
実際何入力しているかは、公式のgithub見に行けばわかるんだけど言いがかりつけられるのが嫌なので隠し。

修正確認
CSSセレクタとして扱われるようになったらしい。
試しにタグを入れてみると、エラーになった。


CVE-2021-41183
概要
Datepickerの「*Text」(おしりにTextとつくやつ)オプションに与えられた入力をエスケープしてない問題
動作確認
一回できてしまえば大方使い方がわかるのであとは流れで。
検証用ソースコード
<!-- CVE-2021-41183 -->
<h2 class="demoHeaders">CVE-2021-41183</h2>
closeText:<input type="text" id="CVE202141183_closeText" ><br>
currentText:<input type="text" id="CVE202141183_currentText" ><br>
prevText:<input type="text" id="CVE202141183_prevText" ><br>
nextText:<input type="text" id="CVE202141183_nextText" ><br>
buttonText:<input type="text" id="CVE202141183_buttonText" ><br>
appendText:<input type="text" id="CVE202141183_appendText" ><br>
<input type="button" onclick="CVE202141183()" value="CVE-2021-41183"><br>
<input type="text" id="CVE202141183">
<script>
//CVE-2021-41183
function CVE202141183(){
let closeText_element = document.getElementById('CVE202141183_closeText');
let currentText_element = document.getElementById('CVE202141183_currentText');
let prevText_element = document.getElementById('CVE202141183_prevText');
let nextText_element = document.getElementById('CVE202141183_nextText');
let buttonText_element = document.getElementById('CVE202141183_buttonText');
let appendText_element = document.getElementById('CVE202141183_appendText');
$( "#CVE202141183" ).datepicker( {
showButtonPanel: true,
showOn: "both",
closeText: closeText_element.value,
currentText: currentText_element.value,
prevText: prevText_element.value,
nextText: nextText_element.value,
buttonText: buttonText_element.value,
appendText: appendText_element.value,
} );
};
</script>
実行。
順番に試していくけど、こちらもpocは非表示にしておく。
closeText

currentText

prevText

nextText

buttonText

appendText

修正確認
公式はテキストとして扱われるようになったとのこと。
試しにやってみると、確かにテキストになっていた。


ソースコードはこのあたり?
直接使っていたものが、テキストとして使用されるようになったのが読める。

CVE-2021-41184
概要
.position()の「of」オプションに与えられた入力をエスケープしてない問題
動作確認
最後、引き続きガンガン行く。
検証コード
<!-- CVE-2021-41184 -->
<h2 class="demoHeaders">CVE-2021-41184</h2>
<div id="CVE202141184"></div>
<input type="password" id="CVE202141184_text" >
<input type="button" onclick="CVE202141184()" value="CVE-2021-41184">
<script>
function CVE202141184(){
let element = document.getElementById('CVE202141184_text');
$( "#CVE202141184" ).position( {
my: "left top",
at: "right bottom",
of: element.value,
collision: "none"
} );
}
</script>
実行。
今回もpocは非表示。

修正確認
こちらもCSSセレクタとして扱われるようになったとのこと。
タグを入れてみたらエラーになった。
ただ、ソースコードでそれらしき修正箇所はわからなかった(CSSのほうなのかな?)


感想
実際こういう実装があるかはおいておいて、結構シンプルなXSSだなと感じた。
わりと最近?修正されたものなので、意外と残ってるんだなぁと思った。
長いライブラリだから脆弱性は見つかっているだろうという考えは総計かも?
地道に確かめていくと何かしら見つかりそうってことがわかった。
コメント
> CVE-2021-41184
> .position()の「on」オプションに与えられた入力をエスケープしてない問題
「of」オプションの誤りのようです。
ありがとうございます、修正しました!