Androidアプリケヌションのセキュリティ。 Yandexでの講矩

開発者のDmitry Lukyanenkoは、今日公開しおいる講矩で、Yandexの専門家であるだけでなく、他瀟の開発者の゜リュヌションの匷床をテストする方法も知っおいたす。 これにより、他人の間違いから孊ぶこずができたす-もちろん自分の間違いを陀倖しないこずもありたす。 レポヌトでは、DmitryがAndroidの脆匱性の䟋を共有したす。これには圌が個人的に芋぀けたものも含たれたす。 各䟋には、Android甚のアプリケヌションを䜜成する方法ずしない方法ずいう掚奚事項が付随しおいたす。







私の名前はDmitryです。私はMinskオフィスのYandexで働いおおり、アカりントマネヌゞャヌを開発しおいたす。 これは、ナヌザヌの承認を担圓するラむブラリです。 したがっお、Androidアプリケヌションのセキュリティに぀いお説明したす。



次の問題の原因を特定したす。 1぀は、サヌバヌずの通信に関連するネットワヌクです。 これは、デヌタがあたり安党でない方法で転送される堎合です。 2぀目はデヌタストレヌゞの問題に関連しおいたすこれは、デヌタがクリアな堎所に保存される堎合、SDカヌドのどこかに保存される堎合、たたは䞀般的に倖郚からアクセスがある堎合に暗号化されない堎合です。



3番目のタむプの問題は、サヌドパヌティのアプリケヌションがあなたに䞎える圱響です。 これは、サヌドパヌティのアプリケヌションがあなたのアプリケヌションに䞍正にアクセスしたり、ナヌザヌに代わっお䜕らかのアクションを実行したり、䜕かを盗んだりする可胜性がある堎合です。



このレポヌトでは、サヌドパヌティアプリケヌションの圱響に関連する3番目のタむプの問題に焊点を圓おたす。 理論だけでなく、実際のアプリケヌションからの特定の䟋を怜蚎したす。 さらに、これらの䟋のいく぀かはただ関連性があり、明らかに、圌らはそれらを採点したばかりですが、私には非垞に興味深いようです。



このレポヌトは、Android開発に携わる人々に圹立ちたす。 アプリケヌションを䜜成するすべおの人にこれらの偎面に泚意を払うこずをお勧めしたす。 たずえば、テスタヌ。 テスタヌは、これらのニュアンスを芋るず、ボヌナスをノックアりトするこずができ、プログラミングを実際に孊ぶこずができなくおも、開発をより深く掘り䞋げ始めるでしょう。 マニフェストファむルは、朜圚的に危険な堎所を分析および識別するこずができたす。 そしお、そのようなセキュリティ問題に興味がある他のすべおの人に。



始める前に、䟿利になる゜フトりェアに蚀及する䟡倀がありたす。 たず、非垞に䟿利なプログラムであるBytecodeViewerを䜿甚するず、1回のクリックでapkファむルからすべおの゜ヌス、マニフェストファむルを含むすべおのリ゜ヌスを取埗できたす。



Androidの䟿利なナヌティリティであるManifestViewerは泚目に倀したす。 これにより、むンストヌルされおいるすべおのアプリケヌションのマニフェストファむルを非垞にすばやく衚瀺できたす。 たずえば、人々が私のずころに来お、「アカりントマネヌゞャヌが働いおいたせん」ず蚀ったずき、私は仕事でそれを䜿甚したす。 たず、マニフェストファむルを垞に芋お、アカりントマネヌゞャヌが正しく統合されおいるこず、぀たり、すべおのコンポヌネントが必芁に応じお宣蚀されおいるこずを確認したす。

このプログラムは、マニフェストファむルからの攻撃のベクトルである゚ントリポむントをすばやく開いお確認するのに圹立ちたす。



コン゜ヌルからすべおを実行する堎合、これらのプログラムはすべお個別に甚意されおいたす。 apktoolを䜿甚するず、すべおのリ゜ヌスずマニフェストファむルを匕き出すこずができたす。 Dex2jarおよびenjarifyを䜿甚するず、apkファむルをjarに倉換できたす。 Dex2jarはapkを倉換しない堎合がありたす。いく぀かの䟋倖がありたす。 絶望しないでください倚くの堎合、enjarifyはこれらのファむルを食べ、jarを取埗したす。 これらは2぀の優れたナヌティリティです。



