
Preuve de concept d'exploitation pour CVE-2026-3909, une vulnérabilité hors limites dans Chromium Skia, avec des correctifs et une analyse de crash pour un déclenchement fiable dans des environnements de navigateur réels.
Ce dépôt contient une preuve de concept (PoC) pour CVE-2026-3909 qui peut être déclenchée de manière fiable dans le navigateur Chromium.
Le correctif officiel de Skia pour cette vulnérabilité ne comprenait qu'un cas de test de démonstration simplifié :
Elle ne peut pas s'exécuter dans un environnement Chromium réel. La démo officielle était volontairement limitée et omettait les conditions de déclenchement clés.
Ce PoC est basé sur la démo officielle et a été modifié pour déclencher la vulnérabilité de manière fiable dans un environnement navigateur Chromium réel.
Ce PoC consiste en des modifications apportées aux fichiers suivants :
raster_implementation.cc.patchChemin : <répertoire racine Chromium>/src/gpu/command_buffer/client/raster_implementation.cc
SkChromeRemoteGlyphCache.cpp.patchChemin : <répertoire racine Chromium>/src/third_party/skia/src/text/gpu/SkChromeRemoteGlyphCache.cpp
En plus des deux fichiers de correctif existants, vous pouvez également ajouter du code de débogage à l'intérieur de la fonction DrawAtlas::hasID(). Cela vous permet d'analyser et d'observer pourquoi l'abandon est déclenché.``` 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;
}
```markdown
output:
[*] 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"
## Utilisation
1. Appliquez les deux fichiers de patch à une version vulnérable de Chromium.
2. Ouvrez le navigateur `chrome <path>/trigger.html`
## Abandon```
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