åŸä»ãã®ã»ãã¥ãªãã£å¯Ÿçã§ã¯ Web æ»æã«å¹æçã«å¯Ÿå¿ããããšã¯ã§ããŸããã仿¥ã®ã¯ã©ãŠãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããã¯ããç°å¢ã®ããããåŽé¢ã«ãããŠä¿è·å¯Ÿçãèæ ®ããã»ãã¥ãªãã£ãçµã¿èŸŒãå¿ èŠããããŸãããŸããæ°æ©èœãã®ç¶ç¶çãªãã¹ãããã¡ãžã³ã°ãã»ãã¥ãªãã£åæãªã©ãã»ãã¥ãªãã£ãè©äŸ¡ããããã®ç¶ç¶çãªããã»ã¹ãæ¬ ãããŸãããã»ãã¥ãªãã£ã«å¯Ÿãããã®å§¿å¢ã¯ãFastly ã®ã»ãã¥ãªãã£ã®ããæ¹ã«é¢ããåºæ¬ç念ã®äžéšã§ããããŸãããããŠæè¿ããã®éèŠæ§ã身ããã£ãŠäœéšããäºæ ãçºçããŸãããÂ
å æ¥ãFastly ã§ã¯ Compute@Edge ã§äœ¿çšããŠãã WebAssembly ã³ã³ãã€ã©ã§ãã Cranelift ã®äžéšã«ãã°ãããããšã倿ããŸããããã®ãã°ã«ãã£ãŠãWebAssembly ã¢ãžã¥ãŒã«ã«ãããµã³ãããã¯ã¹åãããããŒãå€éšã®ã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãå¯èœã«ãªã£ãŠããŸãæãããããŸãããã幞ããååãªäººæãããã»ã¹ãããŒã«ãªã©ã®å¯Ÿçã®ãããã§ãæªçšãããåã«ãã°ãçºèŠããã€ã³ãã©äžã§ããããé©çšããããšãã§ããŸãããä»åã¯ããã°ã«ééããçµç·¯ãçºçã®çç±ããã°ã«ãã£ãŠçããå¯èœæ§ã®ãã£ãåé¡ããããŠã€ã³ãã©äžã§æªçšãããŠããªãããšãæ€èšŒããæ¹æ³ãã玹ä»ããŸãã
ãã®èšäºã®ç®çã¯ãä»åã®ãã°ã«ã€ããŠå ã¿é ããå ¬éãããšåæã«ãçµ±åãããã»ãã¥ãªãã£å¯Ÿçã¯ãããŒã«ã ãã§ãªããããã»ã¹ã«ãçµã¿èŸŒãå¿ èŠããããšããããšããäŒãããããšã§ããCompute@Edge ã«ã¯ã匷åãªã»ãã¥ãªãã£å¢çãå®è£ ãããŠããŸããWebAssembly ã®ãµã³ãããã¯ã¹ã«å ããOS ã¬ãã«ã§å®è£ ãããã»ãã¥ãªãã£ã¡ã«ããºã ãæ¡çšããŠããŸãããããããã°ã®ãªããœãããŠã§ã¢ã¯ååšããŸããããã®ãããåé¡ãçºçããå Žåã®å¯Ÿå¿ã«ã€ããŠèããããšããFastly ã®ã»ãã¥ãªãã£äœå¶ã«æ¬ ãããªã察çã®äžã€ã§ããã§ã¯æ©éããã®å¯Ÿçã«ã€ããŠèŠãŠãããŸãããã
æè¡çèæ¯ : Cranelift ãšããŒããµã³ãããã¯ã¹
Compute@Edge ã§ã¯ãWebAssembly (Wasm) ã¢ãžã¥ãŒã«ã«å«ãŸããã客æ§ã®ã³ãŒãããã€ã³ããŠã³ããªã¯ãšã¹ãããšã«ãµãŒããŒäžã§å®è¡ããŸããCompute@Edge ã®èšèšã«ãããéèŠãªç¹ã¯ãã客æ§ã«ããå šãŠã®ãªã¯ãšã¹ããã¢ãžã¥ãŒã«ã®æ°ããã€ã³ã¹ã¿ã³ã¹ã§å®è¡ãããããšã§ããã€ãŸããä»ã®ãªã¯ãšã¹ããã³ãã©ãä»ã®ã客æ§ã®ã³ãŒãã«ã¡ã¢ãªãå ±æãããããšã¯ãããŸããã
WebAssembly ã®èšèšã«ãããéèŠãªç¹æ§ã§ãããã®ã¡ã¢ãªã®éé¢ãããªãã¡ããŒããµã³ãããã¯ã¹ããWebAssembly ãªãã§ã¯ã®åŒ·åãªã»ãã¥ãªãã£ãç¶æããŠããŸãããã®ãããããŒãéã®å¢çã厩ããŠããŸããšãæ·±å»ãªã»ãã¥ãªãã£åé¡ãçºçããå¯èœæ§ããããŸãããã®ãããFastly ã§ã¯ã³ã³ãã€ã©ã®æ£åžžæ§ãéåžžã«éèŠèŠããŠãããã客æ§ã«å±éºãåã¶ããšããªããããè€æ°ã®ããã»ã¹ãšä¿è·ã®ã¬ã€ã€ãŒãèšããŠããŸãã
Fastly ã§ã¯ãã客æ§ã® Wasm ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ãããµãŒããŒäžã§ Cranelift ã䜿ã£ãŠå®è¡ããŠããŸããCranelift ã¯ãWasm ã®ãã€ãã³ãŒãã x86 ãã·ã³ã³ãŒãã«äºåã«å€æããã³ã³ãã€ã©ã§ããããã«ãããã³ãŒãã¯ãªã¯ãšã¹ãã®å°ç次第ããå®è¡ã§ããããã«ãªããããã³ãŒã«ãã¹ã¿ãŒãæéã®å€§å¹ ãªççž®ãå¯èœã«ãªãã®ããCompute@Edge ã®äž»ãªå©ç¹ã®1ã€ã§ãããŸããCranelift ã¯ããŒãã¢ã¯ã»ã¹ããã€ãã£ãã® x86 ã³ãŒãã«å€æããŸããå WebAssembly ã€ã³ã¹ã¿ã³ã¹ (ãªã¯ãšã¹ãããšã«1ã€) ã¯ãä»®æ³ã¡ã¢ãªç©ºéå ã«ç¬èªã®é åãæã¡ãå®è¡æã«ãã®é åãžãã€ã³ã¿ãç§»åããŸããWasm ã®ãã€ãã³ãŒããããŒãã«ã¢ã¯ã»ã¹ãããšãCranelift ã¯ãããããŒãããŒã¹ãããªãã»ããã§ã¢ã¯ã»ã¹ã«å€æããŸããWasm ã®ãã€ã³ã¿ã¯32ãããå¹ ã§ããããããã®ãªãã»ãã㯠4 GiB (4ãã€ããªã®ã¬ãã€ããã€ãŸã232ãã€ã) ãè¶ éããããšã¯ãããŸãããä»®æ³ã¡ã¢ãªé åã®ãµã€ãºãããããã倧ããèšå®ããããšã§ãWasm ã€ã³ã¹ã¿ã³ã¹ãä»ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¡ã¢ãªã«å°éã§ããªãããã«ããŸããã©ã³ã¿ã€ã ã®å¢çãã§ãã¯ç¡ãã§è¡ããããã®ããã»ã¹ã¯ãCompute@Edge ã®ããã©ãŒãã³ã¹ãæå€§éã«åŒãåºãããã®æ¹æ³ã®1ã€ã§ããé åã®éã«ã¯ã¬ãŒãããŒãžãé 眮ãããŠããŸããããã¯ããããããŠããªãä»®æ³ã¢ãã¬ã¹ã§ãã¢ã¯ã»ã¹ããããš Wasm ã€ã³ã¹ã¿ã³ã¹ãçµäºããããã«ãªã£ãŠããŸãã
ãã°ã®çºç
ãã®èšèšã§ã¯ãã³ã³ãã€ã©ãã³ãŒããå¿ å®ã«å€æããããšãåæãšããŠããŸã (éåžžã®ã³ãŒãã§ã¯æ£åžžãªåäœãåæã«ãªã£ãŠããŸã)ãLucet ã®äžéšã§ãã Wasm ãµã³ãããã¯ã¹ã¯ãããŒã¹ãã€ã³ã¿ãš Wasm ããŒãã¢ãã¬ã¹ãå ç®ããããã«ãCranelift ã®å éšè¡šçŸã«å ç®åœä»€ãçæããŸããã§ã¯ããã®æŽæ°ã®å ç®ã誀ã£ãçµæãåŒãèµ·ãããå Žåã¯ãã©ããªãã®ã§ãããã
å®éããã®ãšã©ãŒãåé¡ãåŒãèµ·ãããŸããããã®åé¡ãææ¡ããã«ã¯ã以äžãçè§£ããå¿ èŠããããŸãã
ã³ã³ãã€ã©ãç°ãªãå¹ ã®å€ (äŸãã°32ããããš64ããã) ãã©ã®ããã«æ±ãã
ã³ã³ãã€ã©ãã©ã®ããã«èšç®ãå®è¡ãããã·ã³åœä»€ãéžæããŠããã
å€ãé 眮ããã¬ãžã¹ã¿ã®éžã³æ¹ (ã¬ãžã¹ã¿å²ãåœãŠ)
ã§ã¯ã1ã€ãã€é ã«èŠãŠãããŸãããã
x86-64 ã§ã¯ãæŽæ°ã¬ãžã¹ã¿ã®å¹ ã¯ãã¹ãŠ64ãããã§ããã32ãããã® Wasm ãã€ã³ã¿ãªã©ã§ã¯ãäžéšã®å€ã®å¹ ãçããªããŸããCranelift ãå«ãã»ãšãã©ã®ã³ã³ãã€ã©ã¯ãã¬ãžã¹ã¿ã®äžäœãããã«çãå€ãæ ŒçŽããäžäœãããã¯æªå®çŸ©ã®ãŸãŸã«ããŸããWasm ããŒãã®ã¢ãã¬ã¹ãèšç®ããã³ãŒããçæãããéã32ãããã® Wasm ãã€ã³ã¿ã64ãããå æ°ã«å€æãã zero-extend æŒç®åãå«ããå¿ èŠããããŸãããã®åŸããã®æŒç®åã¯ããŒã¹ã¢ãã¬ã¹ã«è¿œå ãããŸãã
ãã®äžè¬çãªæäœããçæãããå Žæãã¹ãŠã«ãããŠæç€ºçã«å®è¡ããã®ã¯ã³ã¹ããããããŸãããã®ãããCranelift ã®åœä»€ã»ã¬ã¯ã¿ã¯ã32ãããåœä»€ã«ãã£ãŠãäžäœããããã¯ãªã¢ããã64ãããå€ãçæãããããšããããšãã x86-64 ã®ç¹æ§ãå©çšããããšã§ãextend æŒç®åãäžèŠã«ãªããåé€ããããšãã§ããŸãã
ãããŸã§ã¯ãã¹ãŠäžæããããŸããããããã§ã¬ãžã¹ã¿ã¢ãã±ãŒã¿ã®ç»å Žã§ããã³ã³ãã€ã©ããã¯ãšã³ãã®äžéšã§ããã¬ãžã¹ã¿ã¢ãã±ãŒã¿ã¯ãå€ãæ ŒçŽããå ŽæãéžæããŸããããã°ã©ã ã«äžåºŠã«å€ãã®ã¢ã¯ãã£ããªå€æ°ãããå Žåã¯ãããŒã¿ã®äžéšãããã»ããµãŒã¹ã¿ãã¯ã«ã¹ãã«ãããåŸã§å¿ èŠãªãšãã«åããŒãããŸãããã®æäœã¯æ£åžžã§ãããã°ã©ã ããã¯èŠããŸãããããã«ãã£ãŠãããã°ã©ããŒã¯ã¬ãžã¹ã¿ãããå€ãã®å€æ°ã䜿çšããããšãã§ããããã«ãªããŸãã
ããã§ããããããã°ã®ç»å Žã§ããã¬ãžã¹ã¿ã¢ãã±ãŒã¿ãã¬ãžã¹ã¿ãã¹ãã«ããéãã¬ãžã¹ã¿ã¢ãã±ãŒã¿ã¯å€ã®åãææ¡ããŠãããCranelift ã§ã¯å®éã®åã®ãããã®ã¿ã®ä¿æãä¿èšŒããŠããŸããäžèŠãª32ããããã64ããããžã®æ¡åŒµãåé€ããããã«ãå®éã®å€ã32ãããå¹ ã§ããã«ãããããã64ããããšããŠæ±ã£ãŠããŸããšããã®å€ãã¹ãã«ãããå ŽåããªããŒãåŸã®å€ãééã£ãŠããå¯èœæ§ããããŸããæ®å¿µãªããä»åã®ã±ãŒã¹ã§ã¯ã32ãããå€ããªããŒãããããã«ç¬Šå·æ¡åŒµã®ããŒãåœä»€ããã¬ãžã¹ã¿ã¢ãã±ãŒã¿ã«ãã£ãŠäœ¿çšãããŠããŸãããã€ãŸãã0x8000_0000 ãã倧ãã32ãããæŽæ°ã¯ãå ã®ããã°ã©ã ã§64ãããã«ãŒãæ¡åŒµãããåŸã誀ã£ãç¬Šå·æ¡åŒµã«ãã£ãŠè² ã®å€ã«ãªã£ãŠããŸãå¯èœæ§ããããšããããšã§ãã
ããŒããªãã»ãããé¢äžããŠããå Žåãè² ã®ãªãã»ããã¯åé¡ã«ãªããŸãã
圱é¿ç¯å²
ã€ãŸããçšãªç¶æ³äžã§ã¯ããµã³ãããã¯ã¹åãããããŒãã®éå§åã«ãã·ã¹ãã äžã® Wasm ã¢ãžã¥ãŒã«ãã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããšãå¯èœã§ããããšãæå³ããŸããFastly ã®ã·ã¹ãã ã§ã¯ãéåžžã«é«éãªèµ·åãšã¬ã¹ãã³ã¹æéãæäŸãããããåäžã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã»ã¹å ã§è€æ°ã®ãªã¯ãšã¹ããåŠçããŠããŸããã€ãŸãçè«äžãä»»æã®ã¡ã¢ãªãèªã蟌ãããšãã§ãããšããããšã¯ãã客æ§ã®ããŒã¿ã®æŒæŽ©ã«ã€ãªããå¯èœæ§ããããšããããšã§ãã
幞ããFastly ã®ã·ã¹ãã èšèšã«ãã£ãŠãã®åœ±é¿ã軜æžãããããšã倿ããŸãããCompute@Edge ããŒã¢ã³ã®ã¡ã¢ãªã¬ã€ã¢ãŠãã§ã¯ãä»®æ³ã¡ã¢ãªç©ºéå ã§ã¯ã€ã³ã¹ã¿ã³ã¹ããŒãã 4 GiB 以äžé¢ããŠé 眮ãããã®éã«ã¬ãŒãé å (ããããããŠããªãã¡ã¢ãª) ãèšããŠããŸããã€ãŸããWasm ã®ã€ã³ã¹ã¿ã³ã¹ãä»ã®ã€ã³ã¹ã¿ã³ã¹ã®ããŒã (ãªãã¢ã¡ã¢ãª) ã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸãããæå€§ã®åŸæ¹ãªãã»ããã 2 GiB ã§ãããããåã®ã€ã³ã¹ã¿ã³ã¹ããŒãã®å é ã«å°éããããšã¯ã§ããŸããã§ããã
ããããæªæãã Wasm ã¢ãžã¥ãŒã«ããå·§åŠã«æ§ç¯ãããããŒããã¹ãã¢ãå©çšããŠãåã®ã€ã³ã¹ã¿ã³ã¹ã®ã¹ã¿ãã¯ãã°ããŒãã«ãå«ããããŒãã®éå§çŽåã®éèŠãªããŒã¿ã«ã¢ã¯ã»ã¹ããå¯èœæ§ããããŸããã(ã¬ã€ã¢ãŠãã®è©³çްã«ã€ããŠã¯ãLucet ã®ããã¥ã¡ã³ããåç §ããŠãã ããã)ããã倿ããæç¹ã§ããã®ãªã¹ã¯ã¯éåžžã«æ·±å»ã§ããããšãæããã«ãªããŸãããæ¬çªç°å¢ã§ã® WebAssembly ã®å®è¡ããµããŒããã Lucet ã§ã¯ãã©ã³ã¿ã€ã ãäŸåããæ§é äœããã€ã³ã¿ãããŒã¿ã«å«ãŸããŠããããããã®æ§é äœã倿Žãããããšã¯ãããè€éãªæªçšã«ã€ãªããå¯èœæ§ããããŸããã
å¶ç¶ã«ããåæã«çºèŠãããå¥ã®ãã° (ã»ãã¥ãªãã£äžã®åé¡ããªããã®) ããã®ã³ã³ãã€ã©ãã°ãšé£çµãããŠãããããæªçšã«ã¯å€§ããªéçãªãã»ããã䜿ã£ãããŒããã¹ãã¢ãå¿ èŠã«ãªããŸããã€ãŸããæ€åºãããããªãããã§ãããã®è©³çްã«ã€ããŠã¯ã以äžã®ä»é²ã§è©³ãã説æããŠããŸãã
ã€ãŸãããã°ãæªçšããããšã¯çè«çã«å¯èœã§ããããç¹å®ã®ãªãã»ããã§ã®ããŒããããã¯ã¹ãã¢ãå¿ èŠã§ããããšãåãããŸããããã®ãªãã»ãããæ£ãããªãå Žåãå¥ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¬ãŒãé åãããããããããšã§ããŒã¢ã³å šäœãã¯ã©ãã·ã¥ããå¯èœæ§ããã£ããããããŒã¿ã«ã¯åœ±é¿ãåã°ãªããšããããã§ããããšãã¯ã©ãã·ã¥ã«è³ããªãã£ããšããŠããé«é »åºŠã§ã¢ãã¿ãªã³ã°ããŠãããã°ã«ãå€§å¹ ãªé åå€ã¢ã¯ã»ã¹ã®é¢ããç°åžžå ±åãäžãã£ãã§ããããããã§ããåé¡ããã£ãããšã«ã¯å€ãããããŸãããããã«æœåšçãªãªã¹ã¯ãç¹å®ããã¹ãã調æ»ãç¶ããŸããã
ãŸãããã°ãã·ã¹ãã å ã«ååšããŠããéã« Compute@Edge ã«ã¢ããããŒãããããã¹ãŠã® Wasm ã¢ãžã¥ãŒã«ãåæããããã°ã©ã ãèšè¿°ããè匱ãªç¯å²ã®ãªãã»ãããæã€ããŒãåœä»€ãšã¹ãã¢åœä»€ãæ€çŽ¢ããŸãããã客æ§ã®ãã©ã€ãã·ãŒãå®ããããæåã§ã®ã¢ãžã¥ãŒã«ãžã®ã¢ã¯ã»ã¹ã調æ»ã¯äžåè¡ããŸããã§ããããã®ç¹å¥ãªã¿ã¹ã¯ã¯ãCompute@Edge ã®ã¢ãžã¥ãŒã«æ§ç¯ãšåæ§ãéé¢ãããã³ã³ãã€ã«ãã€ãã©ã€ã³ã§å®è¡ãããŸããããã®åæã«ãããWasm ã¢ãžã¥ãŒã«ã«ã¯æªçšã«ã€ãªããå¯èœæ§ã®ãããªãã»ããããªãã£ãããšã倿ããŸããããããã£ãŠãã·ã¹ãã äžã® Wasm ã¢ãžã¥ãŒã«ã䜿ã£ãŠãä»ã®ã客æ§ã®ããŒã¿ã«ã¢ã¯ã»ã¹ããããšã¯äžå¯èœã§ãã£ãããšãåãããŸããã
ãŸããã®èª¿æ»ãšåæã«ãçŽã¡ã« Cranelift ã®ãã°ã«ããããé©çšããã€ã³ãã©ãåãããã€ããŸãããéå»ã«ããã®ãŒã£ãåæãšãã°ä¿®æ£ãè¡ã£ãçµæãFastly ã¯ã客æ§ã®ããŒã¿ã¯å®å šã§ãããšç¢ºä¿¡ããŠããŸãã
åé¡ãçºèŠããçµç·¯
ãã®ãã°ã®ååšãæããã«ãªã£ãçµç·¯ããéåžžã«è峿·±ã話ã§ãã
ããšã®å§ãŸãã¯ãããã€ãã®ç°åžžãªãã°ãšã³ããªãŒã§ãããããæããšã³ãžãã¢ã®1人ãããã PoP ã§ Compute@Edge ããŒã¢ã³ãäœåºŠãã¯ã©ãã·ã¥ããŠãããã¢ã¯ã»ã¹ã§ããªãã¯ãã®ã¡ã¢ãªã¢ãã¬ã¹ã«è€æ°åã¢ã¯ã»ã¹ããŠããããšã«æ°ã¥ããŸãããããã¯ãæãããªåé¡ã®å åã§ããã説æã®ã€ããªãã¡ã¢ãªã¢ã¯ã»ã¹ã¯ãæ·±å»ãªåé¡ã®è¡šãã§ããå¯èœæ§ãããããã§ãã
ã¯ã©ãã·ã¥ã®åå ãšãªã£ã Wasm ã¢ãžã¥ãŒã«ã¯ãKTH Royal Institute of Technology ã®ã»ãã¥ãªãã£ç ç©¶è ãJavier Cabrera Arteaga æ°ã«ãããã®ã§ããããšãããã«ããããŸãããåæ°ã¯ãFastly ãšã®åæã®äžãã»ãã¥ãªãã£ç ç©¶ã®ããã« Compute@Edge ã䜿çšããŠããŸãããFastly 㯠Wasm ã¢ãžã¥ãŒã«ã®ã³ããŒãå ¥æãããã®åäœãåçŸããããã®å ¥åãçè§£ããã¹ããJavier æ°ã«é£çµ¡ãåããŸããã圌ã¯ããããŸå®éšå 容ã Fastly ãšå ±æããã¢ãžã¥ãŒã«ã®ãœãŒã¹ã³ãŒããžã®ã¢ã¯ã»ã¹ãèš±å¯ããŠãããŸããã
ã¯ã©ãã·ã¥ã®åå ãšãªã£ã Wasm ã¢ãžã¥ãŒã«ã®æ£ç¢ºãªããŒãžã§ã³ã Fastly ã·ã¹ãã ããååŸããåŸãã¯ã©ãã·ã¥ãåçŸãããããã¬ã§åé¡ãææ¡ããããšãã§ããŸãããéã¢ã»ã³ããªãèŠãã°ãã³ã³ãã€ã©ã®ãã°ã¯äžç®çç¶ã§ãããåé¡ãææ¡ããæç¹ã§ Cranelift ã«ããããåœãŠãã€ã³ãã©ã®å®å šæ§ã確ä¿ããããšãã§ããŸããã
ããããããã§å šãŠã解決ããããã§ã¯ãããŸããããã°ã®åœ±é¿ãçè§£ããæœåšçãªæŒãããšã¬ã¹ãã³ã¹ãç¹å®ããå¿ èŠããããŸãããFastly ã¯ãããŒãã¬ã€ã¢ãŠããå¢çãã§ãã¯ã¹ããŒã ãæ€èšŒããç°ãªãã³ã³ãã€ã©ãã©ã³ã¿ã€ã èšå®äžã§ã®ãã°ã®åœ±é¿ãæ£ç¢ºã«èšããŸããããããŠãã©ã®ãããªèšå®ããŠãŒã¹ã±ãŒã¹ã§ Cranelift ã«ãŠãã°ãé²åããã®ããFastly ã®ã€ã³ãã©ã«ã©ã®ãããªåœ±é¿ãäžããã®ãã調æ»ããŸããããã°ãæªçšãããæ¡ä»¶ãæç¢ºã«ãªã£ãæç¹ã§ãå ã»ã©ã®èª¬æã«ããã£ãç¹å®ã®ããŒãããã³ã¹ãã¢ã®éçãªãã»ãããæã€ Wasm ã¢ãžã¥ãŒã«ãæ¢ããŸããããã®ããã»ã¹ã®äžç°ãšããŠããªãŒãã³ãœãŒã¹ã³ãã¥ããã£ãç¹ã« Bytecode Alliance ã«å¯ŸãããªãŒãã³ãœãŒã¹ã® Wasmtime ãš Lucet ã©ã³ã¿ã€ã ãžã®åœ±é¿ã確èªããäœæ¥ãè¡ããŸããããã®èª¿æ»ã®çµæã¯ãFastly ã®è匱æ§å ¬éèšäºã«è¿œå ãããŸããã
ãŸã調æ»äžã«ãCompute@Edge ããŒã¢ã³ã«ãŠå®éã«ãã°ãæªçšããæå£ãéçºããŸããã身ãåŒãç· ãŸãæãã ã£ãåé¢ãåé¡ãå®éã«æªçšããããã«ã¯äœãå¿ èŠãªã®ããæ£ç¢ºã«ææ¡ã§ãããããèªä¿¡ãæ·±ããããšãã§ããŸããããã®éçšã§ãWasm ããŒãã®ããŒããšã¹ãã¢ã®äœçœ®ãæ£ãããªããã°ãããŒã¢ã³å šäœãã¯ã©ãã·ã¥ããŠããŸãããšãåãããŸãããã€ãŸãããã®ãããªå éšæ å ±ããªããã°ãæªçšã¯é£ããããšãåãããŸããããã®ãããªã¯ã©ãã·ã¥ã¯ãªã¢ã«ã¿ã€ã ãã°ã§ã¯èŠãããªãã£ãã»ããæ¢åã® Wasm ã¢ãžã¥ãŒã«ããã¹ãŠåæããçµæãFastly ã®ç°å¢ã§ã¯ãã®æªçšæå£ã¯äœ¿ãããªãã£ããšçµè«ã¥ããããšãã§ããŸããã
å€å±€é²åŸ¡ : å®å šãªããã»ã¹ã培åºããã¢ãã¿ãªã³ã°ãç©æ¥µçãªå¯Ÿç
ä»åã®ã€ã³ã·ãã³ãã«ãããŠãéèŠãªæèšã®å€ãã¯ã»ãã¥ãªãã£ããã»ã¹ããåŸãããŸããããã°ã«ãŠç°åžžãæ€åºãããæç¹ã§ããã°ãææããããã»ã¹ãæ£åžžã«æ©èœããããšã確èªã§ããŸããããŸãããããã¯ããšã³ãžãã¢ãã»ãã¥ãªãã£ãšã³ãžãã¢ãã³ãã¥ãã±ãŒã·ã§ã³æ åœè ãæ³åæ åœè ãªã©ã®ã¹ã¿ãããå šå¡æéããè匱æ§ãè¿ éãã€å¹ççã«ä¿®æ£ã§ããããšãåãããŸããã
ãŸããæ°ããåŠã³ãããã€ããããŸãããä»åã®ãã°ã¯ãCompute@Edge çºè¡šä»¥æ¥ãCranelift ã§åããŠçºçããã»ãã¥ãªãã£è匱æ§ã§ããããããæ©ã«ã瀟å ããã»ã¹ãèŠçŽããä»åŸã®æºåãããã«åŒ·åãããããšãã§ããŸããããŸããä»ååã㊠Bytecode Alliance ãšé£æºãã圱é¿ãåãããœãããŠã§ã¢ã®ãŠãŒã¶ãŒãæ¢ãåºããã»ãã¥ãªãã£å§åãçºè¡šããŸãããFastly ã¯ããœãããŠã§ã¢ã®ã»ãã¥ãªãã£ã確ä¿ããäžã§ãBytecode Alliance ã®ã¡ã³ããŒãšååã§ããããšã«å€§ããªæå³ããã£ããšèããŠããŸããä»åŸãæ§ã ãªææ³ãçšãããã°ã®æ©æçºèŠã»ä¿®æ£ã«ç©æ¥µçã«åãçµãããšã§ã客æ§ãžã®å®å šã«æ³šåããŠãããŸãã
ã»ãã¥ãªãã£ãã°ã¯ç¡ãã«è¶ããããšã¯ãããŸããããããããã°ã¯çŸä»£ã®ãœãããŠã§ã¢ã«ã¯ã€ããã®ã§ããããã培åºãã察çãæ¬ ãããŸãããããå€ãã®ã客æ§ããå®å šã§æ±çšæ§ã®é«ããã©ãããã©ãŒã ãšã㊠Compute@Edge ã䜿çšããããã«ãªãã«ã€ãããã®éèŠæ§ã¯ãŸããŸãé«ãŸããŸããFastly ã¯ãã客æ§ã®å®å šã確ä¿ããã¹ãããã®èšäºã«è¿°ã¹ãããããæ¹æ³ã§ãã»ãã¥ãªãã£ã«çŠç¹ãåœãŠããšã³ãžãã¢ãªã³ã°æŽ»åãç¶ããŠãããããšèããŠããŸãã
ä»é² : ãã°ã®è©³çްãªä»çµã¿
ãã®èšäºã®æåŸã«ããã°ãã©ã®ããã«åäœããã®ãããããŠã·ã¹ãã ãšã³ãžãã¢ãã³ã³ãã€ã©ãšã³ãžãã¢ãå®éã«èª€ã£ãã³ã³ãã€ã«ãç®ã«ããå Žåãã©ã®ããã«è¡šç€ºããããã«ã€ããŠãããå°ã詳ããã玹ä»ããŸãã
ãã®ãã°ãã»ãŒå¿ å®ã«åçŸããå Žåãæ¬¡ã®ãããªéã¢ã»ã³ãã«ã«ãªããŸãã
; function prologue, storing a few register-based arguments
push  rbp Â
mov  rbp,rsp
sub  rsp,0xe0
mov  QWORD PTR [rsp],r12
mov  QWORD PTR [rsp+0x8],r13
mov  QWORD PTR [rsp+0x10],r14
mov  QWORD PTR [rsp+0x18],rbx
mov  QWORD PTR [rsp+0x20],r15
mov  r12,rdi            ; bug-relevant details begin here!
                                     ; rdi is the first argument, the WebAssembly "VMContext".
                                     ; Lucet sets VMContext to the heap base, with critical structures
                                     ; placed in the (4k) page before the heap.
mov  r11,rsi            ; rsi is the second argument, the first one from user-controlled
                                     ; WebAssembly code. call it "heap_offset".
mov  rsi,rcx            ; rcx is the third argument, a user-controlled i64 - call it "user_qword".
mov  QWORD PTR [rsp+0x40],rsi   ; spill "user_qword", just a quirk of this PoC .
...
mov  QWORD PTR [rsp+0x30],r11   ; spill "heap_offset", again just a quirk.
movsxd rsi,DWORD PTR [rsp+0x30]Â Â Â ; reload "heap_offset".
add  esi,edx            ; this add helps convince Cranelift to spill in a way it later incorrectly sign extends.
           ; edx is also an argument, which is set to 0 in our PoC - this add does not change "heap_offset".
mov  QWORD PTR [rsp+0x30],rsi   ; the spill! we'll revisit this in a moment.
...
movsxd r11,DWORD PTR [rsp+0x30]Â Â Â ; the incorrect sign-extended load of "heap_offset"!
mov  rdi,QWORD PTR [rsp+0x40]   ; reload "user_qword"
mov  QWORD PTR [r12+r11*1+0x0],rdi ; store "user_qword" to "VMContext" + "heap_offset".
                                     ; since "heap_offset" was sign-extended r11 might be a number like -4096,
                                     ; this store might write "user_qword" over critical structures Lucet relies on.ããã§ã¯ãã»ãã¥ãªãã£äžã®åé¡ãã¯ã£ããåãããŸããããŒãããŒã¹ã®çŽåã«éèŠãªæ§é äœãããå Žåãå°ããªè² ã®ãªãã»ããã«ãã£ãŠãããæ§é äœã«éåžžã«å®¹æã«ã¢ã¯ã»ã¹ã§ããã³ã³ãã€ã©ã¯ãã®ãã¿ãŒã³ã®ãã°ã³ãŒããåºåããã®ãå°é£ã§ãããšããããšã§ãããªãã説æãç°¡æœã«ããããã«ãããã§ã¯ã³ã³ãã€ã©ã WebAssembly ã®ããŒããªãã»ãããã¹ãã«ããããã«ååãªã¬ãžã¹ã¿ãã¬ãã·ã£ãŒãåŸãããã«å¿ èŠãªæ ŒçŽãå ç®ãä¹ç®ãããã³çµã¿åããã倿°ã®ããŒã«ã«ãå«ããŠããŸããã