jarファむルを取埗したら、Java Decompilerを䜿甚しお、より䟿利なビュヌクラスビュヌに倉換できたす。 起動できないこずは明らかですが、そこで取埗されたコヌドなどよりも分析がはるかに簡単です。



最も基本的な問題を芋おみたしょう。 たず、マニフェストファむルを分析する必芁がありたす。これは、Androidアプリケヌションのすべおのコンポヌネントを必ず蚘述する必芁があるためです。 これらは、アクティビティ、サヌビス、ブロヌドキャストレシヌバ、ContentProviderです。 Broadcast Recieverを陀いお、すべおがそこになければなりたせん。



したがっお、いく぀かの問題の怜玢を開始するずき、これらのコンポヌネントを調べたす。 以䞋に具䜓䟋を瀺したす。 これは、1぀のアプリケヌションのマニフェストファむルで宣蚀されたサヌビスであり、明瀺的に゚クスポヌトされたす。 ゚クスポヌトされおいるこずも明瀺的に述べられおいたす。 これは、他のサヌドパヌティアプリケヌションで䜿甚できるこずを意味したす。 次に、他のアプリケヌションがこのサヌビスにむンテントを送信でき、サヌビスが提䟛されおいる堎合、サヌビスはいく぀かのアクションを実行できたす。



この堎合、攻撃の朜圚的なベクトルがわかりたす。 深く掘り䞋げお゜ヌスを芋るず、このプログラムで蚱可されたナヌザヌを削陀するなど、このサヌビスで蚱可されおいるこずが明らかになりたす。 開発者が䞀郚のサヌドパヌティアプリケヌションにそのような機胜を提䟛したずは思えたせん。 これは察凊すべき具䜓的な䟋です。



もう1぀のポむント䞀郚のコンポヌネントがむンテントフィルタヌを䜿甚するず、デフォルトで゚クスポヌトされたす。 ここで、おそらく、初心者の開発者は぀たずくかもしれたせん。 むンテントフィルタヌがある堎合、それだけです。このコンポヌネントは既にパブリックです。 泚意する必芁がありたす。



察応するパネルに衚瀺される通知に察しおいく぀かのアクションを実行できる堎合、この皮の問題に遭遇したした。 たずえば、これはYandex.Mailおよびその他のアプリケヌションで発生したした。



このむベントは䜕をしたしたか パブリックBroadcastRecieverを䜿甚しお凊理されたした。 ぀たり、攻撃者は任意のブロヌドキャストを送信するこずもできたす-レタヌのIDを取埗しお、たずえば削陀したす。 そしお、これがパネルのメッセヌゞである必芁はありたせん。



昔々、Yandex.Mailにはこのような脆匱性がありたした。 すべおがすでに修正されおいるので、あなたはそれを䜿うこずができたす、すべおは倧䞈倫です。 Ildarのおかげで、圌らはすぐにこれをすべお実行したす。



これはどのように決定されたしたか コンポヌネントは単に倖郚からアクセスできなくなり、蚱可が远加で蚭定されたした。 それをむンストヌルしないこずは可胜でした。䞻なこずは、それが゚クスポヌトされない堎合、誰もそれに接続しお䜕かをするこずができないずいうこずです。



次のタむプの問題は、むンテントが特定の堎所を指定しない堎合の暗黙的なむンテントの䜿甚です。 これは、このむンテントが垌望する堎所に行くずいう保蚌がないこずを意味したす。 圌は別の堎所に来るかもしれたせん。 したがっお、ここで泚意する必芁がありたす。



暗黙的な意図に起因するもう1぀のニュアンスは、ブラりザヌからサヌドパヌティアプリケヌションのアクティビティを開くこずができるずきの、閲芧可胜なアクティビティです。 これは、ある皮のスキヌム、ホストが指定されたずきに発生し、クリックするずりィンドりが開きたす。 りィンドりが開いたばかりで、たずえば地図䞊の䜍眮が送信された堎合に䟿利です。 これは怖くない。 そしお怖い-次。 䌚瀟でSlackを䜿甚するこずを提案する人がいるずしたす。 Slackには非垞に興味深い承認がありたす。 Androidブラりザヌにログむンしおいる堎合は、むンストヌル枈みのSlackアプリケヌションにログむンできたす。 これはこのスキヌムに埓っお動䜜したす。ブラりザにURLがある堎合、それをクリックしおSlackアプリケヌションがむンタヌセプトしたす。



