失敗しない!Androidアプリ開発最前線!

92
TS-6 1 失敗しない! Androidアプリ開発最前線! ~最新技術とセキュリティをおさえ、 効率的にAndroidアプリを開発する方法~ 日高 正博 / 住友 孝郎 / 藤田 竜史 / 木村 尭海 1

description

ET West 2013 テクニカルセッション 【講演概要】 モバイル分野においてAndroid OSは大きなシェアを占めており重要性は日々、高まっている。本セッションではAndroidの最新動向を解説するとともに、実際のAndroidアプリ開発ワークフローに即して、組込みデバイス特有の課題の抽出と解決に向けたテクニックを解説する。またアプリ開発におけるセキュリティ・安全性リスクへの考察を通し、Androidへの理解を深める。 ※受講対象者:Androidアプリ開発をこれから始める方、日頃から取り組んでいる方

Transcript of 失敗しない!Androidアプリ開発最前線!

Page 1: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 1

失敗しない! Androidアプリ開発最前線!

~最新技術とセキュリティをおさえ、 効率的にAndroidアプリを開発する方法~

日高 正博 / 住友 孝郎 / 藤田 竜史 / 木村 尭海

1

Page 2: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

セッション概要

2

• モバイル分野におけるAndroid

–大きなシェアを占めるプラットフォームに成長

– Android搭載製品が洪水のように登場

• Androidの課題と解決策を知る

–組込デバイスの課題、解決テクニック

–アプリ開発セキュリティ・安全性リスク

Page 3: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

セッション概要

• Androidアプリ開発のポイント

1. 歴史&最新動向から未来を解説

2. 開発の基本と効率化するための考え方

3. 分断化と組込アプリの省電力処理

4. セキュリティホール例と対策

3

Page 4: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

日高 正博

Android フレームワークからアプリケーションレイヤまで。Dalvik VM/メモリ管理、デバイス制御が得意

自己紹介

Twitter

Account

@mhidaka

4

Page 5: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

1.Androidの歴史から未来を考える

5

Page 6: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

1.Androidの歴史から未来を考える

6

Page 7: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidの進化

• UIの洗練:タッチパネルに特化

• ハードウェア処理能力向上、大画面化

7

Page 8: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidの歴史(1)

1.0

1.1

1.5

1.6

2.0

2.1

2.2

2.3

3.0

3.1

4.0

黎明期

確立期

発展期

8

Page 9: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidの歴史(2)

• Android 1.X (Cupcake / Donut)

• 2008年暮れ~2009年

最初のAndroid端末がリリース

– Gmail、Google Maps、YouTube

– Activity、Serviceなどアプリ基本

– WiFi、Bluetooth、無線環境

–ハードウェアAPIの搭載

9

Page 10: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

ハードウェアを抽象化する仕組み

多様な入力デバイスをまとめ、アプリに提供

10

Page 11: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidの歴史(3)

• Android 2.X (Éclair, Froyo, Gingerbread)

– 2010年、スマートフォンとしての地位を確立

• 速度向上:JITコンパイラの導入、2~5倍の向上

• ブラウザ高速化、OpenGL ES 2.0対応

• 外部ストレージ、クラウド連携機能によるプッシュ配信

11

Page 12: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

広がる利用シーン

家庭、ビジネス、生活のなかでAndroidをプラットフォームとしたサービス、製品の提供

ホーム ビジネス

ネットワーク化の推進:スタンドアロンで動作しているデバイスと繋がる

12

Page 13: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidの歴史(4)

• Android 3.2 (Honeycomb)

– Android 3.0~3.2はタブレット向けに用意

–スマートフォンに搭載されることはないものの重要な技術が多く採用され、のちのAndroid 4.0に継承

13

Page 14: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidの歴史(5)

• Android 4.x (Ice Cream Sandwich, JellyBean)

– 2012年~、UIを洗練し、大画面化

–応答性を改善 ハードウェア割込を活用して

描画、タッチ操作向上

–マルチユーザー、アシスタント検索

– NFCデータ交換「Android Beam」

14

Page 15: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Android搭載製品例

15

Page 16: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidの未来

16

Page 17: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

NFC

•タッチするだけでデータ交換

