უკან დაბრუნება
მკვლევარმა Google-ის დეველოპერულ საიტებზე დისტანციური კოდის შესრულების ხარვეზისთვის 90 000 დოლარი მიიღო
SiTech AI Team2 წთ. საკითხავი

მკვლევარმა Google-ის დეველოპერულ საიტებზე დისტანციური კოდის შესრულების ხარვეზისთვის 90 000 დოლარი მიიღო

მკვლევარმა აღმოაჩინა, რომ Google-ის DevSite-ის პლატფორმა OAuth-ის საიდუმლოებს Flask-ის სესიის ქუქიებში ინახავდა და იმავე გასაღებს ხელმოწერისთვის იყენებდა, რაც გაყალბებული ქუქიებით არაავტორიზებული დისტანციური კოდის შესრულებას იწვევდა.

სესიის ქუქიებში გაჟონილი OAuth-ის საიდუმლო მონაცემები

უსაფრთხოების მკვლევარმა Simon Koeck-მა აღმოაჩინა, რომ Google-ის დეველოპერული დოკუმენტაციის საიტებზე საერთო OAuth-ის ნაკადი მგრძნობიარე საიდუმლო მონაცემებს პირდაპირ Flask-ის სესიის ქუქიებში ამხელდა. developers.google.com-ზე /oauth2authorize მისამართზე შესვლისას ყენდება სესიის ქუქი, რომელიც ხელმოწერილია, მაგრამ არ არის დაშიფრული, რაც ნიშნავს, რომ ქუქის მფლობელს შეუძლია მისი შიგთავსის დეკოდირება.

ქუქის შიგნით Koeck-მა იპოვა pickle-ით სერიალიზებული oauth2client.client.OAuth2WebServerFlow ობიექტი, რომელიც შეიცავდა მოქმედ Google OAuth-ის client_id-სა და client_secret-ს ღია ტექსტით. კიდევ უფრო კრიტიკული იყო ის, რომ იგივე client secret ასევე იყო Flask-ის SECRET_KEY, რომლითაც თავად ქუქიები იწერებოდა ხელმოწერით. მან ეს დაადასტურა ხელმოწერის ოფლაინ ხელახლა გამოთვლით HMAC-ისა და cookie-session გასაღების წარმოების გამოყენებით, რის შედეგადაც მიიღო გაცემულ ქუქიზე არსებული ხელმოწერის ბაიტობრივად იდენტური შედეგი.

გაყალბებული ქუქიდან დისტანციური კოდის შესრულებამდე

ხელმოწერის გასაღების აღდგენის შემდეგ Koeck-ს შეეძლო შეექმნა თვითნებური სესიის ქუქიები, რომლებსაც სერვერი ვალიდურად მიიღებდა. OAuth-ის callback სესიიდან უკან კითხულობს flow ობიექტს და გადასცემს pickle.loads-ს, რომელიც unpickling-ის დროს კოდს REDUCE ოპკოდის მეშვეობით ასრულებს.

Google-ის საწარმოო სისტემებზე ბრძანებების გაშვების ნაცვლად Koeck-მა ხარვეზი დროით დაამტკიცა. payload, რომელიც time.sleep(N)-მდე მცირდება, წარმოქმნიდა პასუხის დაგვიანებებს არჩეული მნიშვნელობის შესაბამისად: 0,207 წამი sleep(0)-ისთვის, 3,193 sleep(3)-ისთვის, 5,194 sleep(5)-ისთვის და 8,283 sleep(8)-ისთვის. საკონტროლო ტესტებმა ეს ქცევა დაადასტურა: ქუქის არარსებობა, ხელმოწერის შეცვლილი ბაიტი ან flow-ის ჩანაწერის არარსებობა ყველა შემთხვევაში აბრუნებდა შეტყობინებას „Invalid request“, ხოლო sleep payload პასუხს ზუსტად მოთხოვნილი რაოდენობით აყოვნებდა.

გავლენა და ჯილდო

ხარვეზი საერთო DevSite-ის პლატფორმას ეხებოდა, ამიტომ აღდგენილი გასაღები ხელს აწერდა ვალიდურ სესიებს firebase.google.com-ზე, developer.android.com-ზე, source.android.com-ზე და docs.partner.android.com-ზე. Google-მა ანგარიში მიიღო და ჯილდოდ 90 000 დოლარი მიანიჭა, რაც გამოითვლება როგორც 75 000 დოლარის საბაზისო თანხა ჩვეულებრივი Google Applications RCE-სთვის, გამრავლებული 1,2-ზე ანგარიშის განსაკუთრებული ხარისხისთვის. ანგარიში წარდგენილ იქნა 2026 წლის 6 აგვისტოს, გადამოწმდა და მიღებულ იქნა 7 აგვისტოს, ხოლო გამოსწორდა 2026 წლის 7 ოქტომბერს.

გამოსწორება

Google-მა ოთხი ფენად დაყოფილი ცვლილება შეიტანა: შეცვალა ორივე გამჟღავნებული OAuth-ის კლიენტის საიდუმლო და გააუქმა მათით ხელმოწერილი სესიები, თითოეულ დანერგვას მისცა საკუთარი მაღალი ენტროპიის Flask-ის SECRET_KEY სერვერის მხარეს არსებული საცავიდან, რომელიც OAuth-ის მონაცემებთან არ არის დაკავშირებული, OAuth-ის flow ობიექტი სერვერზე დატოვა, ქუქიებში კი მხოლოდ გაუმჭვირვალე მითითება შეინახა, და pickle შეცვალა სქემით შემოწმებული მხოლოდ მონაცემების ფორმატით ყველაფრისთვის, რაც კლიენტის საზღვარს კვეთს. რომელიმე ერთი ცვლილებაც კი გააწყვეტდა თავდასხმის ჯაჭვს.

წყაროები: simonkoeck.com

SSiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.