Google Authenticatorで
削除したコードが勝手に復元した

Google Authenticatorで削除したコードが復活した 数ヶ月前 iPhone 削除 アカウントの認証コード サーバー Google 同期失敗 古いシード残存 最近 iPhone 再同期 iOS アップデート サーバーの古いデータ → アプリにダウンロード

海外のフォーラムやGitHubのissueを検索すると、複数の類似事例が見つかりました。特に興味深かったのは、Apple Communityで報告されていた事例です。

ある日、Google Authenticatorアプリを開いたところ、数ヶ月前に削除したはずのSNSアカウントの認証コードが突然表示されていました。不正アクセスを疑いましたが、調査の結果、これはGoogle Authenticatorの同期機能に関するバグであることがわかりました。

この記事では、私が経験した現象と、その原因を調査した過程を共有します。

関連記事

1. 発生した現象

1.1. 突然復活した認証コード

数ヶ月前、SNSアカウントの2段階認証を一度解除し、Google Authenticatorからも該当のコードを削除していました。しかし昨日アプリを開くと、削除したはずのSNSアカウントのコードが表示されていたのです。

この時点で私が使っていた環境は以下の通りです。

  • 使用端末:iPhone 2台
  • iOS:18.2(最近アップデートしたばかり)
  • Googleアカウント:2つ(AアカウントとBアカウント)
  • 復活したコード:元々Bアカウントに登録していたSNSアカウント

1.2. セキュリティ上の懸念

最初は不正アクセスを疑いました。しかし、確認した結果、以下の点から不正アクセスの可能性は低いと判断できました。

  • Googleアカウントに2段階認証を設定済み
  • 本人確認メッセージやログイン通知は一切来ていない
  • SNSアカウントにも不審なログイン履歴はない
  • 先月に新しく設定し直した認証コードで正常にログインできる

つまり、古いコードと新しいコードが両方表示されている状態でした。通常ではあり得ない現象です。

2. 認証アプリの仕組み

この現象を理解するために、まず2段階認証アプリの基本的な仕組みを説明します。

123456 認証アプリの仕組み シード(種) 秘密の文字列 JBSWY3DPEHPK + 現在時刻 30秒 ごと更新 6桁コード 987654 削除 = アプリからシードを削除すること

2.1. シードという秘密鍵

2段階認証アプリは「シード」と呼ばれる秘密の文字列を保存しています。シードは以下のような英数字の組み合わせです。

例:JBSWY3DPEHPK3PXP
2.1. シードという秘密鍵
2.1. シードという秘密鍵

このシードと現在時刻を組み合わせて計算することで、30秒ごとに変わる6桁のコードを生成します。サービス側も同じシードと時刻で同じ計算をするため、コードが一致する仕組みです。

2.1. シードという秘密鍵
2.1. シードという秘密鍵
2.1. シードという秘密鍵

2.2. コードの削除とは

アプリから認証コードを削除するということは、このシード文字列をアプリから削除することを意味します。通常、削除したシードは復元できません。

3. Google Authenticatorの仕組み変遷

当初、Google Authenticatorはシードをアプリ内にのみ保存していました。この方式はシンプルで安定していましたが、端末を紛失するとすべてのコードを失う問題がありました。

2023年4月、GoogleはAuthenticatorにGoogleアカウントとの同期機能を追加しました。これにより、シードをGoogleサーバーにバックアップし、複数端末間で共有できるようになりました。

仕組みの変遷 2023年以前 アプリ内保存のみ シンプル安定 端末紛失=全消失 2023年以降 サーバー同期 バックアップ可 複数端末で不安定 同期バグ発生
3. Google Authenticatorの仕組み変遷

ただし、この同期は「直接サーバーに保存する」方式ではありません。以下のような2段階のプロセスです。

  1. アプリ内にシードを保存(一次保存先)
  2. Googleアカウントにログインしている場合、サーバーに同期(二次保存先)
  3. 他の端末でも同じGoogleアカウントでログインすると、サーバーからシードをダウンロード

コード生成は常にアプリ内のシードから行われ、サーバーはあくまでバックアップ用です。

4. 類似事例の調査

同じような現象が他にも報告されていないか、フォーラムやGitHubのissueを調査しました。

4.1. 複数デバイスでの同期問題

Apple Communityで、iOS 15アップデート後に類似の問題が報告されていました。複数のiPhone・iPadでGoogle Authenticatorを使用していたユーザーが、以下のような現象を経験しています。

  • 各デバイスで重複したコードが表示される
  • 重複を削除した後、iOSアップデートとバックアップを実行
  • その後、一部のコードだけが残り、各デバイスで異なるコードが表示される

この報告は私のケースと酷似していました。

4.2. Google Authenticatorのバグ報告

GitHubのGoogle Authenticatorリポジトリでは、2011年から重複コードの問題が報告されています。同じQRコードを2回スキャンすると、重複したアカウントが作成されてしまうというものです。

また、複数のAndroid端末で同じアカウントなのに異なるコードが生成される問題も、2014年から報告されていました。

4.3. 最近のアップデート後の問題

