Basic 認証、Digest 認証とブラウザの認証ダイアログ

徳丸浩さんがこんな動画をアップされています。

徳丸本VMで実習:Digest認証に対して中間者攻撃してみよう(YouTube)

Digest 認証が掛かったページに対して中間者攻撃(MITM)を行い、 Basic 認証へ変更させたうえでパスワードを読み出す[1]というデモです。

動画の後半(10:30〜(YouTube))では、 Digest 認証の技術仕様であるRFC 7616(tools.ietf.org)に以下の記述があることを引き合いに出し、現実のブラウザは対策が行われていないと警鐘を鳴らされています。

User agents should consider measures such as presenting a visual indication at the time of the credentials request of what authentication scheme is to be used, or remembering the strongest authentication scheme ever requested by a server and producing a warning message before using a weaker one. It might also be a good idea for the user agent to be configured to demand Digest authentication in general or from specific sites.

RFC 7616 - 5.8. Man-in-the-Middle Attacks(tools.ietf.org)

ユーザーエージェント(訳注:ブラウザ等)は、使用する認証スキームの資格情報要求時に視覚的な表示を提示する、またはサーバーによって要求された最も強力な認証スキームを記憶しておき、弱い方法の使用の前に警告メッセージを提供するなどの対策を検討するべきです。

徳丸浩さんによる私訳(YouTube)

ブラウザの認証ダイアログ

§

ここで思い出したのが、一昔前のブラウザでは Basic 認証と Digest 認証でダイアログの表示を変えていたものもあったということです。具体的には Internet Exploer とバージョン12以前の Opera(いわゆる Presto Opera)なのですが、これらは HTTP 環境において Basic 認証の場合のみ、認証ダイアログにパスワードが暗号化されずに送信される旨の警告メッセージが出ていました。

以下にデモページを用意しました。ここで「HTTP」の2つのリンク(リンク先はそれぞれ Basic 認証と Digest 認証が掛かっています)を押した時の両ブラウザの様子を紹介します。

サムネイル画像
Opera 12.18 の Basic 認証ダイアログ(パスワード入力欄の下に「パスワードは暗号化されずに送信されます」という警告メッセージが赤文字で表示)オリジナル画像
サムネイル画像
Opera 12.18 の Digest 認証ダイアログ(警告メッセージなし)オリジナル画像
サムネイル画像
IE 11 の Basic 認証ダイアログ(ユーザー名入力欄の上に「警告: ユーザー名とパスワードは、セキュリティで保護されていない接続で基本認証を使用して送信されます。」という警告メッセージが黒文字で表示)オリジナル画像
サムネイル画像
IE 11 の Digest 認証ダイアログ(警告メッセージなし)オリジナル画像

これらのブラウザで HTTP 環境 + Digest 認証のサービスを利用していると、徳丸さんの動画デモのような中間者攻撃が行われた場合、ダイアログに普段は現れないメッセージが表示されるため、ユーザーが攻撃に気付く事が可能です。とくに Opera は目立つ赤文字なので、技術的知識のない方でも「何か変だぞ」くらいの違和感は持つことが期待できました[2]

ところが昨今のブラウザ(Firefox 76, Chrome 81, Edge 81, Safari 13.1)では、 Basic 認証と Digest 認証で違いはありません。このうち、 Firefox は常に何の警告メッセージも出ないのですが、 Chrome, Edge, Safari は HTTP の時は(Basic / Digest の認証方式に関わらず)安全でない旨の警告メッセージが表示されます(ただし、 Chrome, Edge は localhost では HTTP であっても警告メッセージは表示されません)。

サムネイル画像
Chrome 81 の Digest 認証ダイアログ(ユーザー名入力欄の上に「このサイトへの接続ではプライバシーが保護されません」という警告メッセージが黒文字で表示)オリジナル画像
サムネイル画像
Safari 13.1 の Digest 認証ダイアログ(ユーザー名入力欄の上に「パスワードは暗号化されずに送信されます。」という警告メッセージが灰色文字で表示)オリジナル画像