• Android Beam、非接触ICカードの

読み書き

Bluetooth

•パーソナル(個人利用を主とした)ネッ

トワークの構築

•高音質なハンズフリー、健康機器に

対応したHDPを搭載

WiFi

•最も普及している無線規格

各デバイスとの高速接続

•Wi-Fi Directではピアデバイス通信、

P2Pが可能に

USB

•既存の汎用デバイスと接続

•マウス、キーボードによるUI拡張など

• USB Host、アクセサリ開発(ADK)対

17

Page 18: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

MiracastMiracast

近距離 遠距離

NFC

Bluetooth

無線LAN 3G

LTE

用途に合わせて複数技術を組み合わせて使用 用途に合わせて複数技術を組み合わせて使用

~0.2m 424kbit/s

~10m(Class2) 1~3Mbit/s

~80m(見通し) ~54Mbit/s

~Km ~7.2Mbit/s

18

Page 19: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

• 各ネットワーク機能の特徴

種類 説明

NFC Android Beamではタッチするだけで通信が可能

転送量が小さい。通信時の暗号化は未考慮

Bluetooth オーディオ接続など。用途ごとプロファイルを用意

ペアリングが必須。Low Energyは未対応

WiFi インターネット接続。高速ネットワーク通信が可能

アクセスポイント設定が煩雑、利用範囲が限定

USB 汎用機器が利用可能、HID、HOST等をサポート

開発の難度が高い。シンクロナス転送は非対応

ネットワーク機能の使い分け

19

Page 20: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 20

2. 開発を効率的に進めるために

株式会社ブリリアントサービス

シニアエンジニア 住友孝郎

Page 21: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

自己紹介

• 住友 孝郎

• 所属:株式会社ブリリアントサービス

• 業務経歴

– 産業機器向けアプリ開発(MFC)

– 製造業向けWebシステム開発(Java)

– 家電製品向けAndroidアプリ開発

• モバイル、センシングデバイス

– Androidアプリ開発

– Android+Arduinoを用いたロボット開発

21

Page 22: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

「開発を効率的に進めるために」のポイント

• Androidアプリ開発の特徴

– Android OSやSDK(開発キット)に

どのような開発ツールが整備されているか

• Androidアプリ開発の問題と対策

–実際の開発現場で発生した問題と解決策

22

Page 23: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidアプリ開発の特徴

23

Page 24: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Android OSの特徴

• JavaだけどJavaではない

–モバイル向けの独自バーチャルマシン

「Dalvik VM」の採用

• Webやデータベースなど複数ジャンルの技術を同時に利用する

– OSS、既存技術の有効活用

24

Page 25: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

汎用的なモジュールは整備済

• 画面のレイアウトを作りたい

– XMLで記述、ロジックとの分離

• マルチスレッド化したい

– 非同期実行用 AsyncTaskクラス、Handlerクラス

• ネットワークプログラミング

– 通信機能をまとめたHttpClientクラス

• データベースを使いたい

– SQLiteが整備、SqliteOpenHelperクラス

• 異なるジャンルの機能がAndroidフレームワークに 取り込まれており、おいしいところを利用できる

25

Page 26: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Android SDKに含まれるツール

• 標準ツールだけで開発のほぼ全てが行える

– Eclipseの開発支援機能

– コーディング、リファクタリング

– デバッグ機能(ブレークポイント、デバッグ等)

• 便利なAndroid開発のツール

– レイアウトを確認したい → Hierarchy Viewer

– テストの自動化 → JUnit、monkeyrunner

– パフォーマンス測定 → traceview

– メモリ解析を行いたい → hprof-conv

26

Page 27: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidアプリ開発の問題と対策

27

Page 28: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

開発の壁

• UI、マルチスレッド、データベース、HTTP等の広い範囲の知識とスキルが必要

• 関連する知識とスキルが多いため、

コードの複雑化が発生しやすい

• デバイスの種類が多岐に渡るため、

テストが大変

28

Page 29: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

何故、幅広いスキルが必要か(1)

• 今までは分野間の交差が少なかった