å ã»ã©è©±ã«ããã£ããæªçšã®è©Šè¡ãè€éã«ãã2ã€ç®ã®ãã°ã¯ãå®éã«æªçšãå®è¡ããããšããå Žåã«æç¢ºãªææšãäžããŠãããŸãããããŒãèšå®ã®è§£æã«äœ¿çšããŠããèšå®ããŒãµãŒã¯ã4 GBãã®ãã©ã¡ãŒã¿ãã4,000,000,000ããã€ããã€ãŸããã€ããªã®ãã®ããã€ããã§ã¯ãªã10鲿°ã®ãã®ã¬ãã€ãããšè§£éããŸãããããŒãã®æå€§ãµã€ãºã 4 GiB 以äžã®ã4,294,967,296ãã«èšå®ãããŠãããããã³ã³ãã€ã«ããã WebAssembly ã¢ãžã¥ãŒã«ã¯ãæåŸã®294,967,296ãã€ãã®ããŒãé åã«å¯ŸããŠå¢çãã§ãã¯ãè¡ããŸãããããã«ãã£ãŠãéã¢ã»ã³ãã«ã®èª¿æ»äžã«äºæããªãåœä»€ãããããããŸããã
mov  edi, 0xee6b27fe ; an entirely unexpected constant: 3,999,999,998
movsxd rax, DWORD PTR [rsp+0x88] ; the incorrect sign-extended load
cmp  eax, edi ; compare against the heap bound
jae  ff0 <guest_func_4+0x360> ; and branch to a trap site if out of boundsæ»æè ã¯ã0xfffff000 ã®ãããªããŒããªãã»ããã䜿ã£ãŠå°ãã ãéæ»ãããLucet ãäŸåããéèŠãªæ§é äœã倿Žãããšæãããã®ã§ãããã¯å¹žéãªåºæ¥äºã§ããããã®å Žåãå¢çãã§ãã¯ã¯å€±æããç°åžžã«å€§ãããªãã»ããã«ããããŒãé åå€ãžã®ã¢ã¯ã»ã¹ã«ãã£ãŠãããã°ã©ã ã¯ãã©ããããŸããæå€§ã® (ãŒãã«è¿ã) åŸæ¹ããŒããã€ã³ã¿ã¯ 0xee6b27fd ã§ããããããã®ãã°ã«å°éãã WebAssembly ã€ã³ã¹ã¿ã³ã¹çŽåã®294,967,297ãã€ãã¯æ¹ãããããã«æžãããšã«ãªããŸãããããæ®å¿µãªããããã®ä»ã«ãåé¡ãããããšãããããŸããã
WebAssembly ã®ããŒããšã¹ãã¢åœä»€ã«ã¯ãæ§é äœãæ±ãããŒããšã¹ãã¢ãç°¡çŽ åããããã®å³å€ãªãã»ãããå«ãŸããŠããŸããéåžžãæ§é äœã®ã¡ã¢ãªå
ã®ã¬ã€ã¢ãŠãã¯ããã°ã©ã å
šäœãéããŠåãã§ããäŸãã°ãstruct size ã® st_size ãã£ãŒã«ãã¯ã`struct size` èªäœãã©ãã«ãã£ãŠããåžžã«åããªãã»ããã«ãªããŸããã³ã³ãã€ã©ã¯ãã®ãªãã»ãããå³å€ãšããŠèšè¿°ããããšãã§ãã1ã€ã®æ§é äœã«å¯Ÿããç¹°ãè¿ãæäœã¯ãæ§é äœãã€ã³ã¿ãåå©çšããã ãã§æžã¿ãŸãããããããªãã»ãã㯠WebAssembly ã§å®çŸ©ãããŠãããããæ»æè
ã¯äœãããŒããªãã»ãããéžã³ãããã«ããŒããã¹ãã¢ã§å€§ããªãªãã»ããã远å ããã€ã³ã¹ã¿ã³ã¹ã®ããŒãã®çŽåã«é åã«å°éããããšã§ãé åãã§ãã¯ãå®å
šã«åé¿ããããšãã§ããŸãã
ãã®æç¹ã§ãLucet ã®ãµã³ãããã¯ã¹ã®ã»ãã¥ãªãã£ç¹æ§ã«éåããæ¹æ³ã§ãã€ã³ã¹ã¿ã³ã¹ã®ã¡ã¢ãªãæ¹ããããæŠå¿µå®èšŒãæ§ç¯ããããšãå¯èœã§ããäŸãã°ãæªæããã€ã³ã¹ã¿ã³ã¹ã®åã«ããã€ã³ã¹ã¿ã³ã¹ã®ã¡ã¢ãªãèªãã ãããã€ã³ã¿ãäžæžãããŠã³ã³ãããŒã«ãããŒãä¹ã£åã£ããããããšãã§ããŸããæ»æè ãè匱æ§ãã©ã®ããã«æªçšãããæ³åãã€ããªãå Žåã§ããã»ãã¥ãªãã£åé¡ãçå£ã«åãæ¢ããå¿ èŠããããšããããšããä»åã®ä»¶ã§èº«ããã£ãŠäœéšããããšãã§ããã®ã¯å€§ããªåç©«ã§ããã
