CVE-2026-18413
Açıklama
ADC API, her sürücünün hedef tamponu çok küçük olan bir örnekleme dizisini reddetmesini gerektirir: include/zephyr/drivers/adc.h dosyasındaki struct adc_sequence yapısının buffer_size alanı, "sürücünün örneklerin sınırın ötesine yazılmadığından emin olması gerektiğini ve tamponun yeterince büyük olmadığı ortaya çıkarsa bir hata döndürmesi gerektiğini" belgeler. NXP MCUX LPADC sürücüsü bu sözleşmeye uymamıştır. drivers/adc/adc_mcux_lpadc.c dosyasındaki mcux_lpadc_start_read(), data->buffer = sequence->buffer atamasını yapmadan önce hiçbir tampon boyutu kontrolü gerçekleştirmemiştir. Ardından tamamlanan her dönüştürme işlemi, sınırsız bir *data->buffer++ aracılığıyla, örnekleme turu başına etkinleştirilen kanal başına bir adet 16 bitlik örneği depolar: kesme tabanlı derlemeler için mcux_lpadc_isr()'de ve DMA yolu bulunan sürümlerde DMA tabanlı derlemeler için mcux_lpadc_dma_callback()'de. Örneğin, iki baytlık bir tamponla iki kanal seçen bir dizide, ikinci örnek tamponun sonunun ötesine yazılır. CONFIG_USERSPACE ile yapılan bir derlemede, adc_read() ve adc_read_async() sistem çağrılarıdır. drivers/adc/adc_handlers.c dosyasındaki işleyici, diziyi kullanıcı belleğinden kopyalar, yalnızca [buffer, buffer + buffer_size) aralığının çağıran iş parçacığı tarafından yazılabilir olduğunu doğrular ve kullanıcı tarafından sağlanan options->callback'i reddeder; boyut aritmetiğini kasıtlı olarak sürücüye bırakır. Bu nedenle, bir LPADC cihaz nesnesine erişim izni verilmiş bir kullanıcı modu iş parçacığı kanalları, buffer, buffer_size ve options->extra_samplings değerlerini tamamen kontrol eder ve tamponunun alabileceğinden çok daha fazla örnek talep edebilir: Örnekleme işaretçisi yalnızca tekrarlanan bir örneklemede geri sarıldığı, bir dizinin ek örneklemelerinde asla geri sarılmadığı için, iki baytlık bir tampona channels * 65536 örneğe kadar veri yazılabilir. Sonuç olarak gerçekleşen depolama işlemleri, MPU'nun iş parçacığının bellek alanını kısıtlamadığı çekirdek modunda (ADC kesme işleyicisinde veya DMA tamamlama geri çağırmasında) sürücü tarafından gerçekleştirilir; böylece yazma işlemi doğrusal olarak kullanıcı bölümünün dışına çıkarak diğer bölümler, çekirdek verileri veya iş parçacığı yığınları gibi komşu belleklere sızar. Bunun etkisi, ayrıcalıksız bir kullanıcı modu iş parçacığından gelen, saldırgan tarafından seçilen uzunlukta ve saldırgan tarafından seçilen bir ofsette çekirdek bellek bozulmasıdır; bu da olası bir yetki yükseltme ve hizmet reddi primitifidir. CONFIG_USERSPACE olmayan derlemeler, tamponun uygulama tarafından sağlanması nedeniyle yalnızca çağırıcı tarafında bir dayanıklılık kusuru olarak etkilenir. Düzeltme, mcux_lpadc_start_read() içerisinden drivers/adc/adc_common.c dosyasındaki yeni ortak yardımcı fonksiyon olan adc_sequence_validate_buffer()'ı çağırır. Yardımcı fonksiyon, herhangi bir örnekleme başlatılmadan önce active_channels * sizeof(uint16_t) * (1 + extra_samplings) hesaplamasını yapar ve -ENOMEM döndürür.
Nasıl düzeltilir
- zephyrproject zephyr4.4.2 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| zephyrproject zephyr | 2.5.0 ≤ v < 4.4.2 | 4.4.2 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.