Resumen
El repositorio duckduckgo/content-scope-scripts contiene, según su propio README, el JavaScript compartido que usan todos los navegadores de DuckDuckGo ("shared JavaScript used within ALL DuckDuckGo browsers"). El fallo estaba en uno de sus workflows de GitHub Actions:
.github/workflows/semver-label.yml
Ese workflow se disparaba con pull_request_target, un evento que se ejecuta en el contexto del repositorio base, con acceso a sus secretos, aunque la pull request venga de un fork de cualquier usuario. Y aun así, semver-label.yml:
- Descargaba el código de la cabeza de la PR (controlado por quien la abre).
- Ejecutaba sobre él
npm installynpm run build. - Después lanzaba un script de confianza con
ANTHROPIC_API_KEYen las variables de entorno.
No había ningún control de acceso: cualquier usuario de GitHub podía dispararlo con solo abrir una PR desde un fork. Así, el código del atacante se ejecutaba en el runner de Actions con los secretos del repositorio a su alcance.
El investigador agrupó cuatro hallazgos en el reporte:
- Ejecución remota de código y robo de
ANTHROPIC_API_KEYmediantesemver-label.yml. - Ataque a la cadena de suministro manipulando etiquetas de versión para activar el pipeline de publicación.
- Exposición del secreto
DAX_PATen otros workflows relacionados que también usanpull_request_target. - Un total de 10 workflows con
pull_request_targetrepartidos por la organización de DuckDuckGo en GitHub.
La versión divulgada del reporte no incluye el contenido del workflow vulnerable ni el detalle de los hallazgos 3 y 4.
Cadena de ataque
Según la descripción del investigador:
- Desde una cuenta cualquiera de GitHub, hacer un fork de
duckduckgo/content-scope-scriptsy abrir una pull request contra el repositorio original con código propio. - El evento
pull_request_targetlanzasemver-label.ymlsin ninguna comprobación. - El workflow descarga el código de la PR y ejecuta
npm installynpm run build: el código del atacante corre en el runner. - Desde ahí se puede extraer
ANTHROPIC_API_KEYy abusar delGITHUB_TOKENdel workflow, que tiene permisopull-requests: write. - Con ese token, añadir etiquetas de versión semántica a cualquier PR del repositorio. Al fusionarse una PR etiquetada, se dispara la cadena de publicación automática:
semver-release.yml → build.yml
build.ymlgenera la versión sin firma de código ni verificación de integridad, y los proyectos que dependen de ella la toman de la rama de releases sin validar ninguna firma.
Impacto
- Ejecución de código y robo de secretos: cualquier usuario de GitHub podía ejecutar código arbitrario en el runner de Actions con solo abrir una PR desde un fork, y llevarse
ANTHROPIC_API_KEYpara usar la API a costa de DuckDuckGo. - Control del pipeline de publicación: con el
GITHUB_TOKEN(pull-requests: write) el atacante podía poner etiquetas de versión en cualquier PR y decidir cuándo se publicaba una versión nueva. - Cadena de suministro de todos los navegadores: una versión envenenada de content-scope-scripts llegaría a los navegadores de DuckDuckGo para Android, iOS, macOS y Windows, a las extensiones de Chrome y Firefox y al componente de autocompletado. Según el investigador, eso afecta a decenas de millones de usuarios en todas las plataformas.
- Sin firma de versiones:
build.ymlpublicaba sin firma de código ni verificación de integridad, y quienes consumen la rama de releases no validan ninguna firma.
El reporte se envió el 21 de marzo de 2026, con severidad crítica, y se hizo público el 11 de junio de 2026 ya resuelto.