翻蚳è
ããïŒ
LLVMãããžã§ã¯ãã®äž»èŠãªéçºè
ã®1人ã§ããChris Lattnerã«ããCèšèªã®äžæ確ãªæ¯ãèãã«é¢ããèšäºã®ç¿»èš³ã¯ã倧ããªé¢å¿ãåŒã³ãå®éã«èšè¿°ãããçŸè±¡ã«ééããªãã£ã人ã
ããã®èª€è§£ããåŒãèµ·ãããŸããã Chrisã®èšäºã§ãChrisã¯John Regerã®ããã°ãžã®ãªã³ã¯ãšã2010幎ã®UBã®Cããã³C ++ã«é¢ããèšäºãæäŸããŠããŸãã ããããRegerã®ããã°ã«ã¯ããã®ãããã¯ã«é¢ããæ°ããèšäºãå€æ°ãããŸãïŒãã ããå€ãèšäºã®äŸ¡å€ã¯åŠå®ãããŸããïŒã
ææ°ã®èšäºã2017幎ã®æªå®çŸ©ã®åäœãã«æ³šç®ããããšæããŸãã å ã®èšäºã®ããªã¥ãŒã ã¯éåžžã«å€§ãããããåå²ããŸããã
ååã§ã¯ãASanãUBSanãTSanãªã©ãããŸããŸãªUBæ€çŽ¢ããŒã«ã«ã€ããŠèª¬æããŸãã
ASan -LLVMã«åºã¥ããŠéçºãããGoogleã®ã¢ãã¬ã¹ãµãã¿ã€ã¶ãŒã
UBSan -Cããã³C ++ããã°ã©ã ã®ããŸããŸãªUBãæ€åºããããã«èšèšããããClangããã³GCCã§å©çšå¯èœãªæªå®çŸ©ã®åäœãµãã¿ã€ã¶ãŒã
TSan-ãã«ãã¹ã¬ããããã°ã©ã ã§UBãæ€åºããããã«èšèšãããã¹ã¬ãããµãã¿ã€ã¶ãŒã
ãã®ãããã¯ãå®çšçãšã¯æããªãå Žåã¯ãC ++ UBèšèªã®çã«èšå€§ãªãªã¹ãïŒãã®ãã¡çŽ200ãååšããã¯ãã§ãïŒïŒ
ãŸããRegerã®å€ãèšäºãèªãããšããå§ãããŸããé¢é£æ§ã¯å€±ãããŠããŸããã
èè ã«ã€ããŠïŒJohn Regerã¯ãç±³åœãŠã¿å€§åŠã®ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®ææã§ãã
ææ°ã®èšäºã2017幎ã®æªå®çŸ©ã®åäœãã«æ³šç®ããããšæããŸãã å ã®èšäºã®ããªã¥ãŒã ã¯éåžžã«å€§ãããããåå²ããŸããã
ååã§ã¯ãASanãUBSanãTSanãªã©ãããŸããŸãªUBæ€çŽ¢ããŒã«ã«ã€ããŠèª¬æããŸãã
ASan -LLVMã«åºã¥ããŠéçºãããGoogleã®ã¢ãã¬ã¹ãµãã¿ã€ã¶ãŒã
UBSan -Cããã³C ++ããã°ã©ã ã®ããŸããŸãªUBãæ€åºããããã«èšèšããããClangããã³GCCã§å©çšå¯èœãªæªå®çŸ©ã®åäœãµãã¿ã€ã¶ãŒã
TSan-ãã«ãã¹ã¬ããããã°ã©ã ã§UBãæ€åºããããã«èšèšãããã¹ã¬ãããµãã¿ã€ã¶ãŒã
ãã®ãããã¯ãå®çšçãšã¯æããªãå Žåã¯ãC ++ UBèšèªã®çã«èšå€§ãªãªã¹ãïŒãã®ãã¡çŽ200ãååšããã¯ãã§ãïŒïŒ
ãŸããRegerã®å€ãèšäºãèªãããšããå§ãããŸããé¢é£æ§ã¯å€±ãããŠããŸããã
èè ã«ã€ããŠïŒJohn Regerã¯ãç±³åœãŠã¿å€§åŠã®ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®ææã§ãã
Cããã³C ++ã®æªå®çŸ©åäœïŒUBïŒã«èµ·å ããåé¡ã¯ãäž»ã«ASanãUBSanãMSanãTSanãªã©ã®åçæ€èšŒããŒã«ãåºã䜿çšããããšã§è§£æ±ºããããšäž»åŒµãã人ãããŸãã ããã§æãããªããšã瀺ããŸããè¿å¹Žããããã®ããŒã«ã«ã¯å€ãã®çŽ æŽãããæ¹åããããŸããããUBã®åé¡ã¯ãŸã 解決ãããŠããããç¶æ³ã詳现ã«æ€èšããŸãã

