失敗しない!androidアプリ開発最前線!
DESCRIPTION
ET West 2013 テクニカルセッション 【講演概要】 モバイル分野においてAndroid OSは大きなシェアを占めており重要性は日々、高まっている。本セッションではAndroidの最新動向を解説するとともに、実際のAndroidアプリ開発ワークフローに即して、組込みデバイス特有の課題の抽出と解決に向けたテクニックを解説する。またアプリ開発におけるセキュリティ・安全性リスクへの考察を通し、Androidへの理解を深める。 ※受講対象者:Androidアプリ開発をこれから始める方、日頃から取り組んでいる方TRANSCRIPT
TS-# TS-6 1
失敗しない! Androidアプリ開発最前線!
~最新技術とセキュリティをおさえ、 効率的にAndroidアプリを開発する方法~
日高 正博 / 住友 孝郎 / 藤田 竜史 / 木村 尭海
1
TS-# TS-6
セッション概要
2
• モバイル分野におけるAndroid
–大きなシェアを占めるプラットフォームに成長
– Android搭載製品が洪水のように登場
• Androidの課題と解決策を知る
–組込デバイスの課題、解決テクニック
–アプリ開発セキュリティ・安全性リスク
TS-# TS-6
セッション概要
• Androidアプリ開発のポイント
1. 歴史&最新動向から未来を解説
2. 開発の基本と効率化するための考え方
3. 分断化と組込アプリの省電力処理
4. セキュリティホール例と対策
3
TS-# TS-6
日高 正博
Android フレームワークからアプリケーションレイヤまで。Dalvik VM/メモリ管理、デバイス制御が得意
自己紹介
Account
@mhidaka
4
TS-# TS-6
1.Androidの歴史から未来を考える
5
TS-# TS-6
1.Androidの歴史から未来を考える
6
TS-# TS-6
Androidの進化
• UIの洗練:タッチパネルに特化
• ハードウェア処理能力向上、大画面化
7
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
TS-# TS-6
Androidの歴史(2)
• Android 1.X (Cupcake / Donut)
• 2008年暮れ~2009年
最初のAndroid端末がリリース
– Gmail、Google Maps、YouTube
– Activity、Serviceなどアプリ基本
– WiFi、Bluetooth、無線環境
–ハードウェアAPIの搭載
9
TS-# TS-6
ハードウェアを抽象化する仕組み
多様な入力デバイスをまとめ、アプリに提供
10
TS-# TS-6
Androidの歴史(3)
• Android 2.X (Éclair, Froyo, Gingerbread)
– 2010年、スマートフォンとしての地位を確立
• 速度向上:JITコンパイラの導入、2~5倍の向上
• ブラウザ高速化、OpenGL ES 2.0対応
• 外部ストレージ、クラウド連携機能によるプッシュ配信
11
TS-# TS-6
広がる利用シーン
家庭、ビジネス、生活のなかでAndroidをプラットフォームとしたサービス、製品の提供
ホーム ビジネス
ネットワーク化の推進:スタンドアロンで動作しているデバイスと繋がる
12
TS-# TS-6
Androidの歴史(4)
• Android 3.2 (Honeycomb)
– Android 3.0~3.2はタブレット向けに用意
–スマートフォンに搭載されることはないものの重要な技術が多く採用され、のちのAndroid 4.0に継承
13
TS-# TS-6
Androidの歴史(5)
• Android 4.x (Ice Cream Sandwich, JellyBean)
– 2012年~、UIを洗練し、大画面化
–応答性を改善 ハードウェア割込を活用して
描画、タッチ操作向上
–マルチユーザー、アシスタント検索
– NFCデータ交換「Android Beam」
14
TS-# TS-6
Android搭載製品例
15
TS-# TS-6
Androidの未来
16
TS-# TS-6
NFC
•タッチするだけでデータ交換
• Android Beam、非接触ICカードの
読み書き
Bluetooth
•パーソナル(個人利用を主とした)ネッ
トワークの構築
•高音質なハンズフリー、健康機器に
対応したHDPを搭載
WiFi
•最も普及している無線規格
各デバイスとの高速接続
•Wi-Fi Directではピアデバイス通信、
P2Pが可能に
USB
•既存の汎用デバイスと接続
•マウス、キーボードによるUI拡張など
• USB Host、アクセサリ開発(ADK)対
応
17
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
TS-# TS-6
• 各ネットワーク機能の特徴
種類 説明
NFC Android Beamではタッチするだけで通信が可能
転送量が小さい。通信時の暗号化は未考慮
Bluetooth オーディオ接続など。用途ごとプロファイルを用意
ペアリングが必須。Low Energyは未対応
WiFi インターネット接続。高速ネットワーク通信が可能
アクセスポイント設定が煩雑、利用範囲が限定
USB 汎用機器が利用可能、HID、HOST等をサポート
開発の難度が高い。シンクロナス転送は非対応
ネットワーク機能の使い分け
19
TS-# TS-6 20
2. 開発を効率的に進めるために
株式会社ブリリアントサービス
シニアエンジニア 住友孝郎
TS-# TS-6
自己紹介
• 住友 孝郎
• 所属:株式会社ブリリアントサービス
• 業務経歴
– 産業機器向けアプリ開発(MFC)
– 製造業向けWebシステム開発(Java)
– 家電製品向けAndroidアプリ開発
• モバイル、センシングデバイス
– Androidアプリ開発
– Android+Arduinoを用いたロボット開発
21
TS-# TS-6
「開発を効率的に進めるために」のポイント
• Androidアプリ開発の特徴
– Android OSやSDK(開発キット)に
どのような開発ツールが整備されているか
• Androidアプリ開発の問題と対策
–実際の開発現場で発生した問題と解決策
22
TS-# TS-6
Androidアプリ開発の特徴
23
TS-# TS-6
Android OSの特徴
• JavaだけどJavaではない
–モバイル向けの独自バーチャルマシン
「Dalvik VM」の採用
• Webやデータベースなど複数ジャンルの技術を同時に利用する
– OSS、既存技術の有効活用
24
TS-# TS-6
汎用的なモジュールは整備済
• 画面のレイアウトを作りたい
– XMLで記述、ロジックとの分離
• マルチスレッド化したい
– 非同期実行用 AsyncTaskクラス、Handlerクラス
• ネットワークプログラミング
– 通信機能をまとめたHttpClientクラス
• データベースを使いたい
– SQLiteが整備、SqliteOpenHelperクラス
• 異なるジャンルの機能がAndroidフレームワークに 取り込まれており、おいしいところを利用できる
25
TS-# TS-6
Android SDKに含まれるツール
• 標準ツールだけで開発のほぼ全てが行える
– Eclipseの開発支援機能
– コーディング、リファクタリング
– デバッグ機能(ブレークポイント、デバッグ等)
• 便利なAndroid開発のツール
– レイアウトを確認したい → Hierarchy Viewer
– テストの自動化 → JUnit、monkeyrunner
– パフォーマンス測定 → traceview
– メモリ解析を行いたい → hprof-conv
26
TS-# TS-6
Androidアプリ開発の問題と対策
27
TS-# TS-6
開発の壁
• UI、マルチスレッド、データベース、HTTP等の広い範囲の知識とスキルが必要
• 関連する知識とスキルが多いため、
コードの複雑化が発生しやすい
• デバイスの種類が多岐に渡るため、
テストが大変
28
TS-# TS-6
何故、幅広いスキルが必要か(1)
• 今までは分野間の交差が少なかった
–スタンドアロンアプリ(MFC,C#,Java)
• UI、マルチスレッド、DB
– コンシューマ系Web • UI、DB、HTTPのスキルが必須
• マルチスレッドはほとんどフレームワークが吸収する
–業務系Web
• コンシューマ系Webに近いが異なる
• UIは帳票ベースが多い
• 製造業やサービス業などでも異なる
–組込系 • UI、マルチスレッド、DB(独自が多い)
29
TS-# TS-6
何故、幅広いスキルが必要か(2)
• Android OSは各分野のベストプラクティスが集められている
– UI構築環境
• XMLで記述、ロジックとUIが分離、HTML,JS+CSSに似た考え方
– マルチスレッドプログラミング
• Javaのスレッドモデルが利用可能
• シンタックスシュガーも整備されている
– データベース処理
• フレームワークにSQLiteDatabase3が含まれている
• ACID特性はフレームワーク側で保証している
– ネットワーク(HTTP通信)
• フレームワークにHttpClient(ライブラリ)が含まれている
30
TS-# TS-6
煩雑化する作業を如何に抑えるか
• 各目的のベストプラクティスを把握する
–独自実装を避け、フレームワークに任せる
• 標準の開発ツールの目的を理解する
–ツールで解決できる問題はツールで解決する
31
TS-# TS-6
開発で使用できるもの
• 標準ツールだけで開発のほぼ全てが行える – 統合開発環境 Eclipse
– Android端末エミュレーターの整備
– タスクトレース機能 TraceView
– レイアウト解析 Hierarchy Viewer
• 汎用のJava開発用のツールが使える
– Memory Analyzer(メモリのリーク解析)
• Webアプリ、スタンドアロンアプリなど
別ジャンルの手法を応用可能
• Junitによるテスト自動化
32
TS-# TS-6
複雑化を避けるために
• UI、マルチスレッド、DB、Webは相互依存を減らし、独立して実装する
• 整備されているシンタックスシュガーを使用する – 独自スレッド実装よりAsyncTaskクラスを使う
– 独自DB構築よりSQLiteOpenHelperクラスを使う
• JUnitのユニットテストを作成する
33
TS-# TS-6
JUnitによるテストの自動化
• どのようなテストが行えるか
– UI操作、キー操作、タッチ操作、画面遷移
– タスク
– サービス
– データベース
• JUnitでユニットテストが作成できないものはたいてい結合度が高いことが要因
• 作成したテストは異なる端末でも実行可能
作成コストは運用で回収できる
34
TS-# TS-6
実例1:ビジネスロジックとDBアクセス
• 結合されている場合、単独でテストできない
– ビジネスロジックを実行してDBを確認するのが限界
• 管理用クラスを作って責任を明確にする
– 管理用クラスに絞ってテストができる
ビジネスロジック1
アクセス用処理1
ビジネスロジック2
アクセス用処理2
ビジネスロジック3
アクセス用処理3
DB
DB管理クラス
ビジネスロジック1
アクセス用処理1 ビジネスロジック2 アクセス用処理2
ビジネスロジック3
アクセス用処理3 DB
35
TS-# TS-6
まとめ
36
TS-# TS-6
効率化まとめ
• 広い範囲の知識とスキルが必要な問題
→標準ツールの使い方と目的を理解する
• コードが複雑化する問題
→各モジュールを理解したリードプログラマを配置
• デバイスの種類が多くテストが大変な問題
→実装の複雑化を避ける
→テストの自動化を行う
37
TS-# TS-6 38
3. 失敗する前に知っておく事
株式会社ブリリアントサービス
チーフ・藤田 竜史
TS-# TS-6 39
自己紹介
• 藤田 竜史(ふじた りゅうじ)
• 所属:株式会社ブリリアントサービス
• 業務経歴
– Androidプラットフォーム開発
– Androidシステムアプリケーション開発
• その他
– Android Hacks執筆
– ARアプリケーション開発(ウキウキView)
– AOSPコントリビュート
TS-# TS-6 40
Jelly Bean
(33%)
Gingerbread
(36%)
Ice Cream Sandwich
(25%)
Androidの分断化 その1
• プラットフォームバージョン
– 市場にはさまざまなプラットフォームバージョンのデバイスが溢れている(Google調べ)
TS-# TS-6 41
Normal
(79%)
xhdpi
(25%) hdpi
(36%)
mdpi
(23%)
Androidの分断化 その2
• 画面サイズ/画面密度
– Androidデバイスは、画面サイズと画面密度の組み合わせによって定義される(Google調べ)
• 画面サイズ : 4種類
• 画面密度 : 6種類
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)
TS-# TS-6 43
Androidの分断化 まとめ
• Androidの分断化は激しさを増している
• 製品レベルの対応を行うのは大変
• Androidデバイスの互換性
• メーカー独自実装
TS-# TS-6 44
通常状態 スリープ
状態
ディープ
スリープ状態
バックライト
ON/OFF ある一定の条件時
アプリケーションと省電力
• デバイスは常に動き続けるわけではない
– カーネルのパワーマネージャーによって電力管理が行われている
TS-# TS-6 45
ディープスリープとは?
• 画面が消えていて、CPUも止まっている状態
• 状態変化するトリガは?
– デバイスによってまちまち(ハードウェアの省電力設計に依存する)
※USBケーブル接続中は状態変化しない
※WakeLock取得中も状態変化しない
TS-# TS-6 46
CPUが止まるとは?
• 一部のシステム時刻が停止する
– SystemClock#uptimeMillis()
• システム時刻が止まると・・・
– タイマー処理が停止する
– ハンドラのメッセージ送信が停止する
– スレッドスリープ処理が停止する
ディープスリープ中は、SystemClock#uptimeMillis()によるカウントが停止するため、このメソッドを使用している仕組みは働かなくなる
TS-# TS-6 47
回避策はないのか?
• AlarmManagerを使用する
– タイマー種別に合わせて、スケジュールの設定を指定する
タイマー種別 SystemClock 使い方
ELAPSED_REALTIM
E_WAKEUP
elapsedRealtime() デバイスが起動してからの時間を指定
RTC_WAKEUP currentTimeMillis() 時刻を指定
ディープスリープ中でもSystemClockはカウントされるため、復帰が行われる
TS-# TS-6 48
回避策はないのか?
• WakeLockを取得する
– Android特有のカーネルの機能
• 注意してください
– WakeLockを取得したら解放する
– 必要なときだけ取得する
解放を忘れるとディープスリープ状態に遷移しないため、
電池消費が激しくなる!
TS-# TS-6 49
アプリケーションと省電力 まとめ
• Androidデバイス(カーネル)の仕組みを知っておく必要がある
• ユーザーの利用シーンを想定した試験を用意
TS-# TS-6 50
アプリケーションとデザイン
• デザインはアプリケーションの顔
– ユーザーの評価対象になる
• 使い方説明よりも直感的な操作を
• 見た目の重要性
TS-# TS-6 51
画面密度に合わせたデザイン設計
• ピクセル単位での設計は論外
– DP単位での設計が必要
静的解析ツール(Lint)によって警告される
TS-# TS-6 52
画面密度ごとにリソースを用意
• コストはかかるが粗が見えやすいポイント
mdpi用のサイズで作成したアプリケーションアイコンと
xhdpi用のサイズで作成したアプリケーションアイコンの
表示比較(xhdpiデバイス上)
TS-# TS-6 53
一つのリソースを使いまわす
• Androidによって行われる拡大縮小の概念の理解が必要
– mdpiをベースラインとし、それぞれの画面密度に対し拡大縮小が行われる
TS-# TS-6 54
デバイスに合わせたレイアウトを用意
• デバイスのサイズや向きに合わせたレイアウト
デバイス 向き(デフォルト)
モバイル ポートレート
タブレット ランドスケープ
テレビ
TS-# TS-6 55
Supportライブラリの活用
• Honeycombで追加されたUIをGingerbread
でも動かしたい
– フラグメント
– アクションバー
– ノーティフィケーション
• One APKの実現
– Supportライブラリの活用でGingerbreadでも動かせることができる
– 機能にいくつか制限あり
TS-# TS-6 56
アニメーションを使う
• インタラクティブ性の向上
– 不要な文字列の表示を防ぐ
– アニメーションすることでユーザーは「処理が行われている」ということを実感する
– 過度なアニメーションは控えて・・・
更新中・・・
TS-# TS-6 57
アプリケーションとデザイン まとめ
• デザインは楽しい
• ユーザビリティやユーザーエクスペリエンスを念頭に
TS-# TS-6 58
4. セキュリティで失敗しないためには
TS-# TS-6
自己紹介
木村 尭海(きむら たかうみ)
会社:AVCマルチメディアソフト株式会社
業務経歴
家電連携アプリケーション開発
個人でのアプリ開発
Android
WindowsPhone7
Twitter:@muchiki0226
59
TS-# TS-6
発表の流れ
Androidのセキュリティとは
セキュリティホールになりやすいケース
難読化の範囲の罠
ファイル保存の危険性
インテントの恐ろしさ
WebViewの落とし穴
開発時のポイント
60
TS-# TS-6
Androidセキュリティ
Androidのセキュリティに注目が集まっている
不具合報告が増加
セキュリティを重視したもの
日本スマートフォンセキュリティ協会
注意喚起のためのPDFを配布
セキュリティ専門の技術書登場
Androidセキュリティ勉強会
61
0
20
40
60
80
100
120
2010 2011 2012
5
21
118
報告件数
年
JVNデータ(2013/5月調べ)
TS-# TS-6
Androidセキュリティ
セキュリティを確保するにはどうするのか
セキュリティで狙わられる場面は決まっている
失敗例にはパターンがある
セキュリティを向上させるには
パターンを抑えることで最低限の防御策になる
62
手口は日に日に増えるので常にアンテナを張ることが大事 手口は日に日に増えるので常にアンテナを張ることが大事
TS-# TS-6
アカウントが漏洩したケース
暗号化なしで個人情報を端末に保存
ユーザー名
住所
アカウント名
電話番号
etc…
63
アプリA アプリB
暗号化無しの
個人情報
TS-# TS-6
問題が起こってからではもう遅い
セキュリティホールのリスク
他者への攻撃の踏み台や個人情報の流出
どうしてセキュリティホールが出来てしまうのか
Androidの仕組みを理解していない
悪意のある人の存在(攻撃からの防御)
64
TS-# TS-6
セキュリティ事故を未然に防ぐには
65
知らないということが個人情報を漏洩させる
難読化したのに
どうして? WebViewを使った
だけでも事故に
つながるのか?
Androidの作法
通りに実装したはず…、
漏れてしまったのは
なぜだろう?
アクセス権限を与え
ていなくてもファイル
を読み取られる?
TS-# TS-6
セキュリティホールになりやすいケース
アプリケーション開発の注意
難読化される範囲に罠がある
迂闊なファイル保存に危険が潜む
Root端末の対策について
フレームワークも取り扱い注意
インテントは共有機能、情報秘匿の難しさ
WebViewの落とし穴とは?
66
TS-# TS-6
難読化される範囲に注意
難読化の罠にかかりやすいアプリ
HTMLを利用したレイアウトを持つ
リソースファイルを保持しているアプリ
ハイブリッドアプリ
iOSとAndroidを両方のアプリをターゲットに開発
PhoneGapを利用したHTMLベースのアプリケーション
67
共通点はAssets/Rawフォルダを利用するアプリケーション 共通点はAssets/Rawフォルダを利用するアプリケーション
TS-# TS-6
難読化の範囲の罠
Androidアプリのインストール形式
「APKファイル」の特性
zip形式で圧縮
Java実行ファイルの中間コード(dex)
リソースファイル(res,asset,bin)
APKの入手性
Google Playマーケット以外にも
Androidのデバッグツール「adb」 APKを二次配布している海外サイト
68
解析が容易
入手が容易
TS-# TS-6
難読化の範囲の罠
iOS/Android両対応PhoneGap製アプリ
プロジェクト構成
69
プロジェクト APK
TS-# TS-6
難読化の範囲の罠
70
フォルダ APK
解凍
TS-# TS-6
難読化の範囲の罠
71
フォルダ APK
解凍
Assetsフォルダと フォルダの Assetsフォルダとres/rawフォルダの
中身はそのまま取り出せる!!
TS-# TS-6
難読化の範囲の罠
ハイブリッドアプリでの注意
ソースコードが閲覧可能
JavaScriptを解析されてコード上の不備を利用されるケースを考慮する必要
Assets/Rawフォルダ利用上の注意
通常のリソース(画像、音声データ)と一緒に
暗号化キー(秘密鍵)を同梱しない
悪用される可能性が高い
72
TS-# TS-6
難読化の範囲の罠
対策
セキュリティが必要な箇所はAndroid NDKの利用
C/C++によるバイナリ化で解析を防御
※完全に防げるわけではないがカジュアルハックを予防
暗号化の鍵はネットワーク上に置く
サーバー認証、ワンタイムパスワードの活用
73
TS-# TS-6
ファイル保存の危険性
ファイル保存される位置を把握
フレームワークで隠ぺいされている
強く意識しない
→気付かず危険な処理を行っている
保存できる場所は2種類
外部領域
SDカード
内部領域
ストレージ領域
アプリケーション領域
74
TS-# TS-6
ファイル保存の危険性
外部領域のファイル保存
PCと接続する
リムーバブルディスク、SDカード扱い
保護機構がなく防御に課題
セキュリティにおいて脆弱
→防御対象に関わるものをおいてはいけない
75
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
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ファイルになる
TS-# TS-6
ファイル保存の危険性
対策フロー
防御対象の性質によりケースバイケース
78
非公開情報 非公開情報 拡張領域
高度なセキュリティ 高度なセキュリティ
暗号化してアプリケーション領域
or
ネットワーク上に置く
アプリケーション領域
はい
いいえ
TS-# TS-6
インテントの恐ろしさ
インテントとは
Androidにおけるアプリ連携の機能
非常に便利な機能
別アプリにデータを渡すことが出来る共有機能
例:メールアプリにメッセージ部分を渡す
情報の公開を前提とした共有機能
隠ぺいが困難
79
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);
TS-# TS-6
インテントの恐ろしさ
なりすますことが容易
システムログなどからIntentの中身を参照、
受信者に成りすますことが可能
キーがわかればデータを取り出せるようになる
81
アプリA アプリC(アプリBになりすます)
TS-# TS-6
インテントの恐ろしさ
対策
独自パーミッションを利用して受信に制限
android:protectionLevel
証明書が同じ必要がある「signature」の利用(自分が許可したアプリ以外は受信できなくなる)
82
アプリA アプリB
証明書A 証明書A 証明書A 証明書A
TS-# TS-6
インテントの恐ろしさ
対策
独自パーミッションを利用して受信に制限
android:protectionLevel
証明書が同じ必要がある「signature」の利用(自分が許可したアプリ以外は受信できなくなる)
83
アプリA アプリC
証明書A 証明書A 証明書B 証明書B
TS-# TS-6
インテントの恐ろしさ
対策
Intentの範囲を内部に絞り、不用意に公開しない
84
アプリA
アクティビティB アクティビティA
TS-# TS-6
WebViewの落とし穴
WebViewの特性を理解しないと危険
多くのセキュリティホール事例が報告
セキュリティ事故は大きく2パターンに分類
キャッシュの生存期間
ローカルストレージへのアクセス制御
85
TS-# TS-6
WebViewの落とし穴
キャシュの保存内容
ID/パスワード
ページの閲覧履歴
キャッシュの場所は固定
/data/data/パッケージ名/databases/webview.db
フォルダの権限で守られている
暗号化されていない
86
DBが取り出されると目視でIDとパスワードが抜き取れる DBが取り出されると目視でIDとパスワードが抜き取れる
TS-# TS-6
WebViewの落とし穴
対策
WebViewキャッシュとアプリの生存期間を同一に
タイミングが重要
onPauseが呼ばれるタイミングが理想(画面表示中に限定)
ユーザーが操作していないタイミング
ロック画面から復帰時
アプリの再立ち上げ時
アプリの終了時
webview.clearCache();
87
TS-# TS-6
WebViewの落とし穴
WebViewはローカルファイルにアクセス可能
file://によるコンテンツアクセス(URI指定)に対応
88
WebView
ファイルシステム
file://~
TS-# TS-6
WebViewの落とし穴
バックグラウンドでファイルロードができる
JavaScript
WebSocketを用いるとネットワーク上に送信できる
89
挙動に変化はないがファイルを送信することができる 挙動に変化はないがファイルを送信することができる
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var file = fs.OpenTextFile(“file://【ファイルパス】", 1);
たったこれだけでファイルが読み込まれる たったこれだけでファイルが読み込まれる
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月調べ)
TS-# TS-6
アプリを作るときのポイント1
難読化の適応範囲を意識する
セキュリティに関わる処理はNDK
NDKでも限界があるため、耐タンパ性はソフトウェアで実現可能な領域をでない
Web/HTML利用アプリには向き/不向きがある
フロントエンドとしては優秀だが安易に選択しない
ファイルが保存される位置を意識する
ユーザーが触れる領域か
他のアプリからはアクセス不可か
91
TS-# TS-6
アプリを作るときのポイント2
インテントに付与する情報を意識する
セキュリティに関わる情報をインテントに付与しない
インテントの公開範囲、権限を制限する
WebViewの特性を意識する
JavaScriptを許可しない
キャッシュの生存期間
92