要約

  • Sharon Goldberg、Aanchal Malhotra、Isaac E. Cohen、Erik Brakkeは、旧版ntpdが要求と一致しない起点タイムスタンプを持つKiss-o'-Death応答まで受け入れることを確かめた。
  • 構成済みサーバーごとに偽造パケットを一個送れば、攻撃者が選んだ期間だけ同期を失わせ得た。拒否を要求に結び付け、後退時間を端末側で制限することが恒久的な教訓となった。

NTPクライアントは、時刻を尋ね続けるだけの単純な存在ではない。サーバーを酷使しないため、相手から頻度を落とすよう求められれば従う。その協調性が、2015年に報告された攻撃の入口になった。

Aanchal Malhotra、Isaac E. Cohen、Erik Brakke、Sharon Goldbergの論文が扱ったのは、Kiss-o'-Death、通称KoDという応答である。モード4、うるう秒指示3、階層0という形を取り、参照ID欄にはRATE、DENY、RSTRなど四文字のコードが入る。混雑する公共サーバーが過剰なクライアントを遠ざけるための仕組みだ。

仕組みの目的ではなく、受け手が与えた権限に欠陥があった。研究チームが試したntpd 4.2.6と4.2.8では、KoDが自分の要求への返答かどうかを確認しないまま、そこに示されたポーリング間隔を採用した。サーバーのアドレスを詐称できる経路外の攻撃者は、通信を盗み見る必要さえなかった。

未使用だった照合材料

通常のNTP往復には、応答を要求に結び付ける値がすでにある。クライアントのモード3要求には送信タイムスタンプが入り、サーバーのモード4応答はそれを起点タイムスタンプとして返す。TEST2はこの値を未完了の要求と照合する。暗号学的な本人確認ではないが、少なくとも「この答えは、いま出した問いに対応する」と確認できる。

旧版のKoD処理は、その検査を通していなかった。形式だけ整えた偽の応答でも、負の命令として通用したのである。ここで奪われたのは現在時刻ではなく、これから質問する権利だった。

ポール値は2の累乗で待ち時間を表す。17なら2^17秒、約36時間である。実装は想定範囲を超える値も受け入れ、25ならおよそ一年に達する。送信者の負担は一瞬だが、受信者が抱える状態は長い。制御面では、この寿命の非対称性がパケットサイズより重要だった。

RFC 5905はRATEを受けた際にパケット間隔を延ばす意図を定める。公開済みの訂正では、元の文面にあった逆向きの動詞も修正されている。仕様の一語が実装の安全性を自動的に保証するわけではない。どの入力を本物と見なし、どれほど長く従うかは、別々に設計する必要がある。

時刻源を一つずつ消す

直接攻撃には、対象クライアントのIPアドレスと、利用中のサーバーが必要だった。論文はそのサーバーを知る方法も示す。同期済みのIPv4クライアントにモード3の問い合わせを送り、返ってくるモード4応答の参照IDを見ると、現在のサーバーアドレスが分かる場合がある。

攻撃者は、そのサーバーから来たように見えるKoDを偽造する。クライアントが次のサーバーへ切り替えたら、同じことを繰り返す。必要なのは毎秒何万個ものパケットではない。構成された時刻源ごとに、受理される命令が一個あればよい。

実験では、三つの公開サーバーを使うntpd 4.2.8p2に対し、約一時間半で三つ目のKoDまで到達した。その後、実験を止めてもクライアントは少なくとも次の50時間、問い合わせを再開しなかった。偽造パケットが指定した最小待ち時間は約36時間だった。

2015年当時のインターネット計測では、攻撃の第一段階に必要な問い合わせへ応答するIPv4アドレスが1300万超と推定された。ただし、これは現在の脆弱台数ではない。KoDに反応すること、同期先がIPv4で参照IDから見えることなど、別の条件も必要だった。計測値は当時の前提の広がりを示すもので、永続的な母数ではない。

狂わせる攻撃と、補正を奪う攻撃

KoD一個が時計を任意の時刻に書き換えたわけではない。外部サンプルを止め、クライアントを自走状態に置いた。以後のずれは、物理発振器、仮想化、CPU負荷、OSや同期実装によって変わる。

安定した物理機なら緩やかにずれるかもしれない。仮想マシンでは短時間に不確かさが広がることもある。ログ、証明書検査、認証、分散処理、予約実行への影響も一様ではない。したがって事実として言えるのは、「攻撃者が補正源を長時間取り除けた」ことまでである。どの時刻へ、いつ到達するかまで保証する攻撃ではない。

運用記録もこの境界に合わせるべきだ。最後の正常同期、KoDの送信元とコード、起点タイムスタンプの検査結果、適用した間隔、利用可能なサーバー数、ホールドオーバー中の推定誤差を残す。沈黙の後に時刻ずれだけ見つけても、原因と影響を精密には結べない。

修正は攻撃コストを変えた

NTP ProjectのBug 2901告知によると、直接詐称への修正は4.2.8p4に入った。KoDでも起点タイムスタンプを検査し、実在する要求の値を返していなければ受け付けない。開発系列では4.3.77より前が該当するとされる。

これは送信元を暗号的に認証するものではない。それでも、経路外から値を発明するだけの攻撃は封じた。論文が「priming pump」と呼ぶ残余手段では、被害者のアドレスを詐称した要求を本物のサーバーへ多数送り、サーバー自身に正しい起点タイムスタンプを持つKoDを作らせる。直接攻撃より高価で、得られる待ち時間もポール10、約15分のように短くなりやすい。

2019年のRFC 8633は、さらに境界を明文化した。KoDは起点タイムスタンプが有効な場合だけ受理する。RATEに従う場合も、クライアントは合理的な最大値を持ち、ポール13、つまり2時間を超えてはならない。異常に大きなポール値を持つ要求は、一個だけでも攻撃の兆候になり得るとも記す。

要求との照合、送信者認証、効果時間の上限は同じものではない。照合はでっち上げを難しくし、認証は相手を確かめ、上限は本物の指示が過大でも損害を閉じ込める。三つを混同しないことが、修正を一つの比較処理で終わらせない鍵となる。

Goldbergが結び付けた三つの証拠層

Boston Universityの公式プロフィールは、Goldbergの研究を、暗号・ゲーム理論・アルゴリズムと、ネットワーク計測・モデル化・シミュレーションの結合として説明する。NTP研究にもその構造がある。RFCは意図された意味を示し、実装試験は実際の受理条件を示し、実験と走査は状態の持続と当時の露出条件を測った。

成果は四人の共同研究である。研究ページによれば、責任ある開示は2015年8月20日に始まり、Network Time Foundation、NTPsec、Cisco、Red Hatが10月21日の公表前に修正を出した。Goldbergを人物として追うことは、Malhotra、Cohen、Brakkeの仕事を単独の英雄物語へ吸収することではない。

この事例が残した問いは広い。retry later、拒否、隔離、停止、購読解除のような負のメッセージを受けたとき、どの要求と相手に結び付いているか。継続時間を誰が決めるか。上限を超えた指示を異常として記録できるか。従っている間にも回復経路が残るか。

エラー応答は、未来の行動を変える制御命令である。KoDが強力だったのは、偽造の費用が小さく、沈黙から戻る費用が大きかったからだ。安全な設計は逆にする。文脈を証明させ、後退を有限にし、時計が尋ねなくなった瞬間を観測可能にする。

出典