世界を動かす技術を、日本語で。

最初に登場したのはCNAMEレコードか、それともAレコードか?

概要

2026年1月8日、1.1.1.1のメモリ使用量削減を目的としたアップデートがDNS解決障害を引き起こした事例 CNAMEレコードの順序変更が一部DNSクライアントの不具合の原因 40年以上前のDNSプロトコル仕様の曖昧さが根本要因 障害の詳細なタイムラインと影響範囲の解説 CNAMEチェーンやRFCの曖昧な記述についても考察

2026年1月8日発生 DNS解決障害の概要

  • 2026年1月8日、 1.1.1.1 の定期アップデートにより DNS解決障害 が発生
  • 原因は DNS応答内のレコード順序 変更によるもの
  • 多くのソフトウェアは順序を無視するが、一部実装では CNAMEレコードが先頭 であることを期待
  • この順序変更により、特定のDNSクライアントで 名前解決が失敗
  • 攻撃や大規模障害ではなく、 仕様解釈の違い によるもの

障害発生までのタイムライン

  • 2025-12-02: レコード順序変更のコードが 1.1.1.1コードベース に導入
  • 2025-12-10: テスト環境 でリリース
  • 2026-01-07 23:48: グローバルリリース 開始
  • 2026-01-08 17:40: 90%のサーバー に展開完了
  • 2026-01-08 18:19: インシデント宣言
  • 2026-01-08 18:27: リリース リバート 開始
  • 2026-01-08 19:55: 復旧完了

CNAMEチェーンとDNS動作の基礎

  • ドメイン問い合わせ時、 CNAME(Canonical Name) レコードで別名解決が行われる
  • 例: www.example.com → cdn.example.com → server.cdn-provider.com → 198.51.100.1
  • 1.1.1.1 はこのチェーンを辿り、 各レコードをキャッシュ
  • 各レコードは 独自のTTL (有効期限)を持つ
  • チェーンの一部が失効しても、 有効部分のみ再解決 し、全体を再構築

問題の発生した実装変更

  • 以前は「 CNAMEチェーン→新しいレコード」の順で応答を構築
  • メモリ最適化のため「 既存回答にCNAMEを追加(CNAMEが後ろ)」方式に変更
  • これにより、 CNAMEレコードが末尾 に現れる場合が発生

影響を受けたDNSクライアント

  • 一部クライアントは CNAMEが先頭 であることを前提
  • glibcの getaddrinfo 関数などが該当
    • レコードを順に処理し、 CNAME発見時に参照名を更新
    • CNAMEが後ろにある場合、 期待通りに動作せず解決失敗
  • Ciscoスイッチ の一部モデルでは、CNAME順序変更で 再起動ループ が発生

影響を受けない実装例

  • systemd-resolved などは、全レコードを 順不同のセット として扱う
    • CNAMEがどこにあっても 正しくチェーンを辿れる

RFC(仕様書)における解釈の曖昧さ

  • RFC 1034 (1987年発行)がDNSプロトコルの基礎を定義
  • CNAMEレコードが先頭に来る可能性がある」と記載
    • ただし MUST/SHOULD などの強制表現は未使用
  • RRset(同名・同タイプのレコード集合) 内の順序は 重要でない と明記
  • ただし、 異なるRRset間の順序 は明確に規定されていない
  • 例示ではAレコード同士の順序のみ扱い、 CNAMEやAの混在順序は未記述

CNAMEチェーン順序のさらなる問題

  • CNAMEチェーン自体の順序 もRFCで明確な規定なし
  • チェーン順がバラバラだと、 逐次処理型クライアントで不具合
  • 例: www.example.com→cdn.example.com→server.cdn-provider.com の順序が崩れると解決失敗

レゾルバ(DNSクライアント)が取るべき対応

  • RFC 1034は「 CNAME発見時に新しい名前で再クエリ」を推奨
  • ただし、 フルレゾルバ 向けの記述が中心
  • スタブレゾルバ (glibcなど簡易クライアント)は仕様通り動かない場合も

DNSSEC仕様との比較

  • RFC 4035 (DNSSEC)は「 RRSIGは他RRsetより優先して含めるべき」と明確に規定
  • MUST などの強制表現を使用し、 曖昧さを排除
  • DNSSECのような明示的な優先順位指定が 従来DNSには存在しない

まとめ

  • DNS応答のレコード順序 は、古いRFCの曖昧な記述と実装依存によりトラブルの温床
  • 今回の障害は 仕様解釈の違いテスト不足 が要因
  • 安定運用には 実装間の互換性明確な仕様遵守 が重要

Hackerたちの意見

ハイラムの法則のいい例だね。「APIのユーザーが十分にいる場合、契約で何を約束しても関係ない。システムのすべての観察可能な動作は誰かに依存される。」これに、ポステルの法則を守らないことが組み合わさってる。「送信するものには保守的で、受け入れるものには寛容であれ。」

ポステルの法則は、業界が進化するにつれて、ますます有害だと見なされているね。

それは確かだけど、Hyrumの法則の精神をちょっと外してるね(つまり、世の中には obscure なエッジケースがたくさんあるってこと)。この場合、壊れたリゾルバーはGNU Cライブラリのもので、全然 obscure な状況じゃないよ! ここでのニュースは、実はストーリーの中に埋もれてる。要するに、Cloudflareはこれをテストしなかったってことだね。世界中のデータセンターがこの変更で失敗することになるだろうし、彼ら自身のも含まれてるかもしれない。

