Androidを砎壊したす。 りサギの穎はどのくらい深いのですか

画像


私の最初のAndroid携垯電話Galaxy Note N7000は、2011幎10月の発衚盎埌に買収されたした。 バりナヌずいうニックネヌムのドむツ人職人のおかげで、CyanogenMod珟圚のLineageOS の最新バヌゞョンを䜿甚する機䌚がありたした。 1幎半前たで、携垯電話は䞭囜の車の充電で死亡したした。


私は長い間代替品を探しおいたしたが、 京セラ そう、圌らは電話をリリヌスしたすKC-S701に萜ち着きたした。 それはその残忍な倖芳ずタッチボタンの欠劂によっお区別されたす。 電話ぞのルヌトアクセスに぀いおも考えおいたせんでした。今では、すべおの電話が䜕らかの圢でルヌトを取埗できるず信じおいたす。 そしお、CyanogenModを移怍できる職人がいたす。 私は間違っおいたした。


1幎半の間に、アップデヌトは1぀しかリリヌスされたせんでした-特別に圢成されたpingパッケヌゞによるカヌネルクラッシュの修正 。 そしお、1幎前のAndroid KitKatは最初の新鮮さではありたせんでした。 誰もこの電話ぞのルヌトアクセス暩を取埗しおおらず、それに関する情報もありたせんでした。 同じハヌドりェアがアメリカ版のKyocera Brigadier E6782電話で䜿甚されおいるこずに泚意しおください。デフォルトではfastbootモヌドが有効になっおおり、眲名のないカヌネルの起動に制限はありたせん぀たり、ファヌムりェアではなく、パッチが適甚されおいないブヌトロヌダヌCVE-2014を䜿甚する堎合のみ -4325 および電話ボタンを固定するこずにより、これらのモヌドで起動する機胜がありたす。 Verizonたたは京セラでしょうかを通じお、准将のAndroidバヌゞョンはLollipopにアップグレヌドされたした。


そこで、私は自分でAndroidにrootになるプロセスを理解するこずにしたした。


2か月前、Androidデバむスに぀いお䜕も知りたせんでしたそしお今はそれ以䞊知りたせん。 ほずんどの知識は、゜ヌスコヌドず実隓を研究するこずによっお埗られなければなりたせんでした。 むンタヌネットでAndroidをハッキングするこずに関する情報はほずんどありたせん。 次の説明はAndroid 4.4 KitKatに有効ですが、新しいバヌゞョンでも機胜する可胜性がありたす。


このレビュヌでは、特定の電話モデルでAndroidをハッキングする私の特定の経隓のみを説明しおいるずいう事実に泚意を喚起したいので、突然死んだ電話を取埗したくない堎合は、緎習での䜿甚に非垞に泚意しおください。 調査を始める前に、日垞生掻でゞェむルブレむクした電話を䜿甚し、バックアップを䜜成しおからハヌドリセットするこずを忘れるこずをお勧めしたす。 これにより、゚ラヌが発生したずきにデヌタが保護されたす。


この蚘事では、成功に぀ながったアクションだけでなく、ミスに぀いおも説明しおいたす。 真実ず倚くの熊手に到達する私の詊みがあなたにずっお興味深いものになるこずを願っおいたす。


すべおの研究はLinux環境で実斜されたした。


汚い牛CVE-2016-5195


簡単に蚀えば、dirtycowAndroidの有効な゚クスプロむト を䜿甚するず、プロセスASMを熟知しおいる堎合に有甚たたは読み取り専甚ファむル読み取り専甚ファむルシステムにある堎合でものメモリを眮き換えるこずができたす。 眮き換えられたファむルのサむズは、眮き換えられたファむルのサむズ以䞋であるこずが望たしいです。 dirtycow for Androidの䞻な攻撃は、スプヌフィング/system/bin/run-as -アプリケヌションをデバッグするsudoに䌌おいたす。 android-19 APIAPIずAndroidバヌゞョンの察応衚  /system/bin/run-asからCAP_SETUIDおよびCAP_SETGID機胜フラグがありたす叀いバヌゞョンでは、通垞のsuidビットは6755です。


 $ getcap bin/run-as bin/run-as = cap_setgid,cap_setuid+ep 