–スタンドアロンアプリ(MFC,C#,Java)

• UI、マルチスレッド、DB

– コンシューマ系Web • UI、DB、HTTPのスキルが必須

• マルチスレッドはほとんどフレームワークが吸収する

–業務系Web

• コンシューマ系Webに近いが異なる

• UIは帳票ベースが多い

• 製造業やサービス業などでも異なる

–組込系 • UI、マルチスレッド、DB(独自が多い)

29

Page 30: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

何故、幅広いスキルが必要か(2)

• Android OSは各分野のベストプラクティスが集められている

– UI構築環境

• XMLで記述、ロジックとUIが分離、HTML,JS+CSSに似た考え方

– マルチスレッドプログラミング

• Javaのスレッドモデルが利用可能

• シンタックスシュガーも整備されている

– データベース処理

• フレームワークにSQLiteDatabase3が含まれている

• ACID特性はフレームワーク側で保証している

– ネットワーク(HTTP通信)

• フレームワークにHttpClient(ライブラリ)が含まれている

30

Page 31: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

煩雑化する作業を如何に抑えるか

• 各目的のベストプラクティスを把握する

–独自実装を避け、フレームワークに任せる

• 標準の開発ツールの目的を理解する

–ツールで解決できる問題はツールで解決する

31

Page 32: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

開発で使用できるもの

• 標準ツールだけで開発のほぼ全てが行える – 統合開発環境 Eclipse

– Android端末エミュレーターの整備

– タスクトレース機能 TraceView

– レイアウト解析 Hierarchy Viewer

• 汎用のJava開発用のツールが使える

– Memory Analyzer(メモリのリーク解析)

• Webアプリ、スタンドアロンアプリなど

別ジャンルの手法を応用可能

• Junitによるテスト自動化

32

Page 33: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

複雑化を避けるために

• UI、マルチスレッド、DB、Webは相互依存を減らし、独立して実装する

• 整備されているシンタックスシュガーを使用する – 独自スレッド実装よりAsyncTaskクラスを使う

– 独自DB構築よりSQLiteOpenHelperクラスを使う

• JUnitのユニットテストを作成する

33

Page 34: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

JUnitによるテストの自動化

• どのようなテストが行えるか

– UI操作、キー操作、タッチ操作、画面遷移

– タスク

– サービス

– データベース

• JUnitでユニットテストが作成できないものはたいてい結合度が高いことが要因

• 作成したテストは異なる端末でも実行可能

作成コストは運用で回収できる

34

Page 35: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

実例1:ビジネスロジックとDBアクセス

• 結合されている場合、単独でテストできない

– ビジネスロジックを実行してDBを確認するのが限界

• 管理用クラスを作って責任を明確にする

– 管理用クラスに絞ってテストができる

ビジネスロジック1

アクセス用処理1

ビジネスロジック2

アクセス用処理2

ビジネスロジック3

アクセス用処理3

DB

DB管理クラス

ビジネスロジック1

アクセス用処理1 ビジネスロジック2 アクセス用処理2

ビジネスロジック3

アクセス用処理3 DB

35

Page 36: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

まとめ

36

Page 37: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

効率化まとめ

• 広い範囲の知識とスキルが必要な問題

→標準ツールの使い方と目的を理解する

• コードが複雑化する問題

→各モジュールを理解したリードプログラマを配置

• デバイスの種類が多くテストが大変な問題

→実装の複雑化を避ける

→テストの自動化を行う

37

Page 38: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 38

3. 失敗する前に知っておく事

株式会社ブリリアントサービス

チーフ・藤田 竜史

Page 39: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 39

自己紹介

• 藤田 竜史(ふじた りゅうじ)

• 所属:株式会社ブリリアントサービス

• 業務経歴

– Androidプラットフォーム開発

– Androidシステムアプリケーション開発

• その他

– Android Hacks執筆

– ARアプリケーション開発(ウキウキView)

– AOSPコントリビュート

Page 40: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 40

Jelly Bean

(33%)

Gingerbread

(36%)

Ice Cream Sandwich

(25%)

Androidの分断化 その1

• プラットフォームバージョン

– 市場にはさまざまなプラットフォームバージョンのデバイスが溢れている(Google調べ)

Page 41: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 41

Normal

(79%)

xhdpi

(25%) hdpi

(36%)

mdpi

(23%)

Androidの分断化 その2

• 画面サイズ/画面密度

– Androidデバイスは、画面サイズと画面密度の組み合わせによって定義される(Google調べ)

• 画面サイズ : 4種類

• 画面密度 : 6種類

Page 42: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 42

2010年12月

2011年2月

2011年10月

2012年6月

Androidの分断化 その3

• バージョンアップサイクル

– およそ半年おきにバージョンアップされる

Android 2.3

(Gingerbread)

Android 3.0

(Honeycomb)

Android 4.0

(Ice Cream Sandwich)

Android 4.2

(Jelly Bean)

Page 43: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 43

Androidの分断化 まとめ

• Androidの分断化は激しさを増している

• 製品レベルの対応を行うのは大変

• Androidデバイスの互換性

• メーカー独自実装

Page 44: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 44

通常状態 スリープ

状態

ディープ

スリープ状態

バックライト

ON/OFF ある一定の条件時

アプリケーションと省電力

• デバイスは常に動き続けるわけではない

– カーネルのパワーマネージャーによって電力管理が行われている

Page 45: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 45

ディープスリープとは?

• 画面が消えていて、CPUも止まっている状態

• 状態変化するトリガは?

– デバイスによってまちまち(ハードウェアの省電力設計に依存する)

※USBケーブル接続中は状態変化しない

※WakeLock取得中も状態変化しない

Page 46: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 46

CPUが止まるとは?

• 一部のシステム時刻が停止する

– SystemClock#uptimeMillis()

• システム時刻が止まると・・・

– タイマー処理が停止する

– ハンドラのメッセージ送信が停止する

– スレッドスリープ処理が停止する

ディープスリープ中は、SystemClock#uptimeMillis()によるカウントが停止するため、このメソッドを使用している仕組みは働かなくなる

Page 47: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 47

回避策はないのか?

• AlarmManagerを使用する

– タイマー種別に合わせて、スケジュールの設定を指定する

タイマー種別 SystemClock 使い方

ELAPSED_REALTIM

E_WAKEUP

elapsedRealtime() デバイスが起動してからの時間を指定

RTC_WAKEUP currentTimeMillis() 時刻を指定

ディープスリープ中でもSystemClockはカウントされるため、復帰が行われる

Page 48: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 48

回避策はないのか?

• WakeLockを取得する

– Android特有のカーネルの機能

• 注意してください

– WakeLockを取得したら解放する

– 必要なときだけ取得する

解放を忘れるとディープスリープ状態に遷移しないため、

電池消費が激しくなる!

Page 49: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 49

アプリケーションと省電力 まとめ

• Androidデバイス(カーネル)の仕組みを知っておく必要がある

• ユーザーの利用シーンを想定した試験を用意

Page 50: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 50

アプリケーションとデザイン

• デザインはアプリケーションの顔

– ユーザーの評価対象になる

• 使い方説明よりも直感的な操作を

• 見た目の重要性

Page 51: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 51

画面密度に合わせたデザイン設計

• ピクセル単位での設計は論外

– DP単位での設計が必要

静的解析ツール(Lint)によって警告される

Page 52: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 52

画面密度ごとにリソースを用意

• コストはかかるが粗が見えやすいポイント

mdpi用のサイズで作成したアプリケーションアイコンと

xhdpi用のサイズで作成したアプリケーションアイコンの

表示比較(xhdpiデバイス上)

Page 53: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 53

一つのリソースを使いまわす

• Androidによって行われる拡大縮小の概念の理解が必要

– mdpiをベースラインとし、それぞれの画面密度に対し拡大縮小が行われる

Page 54: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 54

デバイスに合わせたレイアウトを用意

• デバイスのサイズや向きに合わせたレイアウト

デバイス 向き(デフォルト)

モバイル ポートレート

タブレット ランドスケープ

テレビ

Page 55: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 55

Supportライブラリの活用

• Honeycombで追加されたUIをGingerbread

でも動かしたい

– フラグメント

– アクションバー

– ノーティフィケーション

• One APKの実現

– Supportライブラリの活用でGingerbreadでも動かせることができる

– 機能にいくつか制限あり

Page 56: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 56

アニメーションを使う

• インタラクティブ性の向上

– 不要な文字列の表示を防ぐ

– アニメーションすることでユーザーは「処理が行われている」ということを実感する

– 過度なアニメーションは控えて・・・

更新中・・・

Page 57: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 57

アプリケーションとデザイン まとめ

• デザインは楽しい

• ユーザビリティやユーザーエクスペリエンスを念頭に

Page 58: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6 58

4. セキュリティで失敗しないためには

Page 59: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

自己紹介

木村 尭海(きむら たかうみ)

会社:AVCマルチメディアソフト株式会社

業務経歴

家電連携アプリケーション開発

個人でのアプリ開発

Android

WindowsPhone7

Twitter:@muchiki0226

59

Page 60: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

発表の流れ

Androidのセキュリティとは

セキュリティホールになりやすいケース

難読化の範囲の罠

ファイル保存の危険性

インテントの恐ろしさ

WebViewの落とし穴

開発時のポイント

60

Page 61: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidセキュリティ

Androidのセキュリティに注目が集まっている

不具合報告が増加

セキュリティを重視したもの

日本スマートフォンセキュリティ協会

注意喚起のためのPDFを配布

セキュリティ専門の技術書登場

Androidセキュリティ勉強会

61

0

20

40

60

80

100

120

2010 2011 2012

5

21

118

報告件数

JVNデータ(2013/5月調べ)

Page 62: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

Androidセキュリティ

セキュリティを確保するにはどうするのか

セキュリティで狙わられる場面は決まっている

失敗例にはパターンがある

セキュリティを向上させるには

パターンを抑えることで最低限の防御策になる

62

手口は日に日に増えるので常にアンテナを張ることが大事 手口は日に日に増えるので常にアンテナを張ることが大事

Page 63: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

アカウントが漏洩したケース

暗号化なしで個人情報を端末に保存

ユーザー名

住所

アカウント名

電話番号

etc…

63

アプリA アプリB

暗号化無しの

個人情報

Page 64: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

問題が起こってからではもう遅い

セキュリティホールのリスク

他者への攻撃の踏み台や個人情報の流出

どうしてセキュリティホールが出来てしまうのか

Androidの仕組みを理解していない

悪意のある人の存在(攻撃からの防御)

64

Page 65: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

セキュリティ事故を未然に防ぐには

65

知らないということが個人情報を漏洩させる

難読化したのに

どうして? WebViewを使った

だけでも事故に

つながるのか?

Androidの作法

通りに実装したはず…、

漏れてしまったのは

なぜだろう?

アクセス権限を与え

ていなくてもファイル

を読み取られる?

Page 66: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

セキュリティホールになりやすいケース

アプリケーション開発の注意

難読化される範囲に罠がある

迂闊なファイル保存に危険が潜む

Root端末の対策について

フレームワークも取り扱い注意

インテントは共有機能、情報秘匿の難しさ

WebViewの落とし穴とは?

66

Page 67: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

難読化される範囲に注意

難読化の罠にかかりやすいアプリ

HTMLを利用したレイアウトを持つ

リソースファイルを保持しているアプリ

ハイブリッドアプリ

iOSとAndroidを両方のアプリをターゲットに開発

PhoneGapを利用したHTMLベースのアプリケーション

67

共通点はAssets/Rawフォルダを利用するアプリケーション 共通点はAssets/Rawフォルダを利用するアプリケーション

Page 68: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

難読化の範囲の罠

Androidアプリのインストール形式

「APKファイル」の特性

zip形式で圧縮

Java実行ファイルの中間コード(dex)

リソースファイル(res,asset,bin)

APKの入手性

Google Playマーケット以外にも

Androidのデバッグツール「adb」 APKを二次配布している海外サイト

68

解析が容易

入手が容易

Page 69: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

難読化の範囲の罠

iOS/Android両対応PhoneGap製アプリ

プロジェクト構成

69

プロジェクト APK

Page 70: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

難読化の範囲の罠

70

フォルダ APK

解凍

Page 71: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

難読化の範囲の罠

71

フォルダ APK

解凍

Assetsフォルダと フォルダの Assetsフォルダとres/rawフォルダの

中身はそのまま取り出せる!!

Page 72: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

難読化の範囲の罠

ハイブリッドアプリでの注意

ソースコードが閲覧可能

JavaScriptを解析されてコード上の不備を利用されるケースを考慮する必要

Assets/Rawフォルダ利用上の注意

通常のリソース(画像、音声データ)と一緒に

暗号化キー(秘密鍵)を同梱しない

悪用される可能性が高い

72

Page 73: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

難読化の範囲の罠

対策

セキュリティが必要な箇所はAndroid NDKの利用

C/C++によるバイナリ化で解析を防御

※完全に防げるわけではないがカジュアルハックを予防

暗号化の鍵はネットワーク上に置く

サーバー認証、ワンタイムパスワードの活用

73

Page 74: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

ファイル保存の危険性

ファイル保存される位置を把握

フレームワークで隠ぺいされている

強く意識しない

→気付かず危険な処理を行っている

保存できる場所は2種類

外部領域

SDカード

内部領域

ストレージ領域

アプリケーション領域

74

Page 75: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

ファイル保存の危険性

外部領域のファイル保存

PCと接続する

リムーバブルディスク、SDカード扱い

保護機構がなく防御に課題

セキュリティにおいて脆弱

→防御対象に関わるものをおいてはいけない

75

Page 76: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

ファイル保存の危険性

内部領域

ストレージ領域

リムーバブルディスク同等

アプリケーション領域

保存ファイルにアクセス権限を実施

アプリケーション領域に保存する例

76

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);