Valgrindããã³ã»ãšãã©ã®ãµãã¿ã€ã¶ãŒã¯ãããã°ãç®çãšããŠããŸãããã¹ãäžã«çºçããæªå®çŸ©ã®åäœã®ã±ãŒã¹ã«é¢é£ãããããããã蚺æã¡ãã»ãŒãžãçæããŸãã ãã®ãããªããŒã«ã¯éåžžã«æçšã§ãããã»ãšãã©ãã¹ãŠã®éèªæãªCããã³C ++ããã°ã©ã ãç¶ç¶çãªUBãããŒãšããŠå®è¡ãããäžçã®ç¶æ ãããæãäžè¬çãªæ§æããã³ãŠãŒã¹ã±ãŒã¹ã§ããªãã®æ°ã®éèŠãªããã°ã©ã ãã»ãšãã©UBããªãŒã§ããäžçã®ç¶æ ã«é²åããã®ã«åœ¹ç«ã¡ãŸãã
ãã€ãããã¯ãããã°ããŒã«ã®åé¡ã¯ãUBã®ææªã®ã±ãŒã¹ã«å¯ŸåŠããããã«äœãããªãããšã§ãããã¹ãäžã«ã©ã®ããã«åäœãããã¯ããããŸãããããªãªãŒã¹ã§UBãã©ã®ããã«è¡šç€ºããããã¯ä»ã®èª°ããç解ã§ããŸãè匱æ§ãšããŠäœ¿çšããŸãã åé¡ã¯ãå質ãã¹ãã«èŠçŽãããŸãããããã¯å°é£ã§ãã afl-fuzzã®ãããªããŒã«ã¯åªããŠããŸããã倧ããªããã°ã©ã ã«è§Šããããšããã»ãšãã©ãããŸããã ãã¹ãã®åé¡ãåé¿ãã1ã€ã®æ¹æ³ã¯ãéçUBæ€åºããŒã«ã䜿çšããããšã§ãã ãããã¯çµ¶ããæ¹åãããŠããŸãããèªä¿¡ãæã£ãŠæ£ç¢ºãªéç解æãè¡ãã®ã¯å¿ ãããè¯ããã¹ãã«ãã¬ããžãéæãããããç°¡åã§ã¯ãããŸããã ãã¡ããããããã®2ã€ã®ææ³ã¯ã1ã€ã®åé¡ã解決ããããšãç®çãšããŠãããããã°ã©ã ãå®è¡ããæ¹æ³ãç°ãªãè§åºŠããç¹å®ããŸãã ãã®åé¡ã¯åžžã«éåžžã«è€éã§ãããããããåžžã«ããã§ãã éçåæãéããŠUBãèŠã€ããããšã«ã€ããŠå€ãã®ããšãæžãããŠããŸããããã®èšäºã§ã¯åçããŒã«ã«çŠç¹ãåœãŠãŸãã ãã¹ãã®åé¡ã解決ãããã1ã€ã®æ¹æ³ã¯ãUBãç·©åãããŒã«ã䜿çšããããšã§ããCããã³C ++ã䜿çšãããšæªå®çŸ©ã®åäœãå®çŸ©æžã¿ã®åäœã«å€æããå®å šãªããã°ã©ãã³ã°èšèªã䜿çšããå©ç¹ãå¹æçã«éæããŸãã UBã軜æžããããŒã«ã®èšèšã®é£ããã¯æ¬¡ã®ãšããã§ãã
-ãè§ãã®å ŽåïŒè§ã®å ŽåïŒã«ã³ãŒããå£ããªãã§ãã ãã
-ãªãŒããŒããããå°ãªã
-è¿œå ã®è匱æ§ãè¿œå ããªãã§ãã ãããããšãã°ãæªãã§ãã¯ã®ã©ã³ã¿ã€ã ã©ã€ãã©ãªãšã®ãªã³ã¯ãå¿ èŠã§ãã
-æ»æãå°é£ã«ãã
-çžäºã«çµã¿åãããïŒå¯Ÿç §çã«ãASanãTSanãªã©ã®äžéšã®ãããã°ããŒã«ã¯äºææ§ããªããäž¡æ¹ã®ããŒã«ãå¿ èŠãšãããããžã§ã¯ãã«å¯ŸããŠãã¹ãã¹ã€ãŒãã2åå®è¡ããå¿ èŠããããŸãïŒã
UBã®åã ã®ã±ãŒã¹ãèŠãåã«ãç®æšãå®çŸ©ããŸãããã ãã¹ãŠã®Cããã³C ++ã³ã³ãã€ã©ã«é©çšãããŸãã
ç®æš1ïŒ UBã®åã±ãŒã¹ïŒã¯ããçŽ200åãããæåŸã«å®å šãªãªã¹ããæäŸããŸãïŒã¯ãç¹å®ã®åäœããããšææžåããããã³ã³ãã€ã©ã«ãã£ãŠèŽåœçãªãšã©ãŒãšããŠèšºæãããããæåŸã®æ段ãšããŠãUBãæ€åºãããµãã¿ã€ã¶ãŒã䜿çšããå¿ èŠããããŸãã©ã³ã¿ã€ã ã ããã¯ãè«äºãåŒãèµ·ããã¹ãã§ã¯ãããŸãããããã¯ãæ»æè ããããã¯ãŒã¯ãã±ãããšã³ã³ãã€ã©ã®æé©åã䜿çšã§ããçŸä»£ã®Cããã³C ++ã§ã®éçºã®æå°èŠä»¶ã®ãããªãã®ã§ãã
ç®æš2ïŒåUBã®ã±ãŒã¹ã¯ãææžåãããããèŽåœçãªãšã©ãŒãšããŠã³ã³ãã€ã©ã«ãã£ãŠèšºæããããã以åã®èŠä»¶ãæºãããªãã·ã§ã³ã®ãç·©åãã¡ã«ããºã ãæã€å¿ èŠããããŸãã ããã¯é£ããã§ãã ããã¯å€ãã®ãã©ãããã©ãŒã ã§éæã§ãããšèããŠããŸãã é床ãéèŠãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãä»ã®ã³ãŒãã®ã«ãŒãã«ã¯ãæ£åŒãªæ¹æ³ãªã©ãä»ã®ãã¯ãããžãŒã䜿çšããå¿ èŠããããŸãã ãã®èšäºã®æ®ãã®éšåã§ã¯ãäžå®ã®åäœã®ããŸããŸãªã¯ã©ã¹ã®çŸåšã®ç¶æ³ã調ã¹ãŸãã
倧ããªUBã¯ã©ã¹ããå§ããŸãããã
空éã¡ã¢ãªã®å®å šéå
説æïŒãªããžããªã®å€éšã«ã¢ã¯ã»ã¹ãããã®ãããªãã€ã³ã¿ãŒãäœæããããšãããCããã³C ++ã®UBã§ãã 1988幎ãMorrisã¯ãŒã ã¯ãä»åŸN幎éã§ç§ãã¡ãåŸ ã£ãŠããããšã瀺åããŸããã ç§ãã¡ãç¥ã£ãŠããããã«ãN> = 29ããããŠããããNã®å€ã¯75ã«éããã§ãããã
ãããã°ïŒ ValgrindãšASanã¯åªãããããã°ããŒã«ã§ãã å€ãã®å ŽåãASanã¯ãªãŒããŒããããå°ãªãããåªããŠããŸãã ã©ã¡ãã®ããŒã«ãã¢ãã¬ã¹ã32ãããå€ãŸãã¯64ãããå€ãšããŠè¡šããæå¹ãªãããã¯ã®åšå²ã«çŠæ¢ãããã¬ãããŸãŒã³ãäºçŽããŸãã ããã¯ä¿¡é Œã§ããã¢ãããŒãã§ããããã®ããŒã«ã䜿çšããéåžžã®ãã€ããªã©ã€ãã©ãªãšã·ãŒã ã¬ã¹ã«é£æºã§ããŸãããŸãããã€ã³ã¿ãŒãæŽæ°ã«å€æããæäœãæã€éåžžã®ã³ãŒãããµããŒãããŸãã
Valgrindã¯å®è¡å¯èœã³ãŒãããæ©èœããã¹ã¿ãã¯å€æ°ã®éã«ã¬ãããŸãŒã³ãæ¿å ¥ã§ããŸããã ã¹ã¿ãã¯äžã®ãªããžã§ã¯ãã®é 眮ã¯ãã¹ã¿ãã¯ã«ã¢ã¯ã»ã¹ããåœä»€ã®ãªãã»ããå€ã«ãã§ã«ãšã³ã³ãŒããããŠãããã¹ã¿ãã¯ã«ã¢ã¯ã»ã¹ããã¢ãã¬ã¹ãããªã³ã¶ãã©ã€ãã§å€æŽããããšã¯ã§ããŸããã ãã®çµæãValgrindã¯ã¹ã¿ãã¯äžã®ãªããžã§ã¯ããæäœããŠãšã©ãŒãæ€åºããéã®ãµããŒããå¶éããŠããŸãã ASanã¯ã³ã³ãã€ã«æã«å®è¡ãããã¹ã¿ãã¯å€æ°ã®åšãã«ã¬ãããŸãŒã³ãæ¿å ¥ããŸãã ã¹ã¿ãã¯å€æ°ã¯å°ããå€æ°ãããã¢ãã¬ã¹ç©ºéãšããŒã«ãªãã£ãèæ ®ãããšãéåžžã«å€§ããªã¬ãããŸãŒã³ã®äœ¿çšã劚ããããŸãã ããã©ã«ãèšå®ã§ã¯ã2ã€ã®é£æ¥ããããŒã«ã«æŽæ°å€æ°xãšyã®ã¢ãã¬ã¹ã¯16ãã€ãã§åºåãããŸãã ã€ãŸããASanããã³Valgrindã«ãã£ãŠçæãããæ€èšŒã¯ãã¡ã¢ãªå ã®ãªããžã§ã¯ãã®é 眮ã®ã¿ã«é¢é£ããæ€èšŒãæå¹ãªå Žåã®ãªããžã§ã¯ãã®é 眮ã¯ãæ€èšŒããŒã«ã䜿çšããªããªããžã§ã¯ãã®é 眮ãšã¯ç°ãªããŸãã
ASanãšValgrindã®æ¬ ç¹ã¯ãäŸã®ããã«ããªããã£ãã€ã¶ãŒã«ãã£ãŠã³ãŒããåé€ãããŠå®è¡ã§ããªãå ŽåãUBãã¹ãããã§ããããšã§ãã
ç·©åç ïŒASLRããã¹ã¿ãã¯ã«ããªã¢ãããä¿è·ãããã¢ãã±ãŒã¿ãŒããNXããããªã©ãå®å šã§ãªãã¡ã¢ãªæäœã«å¯Ÿããç·©åã¡ã«ããºã ãé·ãéãããŸããã
ASLR
ã¢ãã¬ã¹ç©ºéã¬ã€ã¢ãŠãã®ã©ã³ãã åïŒã¢ãã¬ã¹ç©ºéã¬ã€ã¢ãŠãã®ã©ã³ãã åïŒ-ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§äœ¿çšãããæè¡ã䜿çšããããšãéèŠãªããŒã¿æ§é ãã€ãŸãå®è¡å¯èœãã¡ã€ã«ãããŒããããã©ã€ãã©ãªãããŒããã¹ã¿ãã¯ã®ã€ã¡ãŒãžã®ããã»ã¹ã®ã¢ãã¬ã¹ç©ºéå
ã®å Žæãã©ã³ãã ã«å€æŽãããŸãã
https://en.wikipedia.org/wiki/Address_space_layout_randomization
ã泚æ perevã
https://en.wikipedia.org/wiki/Address_space_layout_randomization
ã泚æ perevã

