どうもこんにちは!
サバ缶(@tech_begin)です。
私は、本業でAndroidアプリ開発に携わっています。
とある案件で、リリース当日にアプリが消されるというとんでもなくヤバい事象が起きました。
その状況をどう切り抜けたのか、結果的にアプリの公開には間に合ったのか……。
今回の記事では、物語調かつ時系列にそってご紹介していきます。
第1章 〜問題の発見〜
2022/3/29(火)
お客様が広告を大きく打ち出している新機能が、新年度となる4/1(金)から開始。
プロジェクトメンバ全員、いつもとは違う緊張感に包まれていました。
さて、リリース3日前である今日は、朝からアプリの審査に提出。
昼過ぎには審査に通過したことを確認して、お客様にも連絡済み。
OK。全て順調だね。
問題なし!
その後は他の業務にあたっていました。
2022/3/31(木)
2日経った今日。
4/1の早朝から使えるようにするため、ストア公開は深夜に行う予定です。
念の為、事前確認しておこうとしてGooglePlay Consoleを覗くと………………
アプリがストアから削除されているではありませんか。
その時刻、午前10時過ぎ。
第2章 〜現状の整理〜
テンパる暇もありません。
まずはログなどから情報を収集します。
ログを確認したところ、以下のような時系列でした。
- 2022/3/29
10:00 審査提出
14:00 審査通過を確認
20:00 ストアから削除
- 2022/3/31
10:00 ストアから削除されていることを確認
いや、こんなん気づかんて……。
「念の為」の確認によって、事前に気づくことができました。
ストア公開直前まで気づかなかったら……ゾッとします。
起きてしまったことは仕方ありません。
1秒でも早く、復旧しなければ……!
第3章 〜削除された理由〜
削除された理由には以下のように書かれていました。
そのまま引用します。
アプリにセキュリティの脆弱性が含まれていることがわかりました。
これにより、ユーザー情報が公開されたり、ユーザーのデバイスが損傷したりする可能性があります。
これは、デバイスとネットワークの不正使用に関するポリシーに違反しています。
具体的には、アプリは脆弱ですWebview SSLErrorHandler。
この問題に対処するには、このGoogleヘルプセンターの記事の手順に従ってください。影響を受けるバージョン:
GooglePlayConsoleの通知より引用
バージョンコード:7(クローズドテストトラック)
あー、なるほどね(全くわからん)。
第4章 〜原因調査〜
「わからん」と言っても、進めるほかありません。
具体的に調査を進めていきました。
原因調査① ソースコードの確認
先述の内容を見ると Webview SSLErrorHandler
なるものが悪さをしているようです。
まずはこの処理がないか、ソースコードを確認しました。
審査提出しているアプリの状態で確認するため、審査提出時のブランチでソースコードの全体を検索します。
しかし、どこにも SSLErrorHandler
が実装されている箇所はありませんでした。
原因調査② バージョンコード7を探す
先述の内容を見ると、どうやら「バージョンコード7のアプリ」が悪さしているようです。
しかし、審査提出したアプリのバージョンコードは「50」でした。
なぜここにきて数年前のアプリのことを言い出しているのか。
別れたメンヘラ彼女が「あの時のアレ…」とか突然怒りの連絡をしてきたみたいな感じです。
いや、体験談じゃないですよ(ほんとです)。
でもそんな感じ。
とりあえず「バージョンコード7」のアプリバイナリを、GooglePlayConsole上で探します。
すると、内部テストのトラックに1年以上前に配信したバージョンコード7のアプリバイナリがありました。
これが悪さをしていたようです。
原因調査③ なぜバージョンコード7のアプリが悪い?
GooglePlayConsoleを管理するGoogleは、具体的な理由を教えてくれません。
PlayConsole経由で、直接Googleに問い合わせてみました。
PlayConsoleヘルプ ご担当者様
お世話になっております。
株式会社●● ▲▲部 [サバ缶の名前]と申します。
本日リリース予定のアプリがストアから削除されており、対応方法に目処が立たないためご連絡いたしました。
下記ご確認いただけますでしょうか。
1. 状況
本日リリース予定のアプリを確認していたところ、アプリが削除されておりました。
下記のようなエラーが表示されておりました。
<以下、引用>
アプリにセキュリティの脆弱性が含まれていることがわかりました。これにより、ユーザー情報が公開されたり、ユーザーのデバイスが損傷したりする可能性があります。これは、デバイスとネットワークの不正使用に関するポリシーに違反しています。具体的には、アプリは脆弱ですWebview SSLErrorHandler。この問題に対処するには、このGoogleヘルプセンターの記事の手順に従ってください。
影響を受けるバージョン:
バージョンコード:7(クローズドテストトラック)
2. 調査
対応策として以下のページを参照させていただきました。
>https://support.google.com/faqs/answer/7071387
弊社にてソースコードを確認いたしましたが、『onReceivedSslError』の実装がございませんでした。
3. 質問事項
3-1.
メッセージの内容にある内容が、弊社のコード内で確認できませんでした。
ポリシーに遵守できていない箇所がどこにあたるか具体的にご教示いただけないでしょうか。
3-2.
また『影響を受けるバージョン:バージョンコード:7(クローズドテストトラック)』という表記がございますが、こちらが影響してアプリが削除されているのでしょうか。
以上、お手数ですがご確認いただけますと幸いです。
Googleからの回答はというと……。
株式会社●●
ご担当者様
Google Play チームにお問い合わせいただき、ありがとうございます。
ステータス: アプリ - Google Play での公開停止中
お送りいただいたお申し立ての内容を審査いたしましたが、依然としてお客様のアプリは Google Play ポリシーに違反していると判定されました。アプリの具体的な問題と、Google Play にアプリを再度公開するために必要な手順について、以下に詳しくご説明いたします。
手順 1: アプリのポリシー違反を修正する
審査の結果、お客様のアプリ「●●●●●●」(jp.co.marumaru.marumaru_app、App Bundle バージョン: 7)は、デバイスやネットワークでの不正行為に関するポリシーに違反していることが判明いたしました。
セキュリティの脆弱性を組み込むまたは悪用するコードは許可されません。デベロッパーに報告された最近のセキュリティに関する問題については、アプリ セキュリティ向上プログラムをご確認ください。
詳細と一般的な違反の例については、デバイスやネットワークでの不正行為に関するポリシーのページをご参照ください。
たとえば、お客様のアプリでは現在、SslErrorHandler の次の脆弱な実装が使用されています。
[エラー起因の該当ファイルと行数が書かれていました(by サバ缶)]
影響を受けるアプリを更新して脆弱性を修正し、アップグレード版 APK のバージョン番号を更新してください。詳細なガイダンスについては、ヘルプセンター記事「アプリで WebView SSL エラーハンドラの通知を処理する方法」をご参照ください。
アプリに適切な変更を加えて、上記の問題に確実にご対応くださいますようお願いいたします。
再審査のためにアプリを再送信する前に、ポリシーに準拠していないApp Bundleバージョン 7を無効にし、APK (App Bundle)のバージョンコードを上げて修正してください。
製品版リリースに加えてテストや品質保証チェックに使用する他のリリースタイプ(内部テスト版、クローズド テスト版、オープンテスト版など)があれば、当該トラックも必ず更新してください。
今回の決定によってお客様の Google Play デベロッパー アカウントの状態が変更されることはございませんが、違反が繰り返された場合は、このアプリや Google Play デベロッパー アカウントが停止されることがございます。
ステップ 2: 更新した APK を送信する
更新した App Bundle または APK を送信するには:
Google Play Console にアクセスします。
アプリを選択します。
App Bundle エクスプローラに移動します。
右上のプルダウン メニューで、ポリシーを遵守していない APK または App Bundle のアプリのバージョンを選択し、該当するリリースを書き留めます。
ポリシーに関する問題があるトラックに移動します。4 つのページ([内部テスト]、[クローズド テスト]、[オープンテスト]、[製品版])のいずれかになります。
ページの右上にある [新しいリリースを作成] をクリックします(場合によっては、先に [トラックを管理] をクリックする必要があります)。
違反している APK を含むリリースが未公開の状態の場合は、リリースを破棄します。
ポリシーを遵守したバージョンの App Bundle または APK を追加します。
ポリシーを遵守していないバージョンの App Bundle (バージョン: 7) がこのリリースの [含まれない APK] セクションに表示されていること。詳しくは、Google Play Console ヘルプセンター記事「リリースを準備して公開する」の「含まれない(App Bundle と APK)」をご参照ください。
新しいリリースが 100% 公開され、ポリシーを遵守していない APK が完全に無効になっていること。
リリースの変更内容を保存するには、[保存] を選択します。
リリースの準備が完了したら、[リリースのレビュー] を選択します。
ポリシーを遵守していない APK が複数のトラックでリリースされている場合は、トラックごとにステップ 5~9 を繰り返してください。
アプリに加えた変更が、審査のために自動的に送信されることはありません。[公開の概要] ページにアクセスし、[審査に送信] をクリックして変更を送信する必要があります。
他にご不明な点がございましたら、お気軽にお問い合わせください。ポリシー違反の修正にご協力いただき、ありがとうございます。今後とも Google Play をよろしくお願いいたします。
Google Play チーム
●●
教えていただいた「対処法」から原因を推測します。
改めて確認していたところ、数年前に作成した「Version 1.0.22」がビルド番号『7』でした。
ちなみに、これは「内部テスト」に属するトラックで作成していたものです。
…という結論に至り、削除されたと推測されます。
それに、機械的に判定されて削除されたと考えられます。
【補足-1】チャットでの問い合わせも可能
対応時間は決まっていますが、時間が合えばGooglePlayConsoleヘルプチームと、リアルタイムでチャットサポートを受けることが可能です。
私が相談した時、上記と同様の内容を連絡すると以下のような回答が返ってきました。
- この窓口ではポリシーについて権限がないので、直接担当チームに連絡してください。
- (削除通知の)メールに記載の問い合わせから行えます。
- 異議申し立てを行うことでも可能です。直接担当チームに問い合わせできます。
欲しい回答が貰えなかったので「返事が遅くてもいいから問い合わせておこう」という感じで問い合わせ連絡をしました。
【補足】なぜそんなに古いバージョンの内部テストトラックが残っていたのか?
そもそも……
どうして、そんな古いのが残ってたの…?
こちらの疑問についてお答えします。
当初、この案件では内部テストを使って、関係者各位に動作確認を行っていただいていました。
そんな中、クローズドテストトラックを使用すると、そのまま製品版にプロモート(昇格)操作が可能になるということを知ります。
そのことが分かってから、クローズドテストトラックを使用するようになったという経緯があります。
運用フローの変更が起き、内部テストはそのまま放置してしまっていたことが原因です。
まさかこんなことが起きるとは、思ってもいませんでした……。
第5章 〜対応方針〜
推測ではありますが、原因は特定することができました。
以下の画像をご覧ください。
右側の「内部テスト」において、問題を起こしていると考えられる「バージョンコード7のアプリ」があります。
対応方法は以下の2つを考えました。
- 紐づいているテスターを全員削除
- 誰も使用できない&古いものが内部テストの最新版として存在しないようにするため蓋閉じ(上記画像の★にあたる)
第6章 〜各所へ連絡〜
上記の対応を行い、お客様とGoogleへ連絡をしました。
対応方法ではなく、個人的な備忘録になります。
興味のある方だけ、アコーディオンを開いてご覧ください。参考になれれば嬉しいです。
一通り調査、対応の目処が立ちましたのでご報告いたします。
①現状
ストアからアプリが削除されており「ポリシーに遵守していない」とされています。
②原因
GooglePlayConsole(アプリ公開するサービス)を確認していたところ『内部テスト』に以前配信したものがございました。
Ver X.X.X、ビルド番号 7
③削除までの経緯(推測)
1年以上も前のアプリが存在しており、一部の人にテスターとしてダウンロード可能な状態になっていました。
→脆弱性のあるコードが含まれるアプリがある
→それがダウンロード可能状態にある
→ダウンロードできてしまうと危険である
→Google「アプリを一旦削除し未然に防ごう」
実際の経緯については、Google側から具体的に伝えられないため、このような経緯で削除されたと推測しております。
④対応策
以下、2つを行います。
1.
すでにある内部テストの古いアプリは、削除することができません。
ですので、上書き(蓋を被せるイメージ)するように今回のVer X.X.Xを内部テストとしてリリースします。
こちらについてはテスター設定しませんので、誰もダウンロードすることができません。
2.
上記の対応内容を、GooglePlayConsoleポリシー担当チームへ直接問い合わせ、再審査の請求を行います。
こちらについてはすでに問い合わせており、現在返事待ち状態です。
---
この度はご心配おかけし、大変申し訳ございませんでした。
審査通過を確認したのが 29日10:00ごろ、削除されたのが同日 19:30ごろ、削除発覚が 31日10:00ごろでした。
審査通過後も定期的に確認するよう致します。
---
今回のリリースへの影響については、Google側からの返答が未だないため明確にお答えすることができない状況です。
再審査の結果は、●●様のメールアドレスにも届くようにしておりますので、すぐにご確認いただけるかと存じます。
恐れ入りますが、ご認識おきのほどよろしくお願い致します。
お世話になっております。
●●株式会社▲▲部[サバ缶の名前]です。
弊社が開発を担当している当該アプリが、GooglePlayストアより削除されておりました。
以下の通り、現在の状況・推測される原因・講じた対策を記載しております。
対応に伴い、ご担当者様に再審査をお願いしたく存じます。
お手数おかけしますが、ご確認いただけると幸いです。
①現状
ストアからアプリが削除されており「ポリシーに遵守していない」とされている。
<以下、引用>
アプリにセキュリティの脆弱性が含まれていることがわかりました。これにより、ユーザー情報が公開されたり、ユーザーのデバイスが損傷したりする可能性があります。これは、デバイスとネットワークの不正使用に関するポリシーに違反しています。具体的には、アプリは脆弱ですWebview SSLErrorHandler。この問題に対処するには、このGoogleヘルプセンターの記事の手順に従ってください。
影響を受けるバージョン:
バージョンコード:7(クローズドテストトラック)
②原因
確認していたところ、ポリシーに遵守しないトラックがございました。
内部テスト『Ver X.X.X、バージョンコード 7』
③対応策
すでにある内部テストトラックは、削除することができません。
したがって、上書きするイメージで本日リリース予定の最新版『Ver X.X.X』を内部テストとしてリリースいたしました。
また、こちらのリリーストラックはテスターには誰も指定していないため、ダウンロードできないようになっております。
テストトラックを一時停止する方法も検討致しましたが、念の為メールに記載されていた手順(5. [トラックの管理]をクリックして、新しいリリースを作成します)を行いました。
以上、お手数ですがご確認のほどよろしくお願い致します。
最終章 〜まとめ〜
やったーーーーーーー!!!!
よかったーーーーー!!!
この連絡をして数時間後、無事GooglePlayストアに表示されていることを確認しました🙌
はじめて私が主体的に動いて対応したので、達成感もありました。
でも……事前の通知なしに削除するのはやめて欲しいです……(切実)。
今回学んだこと・反省点は以下の通りです。
- Googleは機械的に判定し、忠告なしに突然アプリをストアから削除することがあるので注意すること
- 審査通過したからといって、安心せず、定点観測すること
- チャットサポートがあること。対応時間内であればとても心強い!
- テスト用のリリーストラック(内部テストなど)は、古いものがあれば出来るだけ最新版に置き換える
わたしの経験がお役に立てば幸いです!
不明点・指摘箇所あれば、お気軽にTwitterでもご連絡ください〜🐠