Editor edit = sharedPreferences.edit();

edit.putString(SAVE_KEY, “080-XXXX-XXXX”);

edit.commit();

#ls -l

-rw-rw---- app_52 app_52 108 2012-07-28 08:17 pref.xml

Page 77: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

ファイル保存の危険性

実は先ほどのケースも防御手法として限定的

Root端末の存在、superuser権限の奪取

ファイルのアクセス権限設定を無効化する

77

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);

Editor edit = sharedPreferences.edit();

edit.putString(SAVE_KEY, “080-XXXX-XXXX”);

edit.commit();

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map>

<string name="save_key"> 080-XXXX-XXXX</string>

</map>

SharedPreferencesで保存するとXMLファイルになる

Page 78: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

ファイル保存の危険性

対策フロー

防御対象の性質によりケースバイケース

78

非公開情報 非公開情報 拡張領域

高度なセキュリティ 高度なセキュリティ

暗号化してアプリケーション領域

or

ネットワーク上に置く

アプリケーション領域

はい

いいえ

Page 79: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

インテントの恐ろしさ

インテントとは

Androidにおけるアプリ連携の機能

非常に便利な機能

別アプリにデータを渡すことが出来る共有機能

例:メールアプリにメッセージ部分を渡す

情報の公開を前提とした共有機能

