【Android】MASA認証(難読化)の対応について

MASAとは
Google Playに紛れ込む不正アプリを未然に防ぐアライアンス「App Defense Alliance(ADA)」が提供するプログラムのことを指します。
正式名称は「Mobile Application Security Assessment」
このプログラムはOWASPが公開している一連のセキュリティ要件である Mobile Application Security Verification Standard(MASVS)と、
一連のテスト基準である Mobile Application Security Testing Guide(MASTG)で、デベロッパーがアプリを共通の基準に基づいて評価するための客観的な手段を提供しています。
このプログラムが提供されているということは、将来的にこれを通さないと、Google Playでアプリの公開ができなくなる懸念があります。
プログラムを通した結果は?
現在所属しているプロジェクトにて審査を出したところ以下の指摘を受けました
- ハードコードされたキーが存在する
- 完全に難読化されていない
これらを対応しないと合格しませんよ、といった言われているようだったので対応が必要そうです。
筆者はこのうち「完全に難読化されていない」の対応を行いました。
難読化対応
まずは難読化されていなかったので難読化をONにします。
build.gradleに難読化するかしないかを判定するキーがあるのでそれをtrueにします。
- build.gradle
minifyEnabled true
- build.gradle.kts
minifyEnabled=true
この時、難読化をONにするのはリリースビルドのみです。 デバッグビルドではONにしたとしても、難読化はされません。
どうやらAGP7.2.0付近のバージョンから難読化されなくなっているようです。
参考1
参考2
次に難読化すると正しく動作しないやつが存在しているので、それを難読化しないようにルールファイルに定義します。
ルールファイル: proguard-rules.pro
難読化すると動作しないやつとしては
- ライブラリ
- リフレクションしているクラス
- jsonデータを送信しているクラス
などがあります。
proguard-rules.proには以下のように記載します。
-keep class <パッケージ名>.** { *; }
-keep class <クラス名> { *; }
インナークラスも存在しているのでそれも追加します。
-keep class <クラス名>$* { *; }
難読化をONにすると同時に最適化もしてくれるので、最適化のオプションも入れます。
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-dump <ファイル名>.txt
-printseeds <ファイル名>.txt
-printusage <ファイル名>.txt
-printmapping <ファイル名>.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable,InnerClasses
-repackageclasses ''
最適化のオプションについては英語で記載しているのを日本語に訳してあるページが存在しています
日本語訳のページのリンク集
試験
除外するライブラリ、クラス、最適化オプションを追加したら、リリースビルドでバイナリを作成して試験です。
試験はアプリの全体の動作を見る試験を行いました。が、それなりの規模があるアプリなので難読化の除外をしきれなかった部分がポロポロと出てきました。
対応しきれなかったのは主にjsonデータを送信しているクラス、が多かったです。
こうして出てきた不具合をルールに追加して難読化しないようにしたりして一つ一つ潰して試験してを繰り返します。
まとめ
Androidのアプリは割と簡単に中身が見れてしまうので、セキュリティ的な意味では難読化の対応は必須だとは思います。なので、難読化の対応は早めに実施したほうが良いです。
後になればなるほど試験の範囲が広がるし、難読化して不具合が出た時に原因となる場所を探るのに時間がかかりやすくなります。
冒頭でも触れましたが今はMASA認証がないからすぐに公開できない、みたいなことにはならないとは思いますが近いうちに必須になるかもしれません。