AdGuard for Windows によるページ読み込み不具合(修正済み): 原因調査と再発防止策

最近、一部の AdGuard for Windows ユーザーの方がアプリの不具合に直面していました。AdGuard for Windows v7.22 をリリースした後、このアップデートによりブラウザでページ読み込みが時々うまく行かなくなる問題が発生していることが判明しました。Chrome については比較的早く問題を緩和できましたが、Firefox では、バグが非常に稀かつ再現が難しく、テスト時には検出されなかった要因の組み合わせによって発生していたため、より長い期間にわたって影響が続いていました。

11月13日時点では、問題を完全に解消するホットフィックス「AdGuard for Windows v7.22.1」をリリース済みです。 円滑にご利用いただくため、アプリを最新バージョンに更新していただくようお願いいたします。なお、他のプラットフォームで AdGuard をお使いの場合は、特に操作していただく必要はありません。通常どおり問題なく動作しているはずです。

ご不便とご迷惑をおかけしましたことを、心よりお詫び申し上げます。今回の件が、皆さまの AdGuard に対する全体的な印象やご体験を損なうことのないよう、強く願っております。今回の事象は一度きりのものであり、今後同じことが起こらないようにいたします。技術的な問題を解決するだけでなく、社内の各種プロセスを見直し、今後同様の事態を未然に防ぐための改善をすでにいくつも実施しました。

以下では、今回のインシデントに至るまでのタイムラインをご説明し、その後で、より技術的な詳細と、今後同様の問題を防ぐために講じている対策についてご紹介します。

事象のタイムライン

10月2日

AdGuard for Windows v7.22 をリリースしました。

10月4日

あるユーザーの方が、v7.22 にアップデートした後にページ読み込みの問題が発生し、最終的には Timed out エラーが表示されるようになった、という内容の GitHub Issue を作成しました。

10月6日

QA チームが本件の調査を開始しましたが、この時点では問題の再現に失敗しました。同日中に開発チームへエスカレーションが行われ、社内での議論が始まりました。

10月16日

GitHub 上のディスカッションにはさらに多くのユーザーが参加し、報告とアップボートが積み上がっていきました。残念ながらこの段階で、QA チームはこのレベルの問題に対する社内のエスカレーションガイドラインに沿った対応をできていませんでした。
ユーザーからの報告内容に一貫性がなく、バグの再現に非常に苦労したこともあり、「この問題は数バージョン前に導入されたものであり、緊急のホットフィックスは不要ではないか」という誤った判断につながってしまいました。
その結果、この問題は次回の定期リリースに回され、タスク自体は P1: Critical(最重要)としてマークされていたにもかかわらず、適切なエスカレーションが行われず、貴重な時間が失われてしまいました。

10月30日

最初の報告から 24 日後、社内で改めてこの問題が大きく取り上げられ、ユーザーへの影響の大きさがようやく明らかになりました。問題の再現に成功したことで、全体的な影響度をより正確に見積もることができました。直ちにホットフィックス(v7.22.1)に向けた作業を開始しましたが、工数の多くは、問題を安定して再現し、その主な原因を特定することに費やされました。この過程で複数の仮説を検証し、その多くを却下しています。

調査の途中で、ページ読み込みをさらに遅くし、デバッグを複雑にしていた QUIC 接続に関連する Firefox のバグ も発見しました。加えて、Wintun を無効にした互換モードで AdGuard と AdGuard VPN を併用している場合に、QUIC 接続が適切にフィルタリングされていないという 別の問題 も判明しました。

11月1日

原因の一部を特定し、再現手順も確立できました。当社の DNS フィルタリングエンジンである DnsLibs に修正を加え、テスト用の nightly ビルドをリリースしました。

11月5日

AdGuard のフィルタリングエンジンである CoreLibs のルーティングループ検出コンポーネントに存在する バグ こそが、主な原因であることを突き止めました。この問題はすぐに修正され、2つ目の nightly ビルドがリリースされました。