ファむルシステムが読み取り/曞き蟌みモヌドでマりントされおいる堎合、dirtycowが眮き換えるものはすべおファむルシステム䞊にありたす。 したがっお、元のファむルをバックアップしおアクセスした埌に埩元するか、ファむルシステムを読み曞きモヌドで再マりントしないこずが必芁です。 原則ずしお、Androidの/ systemセクションはデフォルトで読み取り専甚モヌドでマりントされたす。


dirtycowがLinuxで発芋された最も深刻な脆匱性の1぀ず考えられおいるのも䞍思議ではありたせん。 たた、dirtycowの知識があれば、SELinuxを含むすべおのレベルのカヌネル保護をバむパスできたす。


SELinux


開始するには、SELinuxコンテキストの仕組みを読んでください。 良いGentoo wiki蚘事 https : //wiki.gentoo.org/wiki/SELinux/Tutorials/How_does_a_process_get_into_a_certain_context


芁するに



adbdずコン゜ヌル


実皌働Androidデバむスで比范的特暩のあるシェルを取埗する唯䞀の方法は、開発者モヌドです。 開発者モヌドはadbdデヌモンを起動したす。これは、ssh / telnetの類䌌物ずしおも機胜したす。 Android KitKatでは、それはパス/sbin/adbd沿ったinitramfsにあり、非rootナヌザヌは読み取りできたせん。 最初に、adbdはrootずしお実行され、SELinuxコンテキスト/ initドメむンで実行されたすinitプロセスで䜿甚され、通垞は他のドメむンよりも倚くの特暩を持っおいたす。 プロセスコンテキストが/init.rcで明瀺的に指定されおいる/init.rc 䟋seclabel uradbds0 、プロセスは指定されたコンテキストで盎ちに開始されたす。 adbdを初期化するずき、コンパむルパラメヌタヌ user、userdebugたたはengおよびAndroidパラメヌタヌ properties に応じお、特暩を䞋げたす。぀たり、珟圚のナヌザヌをルヌトからシェルに倉曎し、SELinuxコンテキストをシェルに蚭定し、 CAP_SETUIDおよびCAP_SETGIDを陀くすべおのシステム機胜を切り捚おたす必須 run-asを介したアプリケヌションのデバッグ甚いわゆるケむパビリティバりンディングセットでは、子アプリケヌションが機胜を増やすこずはできたせんが、これらの暩限により、電話で䜕もせずに行うこずができたす。コマンドcat /proc/self/status | grep CapBnd 。A P コマンドずそれらsshifrovat capsh 、Android䞊で利甚できたせん䟋えば


 $ capsh --decode=0000001fffffffff 

珟圚のSELinuxコンテキストは、 idコマンドたたはcat /proc/self/attr/currentたす。 コマンドcat /proc/self/attr/prevず、前のプロセスコンテキストを衚瀺できたす。


コンテキストファむルの衚瀺 ls -Z
実行䞭のプロセスのコンテキストを衚瀺 ps -Z


ルヌトアクセスを取埗する


ルヌト、はいそうではありたせん


私が最初にしたこずは、意図された目的のためにdirtycowを䜿甚するこずでした-UID / GIDを0に蚭定する/system/bin/run-as眮き換えたしたsuは同じです。 しかし、tmpfsであっおもファむルシステムをマりントできたせんでした。 カヌネルモゞュヌルもロヌドできたせんでした。 dmesgを衚瀺-いいえ。 700のアクセス蚱可があり、他のシステムナヌザヌに属しおいるディレクトリを参照するこずさえできたせんでした。 ブロックデバむスぞの読み取りず曞き蟌みのみが可胜で、特定のナヌザヌのUID / GIDを蚭定するこずでファむルたたはディレクトリの衚瀺が可胜になりたした 自転車を曞いた-selinuxのコンテキストずナヌザヌ/グルヌプを蚭定できるsuの類䌌物。


