セッションIDが推測可能な脆弱性
2008年12月18日(木曜日)
セッションIDが推測可能な脆弱性
公開: 2025年1月20日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回通しているのが何のためなのかよく分からないですね。
- 「セッションIDが推測可能な脆弱性」にコメントを書く
関連する話題: セキュリティ
- 前(古い): 森の生活 26日目: スーパーたぬき
- 次(新しい): 森の生活 29日目: クローバーファームとぎんのジョウロと