11月6日

nightly ビルドのテストの結果、最初の修正によって TCP 接続に関する問題のほとんどは解消されているものの、UDP に関連する問題の一部がまだ残っていることが分かりました。ユーザーへの影響を最小限に抑えるため、修正を 2 段階で展開する方針を取りました。
まず 3 つ目の nightly ビルドで、ライブラリの最終的な修正やドライバ関連の指示更新などを含む追加の問題に対処しました。そのうえで、v7.22.1 パッチを準備し、十分なテストを行った後、同日中にリリースしました。

技術的な詳細

バグの内容

AdGuard for Windows v7.22 に含まれていたバグにより、Firefox で特定のページを読み込む際に、まれに予測不能なフリーズが発生していました。Chrome ユーザーへの影響は、Firefox に比べるとずっと小さいものでした。
この問題は、トラフィックが自分自身へループして戻ることを防ぐための仕組みとして、CoreLibs v1.19 に「ルーティングループ保護」が導入されたことをきっかけに発生し始めました。

このバグには、主に 2 つの原因がありました。
1つ目は、ルーティングループチェックからポートが除外されてしまうというプログラミング上のミスです。その結果、ブラウザからのリクエストのような正当なフィルタリング対象の接続であっても、ブロックされてしまう場合がありました。これは、OCSP リクエストなど、AdGuard 自身から発生する特定のサービスリクエストをきっかけとして発生し、そのようなリクエストの直後に行われるブラウザ接続が中断されてしまう、という形で表面化していました。

2つ目は、このチェックが適用されるタイミングが不適切で、すでに確立されている接続に対して行われていたことです。そのため、本来ブロックされるべきでない接続が不要に遮断されることがありました。

なぜルーティングループ保護が必要なのか

ルーティングループ とは、トラフィックが元のアプリケーションにループして戻ってきてしまう状態のことです。このようなループが発生すると、接続が遅くなったり、CPU 使用率が異常に高くなったりする原因となります。通常の状況では起こらないはずの現象ですが、他のソフトウェアとの組み合わせによっては発生する可能性があります。
これを防ぐために、AdGuard は送信元アドレスごとに送信接続を追跡し、同じアドレスに戻ってきた接続をルーティングループとして検出し、終了させる仕組みを備えています。

なぜ Chrome への影響は小さかったのか

今回の問題では、サービスリクエストの直後に発生した 1 回分の接続だけが失敗する、という形で現れていました。Chrome には、接続がリセットされた場合に同じネットワークリクエストを自動的に再試行する仕組みがあるため、ユーザー側が問題に気付く可能性は非常に低くなっていました。

一方で Firefox には、ネットワークエラー発生時に自動でリトライするような設計がありません。そのため、Firefox ユーザーは、この問題の影響をより直接的かつ目に見える形で受けることになりました。

AdGuard for Linux や for Android ではどうだったのか

今回の問題は、CoreLibs v1.19 をまず最初に導入する AdGuard CLI の段階では検出されませんでした。通常、新しい機能は UI ベースのアプリケーションへ統合する前に、重大な問題を早期に発見・修正する目的で、まず CLI 版に導入されます。
しかし今回のケースでは、問題が発生しうるのは「Linux の自動モード」かつ「主に Firefox 使用時」という条件にほぼ限定されており、この条件に当てはまるユーザーはごくわずかでした。そのため、ユーザーからの報告も届いていませんでした。

同じ CoreLibs 1.19 を使用している AdGuard for Android v4.12 では、受信側と送信側の接続アドレスが異なっていたため、今回のバグが成立する条件が揃わず、問題は発生しませんでした。

診断の難しさ

