Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions .github/workflows/osv-scanner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@
# separate terms of service, privacy policy, and support
# documentation.

# Full-lockfile OSV scan: every pull request, push to main, and weekly.
# Full-lockfile OSV scan: every pull request/push to main or develop, plus daily
# on the default branch so newly published advisories do not wait a week.
# Findings remain visible as SARIF/CVSS; do not suppress vulnerabilities.

name: OSV-Scanner

on:
pull_request:
branches: [ "main" ]
branches: [ "main", "develop" ]
merge_group:
branches: [ "main" ]
branches: [ "main", "develop" ]
schedule:
- cron: '33 13 * * 1'
- cron: '33 13 * * *'
push:
branches: [ "main" ]
branches: [ "main", "develop" ]

permissions:
# Require writing security events to upload SARIF file to security tab
Expand Down
40 changes: 20 additions & 20 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ mdns-sd = "0.20"
sysinfo = "0.39"

# QUIC transport
quinn = "0.11"
quinn = "0.11.12"
rustls = "0.23"
# PEM loading is built into rustls 0.23 via pki_types::PemObject
rcgen = "0.14"
Expand Down
115 changes: 115 additions & 0 deletions docs/security/PLAN-2026-10-27-dependabot-release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
# Plan de remediación de seguridad y release de Synapsis

**Estado:** remediación local validada; integración y publicación pendientes
**Repositorio:** `MethodWhite/synapsis`
**Rama de trabajo:** `codex/synapsis-security-release-20261027`
**Línea base revisada:** `main` en `25bab13` (v0.13.1)
**Fecha:** 2026-10-27

## 1. Objetivo y alcance

Remediar las alertas abiertas de Dependabot del SDK `packages/synapsis-client`, integrar la corrección vigente de Quinn/RustSec que ya está propuesta para `main`, mantener el escaneo OSV en las ramas de publicación y desarrollo, validar el resultado sin relajar el acceso a dependencias privadas y producir un release cuyo commit/tag contenga las correcciones.

La revisión encontró seis alertas Dependabot abiertas, todas para Vite `8.3.2` en el lockfile del SDK y marcadas como dependencias de desarrollo. El PR #83 propone Vite `8.3.5`. Las seis advisories consideran afectada la línea `8.3.0–8.3.2` y fijada desde `8.3.3`; `8.3.5` supera esa versión. El riesgo es de herramientas de desarrollo/build, no evidencia de una vulnerabilidad explotable en el SDK publicado. La exposición concreta depende de las condiciones descritas por cada advisory.

La auditoría actual de `Cargo.lock` añadió hallazgos RustSec posteriores a los PR revisados: Tokio, rustls, rustls-webpki, raíces WebPKI y componentes criptográficos. Se fijaron versiones corregidas para esas vulnerabilidades; `crypto-bigint 0.7.6` queda como advertencia yanked de Cargo porque es la versión upstream que RustSec señala como corregida.