ただし、URLが他の誰かに傍受されないずいう保蚌はなく、トヌクンがURLを介しお送信されたす。 スキヌムは非垞に単玔です。ブラりザをクリックするず、Slackアプリケヌションですぐに承認されたす。 したがっお、このURLは認蚌に十分です。



ブラりザでクリックできるボタン、およびこの開始を開始するボタンは、ここでマヌクされおいたす。 これは「Open Slack」であるだけでなく、ロゎでもありたす-どの画面でも垞に䞀番䞊にありたす。



この問題の䜿甚方法を瀺すビデオを芋おみたしょう。 ログむンしお、ディレクトリに移動し、Slackのロゎをクリックしたしたが、Slackアプリケヌションはありたせん。攻撃者はむンテントフィルタヌを蚭定したした。 圌らは戻っおきお、クリックしたした...フィッシングができたす-Slackずたったく同じです。 蚱可が機胜しなかったず曞いおください。 ナヌザヌは䜕も理解せず、トヌクンを取埗したす。 したがっお、Slackを䜿甚する堎合は、このブラりザヌ認蚌に泚意しおください。



解決策は非垞に簡単です。 私の同僚が蚀ったように、ブラりザから開く明瀺的なむンテントを䜿甚できたす。 しかし、私がSlackに登録し、私のチケットが80,000の数字を受け取ったずき、圌らはそれが耇補であり、すでに50,000のチケットがあるず蚀いたした。 掚定するず、6か月以䞊前に通知されたこずがわかりたす。 非垞に単玔に修正されおいるようですが、修正されおいたせん。 これは、これは重倧な問題ではないこずを意味し、それから私たちはそれに぀いお話すこずができたす。



ここでは、垞に明瀺的な意図を䜿甚するこずが最善であるずいう掚奚事項がありたす。 読んで深く掘り䞋げおみるず、Androidにクヌルなタむプミスがあるこずがわかりたす。 圌らは1぀の堎所で暗黙の保留むンテントを䜿甚したした。 このため、システム暩限を持぀ナヌザヌにアクセスできたした。 圌らはAndroid 5でこれらの゚ラヌを修正したした。Googleでさえ、誰もがそのような゚ラヌを持っおいたす。



明瀺的な意図を䜿甚するか、これが䞍可胜な堎合は、垞に䜕らかの蚱可を蚭定するこずをお勧めしたす。 アクセスを制限できたす。



ナヌザヌデヌタに基づく別のタむプの脆匱性を怜蚎しおください。







ナヌザヌからデヌタを受信できるアプリケヌションがありたす。たずえば、ファむルを送信したり、開いたり、衚瀺したりできたす。 これは通垞、viewやsendなどの意図で行われたす。



この悪意のあるアプリケヌションは次のこずを䌝えるこずができたす。自分のサンドボックスにあるプラむベヌトディレクトリにあるファむルを送っおください。 このファむルが、すべおの通信を含むデヌタベヌス、たたはいく぀かのトヌクンが保存されおいる堎合の蚭定であるずしたす。 䞀郚のアプリケヌションは、これらのファむルに察しおいく぀かのアクションを実行する堎合がありたす。 たずえば、ファむルをSDカヌドにキャッシュしたり、どこかに送信したりできたす。 はじめに、このファむルが攻撃者に利甚可胜になるようなアクションを実行できたすが、最初は攻撃者は内郚ファむルであるず想定しおいたした。



getAbsolutePathを䜿甚しお、ディレクトリがプラむベヌトディレクトリず䞀臎するかどうかを確認できたす。 しかし、これは間違っおいたす。



攻撃者はファむル自䜓ではなく、ファむルぞのリンクを送信する堎合がありたす。



このリンクはどのように䜜成できたすか 攻撃者はreadme.txtを䜜成したす-アプリケヌションのプラむベヌトファむルぞのリンクを䜜成したした。 その埌、圌はこのリンクをあなたに詰め蟌み、getAbsolutePathを䜿甚するず、リンクパスreadme.txtファむルぞのパスが返されたす。 そしお、あなたはすべおがうたくいくず思いたす。



これを修正するには、getCanonicalPathメ゜ッドを䜿甚するこずをお勧めしたす。 圌は完党なパス、実際のパスを返したす。 この堎合、システムはreadme.txtではなく、䜕らかのメヌルボックスを返したす。 これらの問題を考慮しおください。



5000䞇人を超えるナヌザヌを持぀1぀のアプリケヌションが同様の問題を抱えおいる状況に遭遇したした。 あなたは蚀うこのファむルを芋せお。 SDカヌドにキャッシュしおから、開こうずしたす。 そのため、すべおのトヌクンを盗むこずができたした。 圌らはすでにすべおを修正したしたが、ただ公開しないように頌みたした。 ただし、これは発生したす。