この問題の診断は、特に困難でした。AdGuard が開くサービス接続の数は比較的少なく、再現を試みる際に OCSP リクエストがキャッシュから処理されてしまうことが多かったため、バグが表に出てこないケースがほとんどだったのです。
さらに、問題は一度に 1 件の「後続接続」にしか影響しませんでした。前述のとおり、Chrome は失敗した接続を自動的に再試行するため、Chrome ユーザーはほぼ影響を受けません。一方で Firefox はネットワークエラー発生時に接続を再試行しない設計のため、Firefox ユーザーにとっては問題が直接的な不具合として現れてしまいました。

調査中に判明した関連する Firefox のバグ

この見つけにくいバグを追っている最中、寄せられていた報告の約半数では症状が異なり、過去バージョンの AdGuard でも同様の問題が再現し始めていることに気付きました。その過程で、Windows 版 Firefox において HTTP/3 接続に影響を与える、別の バグ が存在することも判明しました。

簡単に言うと、Firefox は、あるサイトが HTTP/3 をサポートしていると広告している場合、たとえ実際には HTTP/3 接続がまだ利用できない状況であっても、すぐに HTTP/3 接続を試みてしまいます。現在の AdGuard ではデフォルトで HTTP/3 をフィルタリングしていないため、HTTPS フィルタリングが有効になっているアプリケーションに対しては、HTTP/3 がブロックされる形になります。

一般的にブラウザは、Happy Eyeballs のように「どのプロトコルが最適に動作するか」を選択するアルゴリズムを備えていますが、Windows 版 Firefox は、サイト側から(HTTPS タイプの DNS レコードなどを通じて)HTTP/3 の情報を受け取ると、すでに正常に稼働している HTTP/2 接続が存在していても、それを無視して確立されていない HTTP/3 接続側にリクエストを割り当ててしまいます。
もし HTTP/3 が利用できない場合、サイトの読み込みは 20〜30 秒程度も一時停止し、その後になってようやくリクエストが稼働中の HTTP/2 接続へ「振り替え」られる、という挙動になります。

この挙動については、すでに バグ報告 が行われています。予防的な対策として、AdGuard では、HTTP/3 フィルタリングが無効になっている場合に、HTTPS タイプの DNS レコードから h3 ALPN パラメータを除外するようにしました。こうすることで、どうせ AdGuard によってブロックされる状況では、ブラウザ側から HTTP/3 が利用可能である事実自体を隠すことができます。

修正内容

今回の修正は、2 つのフェーズに分けて行いました。

最初のフェーズでは、接続の照合ロジックを見直し、ポートも含めて正しくマッチングされるようにしました。これにより問題の大半は解決しましたが、Windows が最近クローズされた接続のポートを再利用する挙動のため、依然として一部で誤検知が発生していました。11月5日夜にリリースした nightly ビルドは、多くのユーザーにとってこの段階で大きな改善となりました。

しかし、AdGuard のログには依然として問題の痕跡が残っていました。接続マッチングのアルゴリズムを修正しただけでは不十分で、Windows がソケット解放後 1 秒以内に同じポート番号を別の外向き接続に再利用することがある、という点が新たな誤検知の原因になっていたのです。その結果、アドレスとポートが一致していても、実際には無関係な 2 つの接続がルーティングループとして誤って扱われるケースがありました。

明確な新規インシデント(「まだ動かない」という報告)は見られず、ユーザーの皆さまからは「問題なく動いている」との声が大半でしたが、潜在的には多くのユーザーが影響を受ける可能性が残されていました。そこで第 2 フェーズとして、こうしたケースにも対応する修正を行い、最終的なホットフィックスである v7.22.1 をリリースすることで、問題を完全に解消しました。

再発防止策

今回の問題が早期に検出できなかった主な理由は、通常のテスト条件では再現が非常に難しかったこと、そしてユーザーからのフィードバックに対する注意が十分ではなかったことにあります。

現在、QA プロセスと開発プロセスの両方を見直しており、より厳密なプロセス監視、オートメーションの強化、チーム間のテストおよびコミュニケーションの徹底といった点に特に力を入れています。これにより、今後同様のインシデントを未然に防ぎ、すべてのユーザーにとって AdGuard の信頼性をさらに高めていくことを目指しています。