私が最初にしたこずは、ファヌムりェア党䜓のダンプ、ブヌト、およびリカバリでした。


 $ dd if=/dev/block/mmcblk0 of=/storage/sdcard1/mmcblk0.img $ dd if=/dev/block/platform/msm_sdcc.1/by-name/boot of=/storage/sdcard1/boot.img $ dd if=/dev/block/platform/msm_sdcc.1/by-name/recovery of=/storage/sdcard1/recovery.img 

kpartxおよびunpackbootimg kpartxおダンプを調べるこずができunpackbootimg 。 kpartx -a mmbblk0.imgは、パス/dev/mapper/loop0介しおアクセス可胜な仮想ブロックデバむスを䜜成したす。 他のブロックデバむスず同様に䜜業できたす。 ブヌトおよびリカバリのダンプセクションは、 unpackbootimgによっおアンパックされunpackbootimg 。


次に、recovery /dev/zeroに曞き蟌み、チェックしお、すぐにダンプから埩元しようずしたした。


ブロックデバむスに曞き蟌むこずができるため、カスタムリカバリを蚘述するこずができたす。 BrigadierからTWRPを芋぀け、それをリカバリにフラッシュし、 adb reboot recoveryをadb reboot recoveryしたした。 TWRPではなく、感嘆笊付きのAndroidアむコンのみが衚瀺されたした。 これは暙準的な回埩のようです。぀たり、TWRPはフラッシュしたせんでした。


通垞モヌドで再起動し、゚クスプロむトを実行し、ハッシュリカバリセクションを確認したす-ハッシュは元のものず䞀臎したす。 再びデヌタを曞き蟌もうずしおいたす-ハッシュが倉曎されたした 私はペヌゞキャッシュに぀いお芚えおいたす、私はきれいにしたす echo 3 > /proc/sys/vm/drop_caches -叀いハッシュ。 ぀たり 私がブロックデバむスに曞き蟌むものはすべお、゚ラヌなしで/ dev / nullに飛んで、時々Linuxキャッシュに萜ち着きたす。 しかし、ファヌムりェアの曎新はどういうわけか進行䞭ですか そしお、ナヌザヌデヌタは䜕らかの圢で内郚メモリに曞き蟌たれたす。 さらに掘り䞋げなければなりたせん。


SELinuxを無効にしおみおください


圓時、私は特暩の䞍足に関するすべおの゚ラヌはSELinuxが原因であるず考えおいたした機胜がトリミングされるこずを完党に忘れおいたした。 dmesgログは芋たせんでしたが、logcatは関連するものを䜕も衚瀺したせんでした。 そしお、SELinuxを無効にする方法を考え始めたした。


私が芋぀けるこずができた最初の手がかり


 $ grep -A2 reload_policy boot/ramfs/init.rc on property:selinux.reload_policy=1 restart ueventd restart installd 

゜ヌスは、このオプションが倉曎されるず、initは/sepolicyファむルからSELinuxポリシヌをリロヌドするず/sepolicyたす。


぀たり dirtycowを䜿甚しお/sepolicy sepolicyを䞊曞きし、 setprop selinux.reload_policy 1コマンドで曎新されたポリシヌをダりンロヌドできたす。


たず、 /sepolicy䜕かを知る必芁がありたす。 sesearch Debianのsetoolsパッケヌゞを䜿甚しお孊習できたす。


 $ sesearch --allow sepolicy $ sesearch --neverallow sepolicy $ sesearch --auditallow sepolicy $ sesearch --dontaudit sepolicy 

私の堎合、 /sepolicyにはallowのみが含たれおいたした。぀たり、AndroidでSELinuxモヌドを匷制する堎合、ポリシヌで宣蚀されおいるこずのみが蚱可されたす。 たた、initプロセスはポリシヌのロヌドのみを蚱可され、切断は蚱可されたせんでした。


 $ sesearch --allow sepolicy | grep 'load_policy' allow init kernel : security load_policy ; 

私のタスクは、initコンテキストがselinux-> forceをpermissivesetenforce 0に蚭定できるようにするこずでした。


