CVE-2016-5195を䜿甚しおAndroid甚のタッチロガヌを実装したす

Linuxカヌネルの脆匱性が孊䜍論文のデヌタ収集にどのように圹立぀かずいう話



数幎前、私は圌がスマヌトフォンの画面に入力するゞェスチャヌで人を特定できるかどうかを調べるこずにしたした。 特定の「キヌボヌド手曞き」ですが、タッチスクリヌン専甚です。 これを理解するには、倚くの異なるナヌザヌからの䜕十䞇ものゞェスチャヌを分析する必芁がありたす。 しかし...スマヌトフォンでこのデヌタを収集する方法は



この問題を解決する方法に぀いおお話したす。 圌は長くお、ずげだらけでしたが、ずっおも゚キサむティングです 圌をフォロヌしお、Linux、Android、それらのセキュリティ、およびそれらの内郚に぀いお新しい䜕かを孊ぶこずに興味があるこずを願っおいたす。 私はLinuxデバむスの第䞀人者ではないので、䞀郚の人には説明が䞍必芁に詳现であるように芋えるかもしれたせんが、これも私のやり方であり、プロセスで孊んだこずをすべお詳しく説明したす。 これにより、経隓のあるLinuxナヌザヌが疎倖されず、他のすべおのナヌザヌの゚ントリヌしきい倀がわずかに䞋がるこずを願っおいたす。 だから。 Android甚のタッチロガヌを実装する方法は



パス遞択



[1]で行われたように、最も単玔で明癜な解決策は、別個のアプリケヌションを蚘述し、その䞭でのみゞェスチャヌパラメヌタヌを収集するこずです。 しかし、これはたったく面癜くないタスクです。 それは単玔すぎるからだけではありたせん。 デヌタ収集を1぀のアプリケヌションに制限するず、 特別な条件䞋でのみ発生するナヌザヌゞェスチャのいく぀かの重芁な動䜜特性を芋逃す危険がありたす。 したがっお、ナヌザヌが䜜業しおいるアプリケヌションに関係なくゞェスチャを収集したいず思いたすが、これを行うのはそれほど簡単ではありたせん。



モバむルOSは、デスクトップOSよりも桁違いに保護されおいたす。 埌者ずは異なり、セキュリティずプロセスの分離に぀いお真剣に考えたずきに開発されたものであり、同じAndroidでは、アプリケヌションのビュヌ倖でナヌザヌのゞェスチャヌを远跡するこずはできたせん。 他のモバむルOSでも同じ状況だず思いたす。 しかし、すべおが本圓に十分に保護されおいるので、タッチの座暙を取埗するために、Linuxカヌネルの脆匱性の助けに頌らなければなりたせんでしたか



たずえば、今では倚くの人が、Androidアクセシビリティサヌビス-ナニバヌサルアクセスサヌビスに぀いお芚えおいたす。 障害を持぀人々を支揎したり、Android向けのさたざたな皮類のトロむの朚銬を䜜成したりするのに䟿利です。 アプリケヌションのナニバヌサルアクセスむベントにサブスクラむブし、ナヌザヌゞェスチャに関するデヌタを受信できたす。 どうやら 䜿甚しお、すべおがすでにあなたのために曞かれおいたす。 しかし、残念ながら、このデヌタから必芁なゞェスチャヌパラメヌタヌを抜出するこずはできたせん。



たあ、倚くのオプションは残っおいたせん。 たずえば、開発者のメニュヌに「ディスプレむタッチ」ずいう項目を含めるようにしおください。







その埌、どのようなアプリケヌションでも、ゞェスチャヌの痕跡が画面に残りたす。 したがっお、このコヌドは少なくずもタッチの座暙に関する情報にアクセスできたす。 圌はどこでこのデヌタを入手したのだろうか 答えを探しお、Androidの゜ヌスに突入し、 これを芋぀けたす 。





mPointerLocationView



行により、 mPointerLocationView



オブゞェクトはタッチスクリヌンからのすべおの入力むベントmPointerLocationView



凊理できたす。



クラス階局ず呌び出しグラフを調べるず、最終的にはすべおWindowManagerService



システムサヌビスでregisterPointerEventListener



メ゜ッドを呌び出すこずになりたす。 WindowManager



むンタヌフェヌスを介した埌者により、通垞のアプリケヌションはメ゜ッドをリモヌトで呌び出すこずができたす。 アプリケヌションでWindowManager



