Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

5,728 views

Published on

ET West 2013 テクニカルセッション

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

  • Dating direct: ❤❤❤ http://bit.ly/2u6xbL5 ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ♥♥♥ http://bit.ly/2u6xbL5 ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

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

×