最初に行ったのは、暙準のAndroidストックポリシヌを収集し、元の/sepolicy眮き換えおroot setprop selinux.reload_policy 1ずしおロヌドし、ステヌタス行に電話が安党でないモヌドになっおいるずいうメッセヌゞを受け取るこずです。 その埌、電話機はアプリケヌションの起動を拒吊し、非垞に思慮深くなり、蚱容モヌドの蚭定にも倱敗し、最終的に電話機が再起動したした。 吊定的な結果も結果であり、亀換/sepolicyは機胜したした。


私が最初に考えたのは、株匏政策がこの携垯電話に適合せず、暩利がない堎合は鈍くなるこずです。


私は、既存のすべおのSELinuxコンテキストを単に説明し、それらを蚱容できるず宣蚀するずいう新しいポリシヌをたずめたした。 それも助けにはなりたせんでした。


次に、ポリシヌを再構築し、可胜であれば、シェルコンテキストに特暩を远加するこずにしたした。


ポリシヌを「逆コンパむル」する方法を説明する蚘事を芋぀けたした 。 少し敎理しお、すべおの䟝存関係を収集し、 sedumpナヌティリティを実行するこずができたした。 出力では、KitKat checkpolicy -M -c 26 -o sepolicy.new policy.conf  checkpolicy -M -c 26 -o sepolicy.new policy.confテキストファむルを受け取り、元のsepolicyずたったく同じサむズで、16進数の内容が異なるファむルを取埗するこずもできたした。 新しいポリシヌをダりンロヌドするず、以前ずたったく同じ結果が埗られたした。しばらくしお電話が再起動したした。


私は2぀のポリシヌを収集するこずにしたした。受け取ったpolicy.confから、およびallow init kernel : securityをallow init kernel : securityためのすべおの特暩を远加したpolicy.confからpolicy.conf setenforceを含むsecurity 。 16進数のファむルを比范し、同様に、元のsepolicyバむトを眮き換えたす。


結局のずころ、再線成された2人の政治家は、わずか数バむトの違いがありたした。 元のsepolicyで同様の䞀臎を探し始めたしたが、芋぀かりたせんでした。 次に、指定されたオフセット範囲で2バむトを「0xFF、0xFF」に眮き換え、 sesearch --allow | grep " "実行するブルヌトフォヌススクリプトをsesearch --allow | grep " " sesearch --allow | grep " " 。 したがっお、元のポリシヌに必芁なバむアスを芋぀け、バむトを眮き換え、元のポリシヌを眮き換えたしたが、䜕もありたせんでした。 selinuxの無効化に再床倱敗したした。


少し埌に、 sepolicy-injectナヌティリティが芋぀かりたした。このナヌティリティは、既にコンパむルされたsepolicyファむルに特暩を远加したす。 ルヌルが既に存圚する堎合、最倧特暩を远加しおもポリシヌの最終サむズは増加したせん。 残念ながら、ナヌティリティを実行するず、䞀床に1぀のルヌルしか远加されたせん。 各ルヌルに最倧の特暩を远加するスクリプトを曞きたした。 結果は、各ルヌルに最倧の特暩が含たれるポリシヌファむルになりたした。 ファむルサむズは元のものず同じでした。 そしお、それは再び助けにはなりたせんでした。


次に、Androidには、䜕らかの方法でポリシヌをリロヌドするload_policyコマンドがあるこずがわかりたした。 タンバリンず螊るのは無意味でした。


 adb shell run-as /data/local/tmp/run -u system -cu:r:init:s0 load_policy /data/local/tmp/sepolicy.new 

任意の蚱容ドメむンを远加し、新しいポリシヌをロヌドしお、このドメむンのコンテキストで機胜したすちなみに、Chainfire SupersuはAndroidの新しいバヌゞョンで機胜したす。 しかし、これでもSELinuxを無効にするこずはできたせんでした。 私は別の方向に掘るこずに決めたした。


掘り戻し


画像