El escaneo OSV completo reportó GHSA-qwgh-2vcv-g2f7 contra `block-buffer 0.10.4`. La revisión directa de la etiqueta upstream `block-buffer-v0.10.4` y la confirmación del mantenedor de RustCrypto establecen que esa versión no está afectada por este defecto: su cursor se almacena por separado del buffer. El advisory upstream ya informa el rango `>=0.11.0, <0.12.1`; la ficha central de GitHub Advisory Database y OSV aún conservan el rango anterior, por lo que el CI de Synapsis sigue fallando. Hay una corrección propuesta en [github/advisory-database#10698](https://github.com/github/advisory-database/pull/10698); se dejó allí evidencia independiente y una observación para reconciliar el límite prerelease con el rango upstream. No se añadió ningún ignore ni se afirma que Synapsis tenga esta vulnerabilidad. El gate de publicación queda a la espera de que la ficha central se corrija y que el escaneo completo vuelva a pasar.

El paquete no tenía archivos de prueba aunque declaraba `vitest run`; se añadieron tres pruebas unitarias acotadas al contrato existente de `SynapsisClient.callTool` (JSON-RPC, cabecera de autenticación y errores) para que `npm test` tenga una señal real durante esta actualización.

También hay un PR de seguridad Quinn para `main` (#79), con `quinn 0.11.12` y `quinn-proto 0.11.19`, aprobado y con CI verde al iniciar esta revisión. El PR #82 lleva remediaciones equivalentes a `develop`, pero aún no tiene una aprobación registrada en GitHub. El PR release-please #78 prepara v0.14.0; debe incluir las correcciones antes de publicar.

## 2. Inventario de hallazgos Dependabot

| Alerta | Severidad | Advisory | Riesgo resumido | Versión fijada |
|---|---|---|---|---|
| #16 | Media | GHSA-rq7h-c2jc-7f22 | Posible lectura de archivos fuera de `server.fs.allow` con rutas que coinciden con paths del sistema | Vite 8.3.3+ |
| #15 | Baja | GHSA-9jrq-w75r-8gcw | Ejecución de script cross-origin bajo ciertas configuraciones de middleware | Vite 8.3.3+ |
| #14 | Media | GHSA-vfpm-58rq-9qcg | Exposición de los primeros bytes de archivos fuera de `server.fs` mediante `vite-wasm-instance` | Vite 8.3.3+ |
| #13 | Alta | GHSA-587h-7wmj-h5pm | Bypass de comprobación de ruta de `launch-editor` en Windows | Vite 8.3.3+ |
| #12 | Media | GHSA-r825-w8mm-5pxw | Interpretación de argumentos por algunos editores que puede conducir a ejecución de comandos | Vite 8.3.3+ |
| #11 | Media | GHSA-698v-4r3x-3vcv | Escape incompleto de `%` en Windows en ciertos escenarios de `launch-editor` | Vite 8.3.3+ |

Las seis alertas apuntan al manifiesto `packages/synapsis-client/package-lock.json`; ninguna está marcada como dependencia de runtime. El nivel alto está condicionado a Windows y a que un atacante controle el argumento/ruta descrito por el advisory.

## 3. RCTF

En este plan, **RCTF** significa **Riesgo, Controles, Trazabilidad y Fallback**.

### R — Riesgo

- Mantener Vite `8.3.2` conserva seis advisories conocidas en la herramienta de desarrollo.
- Mantener versiones anteriores de Tokio, rustls, rustls-webpki, las raíces WebPKI y crypto-bigint conserva advisories RustSec, incluidos riesgos de seguridad de I/O, certificados TLS y operaciones criptográficas de tiempo constante.
- `crypto-bigint 0.7.6` está yanked pese a ser la versión corregida indicada por RustSec; actualizarla limpia vulnerabilidades pero conserva una advertencia que requiere decisión de mantenimiento.
- La ficha central OSV aún identifica `block-buffer 0.10.4` (GHSA-qwgh-2vcv-g2f7) como afectado, pero la fuente exacta y el mantenedor upstream confirman que 0.10.4 no está afectado por este defecto. La línea 0.11 introdujo el cursor inline que causa el problema; la versión 0.12.1 lo corrige.
- Mientras la base central de GHSA/OSV no sincronice el rango corregido, el escaneo fail-closed de Synapsis dará un falso positivo. No debe resolverse ocultando o excluyendo el advisory del escaneo.
- Publicar desde una rama de release creada antes de integrar estas correcciones dejaría el tag sin ellas, aunque los PR de seguridad sigan abiertos o pasen pruebas individualmente.
- Los PR de Dependabot no reciben secretos privados de Actions; el PR #83 ya falló al clonar Arca y el escaneo completo encontró avisos Quinn presentes en su base. Estos fallos no se tratarán como PASS ni se resolverán ampliando permisos.

### C — Controles

- Fijar el árbol reproducible en `package-lock.json` a Vite `8.3.5`; confirmar el paquete resuelto y el árbol npm, no solo el rango de `package.json`.
- Integrar la actualización Quinn y la exploración OSV sin agregar excepciones o ignores para los advisories.
- Mantener el token de repositorios privados limitado a los jobs que lo requieren. No publicar Arca, no mover secretos al PR ni usar `pull_request_target` para habilitar secretos a Dependabot.
- Ejecutar revisión independiente Oura y verificar cada hallazgo contra el lockfile, advisories oficiales, salida de npm/Cargo y checks de CI. La auditoría local de Cargo terminó con cero vulnerabilidades RustSec y una advertencia yanked; OSV encontró GHSA-qwgh-2vcv-g2f7 por rango central desactualizado y falló como gate.
- El release debe apuntar a un SHA que ya contenga todas las correcciones aceptadas, changelog/manifest calculados desde ese estado y escaneo final limpio.

### T — Trazabilidad y pruebas

- Registrar alerta/advisory, manifiesto, rango afectado, versión corregida y evidencia de cierre.
- Validar el SDK: `npm ci`, `npm audit --audit-level=low`, `npm run build` y `npm test`.
- Validar Rust: `cargo audit`, `cargo deny check` (CI; cargo-deny no está instalado en este entorno), `cargo test --locked --features arca -- --test-threads=1`, `cargo check --locked --features arca` y `cargo fmt --check`.
- Validar el repositorio completo con OSV Scanner y los jobs de Linux, macOS, Windows, MSRV, seguridad, convenciones y workflows aplicables.
- Después de integrar, consultar de nuevo las alertas Dependabot y el release/tag de GitHub; un PR verde por sí solo no cierra el objetivo.

### F — Fallback y recuperación

- Si npm/Cargo cambia resolución fuera de lo esperado, restaurar únicamente el lockfile desde la rama de trabajo y rehacer la actualización de manera reproducible; no editar a mano hashes o integridades.
- Si una prueba falla por Arca inaccesible, conservar el error como bloqueo, corregir el acceso en la configuración de CI con el alcance mínimo o reejecutar en el contexto autorizado. No marcar la prueba como aprobada ni debilitar el control.
- Si aparecen nuevas advisories o incompatibilidades, detener el release, actualizar el inventario y escoger la versión mínima fijada compatible; no publicar un tag parcial.
- Si CI o el mantenedor rechaza la versión yanked `crypto-bigint 0.7.6`, detener el release y actualizar Arca/K-256 o su árbol criptográfico a una versión upstream aceptable; no ocultar el aviso en Cargo audit.
- Si el release-please #78 no contiene el SHA y las notas de seguridad, actualizar/regenerar el PR de release antes de publicarlo; conservar tags existentes y no reescribir historia.

## 4. Fases y gates

1. **Baseline:** confirmar repo, ramas, alerts, PRs, versiones y estado de CI; registrar SHAs y no tocar los checkouts con cambios preexistentes.
2. **Remediación:** incorporar el bump de Vite a `8.3.5`, la corrección Quinn de `main` y el escaneo OSV diario para `main`/`develop`; revisar que el lockfile no introduzca paquetes inesperados.
3. **Validación local e independiente:** ejecutar las validaciones de npm/Cargo indicadas, revisar el diff y solicitar Oura; confirmar cada salida de forma independiente. Cualquier advertencia yanked debe quedar explícita y ser aceptada por la revisión/CI antes de publicar.
4. **Integración:** publicar un PR de mantenimiento normal con el token privado disponible para el CI autorizado. Resolver o cerrar PRs duplicados solo después de comprobar que su cambio está incluido y sus alertas se resuelven.
5. **Rama de desarrollo:** revisar por separado el PR #82 a `develop`; incorporarlo solo con revisión de diff y CI válido, conservando la separación de ramas.
6. **Release:** actualizar el PR release-please #78 o el PR que lo sustituya para que el tag planificado contenga las correcciones. Ejecutar el gate final sobre el SHA exacto del release; publicar solo con todos los gates obligatorios verdes.

## 5. Resultados esperados

- Las seis alertas Dependabot se cierran automáticamente tras integrar el lockfile fijado a Vite `8.3.5`.
- Quinn/`quinn-proto` queda en versiones fijadas sin los advisories cubiertos; OSV vuelve a escanear diariamente y en PR/push/merge queue de `main` y `develop`.
- `npm audit` y `cargo audit` no reportan vulnerabilidades abiertas para los manifests/lockfiles del release; no se añaden ignores. El resultado local actual de Cargo es cero vulnerabilidades y una advertencia (`crypto-bigint 0.7.6` yanked); OSV completo aún falla hasta que la base central corrija el rango de GHSA-qwgh-2vcv-g2f7.
- Build, pruebas y checks requeridos pasan; el resultado de Windows se informa explícitamente, considerando que el job actual está configurado como `continue-on-error`.
- Las tres pruebas del SDK verifican la serialización del request MCP, el envío de bearer token y el manejo de errores JSON-RPC.
- El changelog, manifest, versión, tag y artefactos del release corresponden al SHA que contiene las correcciones. La versión exacta la determina release-please después de reconciliar el PR #78; no se fija manualmente en este plan.
- No hay cambios funcionales intencionales al API/runtime del SDK ni al comportamiento del servicio: la actualización Vite es de desarrollo y Quinn es una actualización de dependencias con compatibilidad comprobada por la suite.

## 6. Resultados que no se admiten

- Cerrar/silenciar alertas, añadir excepciones a Cargo audit/OSV o afirmar remediación basándose solo en un PR abierto.
- Publicar un tag/release cuyo SHA no incluya los locks corregidos y las notas pertinentes.
- Publicar mientras cargo-deny/CI no haya validado el lockfile, OSV siga fallando por el rango central desactualizado de GHSA-qwgh-2vcv-g2f7, o sin decisión documentada sobre `crypto-bigint 0.7.6` yanked.
- Interpretar los fallos del PR #83 por falta de secreto privado como pruebas aprobadas, o conceder secretos privados a un PR de Dependabot.
- Afirmar impacto en producción a partir de una dependencia marcada solo de desarrollo, o afirmar seguridad absoluta a partir de Oura/audit aislados.
- Perder, sobrescribir o reescribir trabajo local existente; forzar push, borrar tags, publicar Arca o modificar permisos/credenciales.
- Marcar como terminada la línea `develop` si #82 queda sin revisión o sin evidencia de integración.

## 7. Criterio de cierre

La tarea se cierra cuando el release publicado se identifica por versión, tag y SHA verificables; contiene las correcciones de Vite, Quinn y RustSec, los seis avisos Dependabot están cerrados, OSV/npm/Cargo no presentan vulnerabilidades abiertas relacionadas, cargo-deny y los gates obligatorios están verdes, se ha resuelto o aceptado formalmente la advertencia yanked de `crypto-bigint`, GHSA-qwgh-2vcv-g2f7 tiene su rango central corregido y el escaneo completo pasa sin excepciones, y la remediación de `develop` quedó integrada o registrada con evidencia y responsable como única excepción pendiente.

## 8. Estado de ejecución y evidencia local

- Rama `codex/synapsis-security-release-20261027`, basada en `origin/main` `25bab13`; tres commits cherry-picked de remediaciones previas (Quinn, Vite y OSV) y lockfile Cargo actualizado localmente.
- `packages/synapsis-client`: `npm ci`, `npm run build`, `npm test` (3 pruebas) y `npm audit --audit-level=low` pasaron; Vite resuelve a `8.3.5`, auditoría npm informa 0 vulnerabilidades.
- Rust: `cargo check --locked --features arca`, `cargo test --locked --features arca -- --test-threads=1` (suite completa; 1 ignorada), `cargo fmt --check` y `cargo audit` pasaron. Cargo audit informó 0 vulnerabilidades y una advertencia yanked para `crypto-bigint 0.7.6`.
- `cargo deny check` no se pudo ejecutar localmente: el subcomando `cargo-deny` no está instalado. En PR #84, el job remoto Cargo Deny pasó.
- Oura informó sin vulnerabilidades en el conjunto revisado y sin violaciones de código limpio; esto complementa, pero no reemplaza, Cargo audit/deny ni CI.
- CI de PR #84 confirmó el acceso a los repos privados en jobs de mantenedor; Cargo Deny, auditoría de seguridad, pruebas Linux/macOS/Windows, MSRV, formato, clippy, SBOM y Geiger pasaron. El escaneo OSV rápido pasa, pero el scan completo falla por el rango central desactualizado de `GHSA-qwgh-2vcv-g2f7` contra `block-buffer 0.10.4`. Oura no encontró vulnerabilidades al analizar el lockfile y la fuente 0.10.4; la revisión directa concuerda con el mantenedor upstream.
- El repositorio upstream RustCrypto confirma que 0.10.x no está afectado y su API ya muestra `>=0.11.0, <0.12.1`. El PR de corrección central #10698 sigue abierto. Se comentó allí la verificación y la diferencia entre `0.11.0-pre` propuesta y `0.11.0` publicado upstream. PR #84 sigue abierto y no hay release publicado. Pendiente: sincronización central, rerun OSV completo, revisión humana, merge y reconciliación/publicación release-please.
Loading
Loading