QA チームのワークフロー変更

QA チームは今後、GitHub Issues におけるコメント数やアップボート数をこれまで以上に重視して監視していきます。人手による確認だけに依存しないようにするため、公開 Issue におけるアクティビティやアップボート数を自動的にトラッキングする仕組みも導入します。このアプローチが有効であると確認できた場合には、AdGuard のすべてのプロジェクトに関わる QA チームへとスケールさせていく予定です。

また、社内の Triage ガイドラインに基づいた追加ブリーフィングを実施し、Jira 上でのインシデント評価において、このガイドラインに沿った理由付けを必須とする運用を導入します。これにより、優先度の判断に一貫性と透明性を持たせることができます。

さらに、ユーザーからのフィードバックに基づいてフィルタリング関連の問題を特定・分析しやすくするため、ユーザーに確認する診断用質問リストも用意します。

最後に、同様の問題を将来防ぐため、いくつかの自動テストを新たに実装します。ブラウザごとのページフィルタリング速度を評価するベンチマークテスト用スクリプトを開発中で、基準となるパフォーマンスが定まった後は、以降のすべてのリリースでそれに対する比較を行う予定です。現時点では自動テストは Google Chrome のみを対象としていますが、今後は Firefox にも拡大する計画です。
さらに、あらかじめ選定した「問題が起きやすい」ページ群について、各ブラウザでの読み込み速度を測定するテストも作成します。このページリストは、既知の問題サイトをベースにしつつ、今回の調査範囲で特定されたサイト(例えば discord.com)から順次拡張していきます。

開発チームのワークフロー変更

開発チームは今後、新機能を追加する際に、可能な限り新しいテスト(統合テストを含む)を併せて追加することに、これまで以上に注意を払います。これにより、将来のリリースで不具合が紛れ込む可能性を低減させます。
あわせて、新機能に関する技術ドキュメントをより充実させること、そして、その機能に関わるすべてのチームが、潜在的な問題やコーナーケースの観点からテストの必要性を十分に理解できるよう情報共有を徹底することにも重点を置きます。

また、CoreLibs の新バージョンを各プロダクトへ統合する際には、今後は CoreLibs チームからの明示的な承認を得てから作業を進めるようにします。現在のプロセスでは、統合作業がやや「孤立した」形で進められており、そのことが問題を見逃すリスクを高めていました。

まとめ

今回のインシデントによって影響を受けたすべてのユーザーの皆さまに、改めてお詫び申し上げます。また、フィードバックをお寄せいただき、この困難な状況を乗り越えるうえで多大な助けとなってくださった皆さまに、心より感謝いたします。
今後は、ユーザーの皆さまに大きな影響を与えうる重大な問題について、より迅速かつ透明性の高い形で情報をお伝えしていけるよう努めてまいります。

この記事を気に入っていただけましたか?
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
保護機能が有効になっているAdGuard for Windowsのメイン画面
保護機能が無効になっているAdGuard for Windowsのメイン画面
AdGuard for Windowsの統計画面。ブロックされた広告とトラッカーの統計情報が表示されます。
AdGuard for Windowsの保護画面。保護機能と設定が表示されます。
21,445 21445件のユーザーレビュー
素晴らしい

Windows用広告ブロッカー

AdGuard for Windowsは、単なる広告ブロッカーではなく、広告をブロックし、危険なサイトへのアクセスを制御し、ページの読み込みを高速化し、不適切なコンテンツから子供を保護する、多目的ツールです。
ダウンロードされますと、使用許諾契約書に同意したことになります。
Microsoft Store
Windows用広告ブロッカー v7.22(無料試用期間: 14日)
保護機能が有効になっているAdGuard for Macのメイン画面
保護機能が無効になっているAdGuard for Macのメイン画面
21,445 21445件のユーザーレビュー
素晴らしい