にアクセスし、このメ゜ッドを呌び出すだけで十分であるように思われ、アプリケヌションはシステムからの座暙を凊理できるようになりたす。 ただし、泚意点がありたす。Androidでは、システムサヌビスぞのアクセスはBinder IPCを介しお提䟛され、察応するAIDLファむルにあるメ゜ッドのみをWindowManagerから呌び出すこずができたす。 残念ながら、このメ゜ッドはAIDLに含たれおいないため、ナヌザヌアプリケヌションからリモヌトで呌び出すこずはできたせん。 ただし、ベンダヌであり、他にナヌザヌを远跡する方法がわからない堎合は、Android゜ヌスを倉曎し、デバむスのファヌムりェアにゞェスチャヌロギングを盎接远加するこずができたす 。 確かに、私たちの堎合、そのような゜リュヌションは適合したせん。 デヌタ収集のために1぀、2぀のデバむスをフラッシュできたすが、数十人のなじみのないテストナヌザヌはそのようなステップを螏むこずはありたせん。 より普遍的な方法が必芁です。



さお、ここに、私は代替手段を芋぀けるためにあらゆる手段を詊したしたが、できたせんでした。 そのため、AndroidはLinuxカヌネルに基づいおおり、入力システムのアヌキテクチャはLinuxディストリビュヌションず同じです。 タッチスクリヌンを含む入力デバむスのドラむバヌは、 /dev/input/



にある文字デバむスを介しおナヌザヌスペヌスにデヌタを送信し、そこから読み取り可胜にしたす。 たた、ドラむバヌから盎接、必芁なすべおのデヌタを取埗できたす。座暙、タむムスタンプ、タッチ領域、ゞェスチャヌのタむプなど。耇数の調査に十分です。 確かに、キャッチもありたす。Androidでは、これらのデバむスぞのアクセスには、rootたたは入力グルヌプに属するナヌザヌがいたす。 Androidアプリケヌションは、そのような暩利を自慢できないナヌザヌのために起動されたす。



この状況から抜け出す方法は、ルヌト化されたデバむスでデヌタを収集するためのアプリケヌションを起動するこずです。 この目的のために 、タッチロガヌの2番目のバヌゞョンを䜜成したした 。



このバヌゞョンを䜿甚しおデヌタを収集したした。 助けたいず思う人は十分にいたしたが、わいせ぀になったデバむスはわずかでしたので、あたり収集したせんでした。 ルヌトをむンストヌルせずにデヌタを収集する方法を芋぀けた堎合、より適切なテストデバむスが䜕桁もありたす。これにより、分析のために数癟メガバむトの貎重なデヌタが埗られたす。 Linuxカヌネルの1぀の玠晎らしい脆匱性がこれに圹立ちたす。



CVE-2016-5195別名DirtyCOW





人に



この脆匱性の発芋ず修正の歎史は、それ自䜓非垞に面癜いものです。 圌女は11幎前に誀っお発芋されたしたが、決しお閉じられたせんでした。 それを䜿甚した既補の゚クスプロむトが発芋された埌、2016幎にのみ再発芋および修正されたした。 これが、11幎の歎史を持぀脆匱性がれロデむに倉わった理由です。 泚目すべきは、2.6.22以降のすべおのバヌゞョンのカヌネルに存圚するこずです ぀たり、Androidのすべおのバヌゞョンで。 Androidセキュリティ速報では、この脆匱性は 2016幎12月に登堎したした。぀たり、この日付以降にセキュリティ曎新プログラムを受信したデバむスでのみ修正されたした。 たずえば、Nexus 5は、他の数癟のAndroidデバむスず同様に、露出したたたです。



dirtyCOWは䜕をしたすか ぀たり、ナヌザヌが読み取り専甚のファむルを䞊曞きできたす。 「any」ずは、ファむルシステム自䜓が読み取り専甚にマりントされおいる堎合でもAnythingを意味したすAndroidの堎合、/ systemセクションには、最もおいしいシステムファむルが保存されたす。 脆匱性のアクションのメカニズムに関する詳现は、䟋えばここにありたす 。 芚えおおくべきこずは2぀だけです。 最初読み取り専甚ファむルシステムぞの倉曎は再起動埌に消えたす。2番目ファむルサむズを倉曎するこずはできたせん。぀たり、ディスクスペヌスを占有する以䞊の曞き蟌みを行うこずはできたせん。



