უკან დაბრუნება
CVE-2025-13032, ნაწილი 2: Avast-ის დრაივერის ხარვეზის გამოყენება SYSTEM-ის უფლებების მისაღებად
SiTech AI Team2 წთ. საკითხავი

CVE-2025-13032, ნაწილი 2: Avast-ის დრაივერის ხარვეზის გამოყენება SYSTEM-ის უფლებების მისაღებად

SAFA Team-მა აღწერა, როგორ გამოიყენეს Avast-ის კერნელის დრაივერში აღმოჩენილი CVE-2025-13032 სრულად განახლებულ Windows 11-ზე SYSTEM-ის უფლებების მისაღებად. ხარვეზი ორმაგ წაკითხვას ეფუძნება და უკვე გამოსწორებულია.

SAFA Team-მა Avast-ის კვლევის მეორე და საბოლოო ნაწილი გამოაქვეყნა. ნაშრომი 18 სექტემბერს გამოქვეყნდა. ის აღწერს ექსპლოიტს, რომლის შედეგადაც მკვლევრებმა სრულად განახლებულ Windows 11-ზე SYSTEM-ის უფლებები მიიღეს. საუბარია CVE-2025-13032-ზე, Avast-ის დრაივერში აღმოჩენილ ორმაგი წაკითხვის ხარვეზზე.

ორმაგი წაკითხვა და გადავსება PAGED_POOL-ში

დრაივერი მომხმარებლის _UNICODE_STRING სტრუქტურას იღებს, თუმცა მის Length ველს ორჯერ კითხულობს: ჯერ ბუფერის ზომას ExAllocatePoolWithTag-ით განსაზღვრავს, შემდეგ კი იმ memmove-ს იყენებს, რომელიც სტრიქონს მასში აკოპირებს. ამ ორ წაკითხვას შორის მეორე ნაკადს Length 0x1000-მდე გაზრდა შეუძლია, მთავარი ნაკადი კი ციკლში დაუცველ IOCTL-ს იძახებს. დამთხვევისას კერნელი გამოყოფილზე მეტ ბაიტს აკოპირებს და გადადინება PAGED_POOL-ის მეზობელ ბლოკში ხვდება. SAFA-ს თქმით, რბოლის ფანჯარა ვიწროა, მაგრამ საიმედოდ იგება.

სამიზნე: IORing-ის RegBuffers მასივი

სამიზნედ I/O Ring ობიექტი აირჩიეს, რომელიც IoRingReadFile-ისა და IoRingWriteFile-ის მეშვეობით ასინქრონულ ოპერაციებს აჯგუფებს. მისი RegBuffers მასივი სწორედ PAGED_POOL-შია, მის ზომას მომხმარებელი აკონტროლებს, ერთი მაჩვენებლის დაზიანებაც კმარა. მკვლევრებმა ბევრი ასეთი მასივი გამოყო, ნაწილი გაათავისუფლეს და ხარვეზი გაააქტიურეს, რათა გადადინება შექმნილი ხვრელის მეზობლად მოხვედრილიყო.

RegBuffers მასივის სქემა

RegBuffers[0] მომხმარებლის მეხსიერებაში მყოფ ყალბ _IOP_MC_BUFFER_ENTRY სტრუქტურაზე გადამისამართდა, ამიტომ კერნელი შემტევის კონტროლირებად მისამართს მიმართავს. ეს შესაძლებელია იმიტომ, რომ Windows-ს SMAP დაცვა არ აქვს. IoRingReadFile თვითნებურ კერნელის ჩაწერად იქცა, IoRingWriteFile კი თვითნებურ წაკითხვად.

კერნელის მისამართის გაჟონვა MDL-ით

კერნელის მისამართები რანდომიზებულია, ამიტომ ერთი ცნობილი მისამართი იყო საჭირო: საკუთარი _EPROCESS. რეგისტრირებული ბუფერი Memory Descriptor List-ით აისახება და კერნელი მის მაჩვენებელს ბუფერის ჩანაწერში ინახავს. ვინაიდან ჩანაწერი userland-შია, მკვლევრებმა Mdl ველი წაიკითხეს, Address ამ მისამართზე გადაამისამართეს და Process ველიდან მფლობელი _EPROCESS-ის მისამართი მიიღეს.

აღდგენა და SYSTEM-ის უფლებები

ხარვეზმა pool-ის ბლოკის სათაურში ProcessBilled ველიც დააზიანა, ობფუსკირებული მაჩვენებელი, რომელიც ფორმულით EPROCESS ^ ChunkAddress ^ ExpPoolQuotaCookie ითვლება; შესწორების გარეშე ბლოკის გათავისუფლებისას სისტემა ლურჯ ეკრანს იძლევა. SAFA-მ cookie მეორე, სუფთა IORing ობიექტიდან გამოიტანა და მნიშვნელობა დააბრუნა. ბოლოს ექსპლოიტმა SYSTEM-ის token მოიპარა: EPROCESS-ების სია გაიარა, SYSTEM-ის token წაიკითხა და საკუთარი გადაწერა. ხარვეზი უკვე გამოსწორებულია.

SSiTech

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

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