🔐

Flutter セキュリティ Tips 🔓💦

2024/07/02に公開

flutter でmobile 開発する場合、セキュリティにはある程度の定石が存在します。
それらを見ていきましよう。

対象者

  • モバイルアプリの開発にかかわっている
  • セキュリティを学習したい方

今回は、Flutter のセキュリティの学習をしたのでその Tipsを共有しようと思います。
私自身、Flutterをやり始めて 半年が経過しようとしていますが、しっかりとセキュリティの学習をするとまだまだだなと思う部分が多くありました。
難読化やルート化 など、 ???? となっている方はぜひこの記事で学習していってください☆

セキュリティで気を付けるのは以下6つ

どんどん新しいテクノロジーが生まれて、すべてのウイルスや攻撃に対象しようとすることは
現実的ではありません。従ってこれだけは気を付けるべきということを書いていきたいと思います!

  • API キーの保護
  • 情報とストレージの暗号化
  • 通信プロトコルの制限
  • ルート検出 および Jailbreak 対策
  • リバースエンジニアリング 対策
  • バックグラウンドスナップショットを制御

意外と多いですよね!
以下では、それぞれについて解説していきます!

API の保護について

Gitを用いて共同開発するときは、.gitignoreのファイルに .env を書いてリモートに秘密情報はあげないようにしましょう。
要するにハードコーディングはやめましょう。ってだけです。

ちなみに、ネイティブコード内のAPIkey は それぞれ以下に保存します。

Android の場合

local.properties ファイルを .gitignoreに追加して

# local.properties
   google.maps_api_key=SECRET_KEY

読み込む

# android/app/build.grade 
 def localProperties = new Properties()
    def localPropertiesFile = rootProject.file('local.properties')
    if (localPropertiesFile.exists()) {
        localPropertiesFile.withReader('UTF-8') { reader ->
            localProperties.load(reader)
        }
    }
    def googleMapsApiKey = localProperties.getProperty("google.maps_api_key")
    android {
        defaultConfig {
            manifestPlaceholders = [
                    googleMapsApiKey: googleMapsApiKey
            ]
        }
    }

AndroidManifest.xmlファイルに追加

 <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="${googleMapsApiKey}" />

iOS の場合

ios/Flutter/Release.xcconfigファイル にAPIキーを追加

GOOGLE_MAPS_API_KEY=$(SECRET_KEY)

info.plistファイル内で参照する

<key>google_maps_api_key</key>
<string>$(GOOGLE_MAPS_API_KEY)</string>

それをAppDelegate.swiftファイル に追加

GMSServices.provideAPIKey("$(GOOGLE_MAPS_API_KEY)")

情報とストレージの暗号化

暗号化とは テキストデータをエンコードされた形式に変換してデータの機密性、整合性、セキュリティを確保するプロセスです。
API通信のときは必ず暗号化するようにしましょう。

  • ユーザ認証情報
  • アプリのパスワード
  • クレカなどの支払い情報

暗号化するときはこちらのpackageを使うといいでしょう。
https://pub.dev/packages/crypto

ローカルストレージの暗号化

ローカルに機密情報を保存するときは、以下の packageを使います。
データを保存する前に暗号化をおこなってくれます。
AndroidではEncryptedSharedPreferencesまたはKeyStoreを使用し、iOSではKeychainを使用してデータを安全に保存します。これにより、各プラットフォームのセキュリティ機能を最大限に活用できます。

では、なぜ SharedPreferences ではいけないのでしょうか??
理由は以下のようなものです。

  • デバッグモードでアプリケーションを実行する場合、デバッガーを使ってアプリの内部状態を調べることができる。これにより、SharedPreferencesに保存されたデータも簡単に閲覧できる。

  • デバイスにマルウェアがインストールされている場合、そのマルウェアがSharedPreferencesに保存されたデータを収集することが可能。

  • Android Debug Bridgeコマンドを使えば、ファイルシステムにアクセスしてデータを取得できる。

https://pub.dev/packages/flutter_secure_storage

通信プロトコルの制限

API 通信は、HTTPSとSSL/TLSプロトコルを使用します。
以下のパッケージを使用して、よりSecureな通信を実現します。
localhost の場合だけ、HTTPを許容するように設定するといいでしょう。
以下の packageを使用します。

https://pub.dev/packages/dio
https://pub.dev/packages/http

ルート化 および Jailbreak 対策

ルート化とは、デバイスのオペレーティングシステムに対する完全な管理者権限を取得することを指します。Linuxでいうと sudo コマンドですね! これがアプリ内ですべて実行されていると考えるとおそろしいです。
通常のセキュリティメカニズムがバイパスされるため、不正なアプリケーションがシステムレベルで動作する可能性が高くなり、マルウェアやウイルスの攻撃に対してより脆弱になります。

それをチェックするためには ルート検出が必要です。

具体的には以下をチェックします。

  • Superuser.apkがインストールされているか
  • /sbin/suディレクトリが存在するか
  • システムディレクトリに書き込み権限が付与されているか

それらのチェックは 以下のpackageを使用します。
https://pub.dev/packages/flutter_root_detection
https://pub.dev/packages/flutter_jailbreak_detection

リバースエンジニアリング 対策

release build を実行すると、 apkファイルが作成されますが、あれば実は逆コンパイルが可能です。

以下のpackageを利用して自分で作成した apkファイルを逆コンパイルしてみると、
簡単にソースコードが入手できてしまいます。

https://apktool.org/

そのため、第三者に逆コンパイルされたときに、読まれないようにする必要があります。
https://docs.flutter.dev/deployment/obfuscate

release buildには以下の コマンドを追加しましょう。

flutter build apk --obfuscate --split-debug-info=obfuscate/android
flutter build ios  --obfuscate --split-debug-info=obfuscate/ios

難読化は、クラス名やメソッド名を変更しバイナリサイズを落とす。そしてソースコードを理解しにくくすることで、悪意のある第三者によるリバースエンジニアリングを防ぎます。これにより、知的財産の保護や機密アルゴリズムの露出を防ぐことができます。

コマンド一つでこれが可能なのはいいですね。

バックグラウンドスナップショットを制御

バックグラウンドスナップショットの制御とは、アプリケーションがバックグラウンドに移行した際に、スクリーンショットが取られるのを防ぐためのセキュリティ対策です。これは、ユーザーがアプリを一時的に離れるときに、アプリの内容が他のアプリやシステムUI(例えば、アプリスイッチャー)によってキャプチャされるのを防ぐために重要です。

イメージはこんな感じです。

以下のpackageを利用します。
https://pub.dev/packages/secure_application

まとめ

いかがだったでしょうか。私自身も記事をかいてかなり勉強になりました。
やはり、情報を扱う プロとして心得ておきたいですね!

よかったら、フォローおねがいします。
フォロバします。
頑張って勉強していきましょう ☆

参考文献はいかになります。

https://zenn.dev/toma_0/articles/20f64bc7972263
https://www.valuecoders.com/blog/technology-and-apps/secure-your-flutter-app-top-strategies-for-addressing-security-concerns/
https://dev.to/djsmk123/is-your-flutter-application-secured-best-practices-for-developing-and-deploying-secure-flutter-apps-4njm

Discussion