Cloudflareは、セキュリティの不十分なインターネットプロトコルにセキュアなバージョンを展開し、誰でもそれを無料で利用できるようにすることで業界をリードしてきました。2014年には、既存の無料HTTPプランで利用いただける、世界初の無料でセキュアなHTTPSサービス(Universal SSL)を立ち上げました。1.1.1.1 DNS リゾルバーを提供開始したとき、新しいセキュアなバージョンのDNS(DNS over HTTPSとDNS over TLS)もサポートしました。今日は、暗号ウィーク2019の一環として、インターネット上で時刻値を取得するためのプロトコルとして主に利用されているNetwork Time Protocol(NTP)についても同じことを行います。
この発表は、私にとって意味深いものです。過去 4 年間、私はタイムプロトコルの脆弱性を特定し、修正してきました。今日、2015年から2019年まで非常に苦労して取り組んだサービスの導入のお手伝いできることを誇りに思います。time.cloudflare.comは、NTP保護のための新しいNetwork Time Security(NTS)プロトコルとNTPの両方をサポートする無料の時刻情報提供サービスです。今では、世界180都市のすべてのデータセンターから安全に時刻を取得することができます。
NTSのクライアントがまだ開発中ですが、NTPで今使っているすべてのデバイスの時刻のソースとしてtime.cloudflare.com が使用できます。NTPsecにはNTSの実験的なサポートが含まれています。NTSクライアントの開発に関する最新情報を入手するには、time-services@cloudflare.comまで参加希望のメールを送信してください。NTS を使用して時刻の同期を保護するには、業者に連絡してNTSサポートについて問い合わせてください。
まずは「時刻」の小さな物語
2015年、私はインターネットセキュリティに興味を持つ大学院の新入生として、Network Time Protocol(NTP)と呼ばれる、その大部分が難解なインターネットプロトコルに出会いました。NTP は、信頼性が低い可変レイテンシーのネットワークパスを介して通信するコンピュータシステム間で時刻を同期するように設計されていました。本来はインターネットルーティングセキュリティ、特にリソース公開鍵基盤(RPKI)に対する攻撃を研究していましたが、キャッシュフラッシュングの問題で壁にぶつかり続けていました。最後の手段として、マニュアルでコンピュータ上の時刻をロールバックすることを決め、そうすると攻撃がうまくいきました。
私はコンピューターセキュリティにとっての時刻の重要性を発見しました。ほとんどの暗号化では、タイムスタンプを使用して証明書と署名の有効期間を制限します。Webサイトに接続する場合、正しい時刻を知ることで、表示される証明書が最新であり、攻撃者によって侵害されていないことが保証されます。ログを確認する時、時刻同期によって、異なるマシン上のイベントを正確に関連付けることができます。証明書とログインフラストラクチャは、数分、数時間、または数か月の時差で破損します。キャッシュやビットコインなどの他のアプリケーションは、きっちりと秒のオーダーでわずかな違いに敏感です。
ローリング番号を使用した2要素認証も、正確なクロックに依存します。これにより、コンピュータのクロックが、セキュアに配信される充分正確な時刻にアクセスできる必要が生じます。NTPは、インターネット上の時刻同期に最も一般的に使用されるプロトコルです。攻撃者が NTPの脆弱性を利用してコンピュータクロックの時刻が操作できてしまうと、これらのシステムが提供するセキュリティ保証を損なう可能性があります。
私は、問題の深刻さに突き動かされて、NTPとそのセキュリティを深く調べることにしました。ネットワーク間で時刻を同期する必要性は早い段階で認識されており、NTPは非常に古いプロトコルです。NTPの最初の標準化版は 1985年にさかのぼり、最新のNTP バージョン4は 2010 年に完成しました(RFC5905参照)。
最も一般的なモードでは、NTPがクライアントにNTPサーバーへクエリパケットを送信させて、NTPサーバーにクロック時間で応答させることによって機能します。次に、クライアントは自分のクロックとリモートクロックの差を計算して推定し、この中のネットワーク遅延を補正しようとします。NTPクライアントは複数のサーバーに対してクエリを実行し、アルゴリズムを実装して最適な見積もりを選択し、明らかに間違った回答を拒否します。
驚くべきことに、NTPとそのセキュリティに関する研究は、当時あまり活発に行われませんでした。この前に、2013年後半から2014年初頭には、NTPサーバーからのトラフィックを増幅する、分散サービス拒否(DDoS)攻撃が注目を集めました。攻撃者は、被害者のIPアドレスを偽装することができ、大量のトラフィックを流入させることで対象ドメインを圧倒させました。そこに注目する研究者もいました。しかし、これらの攻撃は基本的なプロトコル設計の欠陥を悪用したものではありませんでした。攻撃者は単に退屈な帯域幅増幅機能としてのNTPを使用したのです。Cloudflareは、こうした攻撃について広範囲に記述しました。こことここ、それからここで読むことができます。
私は、NTPプロトコルの設計と実装にいくつかの弱点を見つけました。こうした弱点を利用して、ネットワーク攻撃者が、時間を書き換えたりNTPクライアントへのサービスを拒否することで、もっと壊滅的な攻撃を展開することが可能です。さらに懸念されるのは、この攻撃者がこうした攻撃を仕掛けるために、クライアントとサーバー間のトラフィックを変更できる_中間者(MITM)である必要がない_ことです。我々のメンバーが最近執筆した一連の論文で、ネットワーク上のどこかに存在するオフパスの攻撃者が時間を書き換えたり、NTPクライアントへのサービスを拒否することが可能であることが示されました。これを行う方法の1つは、IPフラグメンテーションを悪用することです。
フラグメンテーションとは、大きなパケットをサポートしないネットワークを通過できるように、大きなパケットを複数の小さなフラグメントに切り分けるIP層の機能です。基本的に、クライアントとサーバーの間のパス上にあるランダムなネットワーク要素は、「ICMPフラグメンテーション要」と、何バイトかにパケットを断片化するように指示を出す特別なパケットをサーバーに送信することができます。サーバーはパス上にあるすべてのネットワーク要素のIPアドレスを知っているとは限らないので、このパケットはどの送信元 IPからでも送信できます。
NTPに対する断片化攻撃
我々の攻撃では、攻撃者はこの機能を利用して、NTPサーバーに、被害者のNTPクライアント用のNTP応答パケットを断片化させます。次に、攻撃者は自分のタイムスタンプ値を含むオフパスから、重複する応答フラグメントを慎重に細工して偽装します。重複するフラグメントに対する再構成ポリシーをさらに悪用することで、攻撃者はクライアントを騙して正当なフラグメントと攻撃者の挿入を含むパケットを組み立てさせます。これにより、パケットの元来の部分の値に依存する信憑性チェックが回避されます。
NTPの過去と未来
1985年にNTPが創設された当時、NTPが提供するサービスには主要な設計目標が2つありました。1つ目の目標は、ネットワークエラーや機器の故障に対応できる堅牢性を持たせることでした。そのため、NTPはクライアントが複数の通信パスを介して複数のピアからタイミングサンプルを収集し、それらを平均化してより正確な測定を行うことができるサービスを設計しました。
2つ目の目標は負荷分散です。どのクライアントも、原子時計、GPSなどの高精度の時刻維持デバイスに直接接続され、より正確な時刻を持つタイムサーバーと通信しようとしますが、デバイスの容量も限られています。そこで、ネットワーク上のプロトコルの負荷を軽減するために、サービスを階層的に設計しました。NTP以外のタイムソースに接続されたサーバーが階層の最上位にあり、他のサーバーに時間を分散し、さらに多くのサーバーに時間を分散します。ほとんどのコンピュータが、これらの第 2レベルまたは第 3 レベルのサーバーに接続します。
NTP のStratumとよばれる階層
元の仕様(RFC 958)には、プロトコルの「非目標」、つまりピア認証とデータ整合性も示されています。比較的小規模で信頼できる初期のインターネットでは、セキュリティはそれほど重要視されておらず、セキュリティに時間を費やすプロトコルやアプリケーションは存在しませんでした。NTPのセキュリティ保護は、プロトコルと実装の改善の二の次でした。
インターネットが成長するにつれて、ますます多くのコアインターネットプロトコルが、不正行為から保護するために、暗号化によって保護されるようになりました。TLS、DNSSEC、RPKI はすべて、インターネット上のすべての通信のセキュリティを確保するための手順です。これらのプロトコルは、セキュリティ保証を提供するために「時間」を使用します。インターネットのセキュリティは NTPのセキュリティにかかっているため、NTPのセキュリティを確保することがさらに重要になります。
この研究で、NTPをセキュアにする必要性が明確に示されました。その結果、インターネットプロトコルの標準化機関であるインターネット技術特別調査委員会(IETF)において、暗号化認証に向けた動きが進みました。当時、NTPv4は対称暗号方式認証と非対称暗号方式認証の両方をサポートしていましたが、両者ともに限界があり、実際に使用されることはほとんどありませんでした。
同期をセキュリティで保護する NTPv4 の対称方式は、対称鍵が事前共有鍵で、かつ手動での設定が必要であるため規模拡大ができません。全クライアントがそれぞれ、時刻を取得したいサーバーと特殊な秘密鍵を必要としたとしたら、こうしたサーバーを実行する組織は、鍵の管理に大量の作業をしなければならなくなるのです。そしてこのソリューションは、どのクライアントからのクエリも受け入れる必要があるパブリックサーバーにとって非常に負担が大きくなります。NISTの場合、重要な公開タイムサーバーを運営し、年に1回米国郵便またはファクシミリを介して登録するユーザーにのみ対称鍵を配布します。米海軍事務所でも同様のことを行っています。
鍵配布の問題を解決する最初の試みは、RFC 5906で説明されている、Autokeyプロトコルでした。多くの公開NTP サーバーは、Autokeyをサポートしません(例: NISTとUSNOタイムサーバー、pool.ntp.orgの多くのサーバー)。ネットワーク攻撃者がクライアントとサーバーの間で共有される秘密鍵を簡単に取得できるため、プロトコルは完全に崩壊しています。認証メカニズムは非標準で非常に特異性があります。
インターネットの未来は、セキュアなインターネットです。つまり、認証されていて暗号化もされているインターネットです。しかしこれまで、プロトコル開発が続いているにもかかわらず、NTPのセキュリティは低いままです。その間に、それに依存するサービスがどんどん増えています。
NTP開発の経緯
問題の修正
論文の発表後、NTPコミュニティ内ではインターネットプロトコルの標準化機関、インターネット技術特別調査委員会(IETF)において、またNTPコミュニティ外でも、NTPセキュリティの状態を改善することへの関心が高まりました。短期的な修正として、ntpd リファレンス実装ソフトウェアに、我々が見つけたいくつかの脆弱性に対するパッチが適用されました。また、長期的なソリューションのために、コミュニティは公開鍵暗号に基づく安全で認証された時刻同期プロトコルの必要性を認識しました。これがあれば、事前に鍵材料を共有することなく、暗号化と認証が可能になります。今日、NTPワーキンググループの数十人の熱心な方々の努力のおかげで、IETFにおいてNetwork Time Security (NTS)のドラフトが検証されています。
簡単に言うと、NTSプロトコルは 2フェーズに分けられます。最初のフェーズは、NTP クライアントとサーバーの間に必要な鍵材料を確立するNTS鍵交換です。このフェーズでは、Transport Layer Security (TLS) ハンドシェイクを使用し、Webと同じ公開鍵基盤に依存します。鍵が交換されると、TLS チャネルが閉じられ、プロトコルは第2フェーズに入ります。このフェーズでは、そのTLSハンドシェイクの結果を使用して、拡張フィールドを介したNTP時刻同期パケットを認証します。ご興味があれば、インターネット版ドラフトで詳細情報をご確認いただけます。
Cloudflareの新サービス
今日、Cloudflareはインターネット上のどなたでも無料で利用できる、時刻情報提供サービスを発表します。特に可用性、堅牢性、セキュリティを向上させることで、既存の公開時刻情報提供サービスの制約を解決する予定です。
グローバルネットワークを使用して、レイテンシーと精度における優位性を提供します。世界180か所すべてにおいてエニーキャストを利用しており、自動的に最も近いサーバーにパケットをルーティングします。私たちのすべてのサーバーは、他の公開 NTPプロバイダの機能と同様に、Stratum 1 時刻情報提供サービスプロバイダと同期され、一般のユーザーに NTPを提供します。時刻同期プロトコルが不正確になる最大の原因は、ネットワークの非対称性であり、クライアントとサーバー間の移動時間とサーバーからクライアントへの移動時間の違いにつながります。一方で、当社のサーバーはユーザーに近接しているため、ネットワーク上でのレイテンシーの分散の測定値であるジッターと、パケットパスの非対称性の可能性が少なくなります。また、NTPサーバーが不足している地域では、私たちのサービスがNTPエコシステムの容量と品質を大幅に向上させることを期待しています。
Cloudflareサーバは、Stratum 1 アップストリームサーバーとの共有対称キーを使用して認証された時刻値を取得します。これらのアップストリームサーバーを各地に配置しており、当社のサーバーがデータセンターで保有する時間が正確であることを確認します。しかし、時間を確保するためのこのアプローチは規模拡大ができません。Stratum 1 サーバーを実行する組織と個別にメールを交換し、それらを使用する許可をネゴシエートする必要がありました。当社にとっては解決策ですが、インターネット上の人全員にとっての解決策ではありません。
セキュアな時刻情報提供サービスプロバイダとして、CloudflareはNetwork Time Securityにおいて無料で安全な公開時刻情報提供サービスを提供する先駆者であることを誇りに思っています。最新の NTS IETF ドラフトを実装しました。このドラフトが順次インターネット標準のプロセスを経て仕上げられるのに従い、私たちはサービスを最新の状態に保つことに全力を上げています。
現在、ほとんどの NTP 実装は NTS サポートに取り組んでおり、今後数か月ほどで広範な導入と現在のドラフトプロトコルのRFCへの進展が見込まれています。現在、NTS のドラフト18を実装している NTPsec と相互運用性があります。当社のサービスがインターネットセキュリティに対する、この重要な改善の採用を加速させるものになることを望んでいます。これは後方互換性の要件を持たない新しいサービスであるため、TLS v1.3 を使用して TLS の最もセキュアなバージョンの採用を促進する必要があります。
ぜひご利用ください
NTS クライアントをお持ちの場合は、time.cloudflare.com:1234 を指定してください。それ以外の場合は、NTP クライアントをtime.cloudflare.comに指定します。構成の詳細については、開発者ドキュメントを参照してください。
まとめ
RoughtimeサービスからUniversal SSLまで、Cloudflareはセキュアなプロトコルの可用性と利用を拡大する役割を果たしてきました。今、私たちの無料の公開時刻情報提供サービスで、セキュアでないレガシープロトコルに代わる、信頼できて広く利用可能な代替手段を提供します。すべての人にとってより速く、信頼性が高く、より安全なインターネットの構築を支援するという私たちの使命の一部です。
このプロジェクトに参加してくださったWatson Ladd、Gabbi Fisher、Dina Kozlovを始め、多くのエンジニアのみなさま、ありがとうございました。
本投稿は、ボストン大学の大学院研究助手で、Cloudflareの暗号化チームの元インターンであるAanchal Malhotra氏が行いました。