隠ぺいが困難

79

Page 80: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

インテントの恐ろしさ

例:別のアプリを呼び出す時のソースコード

80

Intent intent = new Intent();

//com.example.test2.MainActivityを呼びだそうとしている

intent.setClassName("com.example.test2", "com.example.test2.MainActivity");

//データを付与する

intent.putExtra("tel", "080-XXXX-XXXX");

startActivity(intent);

Page 81: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

インテントの恐ろしさ

なりすますことが容易

システムログなどからIntentの中身を参照、

受信者に成りすますことが可能

キーがわかればデータを取り出せるようになる

81

アプリA アプリC(アプリBになりすます)

Page 82: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

インテントの恐ろしさ

対策

独自パーミッションを利用して受信に制限

android:protectionLevel

証明書が同じ必要がある「signature」の利用(自分が許可したアプリ以外は受信できなくなる)

82

アプリA アプリB

証明書A 証明書A 証明書A 証明書A

Page 83: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

インテントの恐ろしさ

対策

独自パーミッションを利用して受信に制限

android:protectionLevel

証明書が同じ必要がある「signature」の利用(自分が許可したアプリ以外は受信できなくなる)

83

アプリA アプリC

証明書A 証明書A 証明書B 証明書B

Page 84: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

インテントの恐ろしさ

