
Prueba de concepto de explotación para CVE-2026-3909, una vulnerabilidad de escritura fuera de límites en Skia de Chromium, con parches y análisis de fallos para una activación fiable en entornos de navegador reales.
Este repositorio contiene una prueba de concepto (PoC) para CVE-2026-3909 que se puede activar de forma fiable en el navegador Chromium.
La corrección oficial de Skia para esta vulnerabilidad solo incluía un caso de prueba de demostración simplificado:
No se puede ejecutar en un entorno Chromium real. La demo oficial estaba limitada intencionalmente y omitía condiciones clave de activación.
Esta PoC se basa en la demo oficial y se ha modificado para activar la vulnerabilidad de forma fiable dentro de un entorno real del navegador Chromium.
Esta PoC consiste en modificaciones a los siguientes archivos:
raster_implementation.cc.patchRuta: <Directorio raíz de Chromium>/src/gpu/command_buffer/client/raster_implementation.cc
SkChromeRemoteGlyphCache.cpp.patchRuta: <Directorio raíz de Chromium>/src/third_party/skia/src/text/gpu/SkChromeRemoteGlyphCache.cpp
Además de los dos archivos de parche existentes, también puedes añadir código de depuración dentro de la función DrawAtlas::hasID(). Esto te permite analizar y observar por qué se está activando la anulación.``` bool hasID(const skgpu::PlotLocator& plotLocator) { if (!plotLocator.isValid()) { return false; }
uint32_t plot = plotLocator.plotIndex();
uint32_t page = plotLocator.pageIndex();
// patch code
printf("[*] POC plot idx: %x fNumPlots: %x\n", plot, fNumPlots);
// origin code
uint64_t plotGeneration = fPages[page].fPlotArray[plot]->genID();
uint64_t locatorGeneration = plotLocator.genID();
return plot < fNumPlots && page < fNumActivePages && plotGeneration == locatorGeneration;
}
```bash
# Instalar dependencias
pip install -r requirements.txt
# Ejecutar la herramienta
python main.py
python main.py -u https://ejemplo.com -w lista_palabras.txt
| Opción | Descripción |
|---|---|
-u, --url | URL objetivo |
-w, --wordlist | Ruta al archivo de lista de palabras |
-t, --threads | Número de hilos (por defecto: 10) |
-o, --output | Archivo de salida para los resultados |
-v, --verbose | Modo detallado |
# Escaneo básico
python main.py -u https://ejemplo.com
# Con lista de palabras personalizada y 20 hilos
python main.py -u https://ejemplo.com -w /ruta/a/lista.txt -t 20
# Guardar resultados en un archivo
python main.py -u https://ejemplo.com -o resultados.txt
La herramienta envía solicitudes HTTP al objetivo y analiza las respuestas para identificar posibles vulnerabilidades. Utiliza una combinación de comprobaciones basadas en firmas y análisis heurístico para detectar problemas de seguridad comunes.
Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request en el repositorio.
Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.```
[*] POC plot idx: 1f fNumPlots: 10
## Git log
Chromium:```
commit e00a64ead1abef9447943efede7bc26362ac3797 (HEAD -> 146.0.7680.71, tag: 146.0.7680.71)
Author: Roger McFarlane <[email protected]>
Date: Mon Mar 9 12:52:01 2026 -0700
[M146-desktop-respin] Make LimitedLayerEntropyCostTracker time-aware.
This change modifies the LimitedLayerEntropyCostTracker to account for
the entropy cost of studies that are active at a specific evaluation
time. The evaluation time is passed to the tracker's constructor and is
used to check against the study's filter dates and Google web visibility
dates.
The current time for entropy evaluation is sourced from
VariationsIdsProvider.
(cherry picked from commit 2ec2c50b47686def251947a2675a207863803cac)
Bug: 490248046, 490432663
Change-Id: I3174730f35b037d533bf10b2b1d0531e3781acfe
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7639358
Reviewed-by: Alexei Svitkine <[email protected]>
Commit-Queue: Alexei Svitkine <[email protected]>
Cr-Original-Commit-Position: refs/heads/main@{#1595543}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7637760
Bot-Commit: Rubber Stamper <[email protected]>
Cr-Commit-Position: refs/branch-heads/7680_65@{#23}
Cr-Branched-From: efe36a9d42443b4091a5be1be21e93ceff9b7a5e-refs/branch-heads/7680@{#1898}
Cr-Branched-From: 76b7d80e5cda23fe6537eed26d68c92e995c7f39-refs/heads/main@{#1582197}
gn help buildargs.is_official_build = false
is_debug = true
symbol_level = 2
v8_symbol_level = 2
blink_symbol_level = 2
is_component_build = false
proprietary_codecs = true
ffmpeg_branding = "Chrome"
v8_enable_sandbox = true
dcheck_always_on = true
optimize_webui = true
target_os = "linux"
target_cpu = "x64"
## Uso
1. Aplica los dos archivos de parche a una versión vulnerable de Chromium.
2. Abre el navegador `chrome <ruta>/trigger.html`
## Abortar```
gen/third_party/libc++/src/include/__memory/unique_ptr.h:578: libc++ Hardening assertion __checker_.__in_bounds<deleter_type>(std::__to_address(__ptr_), __i) failed: unique_ptr<T[]>::operator[](https://github.com/jaf0rk/cve-2026-3909/blob/main/index): index out of range
Received signal 6