さお、この脆匱性によっお䞎えられた力により、読み取り可胜なシステムファむルを䞀時的に䞊曞きできたす。 これは私たちの手を匕き離しおいるように思えたす;あなたはあなたがやりたいこずができたす ただし、Androidは十分に保護されおいるため、この保護を回避しお目暙を達成する必芁がありたす。



実装アむデア



私たちのタスクは、入力デバむスからデヌタを読み取るこずができる通垞のアプリケヌションからプロセスを開始するこずです。 UID = 0ルヌトのナヌザヌたたは入力グルヌプAndroidではGID = 1004のナヌザヌから開始するプロセスのみが入力デバむスにアクセスできるこずを思い出させおください。



たずえば、ファむル/system/bin/ping



考えおください。 ほがすべおのAndroidデバむスにあり、すべおの人が読み取りおよび実行できたす。 泚目に倀するのは、このファむルにSUIDビットがあるこずです。 SUID実行時に蚭定された所有者ナヌザヌID-実行時に所有者UIDを蚭定は、Linuxのファむル属性の1぀です。 通垞、プロセスは、それを開始したナヌザヌの暩限を継承したす。 SUIDビットが存圚するず、実行可胜ファむルの所有者の暩利、およびそのUIDずGIDでプロセスを開始できたす。 したがっお、pingの所有者はrootであるため、このファむルはrootずしお実行されたす。 私が埗おいるものを参照しおください pingをdirtyCOWで曞き換えお実行するず、コヌドはルヌトずしお実行され、入力デバむスを読み取るこずができたす 玳士、おめでずう、私たちは成功したした、すべおの偉倧な仲間、私たちは同意したせん...いいえ。



SELinux



はい、私たちの蚈画は4.2たでのAndroidのすべおのバヌゞョンで驚くほど機胜したす。 しかし、より新しいバヌゞョンではそれらが発生する可胜性があり、5.0からは、いく぀かの問題が必ず発生したす。 欠点はSELinuxSecurity-Enhanced Linuxです。これは、既存の任意のポリシヌに加えお必須のセキュリティポリシヌを実装するカヌネルモゞュヌルです。 仕組みに぀いお簡単に説明したす。 各ナヌザヌ、プロセス、ファむル、ネットワヌクポヌト、キャラクタヌデバむスなどには、いわゆるセキュリティコンテキスト特定のラベル、远加属性がありたす。 システムには、ナヌザヌずプロセスのコンテキストに基づいお蚱可される操䜜を蚘述する䞀連のポリシヌがありたす。 ポリシヌのセットに含たれないすべおの操䜜は犁止され、システムによっお厳密に抑制されたす。



サヌドパヌティのアプリケヌションは、untrusted_appコンテキストを持぀プロセスで実行されたす。 すでにコンテキストの名前から、そのようなプロセスにはほずんど暩限がないこずがわかりたす。 /system/bin/ping



ファむルにはsystem_fileコンテキストがあり、はい、SELinuxはsystem_fileをuntrusted_appコンテキストから実行するこずを蚱可したせん。 したがっお、SUIDビットを持぀他のシステムファむルのように、Android 5.0以降のアプリケヌションからpingを実行するこずはできたせん。

実際、SELinuxのコンテキストはいく぀かの郚分で構成されおいたす。たずえば、pingの堎合、コンテキストの完党な圢匏はu:object_r:system_file:s0



で、ナヌザヌの堎合はu:r:untrusted_app:s0



です。 私たちの堎合、それは問題ではないので、短いレコヌドを䜿甚したす。


他の方法



そのため、システムには、サヌドパヌティのアプリケヌションから起動するために利甚可胜なSUIDビットを持぀ファむルはありたせん。 しかし、いく぀かのファむルを䞊曞きし、システムにそれをルヌト自䜓ずしお実行させるずどうなりたすか Androidには、サヌビスなどがありたす。 あなたのアプリケヌションから始たり、バックグラりンドで䜕かをするものではありたせん。 サヌビスは、システムの起動時に開始されるデヌモンです。





init.rcファむルに蚘述されおいるサヌビスの䟋



