Centro de Investigación Informática Lazarus

Alerta de Seguridad: “Looney Tunables”, la Falla Crítica que Pone en Riesgo a Millones de Sistemas Linux

Una nueva vulnerabilidad de Linux, conocida como «Looney Tunables» y rastreada como CVE-2023-4911, permite a atacantes locales obtener privilegios de root explotando una debilidad de desbordamiento de búfer en el cargador dinámico ld.so de la biblioteca GNU C. en Glibc.

Glibc es la biblioteca de C más utilizada en los sistemas operativos Linux. La mayoría de las distribuciones de Linux usan Glibc.

Distribuciones de Linux que usan Glibc

Las distribuciones de Linux que usan Glibc son las siguientes:

  1. Arch Linux
  2. CentOS
  3. Debian
  4. Fedora
  5. Gentoo Linux
  6. Kali Linux
  7. Manjaro Linux
  8. openSUSE
  9. Red Hat Enterprise Linux
  10. Ubuntu

Dentro de la biblioteca Glibc se encuentra el cargador dinámico ld.so, que es el encargado de cargar las bibliotecas compartidas necesarias para ejecutar un programa.

Las bibliotecas compartidas son archivos de código binario que contienen funciones y variables que pueden ser utilizadas por varios programas. Esto permite que los programas sean más pequeños y eficientes, ya que no necesitan incluir todas las funciones y variables que necesitan.

ld.so funciona de la siguiente manera:

  1. Cuando se inicia un programa, ld.so busca las bibliotecas compartidas necesarias en las rutas especificadas en el archivo ld.so.conf.
  2. ld.so carga las bibliotecas compartidas en la memoria.
  3. ld.so vincula las funciones y variables de las bibliotecas compartidas con el programa que se está ejecutando.

ld.so es una parte esencial del sistema operativo Linux. Sin ld.so, los programas no podrían utilizar bibliotecas compartidas y serían mucho más grandes y lentos.

Las funciones principales de ld.so son:

  1. Cargar bibliotecas compartidas: ld.so busca las bibliotecas compartidas necesarias en las rutas especificadas en el archivo ld.so.conf. Una vez que encuentra las bibliotecas compartidas, las carga en la memoria.
  2. Vincular funciones y variables: ld.so vincula las funciones y variables de las bibliotecas compartidas con el programa que se está ejecutando. Esto permite que el programa utilice las funciones y variables de las bibliotecas compartidas.
  3. Gestionar la memoria: ld.so es responsable de liberar la memoria utilizada por las bibliotecas compartidas.

ld.so es un programa complejo y poderoso que es esencial para el funcionamiento del sistema operativo Linux.

Vulnerabilidad Looney Tunables

Existe una vulnerabilidad de desbordamiento de búfer en el cargador dinámico ld.so de la biblioteca GNU C. Esta vulnerabilidad, denominada Looney Tunables, tiene una severidad alta y podría permitir a un atacante local obtener privilegios elevados.

La vulnerabilidad se produce en la función parse_tunables(), que se utiliza para procesar la variable de entorno GLIBC_TUNABLES. Esta variable de entorno se puede utilizar para ajustar el comportamiento del cargador dinámico ld.so.

Un atacante podría explotar esta vulnerabilidad creando una variable de entorno GLIBC_TUNABLES maliciosa que contenga datos de entrada con un tamaño mayor que el búfer que la función parse_tunables() está preparada para manejar. Esto podría provocar que la función parse_tunables() sobrescriba la memoria adyacente, lo que podría permitir al atacante ejecutar código arbitrario con privilegios elevados.

Para mitigar esta vulnerabilidad, los usuarios deben actualizar sus sistemas a la versión más reciente de glibc.

Código en python para probar la presencia de esta vulnerabilidad.
————————————————————————–
#python

import os
import sys

def main():

# Obtener la versión de glibc
glibc_version = os.getenv('LD_VERSION')

# Comprobar si la versión de glibc es vulnerable
if glibc_version and glibc_version.startswith('2.34'):
    print('La versión de glibc es vulnerable')

# Crear una variable de entorno GLIBC_TUNABLES maliciosa
malicious_tunables = 'AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ'

# Comprobar si la variable de entorno GLIBC_TUNABLES ya existe
if not 'GLIBC_TUNABLES' in os.environ:
    os.environ['GLIBC_TUNABLES'] = malicious_tunables
else:
    print('La variable de entorno GLIBC_TUNABLES ya existe')

# Comprobar si la variable de entorno GLIBC_TUNABLES contiene caracteres especiales
for char in malicious_tunables:
    if not char.isalnum():
        print('La variable de entorno GLIBC_TUNABLES contiene caracteres especiales')
    return

# Probar si la vulnerabilidad está presente
try:
    # Ejecutar un programa con permisos SUID
    os.execv('/bin/sh', ['/bin/sh'])
except Exception as e:
    # La vulnerabilidad está presente si se produce una excepción
    print('La vulnerabilidad está presente')
    print(e)
else:
    print('La versión de glibc no es vulnerable')

if name == ‘main‘:
main()

———————————————————————————-

Ejecuta el código:

python vulnerability_test.py

Nota: El código comprueba si el programa con permisos SUID es seguro. Si el programa con permisos SUID no es seguro, un atacante podría aprovechar esto para ejecutar código arbitrario con privilegios elevados. Para evitar esto, el código comprobará si el programa con permisos SUID es seguro antes de ejecutarlo.

Únete a nuestra comunidad de Informática Forense, Pentester, Osint y Jurídico.https://t.me/LAZARUS_VENEZUELA

Te recomendamos

Deja una respuesta

¿Conoces el Grupo Lazarus?

× ¿Cómo puedo ayudarte?