Informe de evidencia de cambios
Cambios fusionados
Northwind (datos de muestra) · 2 repositorios · rama predeterminada · 15 jul al 13 oct 2026
- Preparado para
- [Firma auditora]
- Repositorios
- northwind/payments-api · northwind/ledger-service
- Cambios en el alcance
- 146 pull requests fusionados en la rama predeterminada, cada uno con un registro de cambio sellado, y 2 pushes directos, capturados de GitHub en el momento en que ocurrieron.
- Registros
- 4.152 registros sellados: registros de cambio, eventos de cambio de control y comprobaciones de código. Firmas verificadas al generar el informe.
- Motor y conjuntos de reglas
- toevan-engine 0.9.4 · Clean Architecture 1.4.0 · Security Essentials 2.14.0
- Personas
- Mostradas como digests de sus cuentas de GitHub en los registros sellados. Las exenciones nombran a quien las solicita y a quien las aprueba.
- Generado
- 13 oct 2026, 11:42 UTC por [nombre]
- Hash del informe
- sha256:3f9a…c21e
Este informe es evidencia para que el auditor la evalúe. Toevan no emite ninguna opinión sobre si los controles están bien diseñados o funcionan con eficacia. Cada dato indica cómo se obtuvo. Los controles fuera del alcance de Toevan se enumeran en la sección de alcance y siguen siendo responsabilidad de la organización.
1Resumen
Evidencia de proceso · cómo entraron los cambios
Evidencia de código · qué hacen los cambios
Qué se capturó
Toevan capturó las fusiones en la rama predeterminada, los cambios en las reglas de revisión, los bypasses y los pushes directos de ambos repositorios tal como GitHub los informó, y selló cada uno en el momento en que ocurrió. En el periodo se fusionaron 146 pull requests y se hicieron 2 commits mediante push directo. Informado + sellado
Puntos de atención
- Dos pushes directos a payments-api/release/v1 el 19 sep, dentro de una ventana de 29 minutos en la que el requisito de revisión estaba desactivado.Proceso
- Tres pull requests fusionados sin la aprobación de alguien distinto del autor: dos en ledger-service antes de que existiera su regla de revisión, uno por bypass de administrador durante la ventana del 19 sep.Proceso
- La regla secret-detection-high falla en código de producción (1 hallazgo), amparada por una exención aprobada hasta el 20 dic.Código, Exenciones
2Alcance, procedencia y mapeo de controles
Cómo se obtuvo cada dato
- Recalculado
- Toevan lo calculó a partir del propio código o del historial de git.
- Repítalo con las mismas entradas y obtenga el mismo resultado.
- Informado + sellado
- GitHub lo informó; Toevan lo capturó en el evento y lo firmó.
- Fíese de ello tanto como se fía de GitHub. Cualquier cambio posterior es detectable.
- Declarado + sellado
- La organización lo declaró, como un cambio en lo que se comprueba; Toevan firmó la declaración y su historial.
- Vea quién declaró qué, cuándo, y cada cambio posterior.
- Registro de Toevan, sin sellar
- Guardado en la base de datos de Toevan pero no sellado en el libro, como una exención hoy. Ninguna firma lo protege.
- Trátelo como una declaración de Toevan y pida a la organización la aprobación que hay detrás.
- Consumido
- Tomado de los registros de despliegue y de release de GitHub y enlazado por commit o digest.
- Compruebe el registro original en GitHub.
- No capturado
- No había una fuente fiable. Toevan no lo infiere.
- Obténgalo de la organización por otros medios.
La evidencia y los controles con los que se relaciona
| Evidencia | Controles relevantes | Obtenido |
|---|---|---|
| Aprobación, revisión independiente, aprobación sobre el commit final | SOC 2 CC8.1 · ISO 27001 A.8.32 · DORA RTS 2024/1774 Art. 17 (planificado) | |
| Checks obligatorios al fusionar; reglas de revisión vigentes; cambios de reglas y bypasses | SOC 2 CC8.1 · ISO 27001 A.8.32 · DORA RTS 2024/1774 Art. 17 (planificado) | |
| Pushes directos a ramas protegidas | SOC 2 CC8.1 · ISO 27001 A.8.4, A.8.32 | |
| Reglas de código: límites de arquitectura, codificación segura, dependencias | ISO 27001 A.8.25 · SOC 2 CC8.1 | |
| Población de cambios y exhaustividad | SOC 2 CC8.1 · ISO 27001 A.8.32 | |
| Despliegue de un commit en producción | SOC 2 CC8.1 · ISO 27001 A.8.32 | |
| Exenciones y cambios de alcance | Excepciones a las reglas anteriores |
No incluido en este informe
- Revisiones de acceso, procesos de altas y bajasOrganizativo
- Monitorización en ejecución, respuesta a incidentesOrganizativo
- Riesgo de terceros de TIC, seguridad físicaOrganizativo
- Despliegues y artefactos fuera de GitHub, y si un artefacto desplegado sigue en ejecuciónOrganizativo
- Fusiones en ramas distintas de la rama predeterminadaNo en esta versión
- Cambios hechos fuera de GitHub, como cambios directos en la base de datos o en la consolaOrganizativo
3Evidencia de proceso
Cómo se revisaron y fusionaron los 146 pull requests fusionados en el periodo, capturado de GitHub en el momento de cada fusión.
| Comprobación | Resultado | Obtenido |
|---|---|---|
| Aprobado por alguien distinto del autor | 143 / 146 · 3 desviaciones | |
| Aprobación dada sobre el commit final | 137 / 143 aprobados · 6 aprobaron un commit anterior | |
| Checks obligatorios superados al fusionar | 146 / 146 | |
| Firmas de commits verificadas por GitHub | 144 / 146 | |
| Reglas de revisión vigentes registradas al fusionar | 146 / 146 |
Desviaciones: fusionados sin aprobación independiente
| PR | Fusionado | Autor | Regla vigente al fusionar | Registro |
|---|---|---|---|---|
| ledger-service #388 | 24 jul | 4be1…09c2 | Ninguna (regla añadida el 02 ago) | rec_51b9e20 |
| ledger-service #391 | 29 jul | c58f…71d0 | Ninguna (regla añadida el 02 ago) | rec_6e07a3d |
| payments-api #1903 | 19 sep 14:12 | 2a6e…f915 | Desactivada de 14:02 a 14:31 (admin) | rec_0c88f14 |
Cambios en los propios controles
| Cuándo (UTC) | Cambio | Por | Registro |
|---|---|---|---|
| 02 ago 09:14 | Regla de revisión aplicada a ledger-service: 2 aprobaciones, checks obligatorios | 9d07…e3a4 | rec_8a2f61c |
| 19 sep 14:02 | Requisito de revisión desactivado en payments-api/release/* | 2a6e…f915 | rec_3f10b9a |
| 19 sep 14:31 | Requisito de revisión reactivado | 2a6e…f915 | rec_3f10c02 |
Pushes directos sin pull request
| Cuándo (UTC) | Rama | Commit | Por | Registro |
|---|---|---|---|---|
| 19 sep 14:09 | payments-api/release/v1 | 7c1e0a2 | 2a6e…f915 | rec_7c1e0a2 |
| 19 sep 14:22 | payments-api/release/v1 | 91d4b3f | 2a6e…f915 | rec_91d4b3f |
Los cambios de control y los pushes directos se capturan como eventos cuando ocurren, así que un hueco entre instantáneas no pasa inadvertido. Las personas se muestran como digests de sus cuentas de GitHub; la independencia se calcula a partir de los ids de cuenta. Informado + sellado
Población de cambios
Cada commit que llegó a la rama predeterminada en el periodo, listado desde el historial de git y asignado a un registro.
Despliegues enlazados por commit
Qué commit llegó a producción y cuándo. Toevan lo lee de GitHub; no lo produce. Donde GitHub no tiene registro de despliegue, el enlace se informa como no capturado y nunca se deduce de la cronología.
4Evidencia de código
Lo que hace el código, comprobado leyendo el propio código en la versión exacta fusionada. Las reglas marcadas como con hallazgos se aplican al código de producción; la documentación y los fixtures de prueba quedan fuera del alcance (véase Exenciones).
Clean Architecture 1.4.0 · reglas de diseño
| Regla | Qué comprueba | Última release | Hallazgos |
|---|---|---|---|
| layer-dependency-handlers-to-db | Los controladores de peticiones nunca llaman directamente a la base de datos | Sin hallazgos | 0 |
| service-boundaries | Los servicios se comunican entre sí solo a través de sus interfaces públicas | Sin hallazgos | 0 |
| role-placement-policy | Las abstracciones y sus implementaciones están en las capas que asigna la arquitectura | Sin hallazgos | 0 |
| layer-dependency-policy | Una dependencia entre capas solo se permite donde la política la enumera | Sin hallazgos | 0 |
Security Essentials 2.14.0 · codificación segura
| Regla | Qué comprueba | Última release | Hallazgos |
|---|---|---|---|
| secret-detection-high | Sin credenciales de alta confianza escritas en el código fuente ni en la configuración | Con hallazgos | 1 · exención |
| no-committed-secret-files | Sin .env, claves privadas ni keystores confirmados | Sin hallazgos | 0 |
| vulnerable-dependency | Ninguna dependencia con una vulnerabilidad alta o crítica conocida (OSV.dev) | Sin hallazgos | 0 |
| encryption-at-rest | Almacenamiento y conexiones a bases de datos cifrados | Sin hallazgos | 0 |
| iac-network-segmentation | Ninguna exposición pública de servicios internos | Sin hallazgos | 0 |
| iac-encryption-policy | Opciones de cifrado de almacenamiento activadas en el código de infraestructura | Sin hallazgos | 0 |
| iac-access-control | Sin políticas de acceso con comodines | Sin hallazgos | 0 |
| sensitive-unsafe-log-flow | Los datos sensibles no llegan a los destinos de logging | Sin hallazgos | 0 |
Hasta dónde llegó el análisis
| Repositorio | Cobertura en la última release | Gate | Ejecuciones por debajo del gate en el periodo |
|---|---|---|---|
| payments-api | 97,9 % | 95 % | 0 |
| ledger-service | 96,6 % | 95 % | 0 |
La cobertura es la proporción de los archivos fuente de producción del repositorio que el índice de código analizó en el commit indexado. Por debajo del gate, una ejecución se señala en lugar de registrarse como sin hallazgos. Las versiones del motor y del conjunto de reglas quedan en cada registro, así que cualquier resultado se puede repetir. Recalculado
5Exenciones y cambios de alcance
Cada decisión que cambió lo que se comprobaba o aceptó una desviación conocida.
| Fecha | Cambio | Solicitada · aprobada | Motivo | Registro |
|---|---|---|---|---|
| 20 sep | Exención: secret-detection-high, payments-api/config/sandbox.yaml (archivo exacto), caduca el 20 dic | c58f…71d0 · 4be1…09c2 | Clave de sandbox sin acceso a producción; rotación programada | rec_b30e7c5 |
Ninguna exención caducó ni se revocó en el periodo. Quien solicita y quien aprueba son cuentas distintas en cada entrada. Las exenciones son registros de Toevan que no se sellan en el libro. Registro de Toevan, sin sellar
Versiones de conjuntos de reglas usadas en el periodo
| Conjunto de reglas | Versión | Desde | Cambio |
|---|---|---|---|
| Clean Architecture | 1.4.0 | 15 jul (todo el periodo) | Sin cambios |
| Security Essentials | 2.13.0 | 15 jul | Sin cambios |
| Security Essentials | 2.14.0 | 12 ago | Reglas actualizadas por Toevan |
6Registros de cambio
Un cambio completo, tal como lo ve el auditor al muestrear. Todos los registros están en la exportación CSV, y cada sobre firmado está en la rama de evidencia del repositorio de la organización.
rec_5b81d4eEl cambio
- Pull request
- payments-api #1921 · Add tenant check to refund handler
- Informado + sellado
- Autor · fusionado por
- 4be1…09c2 · 9d07…e3a4 · 13 oct 2026, 10:41 UTC en main
- Informado + sellado
- Commit de fusión
- 5b81d4e
- Informado + sellado
Evidencia de proceso
- Aprobaciones
- 9d07…e3a4, c58f…71d0 · ambas sobre el commit final e81b2d0
- Informado + sellado
- Independiente del autor
- Sí, por id de cuenta de GitHub
- Recalculado
- Checks obligatorios
- ci/test ✓ · ci/lint ✓ · toevan/gate ✓
- Informado + sellado
- Reglas vigentes
- main-protection: 2 aprobaciones, checks obligatorios, commits firmados
- Informado + sellado
- Firma del commit
- Verificada por GitHub
- Informado + sellado
Evidencia de código
- Reglas de diseño
- 4 / 4 sin hallazgos
- Recalculado
- Codificación segura
- 7 / 8 sin hallazgos · secret-detection-high bajo la exención rec_b30e7c5
- Recalculado
- Cobertura · motor
- 98,1 % (gate 95 %) · toevan-engine 0.9.4
- Recalculado
Camino a producción
- Publicado
- Release v2.31.0 · 13 oct 2026, 11:05 UTC
- Informado + sellado
- Desplegado
- producción · 13 oct 2026, 11:20 UTC · digest de compilación sha256:7d3e…a1c4 · rec_9e41b07
- Consumido
- Copiado a la release
- No capturado: el enlace de backport (L5) no está integrado en esta versión
- No capturado
Sello
- Firma
- ECDSA P-256 · sobre DSSE · keyid 8c1f…e0a2
- Registro anterior
- rec_b7e21f0
- Anclaje público
- Anclaje opcional en Rekor · desactivado para esta organización
Más registros (muestra)
| Registro | Cambio | Aprobación independiente | Reglas de código | Sellado (UTC) |
|---|---|---|---|---|
| rec_b7e21f0 | payments-api #1918 | Sí | 11 / 12 · exención | 13 oct 09:58 |
| rec_9d41e02 | ledger-service #412 | Sí | 12 / 12 | 09 oct 16:21 |
| rec_0c88f14 | payments-api #1903 | No · bypass de admin | 12 / 12 | 19 sep 14:12 |
| rec_7c1e0a2 | push directo 7c1e0a2 | No · sin PR | 12 / 12 | 19 sep 14:09 |
7Cómo comprobar este informe
Cada ruta le permite comprobar la evidencia por su cuenta. Elija la ruta que se ajuste a su función. Solo la tercera necesita herramientas.
| Comprobación | Qué demuestra | Qué no demuestra |
|---|---|---|
| El registro es genuino y no ha cambiado | El registro se firmó con la clave publicada de Toevan y no se ha alterado desde entonces. La cadena de hashes muestra que no se eliminó ninguno. | Que los datos que contiene sean correctos: las dos comprobaciones siguientes lo cubren. |
| La aprobación fue independiente | Quien aprueba y el autor son cuentas de GitHub distintas, recalculado a partir de los ids de cuenta del registro. | Que la revisión en sí fuera adecuada. |
| El resultado de código es reproducible | El mismo commit, la misma versión del motor y la misma versión del conjunto de reglas dan el mismo resultado. | Que las reglas abarquen todos los riesgos del código. |
En la app de la organización
Acceso de auditor de solo lectura, sin acceso al repositorio
- La organización le invita con el rol de auditor: acceso de solo lectura a la lista de evidencias, las exportaciones y los informes.
- Verificar ahora vuelve a comprobar en la app todo el libro, las firmas y las pruebas de cualquier log de transparencia.
- No abre nada más: los repositorios, el código y los hallazgos se rechazan.
Vea cómo lo ejecuta la organización
Pantalla compartida o in situ
- Usted elige las muestras durante la sesión; un ingeniero ejecuta las comprobaciones mientras usted observa.
- Verificación de cada registro muestreado: cadena, firma, sin cambios.
- Cuentas de autor y de aprobador de cada muestra, comparadas en pantalla.
Ejecútelo usted mismo
Especialistas en auditoría de TI con acceso de lectura temporal
- Use git y openssl. Para toda la cadena, use el comando toevan, que Toevan facilita a petición y aún no es público. No hace falta una cuenta de Toevan.
- Compruebe que las puntas de rama de una copia coinciden con las puntas registradas en el informe.
- Ejecute los comandos del apéndice y compare con el informe.
8Ampliaciones planificadasPlanificado
Capas posteriores de la cadena de evidencia. Están planificadas y nada de este informe depende de ellas. Cada una indica cómo se obtendrán sus datos.
Ramas de producción designadas
Ramas que la organización designa como producción, como una rama de release, cada designación declarada y sellada con cada cambio posterior. Cada una recibe la misma población que la rama por defecto: cada commit enumerado directamente desde git y asignado a un registro o señalado.
Correcciones copiadas asignadas por contenido
Una corrección revisada en main y copiada a una rama de release recibe un nuevo ID de commit. Toevan la asignará al original revisado por contenido (git patch-id) y señalará las copias cuyo contenido cambió.
Apéndice · Comandos para revisores técnicos
Los comandos que un ingeniero ejecuta por usted, o que usted ejecuta por su cuenta.
Compruebe un registro con openssl y el shell, sin software de Toevan
ENV=attestations/<head_sha>/<record_id>.dsse.json
REC=records/<head_sha>/<record_id>.json
PUB=toevan.pub
openssl pkey -pubin -in "$PUB" -outform DER | openssl dgst -sha256
T=$(sed -E 's/.*"payloadType":"([^"]*)".*/\1/' "$ENV")
sed -E 's/.*"payload":"([^"]*)".*/\1/' "$ENV" | openssl base64 -d -A > statement.json
sed -E 's/.*"sig":"([^"]*)".*/\1/' "$ENV" | openssl base64 -d -A > sig.der
{ printf 'DSSEv1 %s %s %s ' "${#T}" "$T" "$(wc -c < statement.json | tr -d ' ')"; cat statement.json; } > pae.bin
openssl dgst -sha256 -verify "$PUB" -signature sig.der pae.bin
H=$(sed -E 's/.*"record_hash":"sha256:([0-9a-f]{64})".*/\1/' statement.json)
if [ "$(openssl dgst -sha256 -r "$REC" | cut -d' ' -f1)" = "$H" ]; then echo "record matches the statement"; else echo "RECORD DOES NOT MATCH THE STATEMENT"; fi
printf 'record %s\n' "$(sed -nE 's/.*"record_id":"([^"]*)".*/\1/p' statement.json)"
printf 'subject %s\n' "$(sed -nE 's/.*"subject":\[\{"digest":\{"([^"]*)":"([^"]*)"\},"name":"([^"]*)"\}\].*/\3 \1:\2/p' statement.json)"
SHA2-256(stdin)= <key id>
Verified OK
record matches the statement
record <the record id you picked>
subject git+https://github.com/<owner>/<repository> gitCommit:<the commit you picked>El sobre es una línea de JSON, como la escribe Toevan; las tres rutas son las de la rama de evidencias. La primera línea tras las rutas imprime el id de la clave, que se compara con la lista publicada. Espere “Verified OK” y “record matches the statement” en cada registro que compruebe. Las dos últimas líneas deben nombrar el registro y el commit que eligió. Cualquier fallo significa que el registro se alteró o no se firmó con la clave publicada.
Reproduzca toda la cadena con el verificador de Toevan (a petición, aún no público)
$ toevan audit verify --path evidence-clone --pub-key toevan.pub
✓ chain intact · 4,152 records
✓ signatures verify under the published keyEste comando requiere el verificador de Toevan, que Toevan facilita a petición. No forma parte de la ruta de openssl de arriba.