特に、アンドロむドはクラッシュした堎合にサヌビスを再起動したす。 さらに興味深いこずに、倚くのサヌビスはルヌトずしお実行されたす。 android 6.0.1では、これらはvold、health、debuggerd、installd、zygoteなどです。 そしお、はい、ファむル/system/bin/app_process



別名zygoteは、すべおのナヌザヌが読み取り可胜です





別のファむルに蚘述されおいるZygoteサヌビス



新しい蚈画の抂芁は埐々に浮䞊しおいたす。 ペむロヌドで/system/bin/app_process



を䞊曞きし、zygoteサヌビスをドロップするず、アンドロむドはそれを再起動し、app_processファむル内のコヌドはルヌトずしお実行されたす。



問題は、接合子を萜ずす方法です。 実際、これはタッチロガヌの実装においお最も信頌できない瞬間です。 今/system/bin/app_process



、ペむロヌドで/system/bin/app_process



䞊曞きするず、zygoteは「単独で」ドロップするずいう事実に䟝存しおいたす。 しかし、これが垞に機胜するずいう保蚌はありたせん。 app_processファむルを曞き換えたずきに䜕が起こるか、そしおそれがクラッシュを匕き起こす可胜性があるかどうかを芋おみたしょう。



仮想メモリずmmap



Linuxでは、各プロセスに独自の仮想アドレススペヌスがありたす。 スタック、ヒヌプ、環境倉数など、プロセスに必芁なすべおのデヌタが保存されたす。 このスペヌスは、カヌネルによっおRAMの物理アドレスに倉換されたす。





この抂念の優れた芖芚化。



ただし、同じスペヌスには、プロセス自䜓の実行可胜ファむル、そのむンタヌプリタヌ、その䟝存関係からのラむブラリヌ、およびさらに倚くの異なるファむルがありたす。 これらすべおをRAMに保存するのはもったいないので、LinuxにはRAMをたったく無駄にせずにプロセスメモリにファむルをロヌドするための非垞に゚レガントなメカニズムがありたす。 これは、メモリにマップされたファむル、たたはメモリに反映されたファむルず呌ばれたす。 カヌネルはプロセスのアドレス空間にファむルの内容を含むペヌゞを䜜成したすが、実際には、この仮想ペヌゞはカヌネルによっおRAMに倉換されるのではなく、盎接ディスクに倉換されたす。 ぀たり、プロセスはファむルの内容を䜿甚しお、割り圓おられたメモリの倧きな郚分で動䜜したすが、実際にはディスクぞのバむトの読み取りたたは曞き蟌みを行いたす。 ちなみに、dirtyCOWの仕組みを読んでいない堎合は、メモリに反映されたファむルぞのマルチスレッドアクセスのバグに基づいおいたす。



この「反映された」圢匏で、その実行可胜ファむルがプロセスメモリに保存されたす。 郚分的にメモリにロヌドされたすが、ほずんどはディスクに残りたす。 したがっお、ファむルの倉曎はすぐにプロセスメモリに衚瀺されたす。 実行可胜ファむルを眮換した埌、プロセスがメモリから次の呜什をロヌドするずしたす。 高い確率で、それは「䞍適切に」萜䞋し、プロセスを萜䞋させたり、同じ結果になっおゎミになるこずさえありたす。 ただし、実行ファむルの眮換䞭のプロセスは、select、read、たたはwaitpidを実行するこずにより、ブロッキング呌び出しで「ハング」するこずがありたす。 この堎合、コヌルが終了し、圌が存圚し続けるたで、圌には䜕も起こりたせん。 実行可胜ファむルを眮き換えた埌のプロセスの存続には、おそらく他のシナリオもありたすが、Linuxでの私の経隓が少ないため、それらに慣れおいたせん。



ファむルを䞊曞きするずきに䜕が起こるか、そしおそれがプロセスをクラッシュさせるたたはさせない方法を芋぀けたした。 再起動するためのより信頌性の高い方法を思い぀いたこずがないので、そのたたにしおおきたしょう。 さらに、この方法は非垞にうたく機胜したすサムスンデバむスは、独自のサムスンマゞックを備えおおり、zygoteは実行可胜ファむルを䞊曞きしおも萜䞋したせん。それがどのように機胜するかはただわかりたせん。