対策

Intentの範囲を内部に絞り、不用意に公開しない

84

アプリA

アクティビティB アクティビティA

Page 85: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

WebViewの落とし穴

WebViewの特性を理解しないと危険

多くのセキュリティホール事例が報告

セキュリティ事故は大きく2パターンに分類

キャッシュの生存期間

ローカルストレージへのアクセス制御

85

Page 86: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

WebViewの落とし穴

キャシュの保存内容

ID/パスワード

ページの閲覧履歴

キャッシュの場所は固定

/data/data/パッケージ名/databases/webview.db

フォルダの権限で守られている

暗号化されていない

86

DBが取り出されると目視でIDとパスワードが抜き取れる DBが取り出されると目視でIDとパスワードが抜き取れる

Page 87: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

WebViewの落とし穴

対策

WebViewキャッシュとアプリの生存期間を同一に

タイミングが重要

onPauseが呼ばれるタイミングが理想(画面表示中に限定)

ユーザーが操作していないタイミング

ロック画面から復帰時

アプリの再立ち上げ時

アプリの終了時

webview.clearCache();

87

Page 88: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

WebViewの落とし穴

WebViewはローカルファイルにアクセス可能

file://によるコンテンツアクセス(URI指定)に対応

88

WebView

ファイルシステム

file://~

