CVE-2026-18414
Təsvir
ADC API hər bir drayverdən təyin olunmuş hədəf buferi çox kiçik olan nümunələmə ardıcıllığını rədd etməsini tələb edir: include/zephyr/drivers/adc.h faylındakı struct adc_sequence strukturunun buffer_size sahəsində qeyd olunub ki, "drayver nümunələrin limitdən kənara yazılmadığından əmin olmalı və bufer kifayət qədər böyük olmadıqda xəta qaytarmalıdır". ADI MAX32 drayveri bu şərtə əməl etməmişdir. drivers/adc/adc_max32.c faylındakı start_read() funksiyası bayt sayını göstərən buffer_size dəyərini nümunə sayı ilə ((1 + extra_samplings) * channels) müqayisə etmiş və sizeof(uint16_t) dəyərini nəzərə almamışdır, buna görə də tələb olunan ölçünün yarısı qədər olan buferi qəbul etmişdir. Daha sonra nümunələr Wrap_MXC_ADC_GetData() vasitəsilə uint16_t data->buffer-ə saxlanılır; bu funksiya hər nümunə üçün iki bayt yazır və göstəricini bir uint16_t qədər irəli çəkir: sinxron oxumalar üçün adc_max32_start_channel()-də, asinxron oxumalar üçün isə adc_max32_isr()-də. Məsələn, iki kanalı seçən və iki baytlıq buferi olan bir ardıcıllıq yoxlamadan keçir və onun ikinci nümunəsi buferin sonundan kənara yazılır. CONFIG_USERSPACE konfiqurasiyası ilə qurulmuş sistemlərdə adc_read() və adc_read_async() sistem çağırışlarıdır. drivers/adc/adc_handlers.c faylındakı idarəedici (handler) ardıcıllığı istifadəçi yaddaşından kopyalayır, yalnız [buffer, buffer + buffer_size) diapazonunun çağıran axın (thread) tərəfindən yazıla bildiyini yoxlayır və istifadəçi tərəfindən təqdim edilən options->callback-i rədd edir; o, ölçü hesablamalarını qəsdən drayverə buraxır. Beləliklə, MAX32 ADC cihaz obyektinə giriş hüququ verilmiş istifadəçi rejimi axını kanalları, buferi, buffer_size və options->extra_samplings parametrlərini tamamilə idarə edə bilir və drayverin buferin tutumundan iki dəfə çox bayt yazmasını təmin edə bilər. Yoxlama extra_samplings ilə mütənasib olduğu üçün, aşma miqdarı buferin öz uzunluğuna bərabər olur və bu, channels * 65536 bayta qədər buferin sonundan kənara çıxa bilər, çünki nümunə göstəricisi yalnız təkrar nümunələmədə geri qaytarılır, ardıcıllığın əlavə nümunələmələrində isə heç vaxt qaytarılmır. Nəticədə yaranan yazma əməliyyatları drayver tərəfindən kernel rejimində (sistem çağırışının özündə, ADC kontekst taymerində və ya asinxron oxumalar üçün ADC interrupt handler-də) yerinə yetirilir; burada MPU axının yaddaş domenini məhdudlaşdırmır, buna görə də yazma prosesi xətti şəkildə istifadəçi bölməsindən çıxaraq digər bölmələr, kernel məlumatları və ya axın stekləri kimi bitişik yaddaşa keçir. Bunun təsiri, hücum edənin seçdiyi ofsetdə və onun seçdiyi uzunluqda kernel yaddaşının korlanmasıdır ki, bu da imtiyazsız istifadəçi rejimi axını üçün real imtiyazların yüksəldilməsi və xidmətdən imtina primitividir. CONFIG_USERSPACE olmadan qurulan sistemlər yalnız çağıran tərəfin dayanıqlılıq defekti kimi təsirlənir, çünki buferi tətbiqin özü təmin edir. Həll yolu start_read()-dəki həmin yoxlamanı drivers/adc/adc_common.c faylındakı yeni ortaq köməkçi adc_sequence_validate_buffer() çağırışı ilə əvəz edir və nümunə ölçüsü kimi sizeof(uint16_t) ötürür. Köməkçi funksiya active_channels * sizeof(uint16_t) * (1 + extra_samplings) hesablamasını aparır və hər hansı nümunələmə başlamazdan əvvəl -ENOMEM qaytarır.
Necə düzəltmək olar
- zephyrproject zephyr4.4.2 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| zephyrproject zephyr | 4.0.0 ≤ v < 4.4.2 | 4.4.2 |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.