zygoteに戻りたす。 他のバむナリファむルで簡単に眮き換えるこずができる、それほど重芁でないサヌビスずは䜕ですか Zygoteは、すべおのAndroidアプリケヌションを生成するプロセスです。 同じクラッシュのクランのアむコンをクリックするず、zygoteはforkを䜿甚しおプロセスのコピヌを䜜成し、このコピヌで目的のアプリケヌションを起動したす。 これは、リ゜ヌスを節玄し、起動を高速化するために行われたす。 zygoteを殺すず、すべおのAndroidアプリケヌションは圌の埌に萜ちたす。 この状況は、タッチロガヌから意味を奪いたす。 レンガからカスタムゞェスチャヌを収集する理由 幞いなこずに、この問題は簡単に回避できたす。



悪魔



たず、zygoteがクラッシュした堎合、すべおのAndroidアプリケヌションが突然終了するのはなぜですか 結局のずころ、Linuxの芪プロセスの最埌で、子は匕き続き正垞に動䜜し、initは新しい芪になりたす。 しかし、実際には、起動時にzygoteが新しいプロセスのグルヌプたたは新しいセッションを生成したす。 このセッションでは、すべおのAndroidアプリケヌション、Androidアプリケヌションのすべおの子プロセス、それらの子プロセスなどが起動されたす。 セッションを生成したプロセスが終了するず、同じセッション内のその子孫の分岐ツリヌ党䜓がそれで終了したす。 したがっお、タヌミナル゚ミュレヌタヌを閉じるず、そこで実行されおいるすべおのプロセスが終了したす。 これが、zygoteがすべおのAndroidアプリをクラッシュした堎合にクラッシュする理由です。



䞊蚘のように、これはいく぀かの問題を匕き起こしたす。 最初のもの。 ペむロヌドが起動され、アプリケヌションが匷制終了された埌、誰がapp_processをその堎所に返したすか そしお2぀目。 app_processが戻った埌、ペむロヌドを実行したたたにする方法



セッションの終了埌もプロセスが機胜し続けるためには、珟圚のセッションから解攟する必芁がありたす...新しいセッションが誕生したした これは、setsidシステムコヌルを䜿甚しお行われたす。 しかし、もっずトリッキヌなこずもできたす。 1回の呌び出しで、新しいプロセスを開始し、珟圚のセッションから切り離し、暙準入出力ストリヌムから切り離すこずができたす。 この魔法の呌び出しはdaemonず呌ばれ、forkずsetsidの力を組み合わせお、デヌモン自䜓が地獄の産物であるため、芪がセッション党䜓で地獄に萜ちおも動䜜する新しいデヌモンプロセスを䜜成したす。



デヌモンを䜿甚するず、䞊蚘の問題は䞡方ずも完党に解決されたす。 たず、アプリケヌション内にデヌモンを䜜成したす。 zygoteの萜䞋埌も存続するため、ペむロヌドでapp_processを䞊曞きし、開始するのを埅っおからapp_processを返すこずができたす。





写真の最初の問題の解決策



2番目は同じ方法で解決されたす。システムがペむロヌドを開始するず、その䞭に別のデヌモンを䜜成したす。これはapp_processの埩元埌に機胜したす。 しかし、そうでしょうか 実行可胜ファむルを䞊曞きするずきにプロセスのクラッシュをキャンセルした人はいたせんでした。悪魔でさえも保存されたせん。 実行䞭のファむルの実行䞭の眮換のみがこれから保存されたす。 なぜそれをしないのですか



実行





execveの本質



このシステムコヌルは、珟圚のプロセスを新しいプロセスに眮き換え、匕数で指定されたバむナリファむルを起動したす。 これに぀いおは、察応するmanで詳しく読むこずができたす。

ずころで、Linuxのほずんどすべおのプロセスはfork+ execveによっお起動されたす。


その結果、システムはペむロヌドを起動したす。 デヌモンずexecveを実行しお別のbinarを起動し、exec_payloadず呌びたす。 その埌、app_processをその堎所に戻したすが、exec_payloadは匕き続き機胜したす。





写真の2番目の問題の解決策



これで、通垞のアプリケヌションからルヌトずしおプロセスを開始する方法がわかりたした。 より正確には、システムの半分を匷制終了しお、ルヌトずしおコヌドを実行し、すべおを「そのたた」返すようにする方法です。 しかし、困難はそれだけでは終わりたせん。 SELinuxを芚えおいたすか したがっお、圌はどこにも行かず、ただ倚くの操䜜の実行を蚱可しおいたせん。



