Vulnerabilidades no subsistema eBPF que permiten a execución de código a nivel do núcleo de Linux

Identificáronse dúas novas vulnerabilidades no subsistema eBPF, que permite executar controladores dentro do núcleo Linux nunha máquina virtual especial con JIT. Ambas vulnerabilidades permiten executar o seu código con dereitos de núcleo, fóra dunha máquina virtual eBPF illada. A información sobre os problemas foi publicada polo equipo de Zero Day Initiative, que dirixe o concurso Pwn2Own, durante o cal este ano se demostraron tres ataques a Ubuntu Linux que empregaban vulnerabilidades descoñecidas anteriormente (non se informa se as vulnerabilidades en eBPF están relacionadas con estes ataques) .

  • CVE-2021-3490: a vulnerabilidade é causada pola falta de comprobación fóra dos límites de 32 bits cando se realizan operacións AND, OR e XOR bit a bit en eBPF ALU32. Un atacante pode aproveitar este erro para ler e escribir datos fóra dos límites do búfer asignado. O problema coas operacións XOR aparece a partir da versión do núcleo 5.7-rc1, e AND e OR - a partir da 5.10-rc1.
  • CVE-2021-3489: a vulnerabilidade é causada por un erro na implementación do búfer de anel e débese a que a función bpf_ringbuf_reserve non comprobou a posibilidade de que o tamaño da rexión de memoria asignada poida ser inferior ao tamaño real do ringbuf. O problema aparece dende a versión 5.8-rc1.

O estado das vulnerabilidades de parche nas distribucións pódese seguir nestas páxinas: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). As correccións tamén están dispoñibles como parches (CVE-2021-3489, CVE-2021-3490). Se o problema se pode explotar depende de se o usuario pode acceder á chamada ao sistema eBPF. Por exemplo, na configuración predeterminada en RHEL, a explotación da vulnerabilidade require que o usuario teña dereitos CAP_SYS_ADMIN.

Por separado, podemos observar outra vulnerabilidade no núcleo de Linux - CVE-2021-32606, que permite que un usuario local eleve os seus privilexios ao nivel raíz. O problema é evidente dende o kernel Linux 5.11 e é causado por unha condición de carreira na implementación do protocolo CAN ISOTP, o que fai posible cambiar os parámetros de conexión do socket debido á falta de establecer os bloqueos axeitados na función isotp_setsockopt() ao procesar a bandeira CAN_ISOTP_SF_BROADCAST.

Despois de pechar o socket ISOTP, a vinculación ao socket do destinatario segue en vigor, que pode seguir usando as estruturas asociadas ao socket despois de que se libere a memoria asociada a elas (use-after-free debido á chamada a isotp_rcv() acceder a unha estrutura isotp_sock xa liberada). A través da manipulación de datos, pode anular o punteiro á función sk_error_report() e executar o seu código a nivel do núcleo.

Fonte: opennet.ru

Engadir un comentario