水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > セッションIDが推測可能な脆弱性

セッションIDが推測可能な脆弱性

2008年12月18日(木曜日)

セッションIDが推測可能な脆弱性

公開: 2024年4月23日22時20分頃

興味深いのでメモ: 「セッション ID が推測可能な脆弱性の件 (d.hatena.ne.jp)」。「JVN#07468800 futomi's CGI Cafe 製高機能アクセス解析CGI におけるセッション ID が推測可能な脆弱性 (jvn.jp)」の内容についての考察ですね。

元々はこんな生成の仕方だったようで。

my $seed = $ipaddress.$remote_port.time.$ENV{'HTTP_USER_AGENT'};

my $sid = Digest::Perl::MD5::md5_hex(Digest::Perl::MD5::md5_hex($seed));

seedのMD5ハッシュ値のMD5ハッシュ値を採用していますが、seedに乱数も何も入っていないので、生成のアルゴリズムが分かれば推測できるというお話ですね。いちおうtimeが入っていますが、状況によってはかなり候補を絞り込めるでしょう。一回で成功しなくても、何度もトライすれば良いわけですし。

※ちなみに Perl の time は1970年1月1日0時0分0秒からの経過秒数です。

で、これが修正後だそうで。

my $seed = $ipaddress.$remote_port.time.$ENV{'HTTP_USER_AGENT'}.Data::Random::String->create_random_string(length=>'32', contains=>'alphanumeric');

my $sid = Digest::Perl::MD5::md5_hex(Digest::Perl::MD5::md5_hex($seed));

seedにData::Random::String->create_random_string() の結果が付け加えられました。Data::Random::Stringのソース (search.cpan.org)を見ると、単なる rand() ですね。Perl の rand() って最初に呼ぶときに srand(time) されるのではありませんでしたっけ、と一瞬思ったわけですが……

In versions of Perl prior to 5.004 the default seed was just the current time.

以上、srand - perldoc.perl.org より

それは昔の話でした。実際に手元の ActivePerl5.10 で試した範囲でも、srandを呼ばない場合と srand(time) と srand() とは、全て異なる結果になりました。

逆に言うと、5.004より古いPerlで実行する場合は srand(time) されている可能性があるので、timeの値が推測できるとセッションIDが推測されるおそれがあるのかも。まあ、今どきそんな古いPerlは動いていないだろうと思いますが。

※しかし、Digest::Perl::MD5::md5_hex を2回通しているのが何のためなのかよく分からないですね。

関連する話題: セキュリティ

最近の日記

関わった本など