Hyrumの法則についての必須のxkcd: https://xkcd.com/1172

RFCの表現がそんなに曖昧だとは思わないな。 > 「クエリへの回答は、回答に至る途中で遭遇したエイリアスを指定する1つ以上のCNAMEレコードで前置きされる可能性がある。」この「可能性がある」というのは、明らかに「CNAMEレコードがあれば、そのクエリの回答はそれらのCNAMEレコードで前置きされるべき」と理解すべきで、「クエリをCNAMEレコードで前置きすることもできるし、好きなところに置いてもいい」という意味ではないよね。

100%同意!私も同じことをコメントしたよ。「可能性がある」というのはCNAMEレコードの存在を指していて、順序のことじゃないのは明らかだね。

それには同意するよ。RFCの例6.2.1の解釈がちょっと意味不明だと思う。そこには「回答セクションのRRの順序の違いは重要ではない」と書いてあるけど、RFCから見ると、このコメントは特定の例にのみ関連していることは明らかだよね。二つのレスポンスを比較して、この場合は異なる順序が意味的な影響を持たないと言っているだけだし。まあ、ちょっと細かいことを言うけど、「RFC 1034のセクション3.6では、リソースレコードセット(RRset)を同じ名前、タイプ、クラスのレコードの集合として定義している」とも書いてあるけど、RFCを見てもそんな用語は定義されてないんだよね。「特定の名前に関連付けられたRRのセット」内では順序が問題にならないとは言ってるけど、「特定の名前、タイプ、クラスの組み合わせに関連付けられた」とは言ってないから、どうしてそれが曖昧さを生むのか理解できない。一般的なルールに対する例外を指定しているわけだから、例外が適用されないなら一般的なルールに従うべきだよね。まあ、CloudflareはDNSを僕よりよく知ってるだろうけど、この記事は特に説得力があるとは思わなかった。曖昧さは実際には誤解から来ていると思うし、RFCはCNAMEレコードの特定の順序を要求していると思う。(追記)確かに、RFCにはCNAMEがAの前に来るべきだと書いてあるけど、CNAMEチェーンの順序については明確なルールがあるとは思わない。RFCには「別の名前を指すRRのドメイン名は、常にプライマリ名を指し、エイリアスを指してはいけない」としか書いてないし... もちろん、ロバストネス原則に従って、ドメインソフトウェアはCNAMEチェーンやループに直面しても失敗すべきではないし、CNAMEチェーンは追従されるべきだとも書いてある。だから、実際にCNAMEチェーンを含むレスポンスに関しては、ある程度の曖昧さがあることには同意するかな。

記事では、曖昧さが別のフレーズから生じることがはっきり示されてるよ。「回答セクションのRRの順序の違いは重要ではない」というのは例に適用されているけど、例の問題は、例が説明的で一般化可能なものであるため、どこでも再配置を許可する可能性があるってこと。だから、再配置すべきかどうかは実用的な文脈の問題になってくる。つまり、一人の「明らかな理解」が他の人にとっては「全体の文書を読んだのか?」ってことになるわけだ。これもまた、規範的な言語の価値を強調することになるけど、それは後の話だね。

この記事にそれが明記されてるんじゃない? 記事では、RFCが規範的な言葉がハード要件として標準化される前のものであることも指摘してるよ。

これ、あんまり曖昧じゃないと思うよ。「これをやってもいいよ」と言って、「逆のことをやるかもしれない」と言ってる。もし「何かを前に付けることができる」と言ったら、代わりに後ろに付けることができるわけじゃない。でもさ、世界で最も重要な(エンドユーザー向けの)DNSサーバーのソフトウェアを作ってるプログラマーたちが、 1. CNAMEレスポンスの形成ロジックを変更して、 2. いくつかのテストが壊れて「修正が必要」になったと思う(「CNAMEがクエリされたとき、これが返ってくると思ってた」みたいな)。 3. 誰もこのテストの挙動の変化を見て「この順番って重要なのかな?」とか「もっと調査すべきだ」とか「他のDNSサーバーも順番を変えてるのかな?」とか「これは非常に段階的なリリースのためにフラグを立てるべきだ」と思わなかった。 4. テスト環境に入って、何、1ヶ月くらい… glibcからのgetaddrinfoを使ってこの環境をテストする人もいなかったし、壊れてることに気づいた人もいなかった。Cloudflareは物事を壊して透明性を持つことに慣れてきてるみたいだけど、これは本当に「知ってた?」っていう面白い話に見えるだけで、「また壊しちゃったよ、でもまだ使ってね」って感じじゃない。実際の原因分析はRFCを責めることしかないけど、正直、こんな大規模な運用でこれが見逃されるのはかなり大きな問題だと思う。サウスパークのオイルのジョークを言いたいけど、「ごめん」って感じじゃないみたい。

「おそらく前に付ける」って解釈される場合でも、CNAMEが複数ある場合にCNAME RRセットの順番に依存しているリゾルバがいくつかいるのは壊れてるよ。この順番の期待は関連するRFCでは約束されてないからね。

RFCの文言がそんなに曖昧だとは思わないな。あなたは曖昧じゃないと思うかもしれないけど、実際は曖昧で、修正しようとした試みもあったよ。このトピックについての熱い議論はここで見つけられるよ: https://mailarchive.ietf.org/arch/msg/dnsop/2USkYvbnSIQ8s2vf...

Hacker Newsで議論の続きを見る