ã¹ã¿ãã¯ã«ããªã¢
ãã¹ã¿ãã¯ã«ããªã¢ã-ååã¯ã«ããªã¢ã«ç±æ¥ããé±å±±åŽåè
ã¯é±å±±ã¬ã¹ã®æ¿åºŠãå¢å ããŠããããšã«æ°ä»ãããã«ã«ããªã¢ãšäžç·ã«æã¡ãŸããã
ã¹ã¿ãã¯ãã¬ãŒã ã®ãªã¿ãŒã³ã¢ãã¬ã¹ã®åã«ãã«ããªã¢å€ããæžã蟌ãŸãããããã¡ãªãŒããŒãããŒä¿è·æ¹æ³ã ãããã¡ãªãŒããŒãããŒã䜿çšããŠã¢ãã¬ã¹ãæžãæããããšãããšãã«ããªã¢å€ãæžãæãããããããã¡ãªãŒããŒãããŒãæ€åºãããŸãã
ã泚æ perevã
ã¹ã¿ãã¯ãã¬ãŒã ã®ãªã¿ãŒã³ã¢ãã¬ã¹ã®åã«ãã«ããªã¢å€ããæžã蟌ãŸãããããã¡ãªãŒããŒãããŒä¿è·æ¹æ³ã ãããã¡ãªãŒããŒãããŒã䜿çšããŠã¢ãã¬ã¹ãæžãæããããšãããšãã«ããªã¢å€ãæžãæãããããããã¡ãªãŒããŒãããŒãæ€åºãããŸãã
ã泚æ perevã
ä¿è·ãããã¢ãã±ãŒã¿ãŒ
ã匷åãããã¢ãã±ãŒã¿ã-LLVMã®ã¡ã¢ãªã¢ãã±ãŒã¿ãåçã«å²ãåœãŠãããã¡ã¢ãªã«é¢é£ããè匱æ§ãããã«è»œæžããããã«èšèšãããŠããŸãã 詳现ã«ã€ããŠã¯ã https ïŒ //llvm.org/docs/ScudoHardenedAllocator.htmlãåç
§ããŠãã ããã
ã泚æ perevã
ã泚æ perevã
Nxããã
NXããã-å±æ§ïŒãããïŒNXãããïŒè±èªãå®è¡ããããªãïŒ-ã³ãŒããšããŠããŒã¿ã®å®è¡ãé²æ¢ããæ©èœãå®è£
ããããã«ããŒãžã«è¿œå ããããå®è¡çŠæ¢ã®ãããã ãããã¡ãªãŒããŒãããŒã®è匱æ§ãé²ãããã«äœ¿çšãããŸãã 詳现ã«ã€ããŠã¯ã https ïŒ //en.wikipedia.org/wiki/NX_bitãã芧ãã ãã
ã泚æ perevã
ã泚æ perevã
ãã®åŸãçç£ã°ã¬ãŒãã®CFIïŒå¶åŸ¡ãããŒã®æŽåæ§å¶åŸ¡ïŒãå©çšå¯èœã«ãªããŸããã å¥ã®èå³æ·±ãæè¿ã®éçºã¯ãARMv8.3ã®ãã€ã³ã¿ãŒèå¥ã§ãã ãã®èšäºã§ã¯ãã¡ã¢ãªã»ãã¥ãªãã£ã«é¢é£ããUBç·©åçã®æŠèŠã説æããŸãã
UBãç·©åããæ段ãšããŠã®ASanã®é倧ãªæ¬ é¥ã以äžã«ç€ºããŸãã
$ cat asan-defeat.c #include <stdio.h> #include <stdlib.h> #include <string.h> char a[128]; char b[128]; int main(int argc, char *argv[]) { strcpy(a + atoi(argv[1]), "owned."); printf("%s\n", b); return 0; } $ clang-4.0 -O asan-defeat.c $ ./a.out 128 owned. $ clang-4.0 -O -fsanitize=address -fno-common asan-defeat.c $ ./a.out 160 owned. $
èšãæããã°ãASanã¯ãã¡ã¢ãªã®ç®çã®é åãæãªãããã«ãåã«æ»æè ã«ç°ãªããªãã»ãããèšç®ãããã ãã§ãã ïŒASanã§-fno-commonãã©ã°ã®äœ¿çšãä¿ãYuri Gribovã«æè¬ããŸããïŒ
æªå®çŸ©ã®åäœã®ãã®ããªã¢ã³ããç·©åããã«ã¯ãæå¹ãªé åã§åã¡ã¢ãªã¢ã¯ã»ã¹ãçºçãããã©ããã®åçŽãªãã§ãã¯ã§ã¯ãªããå¢çãè¶ããå®éã®ãã§ãã¯ãå®è¡ããå¿ èŠããããŸãã ããã§ã¯ãã¡ã¢ãªã»ãã¥ãªãã£ããŽãŒã«ãã¹ã¿ã³ããŒãã§ãã ã¡ã¢ãªã»ãã¥ãªãã£ã«é¢ããå€ãã®åŠè¡è«æããããåççãªãªãŒããŒããããšæ¢åã®ãœãããŠã§ã¢ãšã®è¯å¥œãªäºææ§ãåããã¢ãããŒãã瀺ããã®ããããŸãããåºã䜿çšãããŠããŸããã Checked Cisã¯ããã®åéã§éåžžã«ã¯ãŒã«ãªãããžã§ã¯ãã§ãã
çµè«ïŒãã®çš®ã®ãšã©ãŒã®ãããã°ããŒã«ã¯éåžžã«åªããŠããŸãã ãã®ã¿ã€ãã®UBãå€§å¹ ã«è»œæžããããšã¯å¯èœã§ãããå®å šã«æé€ããã«ã¯ãå®å šãªã¿ã€ããšã¡ã¢ãªã®ã»ãã¥ãªãã£ãå¿ èŠã§ãã
äžæèšæ¶ã®å®å šéå
説æïŒäžæã¡ã¢ãªãªããžã§ã¯ãã®ã»ãã¥ãªãã£éåã¯ããã®æå¹æéãåããåŸã®ã¡ã¢ãªãã±ãŒã·ã§ã³ã®äœ¿çšã§ãã ããã«ã¯ããããã®å€æ°ã®ç¯å²å€ã®èªåå€æ°ã®ã¢ãã¬ã¹æå®ããªãªãŒã¹åŸã®äœ¿çšãèªã¿åããŸãã¯æžã蟌ã¿ãžã®ãã³ã°ãªã³ã°ãã€ã³ã¿ãŒã®äœ¿çšãããã«ãªãªãŒã¹ãå«ãŸããŸããããã¯ãå®éã«ã¯éåžžã«å±éºã§ãã freeïŒïŒã¯ãéåžžã解æŸããããããã¯ã«å±ããã¡ã¿ããŒã¿ãå€æŽããŸãã ãããã¯ããã§ã«è§£æŸãããŠããå Žåããã®ããŒã¿ãžã®æžã蟌ã¿ã¯ãä»ã®ç®çã§äœ¿çšãããããŒã¿ã«æå·ãäžããå¯èœæ§ããããååãšããŠãä»ã®ç¡å¹ãªã¬ã³ãŒããšåãçµæãããããå¯èœæ§ããããŸãã
ãããã°ïŒ ASanã¯ãããªãªãŒã¹åŸã®äœ¿çšããã°ãæ€åºããããã«èšèšãããŠããŸããããã¯ãåçŸãé£ããã誀ã£ãåäœãåŒãèµ·ããããšããããããŸãã 圌ã¯ã解æŸããããããã¯ãéé¢ããå³åº§ã«åå©çšããããšãé²ããŸãã äžéšã®ããã°ã©ã ããã³å ¥åã§ã¯ãããã«ããã¡ã¢ãªæ¶è²»ãå¢å ããå±ææ§ãäœäžããå ŽåããããŸãã ãŠãŒã¶ãŒã¯ã誀æ€ç¥ãšãªãœãŒã¹äœ¿çšçã®åŠ¥åç¹ãèŠã€ããããã«éé¢ãµã€ãºãèšå®ã§ããŸãã
ASanã¯ããããã®å€æ°ã®ç¯å²ãè¶ ããŠçãæ®ãèªåå€æ°ã®ã¢ãã¬ã¹ãæ€åºã§ããŸãã ã¢ã€ãã¢ã¯ãèªåå€æ°ãåçã¡ã¢ãªã«å²ãåœãŠããããããã¯ã«å€æããããšã§ããããã¯ãå®è¡ããããã¯ã«å ¥ããšã³ã³ãã€ã©ãèªåçã«å²ãåœãŠãå®è¡ããããã¯ãé¢ãããšè§£æŸããŸãïŒæ€ç«äžïŒã ãã®ãªãã·ã§ã³ã¯ãã¡ã¢ãªã®ç¹ã§ããã°ã©ã ãããã«è²ªæ¬²ã«ããããããããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠããŸãã
以äžã®ããã°ã©ã ã§äžæã¡ã¢ãªãªããžã§ã¯ãã®ã»ãã¥ãªãã£ã«éåãããšãããã©ã«ãã®æé©åãš-O2ã®éã®åäœã«éããçããŸãã ASanã¯æé©åãªãã§ããã°ã©ã ã®åé¡ãæ€åºã§ããŸãããdetect_stack_use_after_returnãªãã·ã§ã³ãèšå®ãããŠããå Žåãããã³æé©åã䜿çšããŠã³ã³ãã€ã«ãããŠããªãå Žåã®ã¿ã§ãã
$ cat temporal.c #include <stdio.h> int *G; int f(void) { int l = 1; int res = *G; G = &l; return res; } int main(void) { int x = 2; G = &x; f(); printf("%d\n", f()); } $ clang -Wall -fsanitize=address temporal.c $ ./a.out 1 $ ASAN_OPTIONS=detect_stack_use_after_return=1 ./a.out ================================================================= ==5425==ERROR: AddressSanitizer: stack-use-after-return ... READ of size 4 at 0x0001035b6060 thread T0 ^C $ clang -Wall -fsanitize=address -O2 temporal.c $ ./a.out 32767 $ ASAN_OPTIONS=detect_stack_use_after_return=1 ./a.out 32767 $ clang -v Apple LLVM version 8.0.0 (clang-800.0.42.1) ...
ä»ã®ããã€ãã®äŸã§ã¯ããµãã¿ã€ã¶ãŒã¯ãªããã£ãã€ã¶ãŒã«ãã£ãŠåé€ãããUBãæ€åºã§ããããããã£ãŠUBã䜿çšãããªã¢ãŒãã³ãŒãã§ã¯çµæãåŸãããšãã§ããªããããå®å šã§ãã ããããããã¯ããã§ã¯ãããŸããïŒ ããã°ã©ã ã¯ã©ããªå Žåã§ãæå³ããããŸããããå€æ°xãéçã«å®£èšãããŠãããã®ããã«ãæé©åãããŠããªãããã°ã©ã ã¯æ±ºå®è«çã«åäœããASanãçããããã®ãèŠã€ããªãã£ãæé©åããã°ã©ã ã¯æ±ºå®è«çã«åäœããæå³ããªãå éšç¶æ ãæããã«ããŸãèŠãããšãã§ããŸããïŒ
$ clang -Wall -O2 temporal.c $ ./a.out 1620344886 $ ./a.out 1734516790 $ ./a.out 1777709110
ç·©åçïŒäžèšã§èª¬æããããã«ãASanã¯è匱æ§ããä¿è·ããããã«ã¯èšèšãããŠããŸããããããŸããŸãªä¿è·ãããã¢ãã±ãŒã¿ãŒã䜿çšå¯èœã§ãããåãæ€ç«æŠç¥ã䜿çšããŠã䜿çšåŸã®è匱æ§ããéããŸãã
çµè«ïŒ ASanã䜿çšããŸãïŒå°èŠæš¡ãªå Žåã®ãã¹ãã«ã¯ããASAN_OPTIONS = detect_stack_use_after_return = 1ããšãšãã«ïŒã ããŸããŸãªã¬ãã«ã®æé©åã§ãä»ã®ã¬ãã«ã§ã¯ææãããªããšã©ãŒãææã§ããŸãã
æŽæ°ãªãŒããŒãããŒ
説æïŒæŽæ°ã®ãªãŒããŒãããŒã¯ãããŸããããäž¡æ¹åã«ãªãŒããŒãããŒãçºçããå¯èœæ§ããããŸãã UB
ãŒãã«ããé€ç®ãšãæ°å€ã®æ¡æ°ãã倧ããå€ã«ããã·ããã¯ã笊å·ä»ãæ°å€ãšç¬Šå·ãªãæ°å€ã®äž¡æ¹ã§UBã§ãã åç §ïŒ C / C ++ã®æŽæ°ãªãŒããŒãããŒã«ã€ããŠ
ãããã°ïŒ UBSanã¯ãæŽæ°ã«é¢é£ä»ããããUBãèŠã€ããããã®éåžžã«åªããããŒã«ã§ãã UBSanã¯ãœãŒã¹ã¬ãã«ã§åäœãããããéåžžã«ä¿¡é Œã§ããŸãã ã³ã³ãã€ã«æã®èšç®ã«é¢ããŠããã€ãã®å¥åŠãªç¹ããããŸããããšãã°ãäžéšã®ããã°ã©ã ã¯ãC ++ 11ãšããŠã³ã³ãã€ã«ãããå Žåã«äŸå€ããã£ããããå¯èœæ§ããããC11ã§ã³ã³ãã€ã«ãããšãã«äŸå€ããã£ããããŸãããæšæºã«æºæ ããŠãããšèããŠããŸããã詳现ã«ã¯è§ŠããŠããŸãã GCCã«ã¯ç¬èªã®ããŒãžã§ã³ã®UBSanããããŸããã100ïŒ ä¿¡é Œããããšã¯ã§ããŸããããã®ããŒã«ããã¹ããåã«å®æ°ã厩å£ããŸãã
軜æžïŒ ããã©ããã¢ãŒããã®UBSanïŒUBããã£ããããããšã蚺æåºåãªãã§ããã»ã¹ãåæ¢ããŸãïŒã䜿çšããŠãUBã軜æžã§ããŸãã ããã¯å¹æçã§ãããè匱æ§ãè¿œå ããŸããã äžéšã§ã¯ãAndroidã¯UBSanã䜿çšããŠãã®ã¿ã€ãã®UBãç·©åããŸãã æŽæ°ã®ãªãŒããŒãããŒã¯åºæ¬çã«è«ççãªééãã§ãããCããã³C ++ã§ã¯ããã®ãããªãšã©ãŒã¯ã¡ã¢ãªã»ãã¥ãªãã£éåã«ã€ãªããå¯èœæ§ããããããç¹ã«å±éºã§ãã ã¡ã¢ãªãžã®å®å šãªã¢ã¯ã»ã¹ãåããèšèªã§ã¯ããããã¯ããã»ã©å±éºã§ã¯ãããŸããã
çµè«ïŒæŽæ°UBããã£ããããã®ã¯ããã»ã©é£ãããããŸãããUBSanãããã§å¿ èŠãªã®ã¯ããã ãã§ãã åé¡ã¯ãæŽæ°UBãè»åãããšåé·æ§ãçããããšã§ãã ããšãã°ãSPEC CPU 2006ã¯30ïŒ é ããªããŸãã æ¹åã®äœå°ã¯ãããããããŸãããŸããç Žæããå¯èœæ§ã®ãããªãŒããŒãããŒãã§ãã¯ãæé€ããæ®ãã®ãã§ãã¯ã®ã«ãŒããªããã£ãã€ã¶ãŒãžã®å¹²æžã軜æžããŸãã ååãªãªãœãŒã¹ãæã€äººããããè¡ãå¿ èŠããããŸãã
å³æ Œãªãšã€ãªã¢ã·ã³ã°éå
説æïŒ Cããã³C ++æšæºã®å³å¯ãªãšã€ãªã¢ã¹ã«ãŒã«ã«ãããã³ã³ãã€ã©ã¯ã2ã€ã®ãã€ã³ã¿ãç°ãªãåãåç §ããå Žåãåããªããžã§ã¯ããæããŠããªããšã³ã³ãã€ã©ãæ³å®ã§ããããã«ãªããŸããããã«ãããåªããæé©åãå¯èœã«ãªããŸãããããã°ã©ã ãããæè»ã«èŠçŽããªã¹ã¯ããããŸãïŒããã¯ã倧ãŸããªæšå®ã«ãããšã倧èŠæš¡ãªCããã³C ++ããã°ã©ã ã®100ïŒ ã§ããïŒè©³çŽ°ãªã¬ãã¥ãŒã«ã€ããŠã¯ããã®èšäºã®ã»ã¯ã·ã§ã³1-3ãåç §ããŠãã ããïŒ æ¬¡ã®ããŒãã§å ¬éãããŸããçŽtranslã ïŒã
ãããã°ïŒå³å¯ãªãšã€ãªã¢ã¹éåã«å¯Ÿãããããã°ããŒã«ã®çŸåšã®ç¶æ ã¯è匱ã§ãã ã³ã³ãã€ã©ãŒã¯ããã€ãã®åçŽãªã±ãŒã¹ã§èŠåãåºããŸããããããã®èŠåã¯éåžžã«ä¿¡é Œã§ããŸããã libcrunchã¯ããã€ã³ã¿ãŒããäœããžã®ãã€ã³ã¿ãŒãã¿ã€ãã«å€æãããããšãèŠåããŸãããå®éã«ã¯ä»ã®äœããæããŸãã ããã«ãããvoidãžã®ãã€ã³ã¿ãŒãä»ããŠåå€æãå®è¡ã§ããŸããããã®ã¿ã€ãã®UBã§ããã誀ã£ããã€ã³ã¿ãŒå€æããã£ããããŸãã CæšæºãšCã³ã³ãã€ã©ãTBAAãæé©åãããšãã«äœãã§ãããã解éããæ¹æ³ïŒã¿ã€ãããŒã¹ã®ãšã€ãªã¢ã¹åæïŒã®ãããã§ãlibcrunchã¯ä¿¡é Œæ§ããããŸããïŒããã°ã©ã å®è¡äžã«çºçããããã€ãã®éåããã£ããããŸããïŒçããããšæããããæšæºã«éåããŠããªãå Žåã®ãã€ã³ã¿ãŒã®å€æã«ã€ããŠïŒã
ç·©åçïŒç°¡åã§ãïŒãã©ã°ïŒ-fno-strict-aliasingïŒãã³ã³ãã€ã©ãŒã«æž¡ããšãå³å¯ãªãšã€ãªã¢ã¹ããŒã¹ã®æé©åãç¡å¹ã«ãªããŸãã ãã®çµæãã³ã³ãã€ã©ã¯ããã€ã³ã¿åéã®å€ããå°ãªããä»»æã®å€æãå®è¡ã§ããå€ãè¯ãã¡ã¢ãªã¢ãã«ã«äŸåããçµæã®ã³ãŒãã¯æåŸ ã©ããã«åäœããŸãã ããã°ã¹ãªãŒã®ãã¡ãGCCãšLLVMã®ã¿ããã®ãããªUBã®å¯Ÿè±¡ã§ãããMSVCã¯ãã®ãããªã¯ã©ã¹ã®æé©åãå®è£ ããŸããã
çµè«ïŒãã®UBã«ææãªã³ãŒãã¯æ³šææ·±ããã§ãã¯ããå¿ èŠããããŸãïŒãã€ã³ã¿ãŒãchar *以å€ã®ãã®ã«å€æããããšã¯åžžã«çãããå±éºã§ãã å¥ã®æ¹æ³ãšããŠããã©ã°ã䜿çšããŠTBAAæé©åããªãã«ãããã®ãã©ã°ã䜿çšããªããšã³ãŒããã³ã³ãã€ã«ãããªãããã«ããããšãã§ããŸãã
ã¢ã©ã€ã¡ã³ãéå
説æïŒ RISCããã»ããµã¯ãéå¢çæŽåã¢ãã¬ã¹ã§ã®ã¡ã¢ãªã¢ã¯ã»ã¹ãæåŠããåŸåããããŸãã äžæ¹ãäžåè¡¡ãªã¢ã¯ã»ã¹ã䜿çšããCããã³C ++ããã°ã©ã ã«ã¯ãã¿ãŒã²ããã¢ãŒããã¯ãã£ã«é¢ä¿ãªãUBããããŸãã æŽå²çã«ã¯ãæåã«x86 / x64ãäžåè¡¡ãªã¢ã¯ã»ã¹ããµããŒãããããããããŠã³ã³ãã€ã©ããŸã ãã®UBãæé©åã«äœ¿çšããŠããªãããããããæã§èŠãŠããŸããã ãããããã®å Žåã§ããã³ã³ãã€ã©ãx64ã§ã®éå¢çæŽåã¢ã¯ã»ã¹ã§ã³ãŒããç Žå£ããæ¹æ³ã説æããçŽ æŽãããèšäºããããŸãã ãã®èšäºã®ã³ãŒãã¯ã-fno-strict-aliasingãã©ã°ã«ããããããããã¹ã¢ã©ã€ã¡ã³ãã«å ããŠå³å¯ãªãšã€ãªã¢ã¹ã«éåããã¯ã©ãã·ã¥ããŸãïŒOS Xã®GCC 7.1.0ã§ãã¹ãæžã¿ïŒã
ãããã°ïŒ UBSanã¯ãã¹ã¢ã©ã€ã¡ã³ããæ€åºã§ããŸãã
軜æžçïŒäžæ
çµè«ïŒ UBSanã䜿çšãã
I / Oãå®è¡ãçµäºããªãã«ãŒã
説æïŒ IãŸãã¯Oãå®è¡ãããå®äºããªãCãŸãã¯C ++ã³ãŒãã®ã«ãŒãã¯ãæªå®çŸ©ã§ãããã³ã³ãã€ã©ãŒã«ãã£ãŠä»»æã«çµäºã§ããŸãã ãã®èšäºãšãã®ã¡ã¢ã åç §ããŠãã ãã ã
ãããã°ïŒããŒã«ãªã
軜æžçïŒãããããã ããã³ã³ãã€ã©ãŒãé床ã«æé©åããããšãé¿ããŸãã
çµè«ïŒãã®UBã¯å®çšçãªåé¡ã§ã¯ãããŸããïŒããšãç§ãã¡ã«ãšã£ãŠäžå¿«ãªå Žåã§ãïŒã
ããŒã¿ã®ç«¶å
説æïŒããŒã¿ã®ç«¶åã¯ãã¡ã¢ãªã®äžéšãè€æ°ã®ã¹ã¬ããããã¢ã¯ã»ã¹å¯èœã§ããããã®ãã¡ã®å°ãªããšã1ã€ãèšé²ã«äœ¿çšå¯èœã§ãããããã¯ãªã©ã®ã¡ã«ããºã ã«ãã£ãŠã¢ã¯ã»ã¹ãåæãããŠããªãå Žåã«çºçããŸãã ããŒã¿ã³ã³ãã¹ãã¯ãCããã³C ++ã®ææ°ããŒãžã§ã³ã§UBã«ã€ãªãããŸãïŒãããã®æšæºã¯ãã«ãã¹ã¬ããã³ãŒããèšè¿°ããŠããªããããå€ãããŒãžã§ã³ã§ã¯æå³ããããŸããïŒã
ã泚æ perevã
ããã§èè
ãšã¯åæããŸããããã«ãã¹ã¬ããã³ãŒãã¯ãPOSIXã¹ã¬ãããªã©ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã APIã䜿çšããŠèµ·åã§ããããã¯ã©ã®ãããªããŒãžã§ã³ã®Cããã³C ++ã§ãå®è¡ã§ããŸãã ãŸãããã€ã¯ãã³ã³ãããŒã©ãŒã§å²ã蟌ã¿ãåŠçããã³ãŒãã¯ãã¡ã€ã³ããã°ã©ã ã«ãŒããšããŒã¿ãå
±æãããšãã«åæ§ã®å¹æãããããå¯èœæ§ããããŸãã ãŸããæšæºã®Cããã³C ++ã®å¹Žã«äŸåããŸããã ã泚æ perevã
説æïŒ TSanã¯ãåçã¡ã¢ãªã³ã³ãã¹ãã®åªããæ€åºæ©èœã§ãã Valgrindçšã®Helgrindãã©ã°ã€ã³ãªã©ãåæ§ã®ããŒã«ã¯ä»ã«ããããŸãããæè¿ã¯äœ¿çšããŠããŸããã åçãªç«¶åæ€åºåšã®äœ¿çšã¯ã競åãæ©èœããã®ãéåžžã«é£ãããšããäºå®ã«ãã£ãŠè€éã«ãªããææªã®éšåã¯ããããã®åäœãã³ã¢ã®æ°ããããŒã¹ã±ãžã¥ãŒã©ã¢ã«ãŽãªãºã ããã¹ããã·ã³ã§å®è¡äžã®ãã®ãã ãŒã³ãã§ã€ãºãªã©ã«äŸåããããšã§ã
軜æžçïŒã¹ã¬ãããäœæããªã
çµè«ïŒãã®ç¹å®ã®UBã«ã¯è¯ãã¢ã€ãã¢ããããŸããããã¯ãªããžã§ã¯ããæ°ã«å ¥ããªãå Žåã¯ã䞊è¡ããŠå®è¡ãããã³ãŒãã䜿çšããã代ããã«ã¢ãããã¯ã¢ã¯ã·ã§ã³ã䜿çšããŸãã
ã·ãŒã±ã³ã¹ãªãã®å€æŽ
説æïŒ Cã§ã¯ãããã©ããŒãã€ã³ããã¯ãx ++ãªã©ã®å¯äœçšã®ããåŒãæå¹ã«ãªãã¿ã€ãã³ã°ãé ãããŸãã C ++ã«ã¯ããã®ã«ãŒã«ãšã¯ç°ãªããã®ã®ãã»ãŒåçã®èšãåãããããŸãã ã©ã¡ãã®èšèªã§ããã·ãŒã±ã³ã¹ãã€ã³ãã«éåããå€æŽã¯UBã«ã€ãªãããŸãã
ãããã°ïŒäžéšã®ã³ã³ãã€ã©ã¯ã次ã®èŠåã«æãããªéåãããå Žåã«èŠåãçæããŸãã
$ cat unsequenced2.c int a; int foo(void) { return a++ - a++; } $ clang -c unsequenced2.c unsequenced2.c:4:11: warning: multiple unsequenced modifications to 'a' [-Wunsequenced] return a++ - a++; ^ ~~ 1 warning generated. $ gcc-7 -c unsequenced2.c -Wall unsequenced2.c: In function 'foo': unsequenced2.c:4:11: warning: operation on 'a' may be undefined [-Wsequence-point] return a++ - a++; ~^~
ãã ããå°ããªéæ¥éåã¯èŠåãåŒãèµ·ãããŸããã
$ cat unsequenced.c #include <stdio.h> int main(void) { int z = 0, *p = &z; *p += z++; printf("%d\n", z); return 0; } $ gcc-4.8 -Wall unsequenced.c ; ./a.out 0 $ gcc-7 -Wall unsequenced.c ; ./a.out 1 $ clang -Wall unsequenced.c ; ./a.out 1
軜æžçïŒäžæã§ãããå¯äœçšãå®è¡ãããé åºã決å®ããã®ã¯ã»ãšãã©ç°¡åã§ãã Javaèšèªã¯ããããã©ã®ããã«è¡ããããã®äŸã§ãã ãã®ãããªå¶éãçŸä»£ã®æé©åã³ã³ãã€ã©ã劚ãããšä¿¡ããŠããå°é£ãªææããããŸããã æšæºåå§å¡äŒããããã§ã¯ãªããšçå£ã«èããŠããå Žåãã³ã³ãã€ã©éçºè ã¯èŠåã«åŸãå¿ èŠããããŸãã çæ³çã«ã¯ããã¹ãŠã®äž»èŠãªã³ã³ãã€ã©ãŒã¯ãã®ãããªå Žåã«åãããšããã¹ãã§ãã
çµè«ïŒããçšåºŠç·Žç¿ããã°ãã³ãŒãã£ã³ã°äžã«ã·ãŒã±ã³ã¹ãã€ã³ãã®æœåšçãªéåã«æ°ä»ãããšã¯ããã»ã©é£ãããããŸããã å¯äœçšã®ããéåžžã«è€éãªåŒã衚瀺ãããããšãå¿é ããå¿ èŠããããŸãã ããã¯ã¬ã¬ã·ãŒã³ãŒãã§çºçããŸãããèŠãç®ã¯ãŸã åäœããŸããã€ãŸããããã¯åé¡ã§ã¯ãªããããããŸããã å®éããã®åé¡ã¯ã³ã³ãã€ã©ã§ä¿®æ£ããå¿ èŠããããŸãã
ã·ãŒã±ã³ã¹ãã€ã³ãã®éåã«é¢é£ããéUBã¯ãã³ã³ãã€ã©ãŒã«ãã£ãŠæå®ãããé åºã§ã¹ããŒãã¡ã³ããå®è¡ã§ãããäžå®ã·ãŒã±ã³ã¹ãã§ãã äŸã¯ãfïŒaïŒïŒãbïŒïŒïŒã®èšç®ã§2ã€ã®é¢æ°ãåŒã³åºãããé åºã§ãã ãã®é åºãå®çŸ©ããå¿ èŠããããŸãã ããšãã°ãå·Šããå³ãžã å®å šã«ã¯ã¬ã€ãžãŒãªç¶æ³ãèæ ®ããªãå Žåãé床ã®æ倱ã¯ãããŸããã
ç¶ç¶ããã