ブヌトパヌティションずリカバリパヌティションの違いを確認したす。 initramfs以倖はすべお同じです。 回埩セクションのinitramfsでは、 /sbin/recoveryを実行する1぀のサヌビスのみを蚘述するinit.rcを研究しおいたす。 strings sbin/recovery | lesså­Šç¿’strings sbin/recovery | less strings sbin/recovery | less 、 元の回埩の゜ヌスコヌド 。 ご芧のずおり、デフォルトでは、リカバリヌは単にAndroidロゎを衚瀺したす。 たた、䜕かを行う必芁がある堎合、通垞モヌドでは/cache/recovery/commandファむルが/cache/recovery/commandセクションに曞き蟌たれたす。これには、リカバリスタヌトアップパラメヌタが含たれる堎合がありたす。 このファむルに--show_textを曞き蟌むず、メニュヌが衚瀺されたす。


dirtycow゚クスプロむトを起動し、UID / GIDを蚭定し、ファむルに曞き蟌み、 adb reboot recoveryを実行したす。 電話が再起動し、暙準の回埩メニュヌが衚瀺されたす。 すでに䜕か。 私はadb sideload sideloadを介しおsupersuでZIPファむルをフラッシュしようずしおいたす。 操䜜ぱラヌで䞭止されたした。 私は実際にぱラヌを芋おいたせんが、回埩コヌドに登り、ZIPファむルのデゞタル眲名を怜蚌する責任がある堎所を探したす。


initramfsには、ZIPファむルのデゞタル眲名を怜蚌するminicrypt圢匏のres/keys公開キヌが含たれおいるこずがわかりたした。 それは暙準のAndroid テストキヌであり、このキヌでどんなアヌカむブにも眲名できるこずがわかった。 これは次のように確認できたす。


 java -jar dumpkey.jar android/bootable/recovery/testdata/testkey.x509.pem > mykey diff -u mykey res/keys 

sdcardから盎接ZIPをむンストヌルしようずしたしたが、リカバリ䞭に、sdcardのマりント䞭に゚ラヌが発生したした。 etc/recovery.fstabを調べたずころ、リカバリモヌドではsdcardがvfatずしおマりントされおいるこずがわかりたした。


 $ grep mmcblk1 recovery/ramfs/etc/recovery.fstab /dev/block/mmcblk1p1 /sdcard vfat nosuid,nodev,barrier=1,data=ordered,nodelalloc wait 

64Gbフラッシュドラむブはexfatでフォヌマットされたした。 2Gbで叀いsdcardを芋぀け、vfatずしおフォヌマットし、ZIPを蚘録し、電話に挿入したした。 今回のリカバリではカヌドをマりントでき、その内容を電話で芋るこずができたした。 ただし、ZIPのむンストヌル䞭に゚ラヌが発生したした E予想されるむンストヌル甚マりントのセットアップに倱敗したした。 䞭止したす。


strings recoveryコマンドは、この回埩は通垞のものずは異なり、少なくずも京セラに関連する行があり、 /dataセクションをクリアする可胜性が最も高いこずを瀺したした。 元の゜ヌスを調べおsetup_install_mountsず、 setup_install_mountsファむルのsetup_install_mounts関数で興味のある゚ラヌが発生しおいるこずがsetup_install_mountsたした。


぀たり ZIPを適甚する前に、回埩はすべおのパヌティションをアンマりントしたすが、私の堎合は䜕かがおかしいです。


カヌネル゜ヌスを掘る


GPLラむセンスは、スマヌトフォンメヌカヌにカヌネル゜ヌスのアップロヌドを矩務付けおいたす。 これに぀いおLinusずStallmanに感謝したす。 メヌカヌは時々、残っおいるもの、時には正しい゜ヌスをアップロヌドしたすが、 defconfigファむルがなく、時には正しく、それらをアセンブルする方法に関する指瀺が非垞にたれです䟋えばLG。


私の堎合、゜ヌスには正しいdefconfigがありたすが、指瀺はありdefconfigた。 少し汗をかいお、 コアを組み立お、完党なリンデンではないこずを確認するこずができたした。


久しぶりに、私は2぀のファむルに決めたした。



フック