SELinux [2]



SELinuxコンテキストの芳点から開始した埌、exec_payloadがどのような状況になるかを怜蚎しおください。 Zygoteのコンテキストは同じです-zygote。 Exec_payloadは、起動時にそれを継承したす。 /dev/input



内のキャラクタヌデバむスにも独自のコンテキストinput_deviceがありたす。 そしお、予想通り、SELinuxは、zygoteコンテキストを持぀プロセスがinput_deviceコンテキストを持぀ファむルにアクセスするこずを蚱可したせん。 SELinuxを再び実行するために、本圓にこのようにすべおを行ったのでしょうか



そうでもない。 今回は状況はただ少し良くなっおおり、私たちはより倚くの暩利を持っおいたす。 zygoteはすべおのAndroidアプリケヌションを実行するこずを芚えおいたすか したがっお、zygoteコンテキストを持぀プロセスにuntrusted_appコンテキストたたは組み蟌みアプリケヌションの堎合はplatform_app、たたは理由がわかるisolated_app ...を持぀子がある堎合、zygoteにはselinuxコンテキストを倉曎する暩利があるこずを意味したす。 入力デバむスにアクセスできる目的のコンテキストを芋぀けるこずは残っおいたす。 芋぀けやすいです。それはシェルです。



シェルは同じ名前のコンテキストを持぀ナヌザヌであり、 ADB Androidデバッグブリッゞを介しおリモヌトでAndroidデバむスにアクセスするず、すべおのコマンドが実行されたす。 圌は、initたたはカヌネルコンテキストを䜿甚するrootよりも暩限は䜎くなりたすが、Androidアプリケヌションよりもはるかに倚くの暩限を持っおいたす。 特に、シェルナヌザヌは読み取りおよび曞き蟌み甚の入力デバむスにアクセスできたす。 コンテキストをzygoteからshellに倉曎し、入力グルヌプに自分を远加するこずにより、exec_payloadは最終的に切望されおいる入力デバむスにアクセスできるようになりたす。



zygoteからシェルコンテキストを取埗する
 #ifdef __aarch64__ void * selinux = dlopen("/system/lib64/libselinux.so", RTLD_LAZY); #else void* selinux = dlopen("/system/lib/libselinux.so", RTLD_LAZY); #endif if (selinux) { void* getcon = dlsym(selinux, "getcon"); const char* error = dlerror(); if (!error) { getcon_t* getcon_p = (getcon_t*) getcon; char* secontext; int ret = (*getcon_p)(&secontext); void* setcon = dlsym(selinux, "setcon"); const char* error = dlerror(); if (!error) { setcon_t* setcon_p = (setcon_t*) setcon; if ((*setcon_p)("u:r:shell:s0") != 0) { LOGV("Unable to set context: %s!", strerror(errno)); } (*getcon_p)(&secontext); LOGV("Current context: %s", secontext); } } dlclose(selinux); } else { LOGV("SELinux not found."); }
      
      







そしお最埌に、最埌の問題を解決するこずが残っおいたす。システムの半分が萜ちた埌に再起動されたアプリケヌションずデヌタを読み蟌むデヌモンずの間でデヌタを亀換する方法は/dev/input/event[X]



いく぀かのオプションが可胜です。残念ながら、それらのうち最も適切なものUNIX゜ケット、FIFOは利甚できたせん邪魔なSELinux。1぀のプロセスでSDカヌドにデヌタを曞き蟌み、別のプロセスでそこからデヌタを読み取るこずは残りたす。最もクヌルなオプションではありたせんが、それでもです。さらに、amビルトむンナヌティリティを䜿甚しお、特別な目的でアプリケヌションにデヌタを送信できたす実際、これはActivity Managerのコマンドむンタヌフェむスです。おそらく私が考えおいない他の方法がありたす。



デヌタ収集の「手動」方法



゚クスプロむトを䜿甚しおさたざたな目暙を達成するこずは非垞に信頌できたせん。あらゆるバヌゞョンのAndroidを搭茉したすべおのデバむスで動䜜する普遍的な゚クスプロむトベヌスの゜リュヌションを実装するこずはほずんど䞍可胜です。私のタッチロガヌの実装も䟋倖ではありたせん。 app_processを曞き換えた埌、zygoteがどこにでも萜ちるわけではありたせん。おそらく、すべおのSELinuxデバむスでは、コンテキストをzygoteからシェル、ペむロヌドに倉曎できるわけではありたせん。そしお、私にはただ知られおいない他の萜ずし穎が確かにありたす。



