
ç§ã®æåã®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
èŠããã«ïŒ
- åæ§ã®æäœãsepolicyã«ãŒã«ã«èšè¿°ãããŠããå ŽåãSELinuxããã»ã¹ã®ã³ã³ããã¹ããå€æŽã§ããŸãã Androidã®ããŒãžã§ã³4.4ïŒKitKatïŒã§ã¯ãã³ã³ããã¹ããå€æŽããããšã§ç¹æš©ãå¢ããæ©äŒããããŸãã ãã ãã5.x以éã§ã¯ããããå®è¡ã§ããªããªããŸããã
- ãã¡ã€ã«ã³ã³ããã¹ããååšããŸãã
- ãã¡ã€ã«ãšããã»ã¹ã®ã³ã³ããã¹ãã«å ããŠãAndroidã¯property_contextsãã©ã¡ãŒã¿ãŒã®ã³ã³ããã¹ããå®è£
ããŸãã
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
çŸåšã®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 ã詳现ã«ã€ããŠã¯åŸè¿°ïŒã§ããŒããããå Žåã«ã®ã¿ããããã®ããã¯ããã€ãã¹ã§ããŸããã
åèµ·å
ãŸããèå³æ·±ããã¡ã€ã«ã§ãã é»è©±ãããŠã³ããŒãããããã®å¯èœãªãªãã·ã§ã³ã«ã€ããŠèª¬æããŸãã
- adb reboot bootloader -fastbootã¢ãŒããæºåž¯é»è©±ã§ã¯äœ¿çšäžå¯ïŒ
0x77665500
-sbl1ã»ã¯ã·ã§ã³ã®16é²ã©ãã«00556677ïŒ - adb reboot recovery-ãªã«ããªã¢ãŒãïŒ
0x77665502
-sbl1ã»ã¯ã·ã§ã³ã®16é²ã©ãã«02556677ïŒ - adb reboot rtc-ããããALARM_BOOTã sbl1ã«ã©ãã«ããªãã®ã¯ãªããããããŸããã§ããã ããããhttps://developer.android.com/reference/android/app/AlarmManager.htmlãæå³ããŸã
- adb reboot oem-X ïŒç§ã®å Žåãoem-
0x6f656d01
ã¯sbl1ã»ã¯ã·ã§ã³ã®16é²ã©ãã«016d656fã§ãïŒã ãã®ã¢ãŒãäžã«äœãèµ·ãããã¯ãã¡ãŒã«ãŒãèšå®ããŸãã ãœãŒã¹ã³ãŒãããå€æãããšãã¢ãã ã»ã¯ã·ã§ã³ããã®ãã¡ãŒã ãŠã§ã¢ã®èªèšŒã§ãšã©ãŒãçºçããå Žåãé»è©±æ©ã¯ãã®ã¢ãŒãã§åèµ·åããŸãã - adb reboot edl-ç·æ¥ããŠã³ããŒããé»è©±ãéåžžã®ã¯ã¢ã«ã³ã ã®ããŠã³ããŒãã¢ãŒãã«ç§»è¡ããŸãã é»è©±æ©ã¯QHSUSB__BULK COMããŒããšããŠå®çŸ©ãããŸãããããä»ããŠã眲åãããããŒãããŒããŒã転éãïŒééã£ãŠããªãå ŽåãåããŒãããŒããŒã¯SoCã®1ã€ã®ã¿ã€ããšé»è©±æ©ã¡ãŒã«ãŒåãã«èšèšãããŸãïŒããã©ãã·ã¥ãå«ãé»è©±æ©ã§äœã¬ãã«ã®æäœãå®è¡ã§ããŸãã äžè¬ã«QPSTãšçµã¿åãããŠäœ¿çšââãããŸãã 京ã»ã©KYL22ãªã©ãäžéšã®é»è©±ã§ã¯ãããŒãããŒããŒããããã¯ãŒã¯ã«ãªãŒã¯ããŸãã 圌ããã©ãããæ¥ãã®ãã¯ç§ã«ã¯åãããªãã
- ããŠã³ããŒãã¢ãŒãã®äžçš®ãadbåèµ·åã§ã¯èµ·åã§ããŸããã ããã§ã¯èå³æ·±ãã§ã...ããããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
Qualcommããã»ããµãæèŒããæºåž¯é»è©±ã§ã®ããŠã³ããŒãæ¹æ³ã«ã€ããŠå°ã説æããŸãã
Qualcommã®çµ±åROMããŒãããŒããŒïŒpbl-ãã©ã€ããªããŒãããŒããŒïŒã¯ãsbl1ïŒã»ã«ã³ããªããŒãããŒããŒïŒããŒãã£ã·ã§ã³ãããŒãããŸãã sbl1ã¯tzïŒãã©ã¹ããŸãŒã³ïŒãããŒããã次ã«abootïŒAndroidããŒãããªãã«ã«ãŒãã«ãlkïŒãããŒãããŸãã 次ã«ãAbootã¯ããŒãããªã«ããªããŸãã¯fotaãããŒãããŸãã
ããŠã³ããŒãã«é¢ä¿ããã»ã¯ã·ã§ã³ã®èª¬æïŒ
- tz-Qualcomm Trust Zoneã QFusesïŒrpmbã»ã¯ã·ã§ã³ïŒã§ã®äœæ¥ãå«ããäœã¬ãã«ã®æäœãå®è¡ããŸãã
- rpm-ãªãœãŒã¹ããã³é»æºãããŒãžã£ãŒã®ãã¡ãŒã ãŠã§ã¢ã ãªãœãŒã¹ãšæ é€ãæ
åœããå°éã®SoCã®ãã¡ãŒã ãŠã§ã¢ã
- sdi-ãã©ã¹ããŸãŒã³ã¹ãã¬ãŒãžããŒãã£ã·ã§ã³ã Trust Zoneã䜿çšããããŒã¿ã
ãããã®ã»ã¯ã·ã§ã³ã¯ãã¹ãŠã蚌ææžãã§ãŒã³ã«ãã£ãŠçœ²åãããŠããŸãã
ãã©ã¿
å Žåã«ãã£ãŠã¯ããã¡ãŒã ãŠã§ã¢ã®æŽæ°ãç¡èŠãããšäŸ¿å©ã§ãã
FOTA-ç¡ç·ã«ãããã¡ãŒã ãŠã§ã¢ã ããŒããšãªã«ããªãšã¯ç°ãªããfotaã¯éå
¬åŒã®AndroidããŒãã¢ãŒãã§ãã fotaã®ã¿ã¹ã¯ã¯ããã¡ãŒã ãŠã§ã¢ãæŽæ°ããããšã§ãã 京ã»ã©ã§ã¯ãããã«Red Bendã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããŸãã35Mbã§ã¯ãã«ãŒãã«ã ãã§ãªã/system
ããŒãã£ã·ã§ã³ã®æŽæ°ã«ã察å¿ããŠããŸãã ãããã£ãŠã /system
ã»ã¯ã·ã§ã³ãžã®æžã蟌ã¿ã¯çŠæ¢ãããŠããŸããããããªããšãééã£ãããŒã¿ã«ããããé©çšãããšãé»è©±ããããã¯ãããå¯èœæ§ããããŸãã
æºåž¯é»è©±ã«æŽæ°ããããŸããã ãã€ã§ãæžã蟌ã¿/cache
ããæŽæ°ãäžæããæ©äŒããã§ã«ãã£ãã®ã§ãç§ã¯ããã«ææŠããããšãã§ããŸããã
Javaã¢ããªã±ãŒã·ã§ã³ã¢ããããŒãã®ãœãŒã¹ã³ãŒããæ€èšããçµæãã©ã®ããã«çºçããããæããã«ãªããŸããã
- Java
/cache/delta/boot_delta.bin
, /cache/delta/Alt-OTA_dlcomplete
, , header'. - .
- ,
libjnialtota.so
fotamng
. - .
, 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 >
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 ()) 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 --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 [ != ]; then echo fi if [ = ]; then echo echo 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. . , .
,
- / WiFi ? UPD:
- sepolicy ? sepolicy? - ?
- oem-1?
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, .