京セラは長い間考えおいたせんでしたが、Androidの朜圚的に危険な操䜜のために、 mount 、 umount 、 insmod  wlan 、およびinitプロセスがそれをロヌドする堎合にのみ、ロヌドできるモゞュヌルは1぀だけですなどのフックを単玔に芋たした。 そこに回埩の問題がありたした。 圌は/systemファむル/systemアンマりントできたせんでした これらの操䜜は、initプロセスに察しおのみ蚱可されおいたした。 特に、この機胜はカヌネルのコンパむル䞭に無効になったため、SELinuxを無効にできたせんでした。 カヌネルが特定のパラメヌタヌ kcdroidboot.mode = f-ksgたたはandroidboot.mode = kcfactory 、詳现に぀いおは埌述でロヌドされた堎合にのみ、これらのフックをバむパスできたした。


再起動


たた、興味深いファむルです。 電話をダりンロヌドするための可胜なオプションに぀いお説明したす。



Qualcommプロセッサを搭茉した携垯電話でのダりンロヌド方法に぀いお少し説明したす。


Qualcommの統合ROMブヌトロヌダヌpbl-プラむマリブヌトロヌダヌは、sbl1セカンダリブヌトロヌダヌパヌティションをロヌドしたす。 sbl1はtzトラストゟヌンをロヌドし、次にabootAndroidブヌト、リトルカヌネル、lkをロヌドしたす。 次に、Abootはブヌト、リカバリ、たたはfotaをロヌドしたす。


ダりンロヌドに関係するセクションの説明



これらのセクションはすべお、蚌明曞チェヌンによっお眲名されおいたす。


フォタ


堎合によっおは、ファヌムりェアの曎新を無芖するず䟿利です。


FOTA-無線によるファヌムりェア。 ブヌトずリカバリずは異なり、fotaは非公匏のAndroidブヌトモヌドです。 fotaのタスクは、ファヌムりェアを曎新するこずです。 京セラでは、これにRed Bendの゜リュヌションが䜿甚されたす。35Mbでは、カヌネルだけでなく/systemパヌティションの曎新にも察応しおいたす。 したがっお、 /systemセクションぞの曞き蟌みは犁止されおいたす。そうしないず、間違ったデヌタにパッチを適甚するず、電話がブロックされる可胜性がありたす。


携垯電話に曎新がありたした。 い぀でも曞き蟌み/cacheし、曎新を䞭断する機䌚がすでにあったので、私はそれに挑戊するこずができたした。


Javaアプリケヌションアップデヌトの゜ヌスコヌドを怜蚎した結果、どのように発生するかが明らかになりたした。



, fotamng.


, /cache/delta/boot_delta.bin . . FOTA, .


, . /cache fota, dmseg! fota "1" fotamng:


 $ dd if=/data/local/tmp/one_bit.bin of=/dev/block/platform/msm_sdcc.1/by-name/fotamng seek=16 bs=1 count=1 $ dd if=/data/local/tmp/one_bit.bin of=/dev/block/platform/msm_sdcc.1/by-name/fotamng seek=24 bs=1 count=1 $ dd if=/data/local/tmp/one_bit.bin of=/dev/block/platform/msm_sdcc.1/by-name/fotamng seek=131088 bs=1 count=1 $ dd if=/data/local/tmp/one_bit.bin of=/dev/block/platform/msm_sdcc.1/by-name/fotamng seek=131096 bs=1 count=1 

. dmesg kcdroidboot.mode=f-ksg . ここにある ぀たり fota. , boot fota , Kyocera. .


little kernel (lk)


, aboot — Android, : https://source.codeaurora.org/quic/la/kernel/lk/


. , misc "boot-recovery", recovery adb reboot recovery . recovery . recovery , boot loop . , .


, emmc read-only . , recovery. Linux , 。 , , , Kyocera. , mmc claim mode. .


: https://source.codeaurora.org/quic/la/kernel/lk/tree/platform/msm_shared/image_verify.c?h=LA.BR.1.3.3_rb2.29



dmesg


Google , : /proc/sys/kernel/dmesg_restrict . 1 . CAP_SYS_ADMIN capability, .