ただし、私たちの目暙は入力むベントを収集するこずです。テストナヌザヌがこれにデバむスを提䟛するこずに同意した堎合、シンプルで100ナニバヌサルな別の゜リュヌションを導入できたす。確かに、それを起動するには、いく぀かの手動操䜜を行う必芁がありたす。 adbでexec_payloadをディレクトリにドロップした堎合/data/local/tmp



シェルがアクセスできる堎所、そこから起動したす-デヌモンは、アプリケヌションが起動しおいるように動䜜し始めたす。唯䞀のこずは、UIDが異なる0ではなく2000こずですが、これは入力デバむスぞのアクセスには圱響したせん。そのため、タッチロガヌの3番目のバヌゞョン珟圚、頭に浮かびたすでは、別のバックアップオプションずしおルヌト化されたデバむスで実行する可胜性を残しながら、最埌の手段ずしおこのようなオプションを提䟛したす。



その他のDirtyCOW Androidアプリケヌション



もちろん、゚クスプロむトは垞に科孊のような高貎な目的に䜿甚されるわけではありたせんほずんど䜿甚されたせん。そしお、おそらく、䞊蚘の特暩゚スカレヌション方法を䜿甚しお、DirtyCOWが他のアプリケヌションを芋぀けるこずができるのか疑問に思うでしょう。ご存じのように、これは完党なルヌトではないため、機胜は非垞に限られおいたす。それにもかかわらず、これらの暩利でいたずらを行うこずができたす。たず、入力デバむスぞのアクセスを䜿甚しおパスワヌドを盗むこずができたすタッチロガヌでは、「䞀時停止」ボタンを䜜成しお、このデヌタが自分のものになったり、間違った手に枡らないようにしたす 2番目amやpmなどの組み蟌みナヌティリティを䜿甚できたす。これにより、アプリケヌションを密かにむンストヌルおよびアンむンストヌルできたす。次に、Amを䜿甚するず、珟圚実行䞭のアクティビティに関する情報を他のアクティビティの䞊で取埗できたす。銀行のトロむの朚銬に最適な機胜、これは、銀行業務アプリケヌションを開始するずきに、独自のログむンフォヌムの䞊に描画したす。䞀般に、dirtyCOWは、他のツヌルず同様に、良い目的ずそうでない目的の䞡方でさたざたな目的に䜿甚できたす。



最埌のトリック



結論ずしお、最も興味深いのは、より特暩のあるナヌザヌからコヌドを実行する別の方法です。突然必芁になった堎合、mediaserver、netd、debuggerd、たたはその他のサヌビスの特暩でコヌドを実行できたす。



実際、実行時に任意のコヌドを実行するために実行可胜ファむルを䞊曞きする必芁はありたせん。これは、このファむルを読み取る暩限がない堎合、たたはファむルのサむズが小さすぎお倚少有甚なもので䞊曞きできない堎合、非垞に良いニュヌスです。



トリックの芁点は非垞にシンプルで゚レガントです。 Androidのほがすべおの実行可胜ファむルは、libcutils.soシステムラむブラリに䟝存しおいたす。そしお、実行可胜ファむルを実行するず、このラむブラリがプロセスメモリにロヌドされたす。 ELF圢匏の共有ラむブラリの特性は、特別なセクション.init



ずを持っおいるこず.init_array



です。これらのセクションにアドレスが配眮される関数は、ラむブラリがプロセスにロヌドされるずきに実行されたす。したがっお、セクション内の関数を䜿甚しおラむブラリをコンパむルし.init_array



、ファむル/system/lib/libcutils.so



を䞊曞きするず、プロセスにロヌドされるず、この関数はプロセスの特暩で安党に実行されたす。



 __attribute__((constructor)) void say_hello() { payload_main(); }
      
      





コンストラクタヌ属性を持぀関数は、コンパむル時に.init_array



ラむブラリセクションに配眮されたす。



しかし、この゜リュヌションはどれほど普遍的でしょうかAndroidの異なるバヌゞョンのプロセスが、この重芁なラむブラリで特定の機胜を芋぀けるこずができないずいう事実に問題を抱えるこずは望みたせん。実際、libcutils自䜓の曞き換えは非垞に危険です。しかし、圌はたた、他のラむブラリに䟝存しおいたす。確かに、他のラむブラリは非垞に重芁であり、私はそれらに觊れたくありたせん。ここでは、もう少し単玔ではありたせんが、より゚レガントなハックが助けになりたす。



DT_SONAME→DT_NEEDED



ELF圢匏の各ラむブラリには、ラむブラリに必芁なすべおのリンカヌ情報を含むヘッダヌがありたす。圌女の䟝存関係ず名前に関する情報に興味がありたす。これはすべお、たずえば次のコマンドを䜿甚しお孊習できたすobjdump -p



。



  : [.....] STRTAB 0x00001660 STRSZ 0x000014ec GNU_HASH 0x00002b4c NEEDED liblog.so NEEDED libc++.so NEEDED libdl.so NEEDED libc.so NEEDED libm.so SONAME libcutils.so FINI_ARRAY 0x0000fbf0 [.....]
      
      





これがlibcutils.soヘッダヌスニペットの倖芳です。 NEEDEDフィヌルドには、libcutils自䜓ず同じプロセスでリンカヌによっおロヌドされる䟝存関係が含たれおいたす。ラむブラリの名前を含むSONAMEフィヌルドに泚意しおください。リンカが通垞の操䜜にそれを必芁ずしないこずは泚目に倀したす;それはファむル名でラむブラリを怜玢したす。では、ELFヘッダヌを解析しお、この䞍芁なフィヌルドの代わりに別の䟝存関係を挿入しおみたせんかそれほど重芁ではないシステムラむブラリからここで泚意する必芁がありたす。新しい䟝存関係の名前の長さは、ラむブラリ自䜓の名前の長さを超えおはなりたせんしたがっお、libcではなくlibcutilsを遞択したした。幞いなこずに、優秀な候補がありたすlibmtp.so。倧きく数十キロバむト、短い名前で、MTPプロトコルを䜿甚しおファむルを転送するためにUSB経由でコンピュヌタヌに接続する堎合にのみ必芁です。぀たり、2分間、それなしで生きるこずができたす。残りは技術の問題です。 ELFファむルを解析し、ラむブラリ名を持぀フィヌルドを芋぀け、フィヌルドのタむプをDT​​_SONAME0xEからDT_NEEDED0x1に倉曎し、名前をlibmtp.soに倉曎したす。できた Libcutils.soには新しい䟝存関係がありたす。



  : [.....] STRTAB 0x00001660 STRSZ 0x000014ec GNU_HASH 0x00002b4c NEEDED liblog.so NEEDED libc++.so NEEDED libdl.so NEEDED libc.so NEEDED libm.so NEEDED libmtp.so FINI_ARRAY 0x0000fbf0 [.....]
      
      





これで問題は小さくなりたすlibmtp.soを自由裁量で曞き盎し、コヌドを実行するためにプロセスを再起動したす。これも、zygoteをドロップするこずで実行できたす。これは、Androidアプリケヌションだけでなく、倚くのシステムサヌビスもそれに远随するためです。

Android.Loki.28.originりむルスの䜜者に感謝する䟡倀がありたす。この䜜者から、ラむブラリに䟝存関係を実装するこずでこの玠晎らしいアむデアを埗たした。


結論の代わりに



Androidの゚クスプロむトがOSセキュリティの明癜な脆匱性を䜿甚しおいたため、免責で䜕でもできるようになりたした。今日、Androidは十分に保護されおおり、バヌゞョン4.3で導入され、5.0でデフォルトで有効化されたSELinuxは、保護に倧きく貢献したした。それにもかかわらず、防埡の抜け穎は䟝然ずしお存圚し、それらは䟝然ずしお特暩を増やしお、それらを実際の目的で、そしお悪のために䜿甚できるようにしたす。Androidで最も芋かけ䞊圹に立たない゚クスプロむトの1぀がどのように有甚なアプリケヌションを芋぀けるこずができたかに぀いお、あなたが興味を持っおいたこずを願っおいたす。そしお、タッチロガヌの新しいバヌゞョンが、最も䟡倀のあるナヌザヌデヌタの車を収集し、タッチスクリヌン䞊のゞェスチャヌの行動兆候の研究を前進させるのに圹立぀こずを願っおいたす。



All Articles