update.結論:多分大丈夫です。...と言う冗談はこれくらいにして、ごく稀に大丈夫じゃないアプリがあるかもしれないのでまとめて見ました。逆に言うと以下2点に該当しないアプリは全部大丈夫(*1)なので、こんな記事読んでる暇あったら水瀬と山下のガンガンGAチャンネルでも見ていた方が有意義な時間を過ごせるかと思います。MR2)以下だPreferenceActivityを継承したクラスを使っている上記に該当する人はこの記事を読んでから水瀬と山下のガンガンGAチャンネル見てください。考えたらTargetSdkVersion19以上でも、PreferenceActivityをよく理解しないで使っている場合は脆弱性が存在する可能性があるので一番下に追記しますはじめにAndroidにはFragmentInjection脆弱性という恐ろしい脆弱性があります。他人が作ったアプリの任意の画面を好き勝手に表示してしまおう!さらに想定されてない動きもしてしまおう!っていうとても恐ろしい奴です。今回はこのFragmentInjection脆弱性についてまとめてみました。夏休みの自由研究みたいな感じです。Injectionのについて語るときに前提として知っておかなければならない単語があるので軽く説明します。そんなの知ってるよ!って方はこの章は飛ばしてください(bow)ActivityとFragmentの関係AndroidアプリにはActivityとFragmentという概念があります。どちらも画面を構成する要素で、Activityの上に何個かのFragmentを乗せていくイメージです。詳しい説明はこちらの記事とかが面白くてわかりやすいと思うのでオススメです!IntentとはActivityからActivityに画面遷移するときに用いるのがIntentという機能です。別のアプリのActivityに遷移することもできます。遷移先の画面を指定すると同時に、遷移先の画面に任意のパラメータを渡したり、なんてこともできます。ある例ですと、GoogleMapを使ってお店などを調べて、「ウェブサイト」ボタンを押すとChromeでお店のWebページが立ち上がる、などが馴染み深いと思います。Injectionってなぁに?上でIntentを使うと他のアプリに画面遷移したりパラメータを渡したりできると書きましたが、当然ですが何でもかんでも好き勝手に画面を呼び出せるわけではありません。いうか設定をしない限り、デフォルトで全てのActivityは他のアプリからは呼び出せないようになっています。GoogleChromeやGoogleMap、Twitterなどで外部のアプリから立ち上げてほしいActivityがある場合のみ、AndroidManifest.xmlの対象のActivityにexported="true"を指定し、外部アプリから起動可能にします。android:exported="true"/>この場合、NanaminActivityは外部アプリから呼び出せるようになっているので、下記コードのような記述で起動することができます。パラメータも投げることができます。"a-aiueo-");startActivity(intent);よく使う例だとLINEやTwitterなどでしょうか。投稿するテキストを他のアプリ(Chromeとか)から持ってきて起動、などよく使うと思います。こんな感じでテキスト付きでTwitterに飛ばしたりできます。冒頭にも書きましたが外部から起動できるActivityは開発者側が設定したActivityのみです。そこで、本来外部から起動できない画面を無理やり起動しちゃおう!ついでに不正なパラメータも渡しちゃおう!っていうのがFragmentInjectionになります。ある条件(課金とかパスワード入力とか)を満たしていないと本来開くはずのない画面を開けるようになっちゃう可能性があるってことですね。便利!!どうして起きるの?AndroidのフレームワークにはPreferenceActivityというActivityがあります。設定画面とかを簡単に作れちゃう便利な奴ですね。こいつは上にのっけるFragmentを指定するときにFragment#instantiate()を使っています。}}Fragment.instantiate()では上記のようにリフレクションを使ってクラスを呼び出しています。この時に呼び出すFragment名やパラメータ名、値はPreferenceActivityを起動した時のIntentのExtraで指定しています。PreferenceActivityを継承したクラスが外部アプリから呼び出し可能になっている場合、起動したいFragmentの名前、パラメータ名を攻撃者が知ってさえいれば、アプリ内の任意のFragmentに自由なパラメータを渡して起動することが可能になってしまいます。実際にやってみよう!それでは今回はAndroidに標準で入っているSettingアプリを攻撃してみましょう!こんな感じのアプリですね。今回は端末の画面ロックから復帰する時のPINパスワードを忘れてしまった時に便利なアプリを作ってみましょう!通常時、PINパスワードが指定されている状態でPINパスワードの変更を行おうとすると、今設定しているパスワードを聞かれる仕様になっています。忘れたから変えようとしてるっていうのに、全く使い勝手の悪いアプリですね。}}...どうやら"confirmCredentials"が悪さをして、確認画面を表示するようにしているようです。false"を指定してこの確認手順をスルーしようと思います。android:windowSoftInputMode="stateVisible|adjustResize"/>当然ですがChooseLockPasswordは外部からの起動ができないように設定されています。ここで先ほど紹介したFragmentInectionの出番です。上記でも書いたように、特定のFragmentを起動するためには、対象のFragmentの名前と、Intentで渡すパラメータの名前などが必要になってきます。今回対象のFragmentの名前は"ChooseLockPasswordFragment"だと言うことは分かっているので、パラメータ名を見ていこうと思います。...これでChooseLockPasswordFragmentには"confirm_credentials"という名前でパラメータを渡せばいいということが分かりました。次にSettingsに渡すパラメータ名を調べていきましょう。":android:show_fragment_args";ちょっと古いソースコード漁るの大変だったので最新ので勘弁してください......めっちゃ脆弱性対策のためのコメント書いてある気がするけど見なかったことに......このようにSettingsに渡すべきパラメータ名もわかりました。後はもう簡単!下記のようなソースレビューに出したら余裕で100回くらいNGくらいそうなソースコードを書くだけで、パスワードを忘れてしまった時のお役立ちアプリを作成することが出来ます。}}無事に、もともと設定してあるPINの確認手順をスキップすることが出来ましたここで任意のPINコードを入力すれば、PINコードを上書きして使うことが出来ます!これでもしPINコードを忘れてしまった時や、誰かが画面ロック解除した状態でケータイを放置しているのを見つけた時に新しいPINコードを設定することが出来ます!(よい子はマネしないでください)おわりに最初にもちらっと書きましたが、今は脆弱性の対策をされているので、TargetSdkVersionを19(KITKAT)以上に指定すればこのような脆弱性は存在しません。}コメントにもがっつり書いてありますが、現在はPreferenceActivityを継承したクラスを用いる場合はisValidFragment()をOverrideして、内部で開いてもいいFragmentの名前を指定する必要があります。上でTargetSdkVersion19以上なら大丈夫って書きましたが、それはまともにソースコードを書いている場合に限ることです。PreferenceActivityをよく理解せずに、レビューで100回くらいNG出されるようなコードを書いた場合は脆弱性が生じてしまう可能性があります。}見るからに怪しいですが、当然ダメです。なんのためにこのメソッドが用意されてると思ってるんですか。コメント読んでくださいって感じです。実装すると以下のようになります。}とりあえず動けコードはセキュリティ的にはやばい時もあるってことですね。HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。upLoginユーザーは見つかりませんでした。