El kernel Linux 5.12 ha adoptado el subsistema KFence para detectar errores al trabajar con la memoria

El kernel de Linux 5.12, que está en desarrollo, incluye una implementación del mecanismo KFence (Kernel Electric Fence), que verifica el manejo de la memoria, detecta desbordamientos del búfer, accesos a la memoria después de la liberación y otros errores de clase similar.

Una funcionalidad similar ya estaba presente en el kernel en forma de la opción de compilación KASAN (desinfectante de direcciones del kernel, usa Address Sanitizer en gcc y clang modernos); sin embargo, se posicionó principalmente para uso de depuración. El subsistema KFence se diferencia de KASAN por su alta velocidad de funcionamiento, lo que permite utilizar esta función incluso en núcleos de sistemas en funcionamiento.

La aplicación en sistemas de producción permitirá detectar errores de memoria que no aparecen en las ejecuciones de prueba y solo aparecen durante cargas de trabajo o durante operaciones a largo plazo (con un gran tiempo de actividad). Además, el uso de KFence en sistemas de producción permitirá aumentar significativamente la cantidad de máquinas involucradas en verificar el funcionamiento del kernel con memoria.

KFence logra una sobrecarga mínima independiente de la carga insertando páginas de protección en el montón a intervalos fijos. Una vez transcurrido el siguiente intervalo de protección, KFence, a través del sistema de asignación de memoria estándar (asignador SLAB o SLUB), agrega la siguiente página de protección del grupo de objetos de KFence e inicia un nuevo informe de contador de tiempo. Cada objeto KFence está ubicado en una página de memoria separada, y las páginas de memoria a lo largo de los bordes izquierdo y derecho forman páginas de protección, cuyo tamaño se elige al azar.

Así, las páginas con objetos están separadas entre sí por páginas de protección, que están configuradas para generar un "fallo de página" ante cualquier acceso. Para detectar escrituras fuera de límites dentro de las páginas de objetos, se utilizan adicionalmente "zonas rojas" basadas en patrones, que ocupan memoria que no utilizan los objetos y permanecen cuando se alinea el tamaño de las páginas de memoria. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARDIA x | J: ROJO- | x GUARDIA x | ROJO- : J | x GUARDIA x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :c | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Si se intenta acceder a un área fuera de los límites del buffer, la operación afecta la página de protección, lo que genera una "falla de página", que intercepta KFence y registra información sobre el problema detectado. De forma predeterminada, KFence no bloquea un error y solo muestra una advertencia en el registro, pero hay una configuración "panic_on_warn" que le permite poner el kernel en estado de pánico si se detecta un error.

Fuente: opennet.ru

Añadir un comentario