Skip to content

Instantly share code, notes, and snippets.

@mala
Last active November 13, 2015 04:34
Show Gist options
  • Save mala/804559abc0cc639b84e8 to your computer and use it in GitHub Desktop.
Save mala/804559abc0cc639b84e8 to your computer and use it in GitHub Desktop.
Plack::Middleware::Session::Cookie で secret未指定の場合のremote code executionについて

この問題は Plack::Middleware::Session::Cookie 0.22以降で対策されました

https://gist.github.com/miyagawa/2b8764af908a0dacd43d http://search.cpan.org/~miyagawa/Plack-Middleware-Session/lib/Plack/Middleware/Session/Cookie.pm

事例 → https://speakerdeck.com/mala/how-to-hack-metacpan-dot-org


信頼できないデータを Storable::thaw に渡した場合、任意のコード実行ができることが知られています。

cookie経由でStorable::thawが呼ばれるモジュールがいくつか報告されています。

DESTROYで自動実行されるコードを通じて、ある程度自由に任意のコードを実行することが出来ます。

  • ファイルの削除 : 一時ファイルや一時ディレクトリを名前を指定して消せるもの
  • ファイルの書き込み : autosaveやautoflush機能を通じて任意のファイル名に書き込みが出来るもの

今のところ、任意のPerlモジュールを生成可能であると確認できているのは、HTTP::CookiesとDBI::ProfileDumperを組み合わせた方法です。

Plack::Middleware::Session::Cookie ではsecretの指定が可能になっていますが、デフォルトではsecretが未設定になっています。 あるいはsecretが漏洩した場合に、セッションオブジェクトの改竄が可能になっています。

secretが未指定のまま動いているプロダクトがいくつかあると思われます。

手元で動作させたmetacpan.orgでは、DBI::ProfileDumperが無かったので任意のコード実行までは試せていませんが、 少なくともテンプレートファイルの書き換えが出来ることを確認しました。

Plack::Middleware::Session::Cookieでは、下記のいずれかの(あるいは全部)対応が必要ではないかと思います

  • secretの指定を必須にする
  • シリアライザを変更する
  • 危険であるとドキュメントに記述する
use strict;
use warnings;
use Plack::Builder;
use lib ".";
builder {
enable "Session::Cookie";
sub {
my $env = shift;
my $session;
my $session = $env->{'psgix.session'};
$session->{count}++;
[200, ["content-type" => "text/html"], ["hoge" . $session->{count}]]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment