スマホアプリのセキュリティについて考える

本記事内で引用しているURLは2025年12月時点で参照したURLとなります
記事内の内容とURLの最新の内容に齟齬が発生している可能性があるため注意してください

はじめに

最近報道された快活CLUBに対するサイバー攻撃の事例をきっかけに、スマートフォンアプリにおけるリバースエンジニアリングの実態について改めて調査しました。

また、日頃スマートフォンアプリの開発に携わる中で、Webアプリと比較するとセキュリティに関する知見や意識が十分に共有されていないと感じる場面があり、その点についてもあわせて整理しています。

快活CLUBの事例

快活CLUBに対するサイバー攻撃について
https://www.kaikatsu.jp/info/detail/ddos.html

快活CLUBに対するサイバー攻撃に関する報道(読売新聞)
https://www.yomiuri.co.jp/national/20251204-GYT1T00037/

目次

経緯(公開情報をもとにしたAIによる要約)

📌 2025年1月20日

DDoS攻撃によるネットワーク障害発生についての第一報が公開
快活CLUBのサービスで DDoS攻撃によるネットワーク障害を確認。
快活CLUBアプリの機能を「会員証表示」のみに制限。
対策を実施中で、状況が進展次第再度告知すると発表。

📌 2025年1月21日

不正アクセスによる個人情報漏えいの可能性について(初報)
1月18日にサーバーへの 不正アクセスを検知 。
会員アカウント管理システムへの侵入痕跡が確認され、個人情報の一部が外部に漏えいした可能性を発表。
対策本部設置、警察への相談、個人情報保護委員会への報告を実施。

📌 2025年3月17日

不正アクセスおよび個人情報漏えいの可能性に関する最終報告(第五報)
外部専門機関による調査と社内調査が完了し、調査結果と再発防止策を公表。
漏えい可能性のある個人情報は約7,290,087件と報告。
実際の情報漏えいや二次被害は確認されていないとしつつ、影響を受けたプログラムの改修やセキュリティ強化対応を実施済みであることが発表された。

スマホアプリは簡単に解析されてしまうという話

今まで漠然と「Androidは危険で、iOSは安全」といったイメージがありましたが、今回の調査で、攻撃者の視点では両者に大きな違いはあまりないのではないかと感じました。
(どちらの方が攻撃し辛いといったことがあまりない)

Googleなどで検索すると、手法やツールなどの記事が多数見つかり、多少の知識があれば誰でも実行できるのではないかと思います。

iOSアプリの場合の例

iOSアプリのipaファイルはzip形式として展開可能であり、一定の範囲であればアプリ内部の構成を容易に確認できます。

こちらの画像は手元のMacでビルドしたアプリを展開したもののため、公式ストア経由で配布されているアプリについては、何かしらの対策が施されている可能性があります。

基本的にスマホアプリの内部構造は「公開されうるもの」として設計すべき

Android・iOSともに、公開されているツールを利用することで、一定程度までアプリのコード構造を確認することが可能です。

性質としてはWebブラウザ上のアプリケーションと近いため、アプリ内にシークレット情報を埋め込む設計は、情報漏えいのリスクを高める要因となります。

少しでもリスクを軽減するための対策

前提としてアプリの中身は公開されるものだという意識は必要なものの、解析や攻撃のコストを上げる方法がいくつかあります。基本的にリバースエンジニアリングは攻撃者の環境上でできるため、100%防御は不可能です。

参考URL:
Zenn, agtech_tomoito, あなたのAndroidアプリは丸裸?リバースエンジニアリングの脅威と今すぐできる対策,アプリを守るための実践的アプローチ:「多層防御」の考え方
https://zenn.dev/agtech_tomoito/articles/34573115100de0#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E5%AE%88%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%EF%BC%9A%E3%80%8C%E5%A4%9A%E5%B1%A4%E9%98%B2%E5%BE%A1%E3%80%8D%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9

@IT, iOSアプリをリバースエンジニアリングから守る「難読化技術」とは
https://atmarkit.itmedia.co.jp/ait/articles/1607/05/news008.html

難読化

コードをコンパイルする際にシンボルを削除したり、コード構造を意図的に複雑化したりすることで、手動での解析を困難にします。Flutterでもoptionから難読化が可能です。

参考URL:
Flutter公式ドキュメント
https://docs.flutter.dev/deployment/obfuscate

Root / Jailbreak ・ 改竄 ・ デバッグ 検知 ・ 完全性のチェック

正当なデバイス、アプリ以外からの操作をブロックします。
Androidは Play Integrity APIという公式のAPIを公開しているためそれである程度チェックが可能となっています。

Android Developers
https://developer.android.com/google/play/integrity/overview?hl=ja

また、iOSにもApp Attestというアプリの完全性を検証するAPIがあります。

Apple Developers
https://developer.apple.com/documentation/devicecheck/establishing-your-app-s-integrity

ただし、ネイティブAPIの利用が必要となり、Androidに比べると実装コストがかかると考えられるため、Firebase App Checkのような既存サービスを活用する選択肢も有効だと思います。

Fairebase, Flutter アプリで App Check を使ってみる
https://firebase.google.com/docs/app-check/flutter/default-providers?hl=ja

jailbreakやデバッグの検知については端末側でのチェックが必要となるため、こちらに関しても一定の実装コストが発生します。

  • デバッグフラグ、実機フラグの検証
  • 特定のroot kitなどの利用チェック
  • rootkitがインストールされた端末で見られる特定ディレクトリの検出

といった仕組みが一般的に用いられているようです

最終的にはサーバー側でセキュリティを確保する

各種リスク軽減策は存在するものの、検索するとそれらを回避する手法を紹介している情報も多く見受けられます。
そのため、最終的にはサーバー側がセキュリティの重要な防衛ラインとなります。

スタンドアロンで完結するアプリは別として、企業が一般的に広く公開するアプリでは、APIサーバーやmBaaSなどのバックエンドが存在するケースがほとんどです。

これらのバックエンドに対するリクエストは、ブラウザ経由の場合と同様に、すべて信用できないものとして扱う必要があります。

  • サーバー側で使用するシークレット情報を、アプリ内に埋め込まない
  • すべてのAPIリクエストについて、必ず認証・認可を行った上でレスポンスを返すようにする
    (RLSやFirebaseのアクセスルールなどを適切に設定する)

こういった基本的な対策を確実に行うことが大切です。

役に立ったらシェアしていただけると嬉しいです
  • URLをコピーしました!
  • URLをコピーしました!
目次