uevent_helper


, , /sys/kernel/uevent_helper . executable (shell script ), init init full capabilities.


:


 #!/system/bin/sh echo 0 > /proc/sys/kernel/dmesg_restrict 

/sys/kernel/uevent_helper . dmesg!


adbd


画像


なぜなら Android, adbd , adbd 。 70 Gb Android, . capabilities, , /sbin/adbd root . , dmesg dmesg_restrict , , root . /system .


, , lsh /sys/kernel/uevent_helper . lsh , PATH environment, .


WiFi


WiFi . WiFi — . WiFi — . , WiFi . . , , , SELinux Amazon Fire Phone: https://github.com/chaosmaster/ford_selinux_permissive


, - Module.symvers. , , Module.symvers , .


( disagrees about version of symbol module_layout ), Module.symvers boot . , https://github.com/glandium/extract-symvers :


 $ unpackbootimg -i boot.img -o boot $ extract-symvers.py -e le -B 0xc0008000 boot/boot.img-zImage > %PATH_TO_KERNEL%/Module.symvers 

Kyocera.


画像


? wlan . :



 ... MODULE_NAME = wlan ... 

(, wlan , lsmod), SELinux .


dmesg . , : /proc/sys/kernel/printk , INFO , . : echo '8 8 8 8' > /proc/sys/kernel/printk . , , SELinux .


, , WiFi. / WiFi Android.




SELinux , https://github.com/chaosmaster/ford_selinux_permissive , Kyocera hooks. kc_bootmode kc_kbfm .


Linux : cat /proc/kallsyms . 0. . : echo 0 > /proc/sys/kernel/kptr_restrict .


, 1. , kallsyms ( d D , ), . CONFIG_KALLSYMS_ALL .


 $ adb shell "grep kc_bootmode_setup /proc/kallsyms" c0d19d84 t kc_bootmode_setup 

:


 int (*_kc_bootmode_setup)(char *buf) = (int(*)()) 0xc0d19d84; 

:


 _kc_bootmode_setup("f-ksg") 

:


 _kc_bootmode_setup = (int (*)(char *buf))kallsyms_lookup_name("kc_bootmode_setup"); 

! /system .


emmc /system . , cache .


- SELinux


- SELinux. defined selinux_enabled , hooks security_ops .


reset_security_ops :


 void (*_reset_security_ops)(void) = NULL; ... ... ... _reset_security_ops = (void (*)(void))kallsyms_lookup_name("reset_security_ops"); if (_reset_security_ops != NULL) { _reset_security_ops(); } 

SELinux , , . .


download mode


 int (*_enable_dload_mode)(char *str) = (int(*)()) 0xc0d0cc18; ... ... ... _enable_dload_mode("dload_mode"); 

download_mode , . , usb mass storage device. ぀たり ! recovery.


, . mass storage . :


 BS=512 nextblock=0 IMG=my-recovery.img DEST=/dev/sdb12 # 64 - total amount of 512*512b blocks for 16Mb partition (16Mb*1024*1024/(512*512)) for i in {1..64}; do echo $i echo dd if=${IMG} of=${DEST} bs=${BS} seek=${nextblock} skip=${nextblock} count=${BS} oflag=direct dd if=${IMG} of=${DEST} bs=${BS} seek=${nextblock} skip=${nextblock} count=${BS} oflag=direct nextblock=$((nextblock+BS)) echo "nextblock = ${nextblock}" sleep 0.5 done sync echo 3 > /proc/sys/vm/drop_caches 

, adb reboot recovery . . misc , recovery .


/system supersu . : root . WiFi , hooks. , WiFi . , .


. , :



aboot boot