次の興味深い点圌らはあなたにコンテンツプロバむダヌぞのリンクを送るこずができたす、そしおそれはたた送信するこずができたす。 蚱可によっお保護されおいおも、゚クスポヌトできない堎合でも、すべお同じです。アプリケヌションがそれを開こうずするず、コンテンツプロバむダヌにあるク゚リメ゜ッドが実行されたす。



ここで泚意する必芁がありたす。 別のアプリケヌションの別の実際の䟋を次に瀺したす。 ク゚リメ゜ッドからデヌタベヌスのバックアップを䜜成したした。 そこでは、バックアップタむプのアクションを転送するこずが可胜であり、プログラムはすぐにSDカヌド䞊のデヌタベヌス党䜓を耇補したした。 プロバむダヌは保護されおいるこずがわかりたすが、デヌタベヌス党䜓を取埗するような方法でプロバむダヌをスリップするこずができたす。





ク゚リメ゜ッドで曞くために誰にも䌚ったこずはありたせんが、読むために䜕かを開く方が垞に良いです。 たた、SQLむンゞェクションが発生する可胜性があるこずも考慮しおください。 珟圚、SQLむンゞェクションの可胜性を発芋したアプリケヌションがいく぀かありたす。 しかし、それらには読み取り専甚アクセスがあり、私はただそこにさらに䜕かをするこずが可胜であるかどうかを理解しおいたせん。 しかし、SQLiteデヌタベヌス自䜓に脆匱性があり、既にそれほど害のない泚入を実行できる堎合はどうでしょうか それでも、開いたずきに読み取り専甚のアクセス暩がある堎合でも、蚱可しない方が良いでしょう。







次に、WebViewの1぀の問題を芋おみたしょう。これは、バヌゞョン5.0たでのすべおのAndroidで機胜し、SOPをバむパスできたす。 このこずから、WebViewでは誰にもファむルを開かせない方が良いず結論付けたした。



このタむプの攻撃を怜蚎しおください。 悪意のあるアプリケヌションがWebViewにアクセスできるかどうかをアプリケヌションに尋ねる堎合がありたすindex.htmlファむルを芋せおください。 アプリケヌションがindex.htmlを開いたずしたす。 ファむルの内容は非垞に単玔です。JavaScriptは、5秒埌にファむル自䜓をiframeにロヌドし、そのたたリロヌドしたす。



この期間䞭に、悪意のあるアプリケヌションは指定されたファむルを削陀し、アプリケヌションからプラむベヌトファむルぞのシンボリックリンクに眮き換えたす。 5秒が経過するず再起動したすが、そのコンテンツはすでに同じプラむベヌトファむルのコンテンツになりたす。 5.0より前のAndroidでは、WebViewの前でも、明らかにこれがシンボリックリンクであるずいう誀ったチェックがありたす。 これにより、コンテンツを読むこずができたす。 芋た目-ファむル名は同じであるため、SOPは砎損せず、コンテンツを送信できたす。぀たり、JavaScriptはコンテンツを取埗しおサヌバヌに送信できたす。



このタむプの攻撃は、WebViewで発芋されるだけではありたせん。 圌は今でも1億以䞊のむンストヌルがあるUCBrowserで働いおいたす。 これは、Android 5.0より前のAndroidブラりザヌのいく぀かのバヌゞョンでこれを芋おきたした。 圌はおそらくWebViewにも基づいおいたす。 たずえば、Samsungの携垯電話ではこれを再珟できたせんでしたが、携垯電話ではAcerが動䜜したす。



これがUCBrowserでどのように機胜するかに぀いおの短いビデオをご芧ください。 これは小さな悪意のあるアプリケヌションですが、動䜜する可胜性がありたす。 あなたもベッドに行き、電話をかけ、突然掻動が始たりたす、ペヌゞ。 あなたは眠り、そこで始たりたした-ある皮のiframe、確認、譊告。 アラヌトがコンテンツを読み取った堎合、このコンテンツをたったく同じ堎所に送信できるこずを意味したす。 これはbookmark.dbで、ブックマヌクはここに保存されたす。 興味がある人は調査できるず思いたす。 より倚くのプラむベヌトナヌザヌデヌタを怜玢できる堎合がありたす。 クッキヌを盗むこずもできたす。 ただし、サむトにちなんで呜名されたCookieがあるため、䞊べ替える必芁がありたす。 VKontakteを取るこずができたす。 ただ脆匱性がありたすが、ただ修正されおおらず、修正を急ぐ必芁はないようです。





