水無月ばけらのえび日記

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

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

2008年12月18日(木曜日)

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

公開: 2018年7月21日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回通しているのが何のためなのかよく分からないですね。

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

最近の日記

関わった本など

インクルーシブHTML+CSS & JavaScript 多様なユーザーニーズに応えるフロントエンドデザインパターンデザイニングWebアクセシビリティ - アクセシブルな設計やコンテンツ制作のアプローチコーディングWebアクセシビリティ - WAI-ARIAで実現するマルチデバイス環境のWebアプリケーション体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践ウェブの仕事力が上がる標準ガイドブック 5 Webプログラミング

その他サイト