Page 89: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

WebViewの落とし穴

バックグラウンドでファイルロードができる

JavaScript

WebSocketを用いるとネットワーク上に送信できる

89

挙動に変化はないがファイルを送信することができる 挙動に変化はないがファイルを送信することができる

var fs = WScript.CreateObject("Scripting.FileSystemObject");

var file = fs.OpenTextFile(“file://【ファイルパス】", 1);

たったこれだけでファイルが読み込まれる たったこれだけでファイルが読み込まれる

Page 90: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

WebViewの落とし穴

対策:JavaScriptを許可しない

WebViewではJavaScriptを不用意に許可しない

標準で使用不可

アプリ仕様で深く考えず許可するケースが多い

webview.getSettings().setJavaScriptEnabled(true);

過去のセキュリティ事故の事例

90

JVNDB-2012-000111 Boat Browser および Boat Browser Mini における WebView クラスに関する脆弱性

JVNDB-2012-000091 Android 版 jigbrowser+ における WebView クラスに関する脆弱性

JVNDB-2012-000085 KUNAI Browser for Remote Service β における WebView クラスに関する脆弱性

JVNDB-2012-000084 サイボウズ KUNAI for Android における WebView クラスに関する脆弱性

JVNDB-2012-000082 サイボウズLive for Android における WebView クラスに関する脆弱性

JVNDB-2012-000077 複数の GREE 製 Android アプリにおける WebView クラスに関する脆弱性

JVNDB-2012-000071 Sleipnir Mobile for Android における WebView クラスに関する脆弱性

JVNDB-2012-000070 Yahoo!ブラウザーにおける WebView クラスに関する脆弱性

JVNDB-2012-000057 Dolphin Browser における WebView クラスに関する脆弱性

JVNDB-2012-000044 iLunascape for Android における WebView クラスに関する脆弱性

JVNDB-2012-000033 TwitRocker2 (Android 版) における WebView クラスに関する脆弱性

JVNDB-2012-000014 複数のクックパッド製 Android アプリケーションにおける WebView クラスに関する脆弱性

JVNデータ(2013/5月調べ)

Page 91: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

アプリを作るときのポイント1

難読化の適応範囲を意識する

セキュリティに関わる処理はNDK

NDKでも限界があるため、耐タンパ性はソフトウェアで実現可能な領域をでない

Web/HTML利用アプリには向き/不向きがある

フロントエンドとしては優秀だが安易に選択しない

ファイルが保存される位置を意識する

ユーザーが触れる領域か

他のアプリからはアクセス不可か

91

Page 92: 失敗しない!Androidアプリ開発最前線!

TS-# TS-6

アプリを作るときのポイント2

インテントに付与する情報を意識する

セキュリティに関わる情報をインテントに付与しない

インテントの公開範囲、権限を制限する

WebViewの特性を意識する

JavaScriptを許可しない

キャッシュの生存期間

92