海外のフォーラムや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段階認証アプリの基本的な仕組みを説明します。
2.1. シードという秘密鍵
2段階認証アプリは「シード」と呼ばれる秘密の文字列を保存しています。シードは以下のような英数字の組み合わせです。
例:JBSWY3DPEHPK3PXP


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



2.2. コードの削除とは
アプリから認証コードを削除するということは、このシード文字列をアプリから削除することを意味します。通常、削除したシードは復元できません。
3. Google Authenticatorの仕組み変遷
当初、Google Authenticatorはシードをアプリ内にのみ保存していました。この方式はシンプルで安定していましたが、端末を紛失するとすべてのコードを失う問題がありました。
2023年4月、GoogleはAuthenticatorにGoogleアカウントとの同期機能を追加しました。これにより、シードをGoogleサーバーにバックアップし、複数端末間で共有できるようになりました。

ただし、この同期は「直接サーバーに保存する」方式ではありません。以下のような2段階のプロセスです。
- アプリ内にシードを保存(一次保存先)
- Googleアカウントにログインしている場合、サーバーに同期(二次保存先)
- 他の端末でも同じ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アカウントコードを削除した際、以下のような状況だった可能性があります。
- アプリ内からシードは正常に削除された
- しかし、Googleサーバー(Bアカウント)への削除情報の同期が失敗
- サーバー側には古いシードデータが残存
5.3. iOS 18.2アップデートがトリガー
最近iOS 18.2にアップデートしたことで、以下の処理が実行されたと考えられます。
- iOSアップデート実行
- Google Authenticatorアプリも更新される
- Googleサーバーとの再同期が実行される
- Bアカウントのサーバーに残っていた古いSNSアカウントのシードをダウンロード
- 結果として、削除したはずのコードが復活
6. 暗号化同期の課題
GmailやGoogle Driveと異なり、Google Authenticatorの同期は不安定になりやすい構造的な問題があります。
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段階認証を使い続けられます。