LAC WATCH

セキュリティとITの最新情報

RSS

株式会社ラック

メールマガジン

サイバーセキュリティや
ラックに関する情報をお届けします。

ラックピープル | 

重要情報の漏えいにつながるスマホアプリのキャッシュ問題と対策

スマートフォンアプリケーション診断を担当している西田です。

ラックのスマートフォンアプリケーション診断では、開発者の意図に反して、スマートフォンアプリケーション(以下、スマホアプリ)とサーバ間の通信に含まれる重要情報がキャッシュされる問題を頻繁に検出しています。本稿ではこの問題の概要と対策について解説します。

皆さまのセキュアなスマホアプリ開発の一助となれば幸いです。

セキュリティ上の影響

スマホアプリの専用ディレクトリ※1 に重要情報を含むキャッシュが保存されている場合、攻撃者にキャッシュを窃取され、スマホアプリの不正利用や、個人情報漏洩、金銭的被害につながる恐れがあります。このシナリオでは、キャッシュが保存されている専用ディレクトリにアクセスできることが前提になります。

本来、AndroidやiOSのスマホでは、スマホアプリの専用ディレクトリにユーザが直接アクセスすることはできません。しかし、攻撃者によってスマホを奪われ、root化やJailbreak※2 をされた場合、またはスマホのバックアップを取得された場合、攻撃者はスマホアプリの専用ディレクトリに自由にアクセスできるようになります。特にAndroidはWebViewの実装に問題があると、物理的にスマホが奪われなくても、スマホアプリの専用ディレクトリ内のデータが窃取される恐れがあります。

  • ※1スマホの内部ストレージの下記のパスに、スマホアプリの専用ディレクトリが作成される。iOSのディレクトリ名<UUID>はランダムに生成される。Androidでは、パッケージ名のディレクトリが作成される。
    iOS:/var/mobile/Containers/Data/Application/<UUID>
    Android:/data/data/<パッケージ名>
  • ※2特殊な方法によってスマホの管理者権限を取得する方法をroot化と呼ぶ。とりわけiOSではこの方法をJailbreakと呼ぶ。

キャッシュとは

WebブラウザでWebページにアクセスすると、Webブラウザはダウンロードしたページのデータを保存します。再度、同じWebページにアクセスした際には、保存したデータを読み込むため、Webページから再度ダウンロードする必要がなくなります。その結果、最初に表示したときよりも速くページを表示することができます。この保存されるデータをキャッシュといいます。

スマホにも、スマホアプリがWebサーバと通信して取得したデータを専用ディレクトリ内にキャッシュする仕組みがあります。
そのため、スマホアプリでキャッシュ対策をしていないと、意図せずスマホアプリ内に重要情報が保存されてしまいます。

今回は、スマホアプリにおけるキャッシュ対策の理解のためにiOS(開発言語 Swift 3)とAndroid(開発言語 Java)のスマホアプリを作成して、AppleとGoogleの公式ドキュメントを参考にキャッシュ対策を検証しました。作成したスマホアプリはWebサーバへGET・POSTリクエストを送信し、返ってきたレスポンスを表示するだけのものです。

キャッシュが保存される検証

iOSのスマホアプリで、サーバ側でキャッシュコントロールせず、スマホアプリでキャッシュ対策をしていない場合の例を説明します。

図1の通り、スマホアプリの専用ディレクトリ配下に保存されているCache.dbファイルに、Webサーバから返ってきたレスポンスがキャッシュとして保存されていることが確認できます。検証時には、サーバから送信されたpassword等のパラメータの値が保存されるのが確認できました。

図1 iOSのキャッシュ保存例

図1 iOSのキャッシュ保存例

キャッシュ対策の検証

AppleとGoogleの公式ドキュメントを参考にして、今回作成したスマホアプリでキャッシュ対策を検証した結果を以下に述べます。

サーバ側でのキャッシュ対策(iOSとAndroid共通)

今回の検証で使用したスマホは、iOS 9.3.2とAndroid 6.0です。対策はサーバ側で行います。

Cache-Controlヘッダを利用したキャッシュ対策の検証結果(WebView/WebAPI)