Mac用広告ブロッカー

AdGuardはmacOSの仕様を念頭に設計されたユニークな広告ブロッカーです。 ブラウザやアプリで広告を取り除くだけでなく、個人情報追跡、フィッシング、詐欺から端末を守ります。
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
Mac用広告ブロッカー v2.18(無料試用期間: 14日)
保護機能が有効になっているAdGuard for Androidのメイン画面
AdGuard for Androidの統計画面。ブロックされた広告とトラッカーの統計が表示されます。
AdGuard for Androidのフィルタ画面。利用可能なフィルターグループが表示されます。
シークレットモードで閲覧するためのAdGuard for Androidプライベートブラウザ画面
AdGuard for AndroidをダウンロードするためのQRコード
21,445 21445件のユーザーレビュー
素晴らしい

Android用広告ブロッカー

AdGuard for Androidは、Android搭載端末に最適なソリューションです。 他のほとんどの広告ブロッカーと違って、root権限を必要とせず、アプリでのフィルタリング、アプリ管理など、幅広い機能を提供しています。
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
スキャンしてダウンロード
お使いの端末のQRコードリーダーをご利用ください
Android用広告ブロッカー v4.12(無料試用期間: 14日)
AdGuard for iOS の統計画面。ブロックされた広告とトラッカーの統計情報が表示されます。
保護機能を有効にしたAdGuard for iOSのメイン画面
AdGuard for iOSの保護画面。保護機能と設定が表示されています。
AdGuard for iOS をダウンロードするためのQRコード
21,445 21445件のユーザーレビュー
素晴らしい

iOS用広告ブロッカー

AdGuard はiOSに最適な広告ブロックアプリです。Safariブラウザですべての広告を削除し、プライバシー保護、ページの読み込み時間の短縮を実現します。 また、複数のフィルタを同時に使用できるようにしながら、最高のフィルタリング品質を実現する最新の広告ブロック技術を採用しています。
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
スキャンしてダウンロード
お使いの端末のQRコードリーダーをご利用ください
iOS用広告ブロッカー v4.5
21,445 21445件のユーザーレビュー
素晴らしい

AdGuardコンテンツブロッカー

AdGuard コンテンツブロッカーは、コンテンツブロッカーテクノロジーをサポートするモバイルブラウザ(Samsung Internetブラウザ、Yandex.Browser)ですべての広告を排除します。Android for AdGuardに比べて機能は限られていますが、無料で効率よく、インストールが簡単です。
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
AdGuardコンテンツブロッカー v2.8
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard ブラウザ拡張機能

AdGuardは、Webページ上のすあらゆる広告を効果的にブロックします。また最速で軽量な広告ブロック拡張機能です!是非AdGuardを使って広告のない高速で安全なブラウジングをお楽しみください。
インストール
ダウンロードされますと、使用許諾契約書に同意したことになります。
インストール
ダウンロードされますと、使用許諾契約書に同意したことになります。
インストール
ダウンロードされますと、使用許諾契約書に同意したことになります。
インストール
ダウンロードされますと、使用許諾契約書に同意したことになります。
インストール
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
AdGuard ブラウザ拡張機能 v5.4
21,445 21445件のユーザーレビュー
素晴らしい

AdGuardアシスタント

AdGuardデスクトップアプリ用のコンパニオン拡張機能です。ブラウザから直接、ページ上で任意の要素をブロックしたり、ウェブサイトをホワイトリストに追加したり、問題を報告したりすることを可能にします。
AdGuardアシスタント v1.4
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard Home

AdGuard Home は、広告やトラッカーをブロックするネットワークベースのソリューションです。ルーターに一度インストールするだけで、家庭内ネットワーク上のすべてのデバイスをカバーします(追加のクライアント側ソフトウェア不要)。これは、プライバシーへの脅威となることが多いさまざまなIoT(モノのインターネット)デバイスにとって特に重要です。
AdGuard Home v0.107
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard Pro for iOS

