Files
AXP-Resurection/docs/009-fortify-port-review-20260926.md
T
sunfish-admin deaaf42caa 009: Magisk ship pack through US-S5-1 + US-S4 OpenSSH/Jelly/Gallery2.
Release-keys/AVB, CVE clean+hi batches, Yama/slabrand, Pro branding,
bundled apps, and AXP-class product surface docs/scripts.
2026-10-05 10:42:00 +02:00

90 lines
4.5 KiB
Markdown

# Revisión del port FORTIFY en curso — 2026-09-26, 21:25 UTC
Revisión de solo lectura del servidor; no se han editado scripts en ejecución.
El dueño confirma combo4 arrancado. Cursor registra kernel #16, DMESG,
SLAB_FREELIST_HARDENED, INIT_ON_ALLOC y INIT_ON_FREE activos, FORTIFY apagado.
No se ha repetido aquí la inspección de LAB.
## Estado real
Job: `009-bisect-ksync-fortify-clang`, iniciado a las 21:15:03 UTC.
Log: `/srv/rom/artifacts/detach-009-bisect-ksync-fortify-clang-20260926T211503Z.log`.
A las 21:25 UTC seguía activo, con procesos clang consumiendo CPU. El log
principal no se actualizaba desde las 21:18:39; eso no implicaba bloqueo.
No había resultado final ni nuevo artefacto FORTIFY validado.
El script recibe **solo CONFIG_FORTIFY_SOURCE**. Es un ensayo aislado, no
combo4+FORTIFY; coincide con el plan local. Preserva breakfast/bp4a y el
empaquetado sobre GOODMAKE. El diff actual no modifica lib/string.c ni añade
los stubs BUG. Mantener deshabilitado ALLOW_FORTIFY_BUG_STUBS.
## Hallazgo que revisar antes de aceptar el port
El script `apply_fortify_clang.py` adapta atributos y prototipos, pero deja
consultas de tamaño incoherentes con algunos atributos:
- POS equivale a `pass_object_size(1)`.
- `strlen` y `strnlen` reciben p con POS y consultan
`__builtin_object_size(p, 0)`.
- `strlcpy`, `strncat` y `strcpy` reciben q con POS y consultan su tamaño
con tipo 0. En otros wrappers, POS0 sí coincide con las consultas tipo 0.
Esto no es un detalle estético. La información de tamaño implícita depende
del tipo. Se compiló por stdin una prueba pequeña con el mismo Clang
r563880c, también para AArch64 freestanding, sin escribir en el servidor:
```c
typedef __SIZE_TYPE__ size_t;
__attribute__((noinline))
size_t mismatch(const char *const p __attribute__((pass_object_size(1)))) {
return __builtin_object_size(p, 0);
}
__attribute__((noinline))
size_t matched(const char *const p __attribute__((pass_object_size(0)))) {
return __builtin_object_size(p, 0);
}
```
El IR optimizado de mismatch devuelve -1 (tamaño desconocido); matched
devuelve el argumento implícito de tamaño. **Límite:** es una prueba aislada
noinline del mecanismo, no una demostración de que todas las llamadas a los
wrappers always_inline reales pierdan protección. Es necesario probar los
wrappers reales con optimización/LTO, tamaños conocidos y desconocidos.
Referencia primaria:
[Clang: pass_object_size](https://clang.llvm.org/docs/AttributeReference.html#pass-object-size-pass-dynamic-object-size).
Adaptar coherentemente los atributos y la semántica de tamaño del 4.14;
no sustituir todas las consultas por tipo 1 a ciegas, porque cambia la
política whole-object/subobject y puede alterar accesos válidos del árbol.
## Otros puntos de aceptación pendientes
- El port elimina `depends on !CC_IS_CLANG` sin implementar la detección y
los límites de versión/capacidades que propone su propio plan. Los macros
de atributos tienen fallback vacío: un compilador no compatible puede
volver a habilitar un FORTIFY sin soporte. No es prueba de fallo de Clang 21,
pero la configuración aún no tiene una protección adecuada.
- `__diagnose_as` está definido pero no utilizado en los wrappers revisados.
Documentar si se omite intencionadamente y validar diagnósticos reales;
declarar el atributo no implementa su efecto.
- El empaquetador imprime propiedades/config pero varias comprobaciones
terminan en `|| true`. Mostrar el valor no garantiza que coincida con el
esperado. Antes de entregar: comparar hashes de ramdisk/DTB, metadatos,
kernel inyectado y opciones de la config embebida, fallando si difieren.
- No editar el script activo. Congelar copia, hash, argumentos, diff y
configuración por experimento para evitar repetir el incidente combo4.
## Qué debe probarse además de compilar y arrancar
Sin stubs es necesario, pero no suficiente: quitar accidentalmente una
comprobación también puede hacer desaparecer símbolos de overflow.
Usar casos válidos y desbordamientos intencionados en un harness aislado
de los wrappers reales (no provocar corrupción en LAB), comprobando el
diagnóstico o camino de fallo esperado con Clang/LTO. Verificar también
ausencia de stubs en binarios/módulos, .config efectiva y hardware básico.
Después del ensayo aislado, validar combo4+FORTIFY como artefacto distinto.
Conclusión: el enfoque mejora y el build está activo; aún hay detalles del
port y pruebas de eficacia pendientes. No equivale a un port ya aceptado.