まとめると、新旧の各ブラウザの挙動は以下の4パターンが存在します(古いブラウザを除けば現状3パターン)。

Opera 12, IE 11
HTTP + Basic 認証の場合のみ警告文あり
Firefox 76
HTTP でも HTTPS でも警告文が表示されない
Chrome 81, Edge 81
HTTP なら Basic / Digest 認証のいずれであっても警告文あり(ただし localhost では表示されない)
Safari 13.1
HTTP なら Basic / Digest 認証のいずれであっても警告文あり

要するに、一昔前(常時 HTTPS が普及する前)は、一部の環境下においてユーザーに対しても Basic 認証と Digest 認証の区別が行われていたのに対し、昨今は HTTPS になっているかどうかが重視され、 Basic 認証か Digest 認証かの区別はさほど重要でないと判断されているのでしょう。

  • そもそも Digest 認証って、 Basic 認証と比較してどの程度使われているんですかねえ……。

Basic 認証と Digest 認証の安全度合い

§

常時 HTTPS が普及する前は、 Basic 認証より Digest 認証の方が安全性が高いという解説が多く行われていました。 Digest 認証は通信経路上でパスワードがハッシュ化されるため、通信を盗聴されてもパスワードそのものが漏れることはない、という技術仕様から来る考え方です。しかし、それはブラウザが適切な対策をしたうえで、ユーザーもブラウザが発した警告を見逃さないなど、技術仕様・ブラウザ・人間すべてが適切な挙動(行動)をすることで始めて成り立つものです。前述のとおり、残念ながら昨今のブラウザはユーザーに対して HTTP 環境下での Basic 認証と Digest 認証の区別を提供しておらず、中間者攻撃に対して無力な状況となっています。そのような状況下では、ユーザーも注意のしようがありません。

HTTPS に移行できるならそうするに越したことはありませんが、どうしてもそれができない場合、 HTTP 環境下ではせめて危険性を認識したうえで使うべきでしょう。

一方、 HTTPS 環境下においては(ユーザーが接続先が正しいドメインであることを確認しているという前提において)通信経路上の盗聴・改ざんがないことが担保されるため、注意すべきはむしろ認証情報が書かれたパスワードファイルを読まれてしまうケースでしょう。 RFC 7616 でもこんな注意が書かれています。

The security implications of this are that if this password file is compromised, then an attacker gains immediate access to documents on the server using this realm.

RFC 7616 - 5.2. Storing Passwords(tools.ietf.org)

そのため、サイト上のプログラムに何らかの脆弱性があり、パスワードファイルを読み出されてしまうと、ハッシュ値でログインできる Digest 認証は Basic 認証よりもむしろ安全性が低いと考えることもできます。ただし、いくら HTTPS であっても HSTS を設定していないなど引き続き HTTP でもアクセスできるケースでは一概にどちらが良いとは言えないかもしれませんが。

いずれにしても、今どきは Basic 認証か Digest 認証かで悩むより先に、まず HTTPS でアクセスできるように(そして HTTP での接続を禁止するように)することが最優先であるといえるでしょう。

脚注

  • 1.

    Basic 認証はリクエストヘッダーにパスワードがハッシュ化されずに流れるので、 HTTP 環境下で第三者に通信を盗聴されると入力したパスワードが解析されてしまいます。 ↩ 戻る

  • 2.

    実際、当時 Presto Opera ユーザだった私は、「HTTP かつ Digest 認証」の Web サービスにおいては「ダイアログに赤文字の警告メッセージが出ていないこと」を常日頃確認し、安全であることの指標にしていました。 Presto Opera の開発が終了して Firefox に移行した際、 Basic 認証と Digest 認証の区別ができないことに絶望したものです。ほどなく常時 HTTPS の時代になったので、実害は少なかったですが。 ↩ 戻る