WebViewだけでなく、WebAPI通信においても、キャッシュされたくない通信のヘッダに「Cache-Control: no-store」を指定することで、スマホアプリの専用ディレクトリにキャッシュを保存させないようにすることができました。
なお、サーバ側でヘッダを指定することで、キャッシュを保存させないようにできますが、スマホアプリ側でも対策をとることを推奨しています。次の項目からは、スマホアプリ側でのキャッシュ対策の検証結果を紹介します。


iOSのスマホアプリでの対策

今回の検証で使用したスマホは、iOS 9.3.2です。

1.URLCacheを利用したキャッシュ対策の検証結果(WebView/WebAPI)

URLCacheクラスのURLCache.shared.removeAllCachedResponses()を利用し、さらにURLCache.shared.diskCapacityとURLCache.shared.memoryCapacityの設定を0にすることで、キャッシュを保存させないようにすることができました。ただし、スマホアプリのキャッシュが全て削除されるため、キャッシュが利用できなくなるので注意が必要です。

図2 URLCacheクラスを利用して、キャッシュを制御

図2 URLCacheクラスを利用して、キャッシュを制御

2.URLSessionConfigurationを利用したキャッシュ対策の検証結果(WebAPI)

URLSessionConfigurationクラスのephemeralを利用することで、キャッシュを保存させないようにすることができました。特定の通信のみをキャッシュさせたくないときに有効です。

今回の検証では、WebAPIへリクエストを送信するクラスを作成し、クラス中で引数の値によりephemeralを設定するようにしました(図3)。

図3 URLSessionConfiguration.ephemeralを利用して、キャッシュを制御

図3 URLSessionConfiguration.ephemeralを利用して、キャッシュを制御

Androidのスマホアプリでの対策

今回の検証で使用したスマホは、Android 6.0です。

1.clearCache(boolean includeDiskFiles)を利用したキャッシュ対策の検証結果(WebView)

WebViewクラスのclearCache(boolean includeDiskFiles)を利用することで、キャッシュを削除することができました。boolean includeDiskFilesにfalseを指定すると、メモリ上のキャッシュのみを削除し、trueを指定すると、スマホアプリの専用ディレクトリ内のキャッシュも含めて削除します。

今回の検証では、WebView用のActivityを呼び出し、Activityが破棄される時に呼ばれるonDestroy()内でWebViewキャッシュを削除しています(図4)。

図4 clearCache(boolean includeDiskFiles)を利用して、キャッシュを削除

図4 clearCache(boolean includeDiskFiles)を利用して、キャッシュを削除

2.HttpURLConnectionを利用したキャッシュ対策の検証結果(WebAPI)

AndroidのWebAPIにおいて、HttpURLConnectionはキャッシュの保存方法を設定しない限り、キャッシュは保存されませんでした。

スマホアプリでキャッシュ対策する必要があるか

金融系のアプリや、通信にユーザID、パスワード、ユーザの個人情報を含む場合は、通信の情報がキャッシュされないように対策する必要があります。

なお、今回紹介した対策を取ることで、一切キャッシュを利用できなくなる場合があります。スマホアプリで扱う情報を考慮して、キャッシュ対策を講じるべきかを判断してください。

キャッシュ対策は複数実装することを推奨(まとめ)

OSやAPIのバージョンによっては、今回検証したキャッシュ対策がサポートされていなかったり、挙動が異なったりする可能性があります。そのため、開発されているスマホアプリが対応するOSやAPIのバージョンでキャッシュ対策がサポートされているかを確認の上、念のためにキャッシュ対策は複数実装しておくことを推奨します。

スマホアプリの脅威はキャッシュだけではなく、その他、様々な脅威があります。スマホアプリの脅威を把握する手段として、ラックのスマートフォンアプリケーション診断の活用もご検討ください。

より詳しく知るにはこちら

より詳しく知るにはこちら

「スマートフォンアプリケーション診断」は、お客様が開発したスマートフォンアプリケーションのセキュリティ対策が適切であるかを診断し、問題点の有無についてご報告するサービスです。

この記事は役に立ちましたか?

はい いいえ