水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 2004年のえび日記 > 2004年10月 > 2004年10月7日(木曜日)

2004年10月7日(木曜日)

チャレンジ・レスポンスではパスワードが送られるか?

腕試し!10分でできるネットワーク実力診断テスト (itpro.nikkeibp.co.jp)」の中にチャレンジ・レスポンス方式に関する問題がありました。

チャレンジ・レスポンス方式というのは、簡単に言うと、サーバから「チャレンジ」と呼ばれるその場限りのキーが送られてきて、手元のパスワードとそのキーを合わせてハッシュしたものを送るという方式です。「チャレンジ」の値は毎回異なり、生成されるハッシュ値も異なりますので、これが盗聴されても問題ないわけです。このハッシュ値はその場で生成された一度きりのパスワードと考えることもでき、従ってこれはワンタイムパスワード方式の一種であるとも言えます。

さて、そのチャレンジ・レスポンス方式について述べているものの中で正しいのはどれかという問題だったのですが、その選択肢は事実上以下の二択になっていました。

  • パスワードはサーバーに送らない
  • パスワードを暗号化してサーバーに送る

※ほかにも二つ選択肢がありましたが論外なので。

さあ困りました。

送られているのはパスワードとチャレンジから生成されたハッシュ値だったりするわけですが、これは「暗号化されたパスワード」なのか、それとも「パスワードではない何か」なのか。「ワンタイムパスワードを送る」とかいう選択肢があればそれで良いと思うのですが、そんな選択肢はないのです。

前者ですが、確かに生のパスワードは送っていません。しかしその場で生成したワンタイムパスワードを送っていると言えますので、パスワードを送らないというのは言い過ぎでしょう。後者ですが、チャレンジと一緒にハッシュしたものを「暗号化」と呼んで良いのかという問題になります。これは、たとえば「/etc/shadow にはパスワードが暗号化されて格納されている」などという言い方を聞きますし、そんなに間違っていないような気がします。

というわけでどちらかといえば後者かなと思って回答したのですが……正解は前者の方でした。えーっ、ワンタイムパスワード送ってるじゃん、と思ったわけですが、回答を良く見ると、なんと後者の方の選択肢が……

クライアントがパスワードを暗号化して送り、サーバーが受信データを複合する

っておいおい、問題に出てたのと選択肢の内容が違ってるし! この選択肢だったら「サーバがデータを復号する」(複合は変換ミスでしょう) 部分が明らかに誤りなので、悩まずに選択肢を絞り込めますね。

瀬戸際で修正して、しかし問題文の方を修正し忘れたのかしら……。

関連する話題: セキュリティ / 思ったこと / ITpro

ASP.NET の脆弱性?

更新: 2005年2月10日

報告された Microsoft ASP.NET の脆弱性に関する情報 (www.microsoft.com)」って良く意味が分からないのですが、「ASP.NET の正規化の問題をプログラムによって確認する方法 (support.microsoft.com)」ではまず "\" をサニタイズしているようですので、\ と / を正規化するあたりに何かあるのかも。

ASP.NET では、たとえば http://……/%5c/test.aspx なんてのをリクエストしても http://……/test.aspx が何事もなく実行されるようになっていて、Request.Path やら Request.PhysicalPath にも何事もなかったかのように /test.aspx なり c:\……\test.aspx なりが格納されています。Request.Url.ToString() も http://……/test.aspx となっていて、いずれも %5c はどこかに消え去っています。

つまり ASP.NET では URL がプログラムに渡る前の前処理として URL を正規化していて、よけいなバックスラッシュなどは消えるようになっているのです。今回の話は、このどこかに穴があってバックスラッシュが (あるいは他のヤバイ文字が) 貫通してくるという話なのでしょうか?

ともあれ続報待ちな感じですね。

※2005-02-10 追記: 修正されました。「ASP.NET パス検証の脆弱性 MS05-004 (www.microsoft.com)

関連する話題: セキュリティ / Microsoft / .NET / ASP.NET

最近の日記

関わった本など