AdGuard Pro for iOS は、高度な広告ブロック機能をすべて備えています。AdGuard for iOS有料版と同じ機能を提供し、Safariで広告をブロックすることに優れており、DNS設定のカスタマイズでデバイス前提での保護機能調整を可能にします。ブラウザやアプリで広告をブロックし、お子様を不適切なコンテンツから守り、個人情報を安全に保ちます。
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
AdGuard Pro for iOS v4.5
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard Mini for Mac - Safariで広告ブロック

AdGuard Mini for Mac は強力なSafari用広告ブロッカーです。この軽量なアプリは広告とトラッカーをブロックし、ページの読み込み速度を向上させます。Safari でのウェブ閲覧を邪魔されないようになり、個人情報の保護にも役立ちます。
インストール
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
AdGuard Mini for Mac v2.2
保護機能を有効にしたAdGuard for Android TVのメイン画面
AdGuard for Android TVの「広告ブロック」画面
AdGuard for Android TVの「設定」画面
AdGuard for Android TVの「アプリの管理」画面。広告とトラッカーがブロックされているアプリが表示されます。
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard for Android TV

AdGuard for Android TV は、広告をブロックし、プライバシーを保護し、スマートテレビのファイアウォールとして機能する唯一のアプリです。Webの脅威に関する警告を受け取り、セキュアDNSを使用し、トラフィックを暗号化しましょう。セキュリティを向上して、広告なしでお気に入りの番組をお楽しみください!
AdGuard for Android TV v4.12(無料試用期間: 14日)
AdGuardのマスコット、「Agnar」がLinuxのペンギンキャラを抱えている
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard for Linux

AdGuard for Linux は、世界初のシステムワイドなLinux用広告ブロッカーです。デバイスレベルで広告やトラッカーをブロックしたり、プリインストールされたフィルタから選択したり、独自のフィルタを追加したりすることができます。
AdGuard for Linux v1.4
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard Temp Mail

匿名性とプライバシーを保護する、無料の捨てメアド(一時メールアドレス)ジェネレーター。メインのメールサービスに迷惑メールは届きません!
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard VPN

74ヵ所の世界中ロケーション

どのコンテンツも自由にアクセス

強力な暗号化

ログ一切なしポリシー

最速コネクション

年中無休サポート(日本語対応)

無料で使ってみる
ダウンロードされますと、使用許諾契約書に同意したことになります。
詳細
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard DNS

AdGuard DNSは、広告ブロック、プライバシー保護、ペアレンタルコントロールの代替ソリューションです。初期設定が簡単で、端末のプラットフォームやデバイスに関係なく、オンライン広告、トラッカー、フィッシングに対する必要最小限の保護を提供します。
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard Mail

エイリアスと使い捨てメールアドレスを使用して、個人情報を保護し、迷惑メールを回避し、受信トレイを安全に。全OS対応の無料メール転送サービス・アプリです。
21,445 21445件のユーザーレビュー
素晴らしい

AdGuard Wallet

セキュアな仮想通貨ウォレットで暗号資産を安全にコントロール。複数のウォレットを管理し、何千もの暗号通貨を発見・保管・送信・スワップ。
AdGuardをダウンロード中です AdGuardをインストールするには、矢印が指してるファイルをクリックしてください 「開く」を選択し、「OK」をクリックして、ファイルがダウンロードされるのをお待ちください。 ダウンロードが終了し開きましたウィンドウでAdGuardを「Applications」フォルダにドラッグで移動させてください。 AdGuardをダウンロードして頂きありがとうございます! 「開く」を選択し、「OK」をクリックして、ファイルがダウンロードされるのをお待ちください。 ダウンロードが終了し開きましたウィンドウで「インストール」をクリックしてください。 AdGuardをダウンロードして頂きありがとうございます!
以下のQRコードをスキャンすることでモバイル端末にもAdGuardをインストールできます。