2024年12月には、Hacker Newsで「Google Authenticatorアップデート後、2FAコードが消失または破損する」という報告がありました。このように、同期機能追加から1年以上経った現在でも、不安定な動作が続いているようです。

5. 原因の特定

調査と状況整理の結果、私のケースでは以下の要因が重なって現象が発生したと考えられます。

5.1. 複数Googleアカウントの使用

私は2つのGoogleアカウントでAuthenticatorを使用していました。

  • Aアカウント:メインで使用していたが、先月すべての認証を削除
  • Bアカウント:数ヶ月前に使用していた、復活したSNSアカウントコードが元々登録されていた

複数アカウントを使用すると、同期処理が複雑になり、バグが発生しやすくなります。

5.2. 削除の同期失敗

数ヶ月前にBアカウントのSNSアカウントコードを削除した際、以下のような状況だった可能性があります。

  1. アプリ内からシードは正常に削除された
  2. しかし、Googleサーバー(Bアカウント)への削除情報の同期が失敗
  3. サーバー側には古いシードデータが残存

5.3. iOS 18.2アップデートがトリガー

最近iOS 18.2にアップデートしたことで、以下の処理が実行されたと考えられます。

  1. iOSアップデート実行
  2. Google Authenticatorアプリも更新される
  3. Googleサーバーとの再同期が実行される
  4. Bアカウントのサーバーに残っていた古いSNSアカウントのシードをダウンロード
  5. 結果として、削除したはずのコードが復活

6. 暗号化同期の課題

GmailやGoogle Driveと異なり、Google Authenticatorの同期は不安定になりやすい構造的な問題があります。

同期の課題 Gmail / Drive サーバー主体 ✓ 安定した同期 ✓ 20年の実績 ✓ 一方向が基本 Authenticator アプリ主体 ✗ 双方向同期 ✗ 2023年開始 ✗ 衝突が発生

6.1. GmailやGoogle Driveとの違い

GmailやGoogle Driveは、サーバーがデータの主体です。クライアント(アプリやブラウザ)は基本的に表示するだけで、同期は主にサーバーからクライアントへの一方向です。これらのサービスは20年以上の実績があり、プロトコルも安定しています。

一方、Google Authenticatorはアプリ内がデータの主体で、サーバーは後付けのバックアップ用です。同期はアプリとサーバーの双方向で行われ、より複雑です。しかも、この機能は2023年開始と比較的新しいものです。

6.2. 双方向同期の複雑さ

双方向同期では、以下のような衝突(conflict)が発生しやすくなります。

  • アプリAでシードを削除
  • サーバーは削除を反映すべきか、それとも保持すべきか
  • アプリBはどちらの状態を信じればいいのか

このような状況で、適切な処理ができないとバグが発生します。

6.3. 暗号化実装の問題

2023年の同期機能導入当初、エンドツーエンド暗号化がなく、後から追加する予定だったことが報告されています。暗号化の実装が不完全だと、以下のような問題が起きやすくなります。

  • データの整合性チェックが甘い
  • 復号エラーが起きやすい
  • エラー時の処理が不十分

6.4. 二重同期の干渉

iPhoneの場合、さらに複雑な状況になります。

iPhone A ←→ Googleサーバー
   ↓              ↓
iCloud同期      同期処理
   ↓              ↓
iPhone B ←→ Googleサーバー

Google AuthenticatorはiCloudバックアップにも対応しており、この二重の同期構造が干渉している可能性があります。

7. 対処法と今後の対策

7.1. 不要なコードの削除

復活したコードは、SNSアカウント側で既に無効化されているため、セキュリティ上の問題はありません。しかし、混乱を避けるため、アプリから削除することをお勧めします。

古いコードは自然には消えないため、手動で削除する必要があります。

7.2. 明示的な同期の実行

Google Authenticatorアプリの画面右上には同期ボタンがあります。コードを追加・削除した後は、このボタンをタップして明示的に同期を実行すると、同期エラーを減らせる可能性があります。

7.3. 複数アカウント使用時の注意

複数のGoogleアカウントでAuthenticatorを使用している場合、どのアカウントにどのコードが紐付いているか定期的に確認することをお勧めします。可能であれば、1つのGoogleアカウントに統一する方が安定します。

7.4. バックアップコードの保存

各サービスの2段階認証設定では、通常バックアップコードを発行できます。これらのコードを紙やパスワードマネージャーに保存しておくと、認証アプリに問題が発生した際の保険になります。

7.5. 定期的な確認

月に1回程度、使っていないサービスのコードがないかチェックし、不要なものは削除するとよいでしょう。特にiOSの大型アップデート後は、コード一覧を確認することをお勧めします。

8. まとめ

Google Authenticatorで削除したコードが復活した原因は、同期機能のバグでした。特に複数のGoogleアカウントと複数の端末を使用している場合、iOSアップデートをトリガーに、サーバーに残っていた古いデータが復活する可能性があります。

これは不正アクセスではなく、技術的な問題です。復活したコードは既にサービス側で無効化されているため、セキュリティ上の懸念はありません。

Google Authenticatorの同期機能は便利ですが、導入から1年以上経った現在でも不安定な面があります。この仕組みを理解し、適切に対処することで、安心して2段階認証を使い続けられます。