Android 4.0 "Ice Cream Sandwich" ã® ASLR ã¨ãã®åé¡
Android 3.x ã¾ã§ã¯ãASLR ãå ¨ãåå¨ããªãã£ããã¨ãåé¡ã®ã²ã¨ã¤ã§ãããAndroid 4.0 "Ice Cream Sandwich" ã§ ASLR ã追å ããããã¨ã«ãããã©ãã¾ã§æ»æã«å¼·ããªã£ãã®ããè¦ã¦ã¿ããã¨èãã¾ããâ¦ãâ¦ã¨ãã¥ã¬ã¼ã¿ã§è©¦ãã¨ã©ã³ãã è¦ç´ ããªãã¨ããé大ãªåé¡ã«è¡ãå½ããã¾ããã
2 ã¤ã®åé¡
ASLR ãã¨ãã¥ã¬ã¼ã¿ä¸ã§ãã¾ãåãã¦ããªãã®ã¯ã次㮠2 ã¤ã®åé¡ãè¤åãã¦ãããã®ã¨èãããã¾ãã
- ARM ã«ããã mmap ã®ã©ã³ãã æ§ã®åé¡
- app_process ã³ã³ãã¤ã©ãã©ã°ã®åé¡
ARM ã«ããã mmap ã®ã©ã³ãã æ§ã®åé¡
ãã®åé¡ãããå ´åã«ã¯ãã¹ã¦ã®ã©ã¤ãã©ãªã¯ 0x4000_0000 ããé çªã«ä¸¦ã³ãã©ã³ãã æ§ã失ãã¾ããä¾ãã°ãããªé¢¨ã«ã
40000000-40000fff r-x /library1.so 40001000-40006fff r-x /library2.so 40007000-40009fff r-x /library3.so
ãã®æ ¹æ¬åå ã¯ãARM ã«ããã mmap ã®ã©ã³ãã æ§ã®åé¡ã§ãã
ã©ã¤ãã©ãªã¯ mmap ã§ãã¼ãããã
AOSP ã§ sync ããã½ã¼ã¹ã³ã¼ãã®ãã¡ãbionic/linker ä¸ã«ãã linker.c ããã©ã¤ãã©ãªããã¼ãããããã®ã³ã¼ããä¿æãã¦ãã¾ããã½ã¼ã¹ã³ã¼ãã«ããã°ãã©ã¤ãã©ãªã¯ mmap ã§ããããããé åã«ãã¼ãããã¾ããã§ã¯ mmap ãã¡ã¢ãªãã©ã³ããã¤ãºããã®ã¯ã©ãã§? çãã¯ã«ã¼ãã«ã® arch/.../mm/mmap.c ã§ããããã¯ç©ºãã¡ã¢ãªé åããå¿
è¦ããã°ã©ã³ãã åãã¦è¿ããã¨ãåºæ¬çãªå½¹ç®ã§ãã
ãããã©ã³ãã åã®ã³ã¼ãã Android 2.6.35.7 ãã¼ã¹ã®ã¨ããããã¤ã¹ã®ã½ã¼ã¹ã³ã¼ãä¸ (arch/arm/mm/mmap.c) ã«ã¯è¦å½ããã¾ããã§ãããçµè«ããè¨ãã°ãARM ã® mmap ã«ã©ã³ãã æ§ã追å ãããã®ã¯æ¯è¼çæè¿ãªã®ã§ãã(x86 ã¯ãã£ã¨åã«ã©ã³ãã åã®ããã®ã³ã¼ãããã¼ã¸ããã¦ãã¾ãã)
ã«ã¼ãã«ã®ãã¼ã¸ã§ã³
Linux ã®ã³ããããã°ãè¦ã¦ã¿ã㨠ARM ã® mmap ã©ã³ãã åãå°å
¥ãããã®ã¯ 2.6.35-rc2 以éã§ããããæ¬å®¶ã® 2.6.35 ã«ã¯ãã¼ã¸ããã¦ãã¾ãããã¡ã¤ã³ã©ã¤ã³ã¸ã®çµ±å㯠2.6.36 ã§ãå½ç¶ãã以ä¸ã®ãã¼ã¸ã§ã³ã®ã«ã¼ãã«ã使ããªãéããmmap ã§è¿ãããã¢ãã¬ã¹ã¯ã©ã³ãã åããã¾ããã
ã¨ãã¥ã¬ã¼ã¿ã¯ãã¨ããã°ãã©ã®ãã¼ã¸ã§ã³ãå¤ããã 2.6.29 ãã¼ã¹ãããããããåé¡ã ã£ãã®ã§ãããã¨ã prelink æ
å ±ãåé¤ã㦠ASLR ãçè«ä¸å¹ãããã«ãã¦ããå®éã®ãã¼ãã«ä½¿ç¨ããã mmap ã®ã©ã³ãã æ§ããªããã°æå³ãããã¾ãããAndroid ã¨ãã¥ã¬ã¼ã¿ã¯ã¡ããã©ãã®åé¡ã«å½ãã£ã¦ãã¾ã£ãã¨ãããã§ãããã
䏿¹ã®å®æ©â¦ä¾ãã° Galaxy Nexus ã¯ããã§ã«å
¬éãããã¹ã¯ãªã¼ã³ã·ã§ããã« 3.0.1 ã¨ã®è¡¨è¨ãããã¾ããããã£ã¦ãã©ã¤ãã©ãªã«é¢ãã¦ã¯ Android 4.0 ã®å®æ©ã§ã¯ ASLR ãå¹ãã¯ãã§ãã(ç§ã¯å®æ©ãæã«å
¥ããããã§ã¯ãªãã®ã§æå®ããã§ãã¾ãããã)
app_process ã³ã³ãã¤ã©ãã©ã°ã®åé¡
ãã¡ãã¯ããå ¨ãã®å¥åé¡ãã§ããåè ã®åé¡ã¨ã¯ç¬ç«ãã¦ãã¾ãããã®åé¡ãããã¨ãã«ã¯ãapp_process ãå ¨ãã©ã³ãã åãããã0x0000_8000 以éã«é ç½®ããã¾ããä¾ãã°æ¬¡ã®ããã«ã
00008000-00009fff r-x /system/bin/app_process 0000a000-0000afff rw- /system/bin/app_process
ãã¡ã㯠mmap ã®åé¡ã§ã¯ãªããapp_process ãã³ã³ãã¤ã«ããã¨ãã®åé¡ã§ãã
PIE (Position Independent Executable)
PIE ã¨ãã種é¡ã®ãã¤ããªãããã¾ããããã¯å®è¡ãã¨ã«ã©ã³ãã åããããã¨ã§ãASLR ã®æ©æµã常ã«åããã¿ã¤ãã®ãã¤ããªã§ããã³ã³ãã¤ã©ãã©ã°ã¯ -fPIEããªã³ã«ãã©ã°ã«ã¯ -pie ãä»å ãããã¨ã«ãã£ã¦ããã®ç¨®ã®ãã¤ããªã使ãããã¨ãã§ãã¾ãã
ãããã¦çæããããã¤ããªã«ã¯ç¹å¾´ãããã¾ããELF ãã¡ã¤ã«ã¨ãããã¨ã«ã¯å¤ããããã¾ããããELF ãã¡ã¤ã«ã®ç¨®é¡ã示ãã¡ã³ãã¼ã®å¤*1ãé常ã®å®è¡ãã¡ã¤ã«ã示ã ET_EXEC ã§ã¯ãªããå
±æã©ã¤ãã©ãªã示ã ET_DYN ã¨ãªãã®ã§ãã*2
ãããå®éã«ã³ã³ãã¤ã«ããã app_process ãè¦ã¦ã¿ãã¨ãâ¦ET_EXEC ã§ãorz
ET_EXEC ããä½ãæªããã¨ããã¨ãã«ã¼ãã« (fs/binfmt_elf.c) ã ELF ãããã«ç¤ºãããéãã®åºå®ã®ã¡ã¢ãªã¢ãã¬ã¹ã確ä¿ãã¦ãã¾ãã¾ããããã«ãã ASLR ãå¹ããªãããã«ãªã£ã¦ãã? ã®ã§ãã
ã³ã³ãã¤ã©ãã©ã°ã®åé¡
Android ã®ãã¼ã«ãã§ã¼ã³ã¯ -fPIC ãå®è¡ãã¡ã¤ã«ã«ã¤ãã¾ããã-fPIE ã¯ã¤ãã¾ããããã㦠-fPIC ã¤ãã§çæãããå®è¡ãã¡ã¤ã«ã¯åãªã PIC ãªå®è¡ãã¡ã¤ã« (ET_EXEC) ã«ãªã£ã¦ãã¾ãã®ã§ãâ¦ã
ãã¡ãã«é¢ãã¦ã¯ãã«ã¼ãã«ã®ãã¼ã¸ã§ã³ã§ã¯è§£æ±ºãã¾ãããããã¯ã仿§ãã ããã§ãã
çµè«
ã©ã¤ãã©ãªã®ã©ã³ãã åã«é¢ãã¦ã¯ããããã宿©ã§ã¯åé¡ãªãã§ããããmmap ã®ã©ã³ãã åã¯ãä¸è¾ã«ãå¼·ãã¨ã¯ããã¾ãã (ä¸åã®ç¢ºä¿ã«ã¤ãã256 éãã®ã¢ãã¬ã¹ãã 1 ã¤é¸ã°ãã) ããããã§ãã¨ã³ãããã¼ã ãã§ããã° 32-bit ç Windows (åãã 256 éãã®ã¢ãã¬ã¹ä¸ãã 1 ã¤é¸ã°ãã) ã«ç¸å½ãã¾ããã§ãã app_process ã¯å®å
¨ãªãã¹ã«è¦ãã¾ããASLR ã¯å®è¡ã³ã¼ãå
¨é¨ãé©åã«ã©ã³ãã åããã¦ãããã¨ãåæã§ããããããã®ããã«ä¸é¨ã§ãå®è¡å¯è½ãªã³ã¼ããåºå®ããã¦ããã¨ãexploit ã®å¯è½æ§ãæ®ãã¾ãã
幸ãã«ã app_process ã¯å°ãããã¾ãä½ä½ã¢ãã¬ã¹ã«é
ç½®ããã¦ãããããä½ãã¨ããã«çã£ã¦ããå®ã¨ã¯ããã¾ãããããããªãããâ¦ASLR ãã¤ãããã¨ããããããªãªã¼ã¹ãã¼ãã«æ¸ããã®ã ã£ããããã®åé¡ãããã¯è§£æ±ºãã¦ããã¦ã»ããã£ãã§ãã