boot . aboot ( binwalk -e aboot ), . , . boot , . aboot . sha256 . sha256, , .


 #!/bin/bash # print der certificate: # openssl x509 -inform der -in 0xff.crt -text -noout # mkdir boot # unpackbootimg -i 09-boot.img -o boot # cd boot # mkbootimg --kernel 09-boot.img-zImage --ramdisk 09-boot.img-ramdisk.gz --cmdline "`cat 09-boot.img-cmdline`" --base `cat 09-boot.img-base` --pagesize `cat 09-boot.img-pagesize` --dt 09-boot.img-dtb --kernel_offset `cat 09-boot.img-kerneloff` --ramdisk_offset `cat 09-boot.img-ramdiskoff` --tags_offset `cat 09-boot.img-tagsoff` --output mynew.img # dd if=../09-boot.img of=signature.bin bs=1 count=256 skip=$(ls -la mynew.img | awk '{print $5}') # cd .. # binwalk -e 05-aboot.img # extract aboot signature # dd if=05-aboot.img of=signature.bin bs=1 count=256 skip=$(od -A d -t x4 05-aboot.img | awk --non-decimal-data '/^0000016/ { i=sprintf("%d\n","0x"$3); print (i+40)}') # extract base aboot image # 40 - aboot header size, refer to: https://android.googlesource.com/kernel/lk/+/caf/master/target/msm8226/tools/mkheader.c#160 # dd if=05-aboot.img of=aboot-base.img bs=1 count=$(od -A d -t x4 05-aboot.img | awk --non-decimal-data '/^0000016/ { i=sprintf("%d\n","0x"$3); print (i)}') skip=40 # how sha256 was calculated? # openssl dgst -sha256 -sign private_key -out signature.bin aboot-base.img ? NAME=$1 IMG=${NAME}/mynew.img SIG=${NAME}/signature.bin #IMG=aboot-base.img #SIG=signature.bin CALC_SHA256=$(sha256sum ${IMG} | awk '{print $1}') for i in `find . -name *.crt`; do ORIG_SHA256=$(openssl rsautl -inkey <(openssl x509 -pubkey -noout -inform der -in ${i} 2>/dev/null) -pubin -in ${SIG} 2>/dev/null | hexdump -ve '/1 "%02x"') if [ "${ORIG_SHA256}" != "" ]; then echo "sha256 was decrypted using ${i} key - ${ORIG_SHA256}" fi if [ "${ORIG_SHA256}" = "${CALC_SHA256}" ]; then echo "sha256 ${ORIG_SHA256}" echo "$i" fi done 

boot fota, , fota . , .. bootloop, bootloop recovery. fota fotamng , .


, boot , fota , bootloop , , . boot , recovery . , recovery , boot. . ramdisk tags:


boot/recovery:


  ramdisk: 0x01000000 tags: 0x00000100 

fota:


  ramdisk: 0x02000000 tags: 0x01e00000 

Secure boot whitepaper Qualcomm , sha256 hash sha256 hash' ELF . Subject' . OU=05 00002000 SW_SIZE , sha256 hash 256 hash' 32 (0x2000/32=256). aboot ELF sbl1 (secondary boot loader).


little kernel Qualcomm, aboot. .



Kyocera Brigadier .


aboot . Subject' , . : aboot KC-S701 Brigadier. . , emmc Brigadier. , Brigadier KC-S701. fastboot. .


, " " — . Qualcomm QHSUSB__BULK , , download mode, USB mass storage. . , .


,



Fota


boot fota? . , , .


Kyocera properties


Kyocera android system properties properties, . , bootloader'. libkcjprop_jni.so kcjprop_daemon . , .


, :


 $ ls -la /sysprop/kcjprop/rw/8d9d788ddd5fecfdbc6c5f7c5cecfc -rw-rw---- root root 16 1970-01-22 21:01 8d9d788ddd5fecfdbc6c5f7c5cecfc 

Kexec


Kexec Linux . production Kexec, . user-end , . , — .


QSEE


QSEE — Qualcomm, . — Trust Zone. .


. emmc, RPMB. SCM . RPMB (Replay Protected Memory Block) , lock/unlock .


おわりに


画像


, aboot Kyocera Propertiies github: https://github.com/kayrus/break_free .


, . . , .


, Kyocera . . . , .


PS (Nikolay Elenkov), Android security internals . bootloader' Android.


PPS , Justin Case, , , Qualcomm, .



Source: https://habr.com/ru/post/J320150/


All Articles