Basic 認証、Digest 認証とブラウザの認証ダイアログ
徳丸浩さんがこんな動画をアップされています。
Digest 認証が掛かったページに対して中間者攻撃(MITM)を行い、 Basic 認証へ変更させたうえでパスワードを読み出す[1]というデモです。
動画の後半(10:30〜)では、 Digest 認証の技術仕様であるRFC 7616(tools.ietf.org
)に以下の記述があることを引き合いに出し、現実のブラウザは対策が行われていないと警鐘を鳴らされています。
ブラウザの認証ダイアログ
ここで思い出したのが、一昔前のブラウザでは Basic 認証と Digest 認証でダイアログの表示を変えていたものもあったということです。具体的には Internet Exploer とバージョン12以前の Opera(いわゆる Presto Opera)なのですが、これらは HTTP 環境において Basic 認証の場合のみ、認証ダイアログにパスワードが暗号化されずに送信される旨の警告メッセージが出ていました。
以下にデモページを用意しました。ここで「HTTP」の2つのリンク(リンク先はそれぞれ Basic 認証と Digest 認証が掛かっています)を押した時の両ブラウザの様子を紹介します。
- デモページ(
labs.w0s.jp
)
これらのブラウザで 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 であっても警告メッセージは表示されません)。
まとめると、新旧の各ブラウザの挙動は以下の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 でもこんな注意が書かれています。
そのため、サイト上のプログラムに何らかの脆弱性があり、パスワードファイルを読み出されてしまうと、ハッシュ値でログインできる Digest 認証は Basic 認証よりもむしろ安全性が低いと考えることもできます。ただし、いくら HTTPS であっても HSTS を設定していないなど引き続き HTTP でもアクセスできるケースでは一概にどちらが良いとは言えないかもしれませんが。
いずれにしても、今どきは Basic 認証か Digest 認証かで悩むより先に、まず HTTPS でアクセスできるように(そして HTTP での接続を禁止するように)することが最優先であるといえるでしょう。
脚注
-
1.
Basic 認証はリクエストヘッダーにパスワードがハッシュ化されずに流れるので、 HTTP 環境下で第三者に通信を盗聴されると入力したパスワードが解析されてしまいます。 ↩ 戻る
-
2.
実際、当時 Presto Opera ユーザだった私は、「HTTP かつ Digest 認証」の Web サービスにおいては「ダイアログに赤文字の警告メッセージが出ていないこと」を常日頃確認し、安全であることの指標にしていました。 Presto Opera の開発が終了して Firefox に移行した際、 Basic 認証と Digest 認証の区別ができないことに絶望したものです。ほどなく常時 HTTPS の時代になったので、実害は少なかったですが。 ↩ 戻る