Команда ΠΈΠ· УнивСрситСта ΠœΠΈΠ½Π½Π΅ΡΠΎΡ‚Ρ‹ раскрыла Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎΠ± ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… врСдоносных измСнСниях

Π‘Π»Π΅Π΄ΠΎΠΌ Π·Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ письмом с извинСниями Π³Ρ€ΡƒΠΏΠΏΠ° исслСдоватСлСй ΠΈΠ· УнивСрситСта ΠœΠΈΠ½Π½Π΅ΡΠΎΡ‚Ρ‹, ΠΏΡ€ΠΈΡ‘ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ядро Linux ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π“Ρ€Π΅Π³ΠΎΠΌ ΠšΡ€ΠΎΠ°-Π₯Π°Ρ€Ρ‚ΠΌΠ°Π½ΠΎΠΌ, раскрыла Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ядра ΠΏΠ°Ρ‚Ρ‡Π°Ρ… ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с этими ΠΏΠ°Ρ‚Ρ‡Π°ΠΌΠΈ пСрСписку с мэйнтСйнСрами.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ всС ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Ρ… ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ Π±Ρ‹Π»ΠΈ ΠΎΡ‚Π²Π΅Ρ€Π³Π½ΡƒΡ‚Ρ‹ ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅ мэйнтСйнСров, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ Π½Π΅ Π±Ρ‹Π» ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½. Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚ Π΄Π°Ρ‘Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π“Ρ€Π΅Π³ ΠšΡ€ΠΎΠ°-Π₯Π°Ρ€Ρ‚ΠΌΠ°Π½ поступил ΡΡ‚ΠΎΠ»ΡŒ Тёстко, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ нСпонятно ΠΊΠ°ΠΊ поступили Π±Ρ‹ исслСдоватСли, Ссли Π±Ρ‹ ΠΏΠ°Ρ‚Ρ‡ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Ρ‹ мэйнтСйнСрами. Π—Π°Π΄Π½ΠΈΠΌ числом ΠΎΠ½ΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌΠ΅Ρ€Π΅Π²Π°Π»ΠΈΡΡŒ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± ошибкС ΠΈ Π½Π΅ допустили Π±Ρ‹ поступлСниС ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ Π² Git, Π½ΠΎ нСпонятно ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ поступили Π±Ρ‹ Π½Π° самом Π΄Π΅Π»Π΅ ΠΈ насколько Π΄Π°Π»Π΅ΠΊΠΎ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΉΡ‚ΠΈ.

ВсСго Π² августС 2020 Π³ΠΎΠ΄Π° с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… адрСсов [email protected] ΠΈ [email protected] (письмо ΠΎΡ‚ ДТСймса Π‘ΠΎΠ½Π΄Π°) Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ ΠΏΡΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ: Π΄Π²Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… (1, 2) ΠΈ Ρ‚Ρ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… скрытыС ошибки (1, 2, 3), ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠ΅ условия для возникновСния уязвимостСй. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‡ содСрТал всСго 1-4 строки ΠΊΠΎΠ΄Π°. Основная идСя ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ Π±Ρ‹Π»Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ исправлСниС ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ условиС появлСния уязвимости ΠΈΠ·-Π·Π° Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ освобоТдСния памяти. НСдСлю спустя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ядра Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° информация с ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ продвиТСния уязвимостСй ΠΏΠΎΠ΄ Π²ΠΈΠ΄ΠΎΠΌ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… исправлСний ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти, Π½ΠΎ ΠΏΡ€ΠΎ Ρ€Π°Π½Π΅Π΅ прСдпринятыС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ врСдоносных ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ Π½ΠΈΡ‡Π΅Π³ΠΎ сказано Π½Π΅ Π±Ρ‹Π»ΠΎ.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‡ устранял ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти, добавляя Π²Ρ‹Π·ΠΎΠ² kfree() ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ управлСния Π² случаС ошибки, Π½ΠΎ создавал условия для обращСния ΠΊ области памяти послС Π΅Ρ‘ освобоТдСния (use-after-free). Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‡ Π±Ρ‹Π» ΠΎΡ‚Π²Π΅Ρ€Π³Π½ΡƒΡ‚ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΌ (Jiri Slaby), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΡƒΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ Π³ΠΎΠ΄ Π½Π°Π·Π°Π΄ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΡƒΠΆΠ΅ пытался ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Π½Π°Ρ‡Π°Π»Π΅ принято, Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ послС выявлСния условий появлСния уязвимости. > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > — if (!p2) return -ENOMEM; > + if (!p2) { > + kfree(p1); > + return -ENOMEM; > + }

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ‚Ρ‡ Ρ‚Π°ΠΊΠΆΠ΅ содСрТал условия возникновСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ use-after-free. Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‡ Π½Π΅ Π±Ρ‹Π» принят ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΌ (Dan Carpenter), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΠ» ΠΏΠ°Ρ‚Ρ‡ ΠΈΠ·-Π·Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅ΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с list_add_tail, Π½ΠΎ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ» Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ put_device ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ освобоТдён ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ «chdev», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ dev_err(&chdev->dev..). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΠ°Ρ‚Ρ‡ Π½Π΅ Π±Ρ‹Π» принят, Ρ…ΠΎΡ‚ΡŒ ΠΈ ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Π½Π΅ связанной с ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ. if (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME «: kfifo_alloc failed\n»); ret = -ENOMEM; goto err_fifo;

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ‚Ρ‡ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π±Ρ‹Π» принят мэйнтСйнСром (Miquel Raynal) ΠΈΠ·-Π·Π° наличия Π΄Ρ€ΡƒΠ³ΠΎΠΉ ошибки, Π½Π΅ связанной с ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ (Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² put для pdev). if (!window->virt) { printk(KERN_ERR MOD_NAME «: ioremap(%08lx, %08lx) failed\n», window->phys, window->size); + pci_dev_put(pdev); goto out; } … if (!map) { printk(KERN_ERR MOD_NAME «: kmalloc failed»); + pci_dev_put(pdev); goto out; } memset(map, 0, sizeof(*map)); … if (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); map->mtd = NULL; + pci_dev_put(pdev); goto out; }

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ 4 ΠΈΠ· 5 ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΠΎ исслСдоватСли сами допустили ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΌ, ΠΏΠΎ ΠΈΡ… мнСнию, ΠΏΠ°Ρ‚Ρ‡Π΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ исправлСниС, Π±Π΅Π· возникновСния ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹Ρ… условий для использования памяти послС освобоТдСния. err = pci_request_mem_regions(pdev, nitrox_driver_name); if (err) { pci_disable_device(pdev); + dev_err(&pdev->dev, «Failed to request mem regions!\n»); return err; }

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru