æªçšã«å¯Ÿãããã©ãŠã¶ãŒã®ä¿è·ã«é¢ããäžé£ã®èšäºãç¶ããŸãã
Chromeãã©ãŠã¶ãŒã®å éšã調ã¹ãŠããã®äžæ£å©çšå µåšã®å 容ã調ã¹ãŠã¿ãŸãããã
ææ°ããŒãžã§ã³ã®Windowsããã³ã³ã³ãã€ã©ãŒã«ãã£ãŠæäŸãããäžè¬çãªã¡ã«ããºã ãå«ãŸããŸãã
- ã¢ãžã¥ãŒã«ããŒã¿ããŒã¹ã®ã©ã³ãã åïŒç»åASLRïŒã
- HighEntropy ASLRïŒ64ãããã¢ãã¬ã¹ã䜿çšãWindows 8以éïŒ;
- Force ASLRïŒã¢ãžã¥ãŒã«ããŒã¹ã®åŒ·å¶ã©ã³ãã åïŒ;
- å²ãåœãŠã®ã©ã³ãã åïŒHeapAllocãVirtualAllocãWindows 8以éïŒïŒ
ã¡ã¢ãªå²ãåœãŠé¢æ°ã¯ãè¿ãããã¡ã¢ãªããŒã¹ã3ã€ã®æ¹æ³ã§éžæããŸãã
- æäžäœã¢ãã¬ã¹ãéžæããŸãã
- æäžäœã¢ãã¬ã¹ã®éžæ
- ç¹å®ã®ããŒã¹ã«é¢é£ããã¢ãã¬ã¹ãéžæããŸãã
Windows 8ããåã®ã·ã¹ãã ã§ã¯ãæåã®2ã€ã®æ¹æ³ã¯ã©ã³ãã åãããŠããªãã£ãããã
äºæž¬å¯èœãªã¢ãã¬ã¹ã«ã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸãã
- ããŒã¿å®è¡é²æ¢ïŒ
éå®è¡å¯èœã¡ã¢ãªïŒã¹ã¿ãã¯ãããŒãããããã®ã¢ãžã¥ãŒã«ã®ã»ã¯ã·ã§ã³ãªã©ïŒã - ã¹ã¿ãã¯CookieïŒã«ããªã¢ïŒïŒ
é¢æ°ã®ããããŒã°ã§ã¯ãã¹ã¿ãã¯ã«æ»ãã¢ãã¬ã¹ã®åã«ã©ã³ãã ãªå€ãé 眮ãããå¶åŸ¡ãè¿ãåã«ãã§ãã¯ãããŸãã ã¹ã¿ãã¯å ã®ãããã¡ãªãŒããŒãããŒã®æäœãè€éã«ããŸãã - å®å
šãªæ§é åäŸå€åŠçïŒSAFESEHïŒïŒ
å¶åŸ¡æ§é SEH_EXCEPTION_REGISTRATION_RECORDã®å 容ãäžæžãããããšã«ãããå¶åŸ¡ã®ååãé²ããŸãã ãã®æ§é ã§æå®ããããã³ãã©ã«å¶åŸ¡ãæž¡ãåã«ããã§ãã¯ãããŸãã ãã³ãã©ãŒãå±ããå®è¡å¯èœã¢ãžã¥ãŒã«ã/ SAFESEHã§æ§ç¯ãããŠããå Žåãã¢ãã¬ã¹ã¯ãã®ã¢ãžã¥ãŒã«ã®ãã³ãã©ãŒã®SEHããŒãã«ãšç §åãããŸãïŒãªã³ã¯äžã«ããã€ããªãŒã«çž«ãä»ããããŸãïŒã - æ§é åäŸå€ãã³ãã©ãŒã®äžæžãä¿è·ïŒSEHOPïŒïŒ
ããèªäœã¯çæ³ããã»ã©é ãããã以åã®ææ³ãè£å®ããŸãã 第äžã«ãã¢ããªã±ãŒã·ã§ã³ã®åã³ã³ãã€ã«ãå¿ èŠã§ããã第äºã«ããã³ãã©ã/ SAFESEHã®ãªãã¢ãžã¥ãŒã«ã«ããå ŽåããŸãã¯ã¢ãžã¥ãŒã«ã®å€åŽã«ããå Žåã§ããåã«æ©èœããŸããã§ããã ãã®ãããMicrosoftã¯OSã¬ãã«ã®ãã¯ãããžãŒ-SEHOPãè¿œå ããŸããã ãã®æ¬è³ªã¯ãSEHãã§ãŒã³ã®æŽåæ§ããã§ãã¯ããããšã§ããã¹ããªãŒã ã®éå§æã«ããã«ããªã¢ããSEHãã³ãã©ãŒã®ãã§ãŒã³ã«è¿œå ããããã³ãã©ãŒãåŒã³åºãããåã«ãã®ååšããã§ãã¯ãããŸããã ååãšããŠãäŸå€ãã³ãã©ãŒã®ã¢ãã¬ã¹ãæžãæãããšããã€ã³ã¿ãŒã¯ãã§ãŒã³å ã®æ¬¡ã®æ§é ãäžæžãããŸããããã«ããããã§ãŒã³ãç Žæãããã«ããªã¢ãã«ã¢ã¯ã»ã¹ã§ããªããªããŸãã - å¶åŸ¡ãããŒã¬ãŒãïŒCFGïŒïŒ
éæ¥ãžã£ã³ãã³ãã³ãã§ã¢ãã¬ã¹ããã§ãã¯ããããšã«ãããä»®æ³é¢æ°ããŒãã«ãå«ãããã°ã©ã ããŒã¿ã®ã¢ãã¬ã¹ãæžãæããããšã«ãããå¶åŸ¡ãããŒãååãããã®ãé²ããŸãã ã¢ãžã¥ãŒã«é¢æ°ã®æå¹ãªã¢ãã¬ã¹ã¯ããããããã«ä¿åãããŸããããããããã¯ã³ã³ãã€ã©ãŒã«ãã£ãŠäœæãããŸãã 詳现 - Windowsç·©åããªã·ãŒïŒ
Windows 8以éã«ãã£ãŠããã»ã¹ã«é©çšãããããã€ãã®å¶éãChromeã§ã¯ããµã³ãããã¯ã¹ã«æ¬¡ã®ãã®ã䜿çšããŸãã
- ç»åã®åé 眮
- ããŒãçµäº
- ããã ã¢ããASL
- é«ãšã³ããããŒASLR
- å³å¯ãªãã³ãã«ãã§ãã¯
- ãã©ã³ãã®èªã¿èŸŒã¿ãç¡å¹ã«ãã
- ãªã¢ãŒãããã€ã¹ããã®ã€ã¡ãŒãžããŒããç¡å¹ã«ãã
- ãå¿ é ã®äœãïŒäœæŽåæ§ã¬ãã«ïŒã®ç»åããŒããç¡å¹ã«ããŸã
- åããã»ã¹ã®äœæãããã«ç¡å¹ã«ãã
ãã©ãŠã¶ã®å éšã¡ã«ããºã ãæ€èšããŸãã
- é
åPartitionAllocïŒ
ããŸããŸãªãµã€ãºãšã¿ã€ãã®ãªããžã§ã¯ããããŸããŸãªããŒãã«åæ£ã§ããããã解æŸãããã¡ã¢ãªã®åè£ãªããžã§ã¯ããéžæããæ»æè ã®èœåãäœäžããŸãã ãããèªäœã®å åŽãšãã®å¢çã®äž¡æ¹ã§ãããŒããªãŒããŒ/ã¢ã³ããŒãããŒããã£ããããã®ã«åœ¹ç«ã¡ãŸãã 詳现-ããã«ã - C ++ã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®ãã¬ãŒã¹-Oilpan;
- JavaScript JITã³ã³ãã€ã©ãŒïŒ
ãšã¯ã¹ããã€ãèŠçŽ ã®çæã«äœ¿çšããããšãå°é£ã«ããå€ãã®ã¡ã«ããºã ãå«ãŸããŠããŸãã - ãµã³ãããã¯ã¹ïŒ
ã³ã³ããŒãã³ãã®ã»ãã¥ãªãã£äŸµå®³ã«ãã被害ãæžããããã«èšèšããããã©ãŠã¶ã»ãã¥ãªãã£ã·ã¹ãã ã
UaFãšã¡ã¢ãªç Žæã®æŠèŠ
ãã©ãŠã¶ã¯ãããã¥ã¡ã³ãã³ã³ããŒãã³ããªããžã§ã¯ãïŒWebããŒãžïŒã管çããããã®APIãæäŸããŸãã ãã®ããã¥ã¡ã³ãã®å 容ã¯ããŒãã®ããªãŒã®åœ¢åŒã§è¡šãããåããŒãïŒèŠçŽ ãå±æ§ãããã¹ããã°ã©ãã£ãã¯ããŸãã¯ãã®ä»ã®ãªããžã§ã¯ãïŒã¯DOMã®è¡šçŸã§ãã ãã®ããªãŒã®ããŒãïŒãããŒããïŒã¯ãJavaScriptã§äœæãç Žæ£ãããã³å€æŽã§ããŸãã å€ãã®çžäºäŸåããè€éãªãªããžã§ã¯ãã®ååšã¯ããã°ã®ååšã®åææ¡ä»¶ã§ãããJavaScriptã䜿çšããŠãããã®ãªããžã§ã¯ãã管çãã䟿å©ãã¯ããããã®ãã°ã䜿çšããæ¹æ³ã§ãã
ããŒãäžã®ãªããžã§ã¯ãã«æå·ãäžãããã°ã¯ããã©ãŠã¶ãŒãæªçšããäžé£ã®ã¢ã¯ã·ã§ã³å šäœã®éå§ç¹ã§ããããšãéåžžã«å€ãã§ãã ãããã«ãã£ãŠåŒãèµ·ããããè匱æ§ã¯ã倧ãã2ã€ã®ã«ããŽãªã«åé¡ã§ããŸãã
- äžæçïŒäžæçïŒ-ãªããžã§ã¯ãã®ååšæéå€ã«ãªããžã§ã¯ãã䜿çšããããšããçµæãšããŠçºçããŸãïŒããšãã°ããªãªãŒã¹åŸã«ãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºããŸãïŒã
- 空éïŒç©ºéïŒ-ã¡ã¢ãªå ã®ãªããžã§ã¯ãã®å Žæãè¶ ãã誀ã£ãã¢ã¯ã»ã¹ïŒããšãã°ãç¡å¹ãªã€ã³ããã¯ã¹ã®é åèŠçŽ ãžã®ã¢ã¯ã»ã¹ïŒã«ãã£ãŠçæãããŸãã
è匱ãªãªããžã§ã¯ãã䜿çšããŠãã¡ã¢ãªå ã®ä»ã®ãªããžã§ã¯ããžã®ã¿ãŒã²ãããçµã£ã圱é¿ãé²ãããã«ãã¢ãã±ãŒã¿ãŒã§å®è£ ãããå€ãã®ã¡ã«ããºã ïŒããŒããããŒãžã£ãŒïŒãèæ ®ããããšãææ¡ãããŠããŸãã
Blink-Chromeã¬ã³ãã©ãŒ-ç¬èªã®2ã€ã®ã¢ãã±ãŒã¿ãŒïŒPartitionAllocãšOilpanïŒå¥åBlinkGCïŒã䜿çšããŸãã 2ã€ã®ãŸããªã±ãŒã¹ããããŸãã
- ç Žæ£å¯èœãªã¡ã¢ãª-倧ããªã°ã©ãã£ãã¯ãªããžã§ã¯ãããã£ãã·ã¥ããããã«äœ¿çšãããããŒãžã¡ã¢ãªã ããã€ã¹ã®ç©ºãã¡ã¢ãªããªããªããšè§£æŸãããŸãã
- mallocã圌ãã¯å®å šã«åãé€ãããã
Partitionalloc
PartitionAllocã¯ã èªåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæ³å®ãããŠããªããªããžã§ã¯ãã«äœ¿çšãããŸãã ããã圌ã®Oilpanãšã®å€§ããªéãã§ãã
PartitionAllocèšèšã«ã¯ãã¡ã¢ãªå ã®ãªããžã§ã¯ãã®å®å šæ§ã«é¢é£ããèŠçŽ ãå«ãŸããŸãã
- ç°ãªãã¿ã€ãã®ãªããžã§ã¯ãã®å²ãåœãŠã®åå²ã ãã®åé¢ã«ãããè匱æ§ã®ãããªããžã§ã¯ãããå¥ã®ã¿ã€ãã®ãªããžã§ã¯ããžã®ããŒã¿ã®èªã¿åããŸãã¯æžã蟌ã¿ã«ã€ãªãããã°ãæªçšããå Žåãæ»æè
ãæã€èœåãäœäžããŸããããšãã°ããã®ããŒãã®ç·åœ¢ãããã¡ãªãŒããŒãããŒã§ãã
- LayoutObjectsã¯ãããŒãžèŠçŽ ã衚瀺ããããã«ã¬ã³ãã©ãŒã䜿çšããDOMããŒãã«å¯æ¥ã«é¢é£ãããªããžã§ã¯ãã§ãã
- ãããã¡-é åãæååãããããã¯ãã«çšã®ãããã¡ã
- FastMalloc-ããŸããŸãªãªããžã§ã¯ãã®ããªãåºç¯ãªãªã¹ãã§ãã
- ããŒãã¡ã¿ããŒã¿ãå¥ã®é åã«ä¿åãã-ã€ãŸã ãŸããæå·ãé²ãããã«æç±ãããŠããŸãã
- freelistïŒç©ºãã¡ã¢ãªãããã¯ã®ãªã¹ãïŒãžã®ãã€ã³ã¿ã¯ãéšåçãªæžãæããŸãã¯éåç §ããä¿è·ãããŠããŸãã
- 倧ããªå²ãåœãŠã¯åå¥ã«é 眮ãããã¬ãŒãããŒãžïŒããã»ã¹ãç·æ¥ã«äžæãããã¢ã¯ã»ã¹æã«å²ãåœãŠããããããã¯ã®çµããã®ååŸã®ã¡ã¢ãªããŒãžïŒã«ãã£ãŠãã¬ãŒã åãããŸãã
ãã®éçºã¯ãMobile Pwn2Own 2013ã§Pinkie Pie ã瀺ãããšã¯ã¹ããã€ããèŠããšããããŸããããã§ã¯ãèè
ã¯åä»ãé
åã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§çºçããæŽæ°ãªãŒããŒãããŒã䜿çšããŠããŸãã æ¡ä»¶ã¯æ¬¡ã®ãšããã§ãïŒFloat64é
åã®ãããã¡ãŒãå²ãåœãŠãããŸããããã®ãã¹ãŠã®èŠçŽ ã®é 次åæåã¯ãã®çµãããè¶
ããFloat64åã®ä»»æã®å€ã®èšé²ã¯ãå²ãåœãŠããããããã¡ãŒã®åŸã®ã¡ã¢ãªã®8ãã€ãããšã«ããã«ä»»æã«ç¶ç¶ã§ããŸãã é©åãªé·ãã®é
åã«ã¯ã倧ããªãããã¡ãŒãå¿
èŠã§ããPartitionAllocã¯ãå²ãåœãŠãã·ã¹ãã ã¢ãã±ãŒã¿ãŒïŒAndroidã®dlmallocïŒã«å§ä»»ããŸãã ãã³ããŒãã€ã¯ãããŒãäžã®æ¬¡ã®å²ãåœãŠã®ã¿ã€ãã«ãæžãçŽãããµã€ãºãå€æŽããããã«é
眮ããããªããžã§ã¯ãã解æŸãïŒããªãŒãªã¹ãã«é©åãªãµã€ãºã®ãããã¯ãè¿œå ããŸãïŒããã®æç¹ã§ç¹å®ã®ãµã€ãºã®æ¬¡ã®ãªããžã§ã¯ãã®å²ãåœãŠãéæããŸãã-ä»»æã®å€ãæžãç¶ããããšãã§ããŸãã
ãããããéçºè
ãã¢ãã±ãŒã¿ã¡ã¿ããŒã¿ãä¿è·ããçç±ã倧èŠæš¡ãªå²ãåœãŠãã¬ãŒãããŒãžã«ãã£ãŠãã¬ãŒã åããããã®æ¹æ³ã§ãããã¡ãè¶
ããããšãã§ããªãçç±ãåä»ãé
åã®ãããã¡ãä»ã®ãªããžã§ã¯ãããåé¢ãããçç±ãããããŸãã
ãªã€ã«ãã³
Oilpanã¯ãèªåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæäŸããŸãã ãã®ã·ã¹ãã ã¯ã解æŸåŸäœ¿çšã¯ã©ã¹ãšã©ãŒã®åå ã§ããéçºè ã«ããæåã¡ã¢ãªç®¡çã®å¿ èŠæ§ãåãé€ããŸãã ãã®ãããªãšã©ãŒã«ãã£ãŠåŒãèµ·ããããè匱æ§ã®æ¬è³ªãç°¡åã«æãåºããŠã¿ãŸãããããªããžã§ã¯ãã¯ææå°æ©ã«ãªãªãŒã¹ãããŸããã€ãŸãããã®åŸã«äœ¿çšã§ãããªãªãŒã¹ã§ãã
äŸãšããŠããããžã§ã¯ããã°ãã©ãã«ãŒã§èŠã€ãããã®ãèŠãŠã¿ãŸãããïŒ https ://bugs.chromium.org/p/chromium/issues/detail?id=69965ããã§ãGeolocationã¯ã©ã¹ã«é¢é£ããUaFãã°ãæ€èšããŸãã ããŒãžãæŽæ°ããããšGeolocationã¯ã©ã¹ã®ãªããžã§ã¯ããç Žæ£ãããŸããããžãªãã±ãŒã·ã§ã³ã解決ãããªã¯ãšã¹ãã¯ä»¥åã«ãã£ã³ã»ã«ãããããã³ã°ãã€ã³ã¿ãŒããªã¯ãšã¹ããããŒãžã£ãŒã«æ®ããå°æ¥ã¿ããéãããããšãã«ãããããã£ã³ã»ã«ããããšãããšãfreedãžã®èª€ã£ãã¢ã¯ã»ã¹ãçºçããŸãäœçœ®æ å ±ãªããžã§ã¯ãã ãã®ãã°ã®ãããã¯ãgeolocationã¯ã©ã¹ã«pageDestroyedã¡ãœãããè¿œå ããŸããããã¯ãããŒãžãªããžã§ã¯ãããªãªãŒã¹ããããã®æ£ããé åºã調æŽããŠããããã§ãã ãã以æ¥ãGeolocationã¯ã©ã¹ã¯ãOilpanã®å®è£ ã«é¢é£ããå€æŽãåããçŸåšã§ã¯ãã®ã·ã¹ãã ã«ãã£ãŠèªåçã«å¶åŸ¡ãããŠããŸãã
ãã®ãããªãã°ã®æªçšã¯ãè匱ãªãªããžã§ã¯ããããŒãããåé€ãããæ¡ä»¶ãæºããããã®ãªããžã§ã¯ããã解æŸãããã¡ã¢ãªã«å¶åŸ¡ããŒã¿ãé 眮ãããã®æ¹æ³ã§ãåœãªããžã§ã¯ãããäœæãããã®åœãªããžã§ã¯ãã®èŠçŽ ãç¬èªã®ã¡ã³ããŒãšããŠäœ¿çšããæ¡ä»¶ãæºãããŸãã ã ãã®ã¢ã¯ã·ã§ã³ã®2çªç®ã®éšå-空ãã¡ã¢ãªã«é 眮ããŠåœã®ãªããžã§ã¯ããäœæãã-ãé²ãããã«ãChromeéçºè ã¯ãç°ãªãã¿ã€ãã®ãªããžã§ã¯ããååšããã¡ã¢ãªé åãåé¢ããŸãã ãããã©ã®ããã«è¡ãããããèŠãŠã¿ãŸãããïŒ
// Override operator new to allocate Node subtype objects onto // a dedicated heap. GC_PLUGIN_IGNORE("crbug.com/443854") void* operator new(size_t size) { return allocateObject(size, false); } static void* allocateObject(size_t size, bool isEager) { ThreadState* state = ThreadStateFor<ThreadingTrait<Node>::Affinity>::state(); const char typeName[] = "blink::Node"; return ThreadHeap::allocateOnArenaIndex( state, size, isEager ? BlinkGC::EagerSweepArenaIndex : BlinkGC::NodeArenaIndex, GCInfoTrait<EventTarget>::index(), typeName); }
Chromium // src / third_party / WebKit / Source / core / dom / Node.h
ãªãŒããŒã©ã€ããããnewã§ã¯ãallocateObjectãåŒã³åºãããåŒæ°isEager == falseã§ãããããThreadHeap :: allocateOnArenaIndexã¯3çªç®ã®åŒæ°arenaIndexãBlinkGC :: NodeArenaIndex-ãªããžã§ã¯ããéžæããã¢ãªãŒãã€ã³ããã¯ã¹ïŒã¡ã¢ãªé åïŒã«ãªããŸãã
inline Address ThreadHeap::allocateOnArenaIndex(ThreadState* state, size_t size, int arenaIndex, size_t gcInfoIndex, const char* typeName) { ASSERT(state->isAllocationAllowed()); ASSERT(arenaIndex != BlinkGC::LargeObjectArenaIndex); NormalPageArena* arena = static_cast<NormalPageArena*>(state->arena(arenaIndex)); Address address = arena->allocateObject(allocationSizeFromSize(size), gcInfoIndex); HeapAllocHooks::allocationHookIfEnabled(address, size, typeName); return address; }
Chromium // src / third_party / WebKit / Source / platform / heap / Heap.h
ä»ã«ã©ã®ãããªå°åãç¹å®ãããŠããŸããïŒ
enum HeapIndices { EagerSweepArenaIndex = 0, NormalPage1ArenaIndex, NormalPage2ArenaIndex, NormalPage3ArenaIndex, NormalPage4ArenaIndex, Vector1ArenaIndex, Vector2ArenaIndex, Vector3ArenaIndex, Vector4ArenaIndex, InlineVectorArenaIndex, HashTableArenaIndex, FOR_EACH_TYPED_ARENA(TypedArenaEnumName) LargeObjectArenaIndex, // Values used for iteration of heap segments. NumberOfArenas, }; * * * // List of typed arenas. The list is used to generate the implementation // of typed arena related methods. // // To create a new typed arena add a H(<ClassName>) to the // FOR_EACH_TYPED_ARENA macro below. #define FOR_EACH_TYPED_ARENA(H) \ H(Node) \ H(CSSValue) #define TypedArenaEnumName(Type) Type##ArenaIndex,
Chromium // src / third_party / WebKit / Source / platform / heap / BlinkGC.h
ããã§ã¯ãNodeã®ã¡ã¢ãªãªããžã§ã¯ããCSSValueãHashTablesã§ãVectorsã¯ã©ã¹ãåé¢ãããŸãã ãã®ã¢ãã±ãŒã¿ãŒã«ããä»ã®ãªããžã§ã¯ãã¯ããµã€ãºãé åããšã«åæ£ãããŸãã
Oilpan / BlinkGCã®éèŠãªæ©èœã§ããèªåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ç§»ããŸãããã ãã®ã·ã¹ãã ã§ç®¡çããå¿ èŠããããªããžã§ã¯ãã¯ã GarbageCollected ã GarbageCollectedFinalizedããŸãã¯GarbageCollectedMixinãã³ãã¬ãŒãã¯ã©ã¹ãç¶æ¿ããŸãã ããŒãã«ãããããã®ã¯ã©ã¹ã®ã¡ã³ããŒãªããžã§ã¯ãã¯ãå¿ èŠãªã»ãã³ãã£ã¯ã¹ã«å¿ããŠã MemberãŸãã¯WeakMemberãã³ãã¬ãŒãã¯ã©ã¹ã«ãã£ãŠè¡šãããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¢ã«ãŽãªãºã ã¯ããŒã¯ã¢ã³ãã¹ã€ãŒãã¢ã«ãŽãªãºã ã§ããã2ã€ã®äž»èŠãªã¹ãããã§æ§æãããŸãã
- mark-ãªããžã§ã¯ãã®ã°ã©ãããã©ããŒã¹ãããŸã;ãã®ããã«ãããããã®traceïŒïŒã¡ãœãããåŒã³åºãããããããå°éå¯èœãªãªããžã§ã¯ããããŒã¯ããŸã ãã®ãããªãã€ãã¹ã®éå§ç¹ã¯ãããã°ã©ã ã®çŸåšã®ç¶æ
ã«å¿ããŠ2ã€ã®ããªãšãŒã·ã§ã³ã§éžæã§ããŸãã
- æ£ç¢º-ã¡ãã»ãŒãžåŠçãµã€ã¯ã«ã®çµããã«ããã°ã©ã ã¹ã¬ãããåæ¢ãããšãã«éžæãããŸãã ããã«ãããã¹ããªãŒã ã¹ã¿ãã¯ã«ãçã®ããã€ã³ã¿ãååšããªãããšãä¿èšŒãããŸããã€ãŸããç¹å¥ãªã°ããŒãã«ãªãæ°žç¶ãã³ãã«ããã€ã³ã¿ããç¶è¡ã§ããŸãã
- ä¿å®ç-ã¹ã¬ããã®ã¹ã¿ãã¯ãééããããããå¯èœãªãã€ã³ã¿ãååŸããå¿ èŠãããå Žåã«å®è¡ãããŸãã
- ã¹ã€ãŒã-åã®ã¹ãããã§èå¥ãããå°éäžèœãªããžã§ã¯ãã¯ãªãªãŒã¹çšã«ããŒã¯ãããã¡ã¢ãªãå¿ èŠã«ãªããšç Žæ£ãããŸãã ããŒãããã®ãªããžã§ã¯ãã®é 延åé€ã®é決å®çãªé åºã«ããããªããžã§ã¯ãã®ãã¹ãã©ã¯ã¿ãåŒã³åºããšãã«ãããŒãå ã®é¢é£ãªããžã§ã¯ãã®ååšã«äŸåã§ããªããªããŸãã ãã®ãããéçºè ã¯ç¹å¥ãªã¡ãœãã-ãã¡ã€ãã©ã€ã¶ãŒãè¿œå ããŸãããããã¯ããŸã çããŠãããšãã«å°éã§ããªããªããžã§ã¯ãã«å¯ŸããŠãããã®ã¹ããŒãžéã§åŒã³åºãããŸãã
Jit硬å
åçã«çæãããã³ãŒãã®ã¢ã»ã³ããªäžã«åãåã£ãåœä»€ãå€æŽãããªãã£ãå Žåãæ»æè ã¯å®è¡å¯èœã¡ã¢ãªã«ã·ã§ã«ã³ãŒããäœæã§ãã匷åãªããªããã£ããåãåããŸãã ãããåé¿ããããã«ãããã€ãã®å¯Ÿçãå°å ¥ãããŸããã
NOP
NOPã¯ã1ã8ãã€ãã®ããŸããŸãªãµã€ãºã®ããã°ã©ã æ¬äœïŒç°å¢ã®ç¶æ ãå€æŽããªãåœä»€ã§ããã®ç®çã®ã¿ãè¡ãããïŒã«ã©ã³ãã ã«æ¿å ¥ãããŸãã ãããã¯ãã¢ã»ã³ãã«ãããã³ãŒãã«äžå®ã®ãã€ãã·ãŒã±ã³ã¹ãçŸããå¯èœæ§ãæé€ããããã«å¿ èŠã§ãã
void Assembler::Nop(int n) { // The recommended muti-byte sequences of NOP instructions from the Intel 64 // and IA-32 Architectures Software Developer's Manual. // // Length Assembly Byte Sequence // 2 bytes 66 NOP 66 90H // 3 bytes NOP DWORD ptr [EAX] 0F 1F 00H // 4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H // 5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H // 6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H // 7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H // 8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H // 9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 66 0F 1F 84 00 00 00 00 // 00000000H] 00H ... }
äžå®ã®æãããã¿
ç®è¡åŒã¯ãã³ãŒãã¢ã»ã³ããªäžã«ã«ãŠã³ãïŒæãããã¿ïŒãããŸãã
<script> x = 0x123 + 0x567; // == 0x68A </script>
mov rax,68A00000000h
絶ãéãªãç²ç®
2ãã€ããŸã§ã®å€ã®ã¿ãã³ãŒãã«å€æŽãããã«ä¿åãããŸãã äŸïŒ
<script> a = 0x1234; </script>
ã§çµã¿ç«ãŠãããŸãïŒ
... mov rax,123400000000h ...
ãã倧ããªå®æ°ã¯ãã©ã³ãã ãªå€ïŒjit_cookieïŒã§ãããããŸãïŒ
void MacroAssembler::SafeMove(Register dst, Smi* src) { ... if (IsUnsafeInt(src->value()) && jit_cookie() != 0) { if (SmiValuesAre32Bits()) { // JIT cookie can be converted to Smi. Move(dst, Smi::FromInt(src->value() ^ jit_cookie())); Move(kScratchRegister, Smi::FromInt(jit_cookie())); xorp(dst, kScratchRegister); } else { DCHECK(SmiValuesAre31Bits()); int32_t value = static_cast<int32_t>(reinterpret_cast<intptr_t>(src)); movp(dst, Immediate(value ^ jit_cookie())); xorp(dst, Immediate(jit_cookie())); } } else { Move(dst, src); } }
ã¬ãŒãããŒãž
ã¢ã»ã³ãã«ãããJITã³ãŒããå«ããããã¡ãŒã¯ãããŒããè¿ãã®å²ãåœãŠã§ãªãŒããŒãããŒããå Žåã«äžæžããããªãããã«ãPAGE_NOACCESSããŒãžã«ãã£ãŠãã¬ãŒã åãããŸãã
JITããŒãžã®ã©ã³ãã å
çµã¿ç«ãŠãããJITã³ãŒããé 眮ãããã¡ã¢ãªã®å Žæã¯ãå€ãã®å ŽåïŒåžžã«ã§ã¯ãããŸãããïŒã©ã³ãã åãããŸãã 3åè©Šè¡ããŠã空ãã¢ãã¬ã¹ãæšæž¬ãããªãå ŽåãChromeã¯ã·ã¹ãã ã¢ãã±ãŒã¿ãŒãäœæããããããã¡ãŒã®ã¢ãã¬ã¹ãéžæã§ããããã«ããŸãã
static void* RandomizedVirtualAlloc(size_t size, int action, int protection) { ... if (use_aslr && (protection == PAGE_EXECUTE_READWRITE || protection == PAGE_NOACCESS)) { // For executable pages try and randomize the allocation address for (size_t attempts = 0; base == NULL && attempts < 3; ++attempts) { base = VirtualAlloc(OS::GetRandomMmapAddr(), size, action, protection); ... } void* OS::GetRandomMmapAddr() { ... static const uintptr_t kAllocationRandomAddressMin = 0x0000000080000000; static const uintptr_t kAllocationRandomAddressMax = 0x000003FFFFFF0000; ... uintptr_t address; platform_random_number_generator.Pointer()->NextBytes(&address, sizeof(address)); address <<= kPageSizeBits; address += kAllocationRandomAddressMin; address &= kAllocationRandomAddressMax; return reinterpret_cast<void *>(address); }
ãµã³ãããã¯ã¹
Chromeã¯ããã©ãŠã¶ã®ããŸããŸãªéšåã«ããŸããŸãªç¹æš©ãšå¶éãå²ãåœãŠãããšãã§ãããã«ãããã»ã¹ã¢ãŒããã¯ãã£ãå®è£ ããŠããŸãã ãµã³ãããã¯ã¹ãåäœãããŠãããã¯ããã»ã¹ã§ãã Chromeãµã³ãããã¯ã¹ã®æå°æ§æã«ã¯ã ãããŒã«ãŒãšåŒã°ããç¹æš©ããã»ã¹ãšã åé¢ããã 1ã€ïŒãŸãã¯ãã以äžïŒã®2ã€ã®ããã»ã¹ãå«ãŸããŸãã ããšãã°ãåé¢ããã»ã¹ã®ã¬ã³ããªã³ã°æ¹æ³-HTMLããã¥ã¡ã³ããã¬ã³ããªã³ã°ããBlinkãšã³ãžã³ã®ã€ã³ã¹ã¿ã³ã¹ã ã¬ã³ãã©ãŒã¯ãWebããŒãžã®ã¿ãããã³ãã©ãŠã¶ãŒæ¡åŒµæ©èœçšã«èµ·åãããŸãã ã¬ã³ãã©ãŒãå±éºã«ããããªã¹ã¯ã¯å€§ããã§ãããªããªãããã®å éšã«ã¯ããŠãŒã¶ãŒããµãŒãã£ã³ãããããããœãŒã¹ããããŒããããç°çš®ã³ãŒãã®è§£éãããããã§ãã ã¬ã³ãã©ãŒã«å ããŠãåå¥ã®ããã»ã¹ã¯ãã©ã°ã€ã³ã³ã³ãããŒïŒãã©ãã·ã¥ïŒã§ãããè£å©ããã»ã¹ã¯ã¯ã©ãã·ã¥ã¬ããŒã¿ãŒãã°ã©ãã£ãã¯ã¹ã®GPUã¢ã¯ã»ã©ã¬ãŒã¿ãŒã§ãã ã¬ã³ãã©ãŒãªã©ã¯IPCïŒããã»ã¹ééä¿¡ïŒã䜿çšããŠããããŒã«ãŒãããªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãèŠæ±ããŸãã ãããã®APIåŒã³åºãã¯IPCãä»ããŠãããŒã«ãŒã«å§ä»»ããããããŒã«ãŒã¯ååé¢ããã»ã¹ã«æå®ãããããªã·ãŒã§å§ä»»ãããåŒã³åºãããã§ãã¯ããèš±å¯ãããåŒã³åºããå®è¡ãããåãIPCã¡ã«ããºã ãéããŠçµæãè¿ãããŸãã
Chromeãµã³ãããã¯ã¹ã¢ãã«ã ãœãŒã¹
Chromeããã»ã¹åé¢ãããŒã¹ãšããWindowsããŒã«ïŒ
- ã¢ã¯ã»ã¹ããŒã¯ã³
- ãžã§ããªããžã§ã¯ã
- ãã¹ã¯ããããªããžã§ã¯ã
- æŽåæ§ã¬ãã«
- Appcontainer
- Windows軜æžããªã·ãŒ
éé¢ãããããã»ã¹ãšç¹æš©ãããŒã«ãŒã®éã«çžäºäœçšãããããšãå床泚ç®ãã䟡å€ããããŸããã€ãŸããäžèšã®ã·ã¹ãã ã¡ã«ããºã ã®è匱æ§ã ãã§ãªããIPCã«ãã£ãŠéæããããããŒã«ãŒã®è匱æ§ã®æªçšã«ãã£ãŠããµã³ãããã¯ã¹ãçµäºã§ããããšãæå³ããŸãã ãã®ã¢ãããŒãã¯ãã¢ãã€ã«Pwn2Own 2013ã§ããã®èšäºã§æ¢ã«èª¬æããRCEãšãšãã«ãPinkie Pieã«ãã£ãŠå®èšŒãããŸãããããŒãIIã®ãªã³ã¯ãåç §ããŠãã ãã ã
ã¢ã¯ã»ã¹ããŒã¯ã³
ã¢ã¯ã»ã¹ããŒã¯ã³ã«ã¯ãSIDïŒã¢ã¯ã»ã¹ãµããžã§ã¯ãã®èå¥åïŒãŠãŒã¶ãŒãšã°ã«ãŒãïŒãå«ãŸããŸãã åé¢ãããããã»ã¹ã«å¯ŸããŠãNULL SIDïŒS-1-0-0ïŒãå«ãããŒã«ãŒãèšå®ãããŸããããã«å¯ŸããŠãååŸå¯èœãªACLãæã€ãªããžã§ã¯ããã·ã¹ãã ã§æ€åºãããå¯èœæ§ã¯äœããªããŸãã
ãã®ãããªããã»ã¹ã¯ã©ã®ããã«ããŠãã¡ã€ã«ãžã®ãã³ãã«ãååŸããŸããïŒ APIé¢æ°ïŒããã§ã¯-ZwCreateFileïŒã«éåžžã®ããã¯ãã€ã³ã¹ããŒã«ãããåŒã³åºãã¯ãµã³ãããã¯ã¹ã¢ãžã¥ãŒã«ãä»ããŠãããŒã«ãŒã«ãªãã€ã¬ã¯ãããããããŒã«ãŒã¯ãã¡ã€ã«ãéããŠãã³ãã«ãè€è£œããŸãã
ãžã§ããªããžã§ã¯ã
ACLã«ãã£ãŠå¶åŸ¡ãããªããªãœãŒã¹ã«é¢é£ããããã€ãã®ç¹å¥ãªå¶éãå«ãŸããŸãã ãã®ãšã³ãã£ãã£ã¯ãåããã»ã¹ã®äœæãã¯ãªããããŒãã®èªã¿åã/æžã蟌ã¿ãªã©ãçŠæ¢ããŸãã 詳现
ãã¹ã¯ããããªããžã§ã¯ã
åé¢ãããChromeããã»ã¹çšã«å¥ã®ãã¹ã¯ããããªããžã§ã¯ããäœæããããŠã£ã³ããŠã«ã¡ãã»ãŒãžãéä¿¡ããŠä»ã®ããã»ã¹ãšã®çžäºäœçšãé²ããŸãã
ãã®çžäºäœçšããªãå±éºãªã®ã§ããïŒ ããã¯ãWindowsã¢ãŒããã¯ãã£ã®å€ã匱ç¹ã§ãããããããã ç²ç æ»æ ã VistaãŸã§ã®ãŠã£ã³ããŠã¡ãã»ãŒãžã¯å¿åã§ãããã©ã®ããã»ã¹ã«ãéä¿¡ã§ããŸããã ã¿ãŒã²ããããã»ã¹ãé¢äžããã«å¶åŸ¡ã転éããé¢æ°ã®ã¢ãã¬ã¹ãå«ãWM_TIMERã¡ãã»ãŒãžã¯ãç¹ã«æ©æãªæ©äŒãäžããŸããã
Vista以éã®ããŒãžã§ã³ã§ã¯ãããã»ã¹éã®ã¡ãã»ãŒãžè»¢éã¯ãæŽåæ§ã¬ãã«ã«åºã¥ããŠå¶éãããŠããŸããïŒãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹æš©éãšã¹ã«ã¬ãŒã·ã§ã³ã ç¹æš©ã®äœãããã»ã¹ã¯ãç¹æš©ã®ããããã»ã¹ã«ã¡ãã»ãŒãžãéä¿¡ã§ããªããªããŸããã
æŽåæ§ã¬ãã«ãAppContainer
Windowsã¢ã¯ã»ã¹å¶åŸ¡ã¡ã«ããºã ã«ã€ããŠã¯ã以åã®èšäºã§èª¬æããŸãã ã
Windows軜æžããªã·ãŒ
ããã»ã¹ã«å¯ŸããŠæå¹ã«ã§ããäžé£ã®æ°ããWindowsã»ãã¥ãªãã£æ©èœã¯ã EMETïŒEnhanced Mitigation Experience ToolkitïŒæ©èœãšéšåçã«éè€ããŠããŸãã ããã§ã¯ããã©ã³ãã®ããŠã³ããŒãã®ç¡å¹åïŒWindowsã«ãŒãã«ã§è§£æïŒãããã»ã¹ãžã®ã¢ãžã¥ãŒã«ãããã»ã¹ã®äœæãªã©ã®æ©èœããããŸãã
ããã»ã¹ã®äœæã®çŠæ¢ã¯ãåé¢ãããChromeããã»ã¹ã®Jobãªããžã§ã¯ãã§æ¢ã«è¡ãããŠããããšãšéè€ããŠããŸãããJobãªããžã§ã¯ãã«ã¯1ã€ã®é¢çœãã®ã£ããããããŸãã åé¿çã¯ãããã°ã©ã ã®ã³ã³ãœãŒã«ãŠã£ã³ããŠãäœæããAllocConsole APIãåŒã³åºãããšã§ããã³ã³ãœãŒã«ãŠã£ã³ããŠã®å Žåããã¹ãããã»ã¹conhost.exeãã·ã¹ãã ã«ãã£ãŠèµ·åãããŸãã ãããã®ããªã·ãŒãšãããã®åŒ±ç¹ã«ã€ããŠã¯ã ãã¬ãŒã³ããŒã·ã§ã³ã®ç 究è James Forshawã§è©³ããèªãããšãã§ããŸãã
ProcessSystemCallDisablePolicy / Win32k.sys Lockdown
ãã®ããªã·ãŒã¯å¥éæ€èšããŸãã
Windowsã°ã©ãã£ãã¯ã¹ãµãã·ã¹ãã ã¯ãé·å¹Žã«ããã£ãŠLPEã®è匱æ§ãæäŸããŠããŸããã ãã©ãŠã¶æ»æã®å Žåããããã¯RCEã®åŸã«äœ¿çšãããŸãã ã¬ã³ããªã³ã°ããã»ã¹ã§ã³ãŒãã®å®è¡ãåãããšã¯ã¹ããã€ãã¯ãWindowsã³ã³ããŒãã³ãã®è匱æ§ãä»ããŠç¹æš©ãææ Œãããã·ã¹ãã ãžã®ãã«ã¢ã¯ã»ã¹ãååŸããŸãã ããã¯ãwin32kã®ã«ãŒãã«ããŒã«ç Žæã®è匱æ§ã«å¯Ÿããååã«ææžåããããšã¯ã¹ããã€ãã«ãã£ãŠèª¬æã§ããŸããããã¯ãPwn2Own 2013ã§MWR Labsã®ç 究è ãChromeã®RCEãšé£æºããŠå®èšŒããŸããã
ãã®è匱æ§ã¯ããŠã£ã³ããŠéã§ã¡ãã»ãŒãžã転éããããã«äœ¿çšãããã³ãŒã«ãã³ãã©ãŒã§çºèŠãããŸããïŒ W32KAPI LRESULT NtUserMessageCall( IN HWND hwnd, IN UINT msg, IN WPARAM wParam, IN LPARAM lParam, IN ULONG_PTR xParam, IN DWORD xpfnProc, IN BOOL bAnsi);
ã æåŸã®ãã©ã¡ãŒã¿ãŒbAnsiã¯ãã¡ãã»ãŒãžã®ããã¹ãã®ãšã³ã³ãŒããå®çŸ©ããŸããããã¯ããµãŒãã¹ãåŒã³åºããããã»ã¹ããã«ãŒãã«ã¡ã¢ãªã«ã³ããŒãããŸãïŒWCHARãŸãã¯ASCII-1æåããã2ãŸãã¯1ãã€ãã ãŸãããã®ãã©ã¡ãŒã¿ã¯ãã«ãŒãã«ããŒã«ã«ãããã¡ãå²ãåœãŠããšããšãã¡ãã»ãŒãžããããã¡ã«ã³ããŒãããšãïŒæåã¯ããŒã«ãšããŠã次ã«ããããã¹ã¯ãšããŠïŒã«è§£éãç°ãªããŸããã ããã«ããã2åã®ãã€ãæ°ãã³ããŒããŠãããã¡ããªãŒããŒãããŒãããããšãã§ããŸããã ãããã£ãŠãã«ãŒãã«å
ã®ããŒã¿ãæäœããããšã§ãring0ã§ã·ã§ã«ã³ãŒãã®å®è¡ãéæããŸãããã·ã§ã«ã³ãŒãã¯ç¹æš©winlogon.exeããã»ã¹ã®ACLããªã»ããããŸãããã€ãŸããäºçŽ°ãªã³ãŒããæ¿å
¥ããåã«ç¡é²åã®ãŸãŸã«ããŸããã å©çïŒ
Win32kã®åé¡
ãã®åçŽãªäžèŠãã察çã®éçºã¯ãChromeèªäœã®ã³ãŒãã ãã§ãªããAdobe Flash Playerããã³Pdfiumã®éçºããŒã ãšã®èª¿æŽãå¿ èŠã§ãããããå€ãã®æéãšåŽåãããããŸããïŒã¬ã³ããªã³ã°ããã»ã¹ã ãã§ãªããPPAPIã«ãããã¯ããŠã³ãå¿ èŠã§ãïŒãã©ã°ã€ã³ãå®è¡ãããããã»ã¹ïŒã Googleã®ãšã³ãžãã¢ã¯ãwin32kã䜿çšããŠãããŒã«ãŒãFlashéä¿¡ã¹ã¿ãã¯ã«è¿œå ããŸããã çŸæç¹ã§ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã èªäœãã·ã¹ãã ã³ãŒã«ããã£ã«ã¿ãªã³ã°ããæ©èœãæäŸãããããããã¯ããŠã³ã®æ¬æ Œçãªå®è£ ã¯Windows 10ã«ã®ã¿ååšããŸã ã ãã®ææžçã®åé¡ãšè§£æ±ºçã説æããææžã«ç²Ÿéããããšã匷ããå§ãããŸãã
ãããã«
ãã¡ãããChromeã®åŒ·ã¿ã¯ãµã³ãããã¯ã¹ã§ãã ããã§ã¯ãã¬ã³ãã©ãŒã®ã³ãŒãããŒã¹ã®è匱æ§ã®æªçšãç·©åããããã®ç¹æš©ãå¶éããããŸããŸãªæ¹æ³ã玹ä»ããŸãã ãããã®ã¡ãœããã®ã»ããã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæäŸãããã®ã«äŸåããŸããWindowsã®æ°ããããŒãžã§ã³ã§ã¯ãå€ãã®æ°ããèå³æ·±ããã®ãè¿œå ãããŠããŸãã ããã«ãåçã¡ã¢ãªã®ç®¡çã«ãå€ãã®æ³šæãæãããŠãããããã¯ææ°ã®Webçšã®æ°ãããã©ãŠã¶æ©èœãäœæããéã«ããã¯ã°ã©ãŠã³ãã«æ®ããŸãããã»ãã¥ãªãã£ã®èŠ³ç¹ããæãéèŠã§ãã éçºè ã¯ããã°ã¬ãã·ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã·ã¹ãã ãå°å ¥ããéåžžã®C ++ã¢ããªã±ãŒã·ã§ã³ã§ã¯äžè¬çã§ã¯ãªããã©ãŠã¶ãŒã³ã³ããŒãã³ããå®è¡ãããç°å¢ã®æ°ããããããã£ãååŸããŸããã
èè
- ãã¥ã«ãã§ã³ã³ãã»ããããªãŒ/ @dt
- ããŒãã®ã³ã€ãŽãŒã«/ @ igor1024