CSIRTCV

Está usted visitando una publicación en la hemeroteca de CSIRT-CV.
Para acceder al portal y contenido actual, visite https://www.csirtcv.gva.es

17/05/2013

Vulnerabilitat en el kernel Linux permet elevació de privilegis

El passat mes d’abril, un missatge en la llista del nucli Linux alertava d’un error de seguretat en la funció 'so_perf_event_destroy' de Kernel/events/core.c. El seu autor, Tommi Rantala, comentava que l'havia trobat executant una versió de Trinity modificada per ell mateix. Es tracta d’una ferramenta per a emprar tècniques de fuzzing en les cridades al sistema que proporciona el nucli Linux.

Risc: Mitjà

La fallada es troba en el subsistema 'perf' que permet obtindre mètriques de rendiment del maquinari. En executar un conjunt de crides amb paràmetres aleatoris, Rantala va aconseguir provocar un "nucli Oops" (una espècie d’excepció en el nucli). En l’eixida de registre de Trinity podien observar-se les línies que contenien la sospita d’un problema de seguretat.

Bàsicament, abans de la crida a 'so_perf_event_destroy' hi ha una crida a 'perf_swevent_init', on s’inicialitza un sencer amb signe al valor d’event->attr.config, procedent del punter a l’estructura *event.

Posteriorment, es fa una crida a 'so_perf_event_destroy' i ací eixe valor sencer amb signe és tractat com un sencer sense signe de 64 bits.

Com en 'perf_swevent_init' el sencer és tractat amb signe, només és comprovat en el seu límit superior, i deixa oberta la possibilitat que s’introduïsca un sencer negatiu que posteriorment en 'so_perf_event_destroy', en ser "convertit" en u64, ens donarà un sencer positiu.

Pel fet que el valor d’event->attr.config és controlable per l’usuari, quan s’efectua la crida al sistema corresponent per mitjà de l’estructura 'perf_event_attr', és possible mapar una zona de memòria i obtindre el seu control fent que s’apunte a eixa adreça. Si s’arriba a executar la nostra zona de memòria amb un shellcode instal·lat allí, este s’executaria amb permisos d’arrel.

Petr Matousek dóna una explicació completa i de recomanable estudi en la llista de bugzilla de Red Hat.

El pedaç va ser afegit al repositori del nucli el mateix mes. Bàsicament consistix a promoure la variable 'event_id' al tipus 'u64', i evitar així la falta d’una comprovació apropiada.

L’error va ser reportat a l’abril, i va passar un poc desapercebuda per la llista de desenvolupadors, sense alçar massa revolada. Però pareix que no va passar tan desapercebuda per a tot el món. Un poc més tard, al maig, un tercer va fer públic un exploit per a aprofitar la vulnerabilitat. Este fet és el que realment ha tret a la llum que la fallada és en realitat un greu problema de seguretat.

Sistemes Afectats:

Esta fallada afectaria tots els nuclis (de 64 bits) des de la versió 2.6.37 a la 3.8.8 que hagen sigut compilats amb l’opció CONFIG_PERF_EVENTS.

Referències:

CVE-2013-2094

Solució:

S’ha publicat un pedaç en el repositori del nucli Linux.

Notes:

Trinity
Linux kernel oops
Performance counter subsystem
CVE-2013-2094 kernel: perf_swevent_enabled array out-of-bound access
Commit del parche en el repositorio del kernel Linux
Hispasec una-al-día

Font: Hispasec una-al-día

CSIRT-CV