Paquete privado de reproducción de sanitizador de extremo a extremo para seis hallazgos de GDCM
Seis defectos de parser/codec en GDCM, reproducidos en v3.2.6 como fallos de sanitizer o comprobaciones de propagación acotadas. Cada disparador automatizado tiene un control casi válido que no produce la señal vulnerable. El hallazgo 1 también incluye una primitiva de flujo de control instrumentada.
Destinado a la revisión de mantenedores y coordinadores de vulnerabilidades. Lea SAFETY.md antes de ejecutar cualquier cosa.
manifest/targets.env:
| Nombre | Revisión | Qué es |
|---|
vulnerable | 9c71b163 | etiqueta v3.2.6 |
master | 2cd05d13 | instantánea de master upstream revisada estáticamente; matriz en tiempo de ejecución pendiente |
fixed | sin definir | rellenar solo cuando exista un commit de remediación revisado |
master es una instantánea con fecha, no una rama en movimiento. Ambas revisiones son accesibles desde el repositorio público, por lo que bootstrap.sh puede preparar cualquiera de ellas sin ningún código fuente privado.
La evidencia en tiempo de ejecución de este repositorio corresponde a v3.2.6. Los rangos más amplios a continuación provienen de la inspección del historial del código fuente; los patrones implicados también permanecen en la instantánea de master fijada.
| # | CWE | Rango inspeccionado en el código fuente | Ruta requerida |
|---|---|---|---|
| 1 | CWE-787 | v3.0.4 hasta v3.2.7 | lectura RLE YBR_FULL_422 multifotograma |
| 2 | CWE-787 | v2.0.16 hasta v3.2.7 | codificación/transcodificación JPEG2000 |
| 3 | CWE-125 | v2.0.5 hasta v3.2.7 | análisis de paleta segmentada; la aplicación de LUT expone valores propagados |
| 4 | CWE-787 | v2.0.8 hasta v3.2.7 | ImageRegionReader::ReadIntoBuffer; relacionado con la validación de precisión incompleta tras CVE-2024-22373 |
| 5 | CWE-674 | v2.0.4 o anterior hasta v3.2.7 | análisis ordinario de secuencias anidadas |
| 6 | CWE-369 | v2.0.4 o anterior hasta v3.2.7 | análisis RLE ordinario con NumSegments=0 |
fixtures/ - las entradas DICOM inertes, fijadas con SHA-256 en manifest/expectations.json y verificadas antes de cada ejecución de disparadorgenerators/ - generadores de código fuente deterministas y sin dependencias para cada fixtureharnesses/ - harnesses mínimos de lectura/codificación/decodificación; el hallazgo 2 se muestra tanto a través de la CLI gdcmconv como de la API de transcodificación de la biblioteca que llamaría un servidormanifest/expectations.json - comandos legibles por máquina, señales decisivas y criterios de aceptación para el objetivo fixedscripts/ - preparación de código fuente fijado, compilaciones con sanitizer, ejecución acotada, limpiezaevidence/ - resultados concisos ya observados, con objetivos no probados declarados explícitamenteLICENSE - licencia MITUn entorno de compilación Linux o macOS desechable con Git, Python 3, CMake 3.20+, Ninja y una cadena de herramientas C++11 (Clang o GCC). En Ubuntu: git python3 cmake ninja-build clang zlib1g-dev. Configure CC/CXX para usar GCC en su lugar.
La preparación del código fuente clona por HTTPS a menos que GDCM_SOURCE_REPO apunte a un clon local existente. No se utiliza ningún host SSH.
Estos comandos preparan únicamente el código fuente y los artefactos de compilación; no abren ningún fixture.
./scripts/build-target.sh vulnerable asan debug
./scripts/build-target.sh vulnerable ubsan debug
./scripts/build-target.sh master asan debug
./scripts/build-target.sh master ubsan debug
El tercer argumento es el perfil. debug es -O0 -g; release es -O2 -g -DNDEBUG, que elimina los gdcm_debug_assert() de GDCM y coincide con cómo las distribuciones compilan la biblioteca. Ejecutar la matriz bajo ambos responde a la primera pregunta que hace un mantenedor, que es si los informes son un artefacto de una compilación con aserciones habilitadas.
GDCM_SUPPORT_BROKEN_IMPLEMENTATION=ON es el valor predeterminado del propio GDCM y se deja tal cual. Sobrescriba el paralelismo conservador con JOBS=8.
Cada compilación escribe build-info.json (revisión, compilador, flags, plataforma) en su árbol de compilación de GDCM, y cada resumen de ejecución lo incorpora, de modo que la evidencia archivada se describe a sí misma.
export GDCM_REPRO_ACK=I_UNDERSTAND_THIS_CRASHES_A_LOCAL_PROCESS
./scripts/run-matrix.sh vulnerable master --profile debug # all automated cases
./scripts/run-one.sh vulnerable f1 # one trigger
./scripts/run-one.sh vulnerable f1 --control # its control
run-matrix.sh ejecuta cada caso automatizado para cada objetivo, no se detiene en el primer fallo y escribe _runs/matrix-<stamp>.json además de un _runs/matrix-<stamp>.md renderizado. El caso f1-exploit de dos etapas permanece manual y se informa como tal en lugar de clasificarse erróneamente como un caso automatizado fallido.
Cada proceso hijo tiene los core dumps deshabilitados y un tiempo de espera de 15 segundos; el hallazgo 5 además recibe un límite de pila acotado. Las salidas permanecen bajo _runs/. El clasificador compara la clase de sanitizer y la función implicada, nunca direcciones, PIDs ni números de línea del código fuente.
Para vulnerable, un caso pasa cuando aparece la señal decisiva y su control permanece limpio. Para master, el ejecutor registra la observación en lugar de un veredicto predeclarado. Para fixed, un caso pasa solo cuando la señal está ausente, no aparece ningún otro sanitizer o señal fatal, y el harness devuelve un resultado limpio permitido. Estas reglas son provisionales hasta que FIXED_REV nombre un parche real; deben revisarse contra el comportamiento previsto de rechazo o procesamiento de ese parche.
| Caso | Hallazgo | Qué muestra |
|---|---|---|
f1 | 1 | escritura en heap de ASan en RLECodec::DecodeFragment |
f1-exploit | 1 | sobrescritura instrumentada de objeto adyacente y control de rama indirecta (Linux x86-64) |
f2 | 2 | escritura en heap de ASan en opj_write_from_memory vía gdcmconv --j2k |
f2-lib | 2 | la misma escritura vía ImageChangeTransferSyntax::Change |
f3 | 3 | lectura en heap de ASan en la expansión de paleta segmentada |
f3-propagation | 3 | bytes fuera de límites alcanzan los píxeles decodificados, informado como un recuento |
f3-sentinel | 3 | una palabra de guarda conocida y acotada cruza el límite lógico de la LUT |
f4 | 4 | escritura en heap de ASan en la decodificación de región JPEG2000 |
f5 | 5 | agotamiento de pila de ASan en elementos de secuencia anidados |
f6 | 6 | división por cero de UBSan en la decodificación RLE; SIGFPE en x86 |
Otros dos harnesses son investigación de explotabilidad en lugar de casos de reproducción, y solo se compilan en el perfil sin sanitizer en Linux x86-64:
| Harness | Hallazgo | Qué establece |
|---|---|---|
finding01_groom | 1 | la adyacencia de glibc probada, observada a través de hooks de registro de asignaciones |
finding03_leak | 3 | una sobrelectura de 131070 bytes puede exponer un puntero de biblioteca específico de la compilación |
evidence/v3.2.6-macos-arm64-debug.md registra la matriz de depuración completa de v3.2.6, incluyendo cada control y ambas comprobaciones acotadas de propagación del hallazgo 3.
evidence/v3.2.6-linux-x86_64-finding01-groom.md y evidence/v3.2.6-linux-x86_64-finding03-leak.md registran los dos resultados de explotabilidad a continuación. Los resultados de master actual, la matriz completa del perfil de release y f1-exploit no se afirman hasta que se conserven sus transcripciones.
./scripts/clean.sh
La limpieza se niega a ejecutarse sin el marcador del paquete y elimina únicamente _work, _build, _generated, _runs y las cachés de bytecode de Python bajo este repositorio. La evidencia conservada bajo evidence/ no se elimina.
f1-exploit es solo para Linux-x86_64 y se ejecuta a mano; manifest/expectations.json contiene la secuencia de comandos exacta. Bajo el diseño de asignación determinista del harness, prueba tres hechos separados, cada uno con un caso negativo emparejado:
f1 simple, informa corrupción pero explícitamente no control de contenido, por lo que la comprobación es falsable;Aproximadamente la mitad de las ventanas de 8 bytes dentro del desbordamiento de 12288 bytes aceptan un valor arbitrario. El resto están acopladas, porque DoYBRFull422 duplica un byte de origen en dos posiciones de salida; el desplazamiento 6144 es una de las ventanas libres. La decodificación del fotograma 1 se ejecuta al final, por lo que es el contenido del fotograma 1 el que persiste más allá de la asignación.
El harness registra si ImageReader::Read() devuelve true mientras el objeto adyacente se modifica. Debe conservarse una transcripción exitosa de Linux x86-64 antes de describir ese resultado como evidencia observada.
f1-exploit proporciona su propio diseño de víctima, por lo que no puede responder si un proceso sin modificar tiene ese diseño. finding01_groom usa glibc estándar, PIE predeterminado y ASLR, con hooks de asignación globales que registran pero no reubican las asignaciones. En las pruebas conservadas:
finding01 simple muere de la misma manera sin ninguna instrumentación.En la compilación de glibc probada, el hallazgo 1 causó de forma fiable denegación de servicio; no se encontró ninguna ruta de ejecución de código. La geometría probada era fija, y otros asignadores o plataformas pueden disponer el heap de manera diferente.
finding03_leak es el resultado más sólido. En la compilación probada, la lectura fuera de límites alcanza 131070 bytes, un puntero de vtable de gdcm::ByteValue entra en los píxeles decodificados, y el harness deriva la base de carga de la biblioteca usando el desplazamiento de vtable conocido de esa compilación. Este es un resultado de divulgación local a nivel de API: requiere la aplicación de LUT y acceso al búfer de píxeles decodificados. No demuestra que un servicio de red devuelva esos píxeles.
Los dos no pueden encadenarse en ejecución de código aquí, y no solo porque no se encontró ninguna víctima: necesitan valores de PhotometricInterpretation diferentes, por lo que necesitan dos archivos, y una base filtrada solo es útil mientras el proceso que la filtra sigue vivo.
Un informe de sanitizer prueba el evento declarado de seguridad de memoria o comportamiento indefinido en el proceso y la revisión probados. f1-exploit prueba el control de bytes y una sobrescritura de puntero de función adyacente bajo un asignador instrumentado que proporciona deliberadamente el diseño objetivo. No establece ese diseño en un consumidor sin modificar. Las pruebas conservadas de finding01_groom no observaron ese diseño para la geometría probada y la compilación de glibc.
Nada de esto prueba la alcanzabilidad remota en ningún producto particular, la persistencia ni la aplicabilidad posterior. El argumento de alcanzabilidad para un despliegue dado es una afirmación separada, hecha en el texto de divulgación y no por este paquete.