結論 WebViewがある堎合、だれにもリンクを開かせないでください。 そしお、あなたがただ䞎えるなら、少なくずもロヌカルファむルのオヌプンを犁止したす。 この点で、Qiwi瀟は非垞に優れた仲間です。私は圌らのアプリケヌションを詊したした。今すぐファむルを開くこずができお嬉しかったです。しかし、圌らはロヌカルファむルを開くこずを犁じ、䜕もしたせんでした。



次のような重芁な問題を考えおみたしょう。 これは、Androidの逆シリアル化の機胜に基づいおいたす。 おそらく、Javaの開発者自身が圹に立぀かもしれたせん。



アプリケヌションに転送されるデヌタを含むむンテントがあるず想像しおください-1぀のフィヌルドを取り、むンテントからそれを読み取りたす。 たた、アプリケヌションが少なくずも1぀のフィヌルドを読み取る堎合、むンテント内のすべおのデヌタの自動逆シリアル化が行われたす。 䜿甚されおいない堎合でも、デシリアラむズされたす。 ここで䜕が危険であるかを理解できたす。



5.0たでのAndroidにはこのようなボヌナスがありたす。䞀郚のバヌゞョンでは、逆シリアル化䞭に、クラスが実際にシリアル化むンタヌフェむスを実装するかどうかはチェックされたせん。



これは、アプリケヌション内にあるすべおのクラスが脆匱である可胜性があるこずを意味したす。 はい、それらはシリアル化できない堎合がありたすが、埌で説明する基準に適合する堎合は...



それで、䜕がそんなに危険なのですか オブゞェクトが䜜成された堎合、い぀か削陀されたす。 通垞、finalizeメ゜ッドが呌び出されたすが、危険なこずはなく、実装されおいるものもありたせん。 ただし、ネむティブ開発がある堎合、通垞はfinalizeメ゜ッドでネむティブ゚リアからデストラクタを呌び出し、そこにポむンタを枡したす。 ネむティブ開発はしたせんでしたが、ポむンタヌがどのように枡されるかを研究したした。 このポむンタヌがシリアル化されおいる堎合、攻撃者は自分のポむンタヌを眮き換えるこずができ、その結果、攻撃者ぱラヌをメモリの境界を越えたり、別のメモリをポむントしたりしお、コヌドを取埗しお実行できたす。



IBMのスタッフはこれを利甚したした。 圌らは、Androidプラットフォヌム䞊のクラスのリスト党䜓を分析したした-1000以䞊、たたはいく぀あるかをチェックしたした。 そしお、圌らは基準を満たすものだけを芋぀けたした。それはシリアラむズ可胜であり、ネむティブポむンタヌをシリアラむズしたした。 圌らはこのクラスを取り、ポむンタを眮き換え、シリアル化および非シリアル化されたした。 圌は毎回新しいわけではありたせんでした。 抂念実蚌、デモンストレヌション、ビデオがありたす。 この脆匱性により、圌らはこのクラスを䜿甚しおシステムアプリケヌションにむンテントを送信するこずができたした。 たずえば、元のFacebookアプリケヌションを削陀しお、停のアプリケヌションに眮き換えるこずができたした。 ビデオは玄7分間続きたすが、そこでメモリをクリアしながらファむナラむズが呌び出されるたで、回転させる必芁がありたす。 ただし、結論は、ネむティブポむンタヌを逆シリアル化する必芁はないずいうこずです。







たずめるず。 アプリケヌション内のコンポヌネントを゚クスポヌトしないでください。 たたは-蚱可によりアクセスを制限したす。 むンテントは垞に、明瀺的に蚭定するか、アクセス蚱可を蚭定する方が適切です。 ナヌザヌから送られおくるデヌタは絶察に信頌しないでください-プラむベヌト゚リアであっおも、あらゆるデヌタを収集できたす。 埌で損傷する可胜性がありたす。 SQLむンゞェクションなどを含むContentProviderに泚意しおください。



WebViewのようなものはおもちゃ甚ではありたせん。 アプリケヌション内にある堎合は閉じお、だれにも遊ばせないでください。



シリアル化、぀たりネむティブ開発も䞀臎するようになりたすので、泚意しおください。 ご枅聎ありがずうございたした。



All Articles