
Laboratorio de detección de persistencia de revocación: cuando el restablecimiento de contraseña tiene éxito pero el atacante nunca se va. Reproduce el fallo de revocación condicional de Strapi CVE-2026-22706, su corrección, un paquete de detección de tres reglas y la regla ingenua que no lo detecta.
Cuando el restablecimiento de contraseña tiene éxito pero el atacante nunca se va.
Un laboratorio local red/blue para una clase de vulnerabilidad: la credencial que sobrevive al evento que se suponía debía eliminarla. Incluye el exploit, la causa raíz, la solución, un paquete de detección de tres reglas, una auditoría de estado para lo que las reglas estructuralmente no pueden ver, una consola forense — y la regla de detección que no funciona, conservada en el repositorio para ser demostrada fallando.
Inicio rápido · El hallazgo · Por qué la detección ingenua falla · El paquete de reglas · Consola · La solución · Matriz · Pruebas · Documentación
El mismo ataque. Las mismas peticiones. Una diferencia.
Generado por scripts/figures.py a partir del mismo payload que
dibuja la consola — regenerado y comparado en CI, para que una figura no pueda desviarse del código.
09:00 alice logs in ┐ refresh credential rt-001 │ the attacker steals rt-001 ┘
10:00 alice changes her password ← the one thing a victim can do alone HTTP 200 · password changed · fresh session issued
10:00:03 attacker: POST /refresh rt-002 → HTTP 200 new access credential at-004, issued 10:00:03
10:01:00 attacker: GET /me at-004 → HTTP 200 {"username": "alice", "authenticated": true}
Sin error. Sin anomalía. Sin autenticación fallida que contar. La credencial de acceso del atacante tiene *tres segundos de antigüedad* y fue emitida por el servidor, a petición, después del restablecimiento.
Aquí está la vulnerabilidad completa:```python
def _revoke_for_security_change(self, user, kind, device_id):
if device_id:
revoke_credentials(user, device_id=device_id) # ← the finding
Léelo como lo haría un revisor. La lógica de revocación está justo ahí. Llama
a la función correcta con el alcance correcto. El endpoint a su alrededor actualiza
el hash de la contraseña, devuelve 200 y emite una sesión nueva — cada comportamiento observable
de un cambio de contraseña correcto está presente.
Y si quien llama omite device_id, no se revoca nada, y el endpoint igualmente
informa éxito.
Esto no es hipotético. Es
CVE-2026-22706
en Strapi ≤ 5.33.2, donde el paso de invalidación del refresh-token era condicional
a un deviceId proporcionado por quien llama. Puntuado 2.1, Low. Se discute
abajo.
La puntuación es baja porque el atacante ya tenía acceso — esa es la condición de entrada, y este bug no concede nada nuevo. Lo que concede es duración, y lo hace rompiendo el único control que la víctima puede operar por sí misma.
test_persistence_lasts_as_long_as_the_refresh_credential recorre siete días de
tiempo simulado para demostrarlo.Un bug con puntuación Low en una ruta de contención cuesta más que un bug con puntuación Low en una ruta de funcionalidad, porque el coste se paga durante un incidente, cuando nadie está leyendo avisos.
La regla que escribes primero:```text IF credential.issued_at < credential_change.timestamp: ALERT
No es una regla estúpida. Es barata, necesita un solo campo, se lee como la definición
del problema, y es **correcta para el caso simple** — un atacante que usa un
token de *acceso* robado después del restablecimiento queda atrapado.
`test_the_naive_rule_catches_the_simple_case` afirma que funciona.
Ambas reglas hacen la misma pregunta sobre la misma credencial. Leen campos
distintos para responderla, y los dos campos no coinciden:

**Tres segundos después, o una hora antes — la misma credencial, en el mismo
instante.** La regla ingenua pregunta por un campo que el atacante controla, y un
`POST /refresh` lo restablece.
Ejecútala sobre el registro de solicitudes, que es donde realmente se escribe esta consulta,
porque los registros de solicitudes son lo que tienes:```text
NAIVE DETECTOR (NAIVE-001), over the request log
Result: NO ALERT
Six requests were served to the attacker after the reset. Every one of them
carried at-004, minted at 10:00:03 -- three seconds *after* the password
change. By its own timestamp it is the newest credential on the account.
Sería fácil detenerse ahí, y deshonesto, así que el laboratorio también ejecuta la versión más justa de la regla ingenua — ampliada para vigilar también el endpoint de refresh:```text NAIVE DETECTOR, widened to include POST /refresh
1 alert at 2026-09-11T10:00:03.000Z: the credential presented to /refresh was rt-002, issued 2026-09-11T09:30:00.000Z. Then it goes blind. 6 events follow that hop and it flags none of them, because every credential from there on carries a post-reset timestamp. Its incident covers 1 accepted request; the lineage rule's covers all of them.
And look at what the alert names: NAIVE-001 revoke rt-002 -- rotated away and already dead at 10:00:03 AFTERLIFE-001 revoke lin-001 -- the live thing every future credential descends from
Esa es la diferencia que importa a las 3 de la mañana. La regla ingenua captura el único instante en que la cadena cruza el límite, y luego pierde el rastro durante los 29 días restantes — y la credencial que nombra *ya ha sido rotada y revocada por el servidor*. Revocarla no logra nada. `lin-001` es el objeto que hay que eliminar.
**Y la regla ingenua no carecía de telemetría.** Utiliza el mismo flujo de eventos, el mismo índice de linaje, la misma tolerancia, la misma deduplicación y el mismo estado acotado. Sobrescribe un método:```python
class Correlator: # AFTERLIFE-001
def _age_reference(self, facts):
return facts.root_issued_at
class NaiveCorrelator(Correlator): # NAIVE-001
def _age_reference(self, facts):
return facts.issued_at
root_issued_at está en el índice que ya está consultando.
test_the_naive_rule_had_the_data_it_needed lo demuestra. El fallo es la
comparación, no el registro.
Tres reglas sobre un registro. Responden a preguntas diferentes y se activan en el orden en que realmente se desarrolla un incidente.
| regla | severidad | responde | se activa | |
|---|---|---|---|---|
| AFTERLIFE-002 | Reutilización de credenciales tras refresco | CRITICAL / MEDIUM | ¿fue robada? | en la reutilización |
| AFTERLIFE-003 | Revocación incompleta en un cambio de seguridad | HIGH / LOW | ¿se ejecutó la contención? | en el cambio — no se necesita atacante |
| AFTERLIFE-001 | Uso del linaje de credenciales tras la revocación | HIGH | ¿se usó el linaje obsoleto? | en la primera aceptación |
| RULE PACK |
10:00:00 HIGH AFTERLIFE-003 Incomplete revocation at a security change 10:00:03 HIGH AFTERLIFE-001 Post-revocation credential lineage use
**Ese ordenamiento es lo más útil de este repositorio.** AFTERLIFE-003
se dispara en el instante en que el cambio se aplica, tres segundos antes de que el atacante toque
nada, porque la evidencia que necesita ya está completa: el log dice qué
linajes estaban activos al entrar, y no dice que fueron revocados.
No necesita víctima ni explotación. Reportará el defecto en el primer
restablecimiento de contraseña que realice cualquier usuario — lo que lo convierte en el que ejecutas en staging,
donde no hay atacante al que esperar. AFTERLIFE-001 te dice que una brecha está
en curso; AFTERLIFE-003 te dice que tu control de contención está roto.

`application recorded watermark: no` es el campo que apunta a un respondedor de incidentes
al *defecto* en lugar de al síntoma.
### El watermark que usan las reglas no es el que reporta la aplicación
El evento de cambio de credencial lleva un campo `revocation_watermark` — el
valor `credentials_valid_after` que escribió la aplicación. **En la implementación
vulnerable es `null`, porque la aplicación nunca escribió uno.** Ese es
el bug.
Así que una regla basada en ese campo sería ciega precisamente al caso que existe para
detectar. Las reglas se anclan en el propio `timestamp` del evento, que es verdadero tanto si la
aplicación hizo su trabajo como si no, y reportan el campo faltante como evidencia.
### Propiedades```text
deduplication 6 accepted requests on the stale lineage -> 1 alert
event order shuffled stream -> same alert (1 alert)
duplicate telemetry log replayed twice -> 1 alert (24 duplicate events discarded)
false positives the fixed implementation's log -> 0 alerts
bounded state caps at 256 activity/user, 2000 users, 20000 credentials
La independencia del orden no es "funciona en su mayoría":
test_6b_every_permutation_of_the_critical_events_detects ejecuta los 24 órdenes
de los cuatro eventos que importan y requiere exactamente una alerta de cada uno.
La deduplicación está basada en (user_id, credential_change_event_id, lineage_id),
con supresión de event_id delante para que un archivo reproducido no pueda inflar el
recuento.
Tarjetas de reglas completas, telemetría requerida y runbooks de respuesta: docs/detection.md.
Una superficie de lectura para la única pregunta de la que trata el laboratorio. No un panel de recuentos de alertas — un registro de mortalidad. Una barra por credencial, desde su emisión hasta su muerte, agrupadas en el linaje del que descienden, con el cambio de contraseña dibujado como una línea en la que todo lo anterior se suponía que debía terminar.
Una inversión deliberada: cálido significa vivo, y después de la línea lo cálido está
mal. En la mayoría de las interfaces de seguridad el rojo significa que ocurrió un error. Aquí nada falla —
cada solicitud en la ejecución vulnerable devuelve 200. Así que el color sigue la mortalidad
en su lugar: frío es una credencial que murió cuando se le dijo que lo hiciera, cálido es una que sigue
respirando, y más allá de la guillotina, seguir estando cálido es todo el hallazgo.
(BLACKOUT estableció la misma convención, donde 200 era el rojo.)
Las finas caídas verticales son genealogía: una credencial hija acuñada a partir de su
padre en ese instante. rt-001 → rt-002 → rt-004 desciende y hacia la derecha
a lo largo de toda la ventana, y en modo vulnerable sigue avanzando después del
corte — que es la imagen de un linaje acuñando nuevas credenciales al otro lado
de su propio evento de extinción.```bash
python scripts/lab.py console
escribe **[`docs/console-preview.html`](https://github.com/het-p301204/afterlife/blob/main/docs/console-preview.html)** — un
archivo autocontenido de 74 KiB con ambas ejecuciones integradas. Sin servidor, sin red, sin
fuentes que descargar; ábrelo desde el sistema de archivos. O ejecuta la versión en vivo:```bash
python -m console
Arrastra el control deslizante hacia atrás más allá de 10:00:00 y hacia adelante a través de él: los hallazgos aparecen
cuando el registro se los gana, AFTERLIFE-003 en el cambio y AFTERLIFE-001 tres
segundos después. El razonamiento de diseño, incluido lo que se descartó, está en
docs/console-design.md.
La consola es de solo lectura por construcción. Vuelve a ejecutar escenarios terminados y los dibuja; no puede cambiar la implementación, mover el reloj ni revocar nada.
test_the_console_has_no_control_surfaceafirma que la única ruta que no es GET es/api/rebuild. Una superficie de lectura que puede cambiar lo que está leyendo es una en la que no puedes confiar.
Seis paquetes, una clase de seguridad, sin infraestructura.```text
app/ the lab application
config.py mode selection; defaults to fixed, deliberately
store.py SQLite credential state + the security-change audit trail
tokens.py minting and decoding; a JWT is a signed pointer to a row
auth.py login / refresh / change-password + THE BUG + the audit
main.py six endpoints
common/ clock.py a rewindable UTC clock, so an hour of history costs nothing events.py the event vocabulary, shared by app and detector telemetry.py JSONL emission with credential-name redaction
detector/ strictly downstream: reads a log file, decides nothing base.py the alert shape, replay suppression, bounded state lineage.py rebuilds a credential's ancestry from issuance events ledger.py which lineages are alive, per user rules.py AFTERLIFE-001 persistence reuse.py AFTERLIFE-002 theft containment.py AFTERLIFE-003 the defect itself naive.py NAIVE-001, kept in order to be demonstrated failing audit.py the state scan the rules structurally cannot do engine.py the pack: one shared index, one stream, ranked alerts tail.py byte-offset JSONL tailer
console/ the mortality register payload.py one run, shaped for drawing static/ ~1400 lines of vanilla HTML/CSS/JS, no build step
scripts/ lab.py the demonstration scenarios.py nine scenarios x both implementations report.py the incident report preview.py bake the offline console figures.py render the console to SVG for this README
tests/ 290 tests
La aplicación se ejecuta **en proceso** bajo la demo, la consola y las pruebas. Sin
puertos, sin servidor de desarrollo, sin Docker. El reloj está fijado, por lo que cada ejecución es
determinista y la telemetría, la consola, las figuras y los informes confirmados son todos
idénticos byte a byte entre ejecuciones — lo cual CI verifica con `git diff --exit-code`.
### Aplicación del lado del servidor
Una credencial es una **fila**, no una cadena. El JWT que posee el cliente lleva `cid` —
una clave de búsqueda — y la fila decide si la credencial está viva.
La expiración se verifica contra el `expires_at` de la fila, no contra la reclamación `exp` que
el portador presentó. Ambas reclamaciones temporales se entregan a PyJWT con `verify=False`,
lo que aquí significa *"el servidor verifica esto por sí mismo"*, y [`app/auth.py`](https://github.com/het-p301204/afterlife/blob/main/app/auth.py)
lo hace, en cada solicitud. El cliente nunca tiene voto sobre si su propia
credencial sigue siendo válida.
---
## Cronología del ataque```mermaid
flowchart TD
A["Account compromised<br/><i>phishing · XSS · stolen backup</i>"] --> B["Attacker holds refresh credential rt-001<br/>lineage lin-001, root sess-001 @ 09:00"]
B --> C["Legitimate password change @ 10:00<br/>HTTP 200 · password hash updated"]
C --> D{"device_id supplied?"}
D -->|"yes"| E["revoke_credentials(user, device_id)<br/>rt-001 revoked"]
D -->|"no — the exploit"| F["nothing revoked<br/>no watermark written"]
E --> G["Attacker refresh → 401<br/><b>contained</b>"]
F --> AF3["<b>AFTERLIFE-003 · HIGH</b> @ 10:00:00<br/>containment did not run<br/><i>no attacker action required</i>"]
F --> H["POST /refresh rt-002 → 200<br/>mints at-004 @ 10:00:03"]
H --> I["GET /me at-004 → 200<br/>well-formed · correctly signed · <b>no anomaly</b>"]
I --> J["at-004.issued_at > watermark<br/>NAIVE-001: no alert"]
I --> K["lineage lin-001 root @ 09:00 < watermark<br/><b>AFTERLIFE-001 · HIGH</b>"]
F --> L["attacker holds and never spends<br/>AFTERLIFE-001 silent — correctly<br/><b>state audit: dormant survivor</b>"]
style F fill:#7f1d1d,color:#fff
style H fill:#7f1d1d,color:#fff
style I fill:#7f1d1d,color:#fff
style J fill:#78350f,color:#fff
style K fill:#14532d,color:#fff
style AF3 fill:#14532d,color:#fff
style L fill:#1e3a5f,color:#fff
style E fill:#14532d,color:#fff
style G fill:#14532d,color:#fff
La rama de la cadena de refresco en el medio es el punto clave. El atacante no utiliza una credencial antigua. Utiliza un linaje antiguo, y el linaje acuña algo nuevo bajo demanda.
Una sesión es la raíz de un linaje. Todo lo que se acuña bajo ella hereda esa raíz, para siempre.```text sess-001 session lineage lin-001 root sess-001 issued 09:00:00 │ ├── rt-001 refresh parent sess-001 root_issued_at 09:00:00 │ └── at-001 access parent rt-001 root_issued_at 09:00:00 │ ├── rt-002 refresh parent rt-001 root_issued_at 09:00:00 ← 09:30 rotation │ └── at-002 access parent rt-002 root_issued_at 09:00:00 │ └── rt-004 refresh parent rt-002 root_issued_at 09:00:00 ← 10:00:03 rotation └── at-004 access parent rt-004 root_issued_at 09:00:00 issued_at 10:00:03
`at-004` tiene tres segundos de antigüedad. Su ascendencia tiene una hora. Ambos hechos son ciertos,
y solo uno de ellos es visible en un registro de solicitudes.
Dos invariantes sostienen esto, y ambas están probadas:
1. **Solo la autenticación crea un linaje.** `Store.open_session` es el único
lugar donde se genera un `lineage_id`, y convierte la sesión en su propio
`root_credential_id`.
2. **La acuñación copia la raíz hacia abajo.** `TokenService.mint` lee los campos del linaje
del padre en lugar de recalcularlos, por lo que una credencial no puede adquirir una
ascendencia más reciente que el inicio de sesión del que desciende.
Un token presentado por el portador deliberadamente **no** lleva su raíz de linaje. Si lo
hiciera, el portador podría mentir al respecto.
---
## La auditoría de estado
AFTERLIFE-001 se dispara cuando un linaje obsoleto es *utilizado*. Ese es el desencadenante correcto para
una regla de detección, y deja un hueco: **un linaje obsoleto que nadie ha tocado es
invisible para ella.** Un atacante que roba una credencial, observa que el restablecimiento falla,
y luego espera, no produce actividad que correlacionar.
Por eso el laboratorio también plantea la pregunta que una regla no puede: no *qué ocurrió*, sino *qué
sigue vivo*.```text
scenario: dormant-survivor (the attacker holds the credential and never spends it)
AFTERLIFE-001 silent — correct; nothing was accepted
AFTERLIFE-003 HIGH — the change revoked nothing
state audit 1 stale lineage, 1 dormant
-h, --help | Muestra el mensaje de ayuda y sale |
-v, --version | Muestra la versión del programa y sale |
-d, --debug | Habilita el registro de depuración |
-c, --config | Ruta al archivo de configuración |
-o, --output | Ruta del archivo de salida |
-f, --format | Formato de salida (json, yaml, xml) |
-q, --quiet | Modo silencioso, suprime la salida |
-V, --verbose | Modo detallado, aumenta la salida |
| python scripts/lab.py audit |
## 🧩 Características
- **Análisis de código estático** para detectar patrones de vulnerabilidad comunes
- **Escaneo de dependencias** para identificar bibliotecas desactualizadas o vulnerables
- **Detección de secretos** para encontrar claves API y credenciales codificadas
- **Generación de informes** en múltiples formatos (JSON, SARIF, HTML)
- **Integración CI/CD** con GitHub Actions y GitLab CI
- **Reglas personalizables** mediante archivos de configuración YAML
## 📦 Instalación
```bash
pip install security-scanner
O instalar desde el código fuente:
git clone https://github.com/example/security-scanner.git
cd security-scanner
pip install -e .
Ejecutar un escaneo básico en el directorio actual:
security-scanner scan .
Especificar un archivo de configuración personalizado:
security-scanner scan --config custom-rules.yaml /path/to/project
Generar un informe en formato SARIF:
security-scanner scan --format sarif --output results.sarif .
| Opción | Descripción | Predeterminado |
|---|---|---|
--config | Ruta al archivo de configuración | .scanner.yaml |
--format | Formato de salida (json, sarif, html) | json |
--output | Archivo de salida para los resultados | stdout |
--severity | Nivel de severidad mínimo | low |
--exclude | Patrones a excluir | node_modules |
Crear un archivo .scanner.yaml en la raíz de tu proyecto:
rules:
- id: SEC001
name: Hardcoded API Key
severity: high
pattern: "api[_-]?key\\s*=\\s*['\"][a-zA-Z0-9]{16,}['\"]"
- id: SEC002
name: SQL Injection Risk
severity: critical
pattern: "execute\\(.*\\+.*\\)"
exclude:
- "**/test/**"
- "**/vendor/**"
severity_threshold: medium
name: Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Security Scanner
run: |
pip install security-scanner
security-scanner scan --format sarif --output results.sarif .
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
security-scan:
stage: test
script:
- pip install security-scanner
- security-scanner scan --format json --output report.json .
artifacts:
reports:
sast: report.json
{
"findings": [
{
"rule_id": "SEC001",
"severity": "high",
"file": "src/config.py",
"line": 42,
"message": "Hardcoded API key detected"
}
],
"summary": {
"total": 1,
"critical": 0,
"high": 1,
"medium": 0,
"low": 0
}
}
El formato SARIF es compatible con GitHub Code Scanning y otras herramientas de análisis estático. Consulta la documentación de SARIF para más detalles.
¡Las contribuciones son bienvenidas! Por favor, lee nuestras pautas de contribución antes de enviar un pull request.
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo LICENSE para más detalles.
FIXED server state clean telemetry clean
Dos fuentes, deliberadamente: la auditoría de **telemetría** ve lo que el log puede probar,
la auditoría de **estado del servidor** ve lo que la base de datos cree. *Cuando discrepan,
el log no es un registro fiel del estado de las credenciales, y toda detección construida
sobre él es más débil de lo que parece* — por eso el comando imprime ambos y lo indica si
difieren.
La auditoría de estado del servidor necesita la tabla `security_changes`, que **ambos modos
escriben**, porque registrar que ocurrió un cambio es una obligación separada de
actuar sobre él — y la implementación vulnerable cumple exactamente una de las dos.
---
## Matriz de escenarios
Nueve escenarios contra ambas implementaciones. `python scripts/scenarios.py` verifica
sus dos invariantes y sale con código distinto de cero si alguna falla.
| escenario | modo | eventos | peor | reglas disparadas | stale | dormant |
|---|---|---:|---|---|---:|---:|
| `legitimate-only` | vulnerable | 19 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `legitimate-only` | fixed | 19 | – | ninguna | 0 | 0 |
| `stolen-refresh` | vulnerable | 22 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `stolen-refresh` | fixed | 23 | – | ninguna | 0 | 0 |
| `stolen-refresh-with-device-id` | vulnerable | 19 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `stolen-refresh-with-device-id` | fixed | 19 | – | ninguna | 0 | 0 |
| `multi-device` | vulnerable | 29 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | **2** | 0 |
| `multi-device` | fixed | 29 | – | ninguna | 0 | 0 |
| `refresh-reuse` | vulnerable | 11 | MEDIUM | `AFTERLIFE-002` | 0 | 0 |
| `refresh-reuse` | fixed | 15 | MEDIUM | `AFTERLIFE-002` | 0 | 0 |
| `dormant-survivor` | vulnerable | 15 | HIGH | `AFTERLIFE-003` | 1 | **1** |
| `dormant-survivor` | fixed | 19 | – | ninguna | 0 | 0 |
| `mfa-change` | vulnerable | 18 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `mfa-change` | fixed | 18 | – | ninguna | 0 | 0 |
| `account-recovery` | vulnerable | 18 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `account-recovery` | fixed | 18 | – | ninguna | 0 | 0 |
| `expired-lineage` | vulnerable | 17 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `expired-lineage` | fixed | 20 | – | ninguna | 0 | 0 |
Cuatro filas conllevan un argumento:
* **`legitimate-only`** no tiene ningún atacante. La corrección no produce nada;
la implementación vulnerable produce un LOW. Eso no es un falso positivo — es
`enumeration_only`: la revocación funcionó *esta vez*, enumerando, sin ninguna
marca de agua que cubra una credencial que el servidor ha olvidado. **El paquete separa
las dos implementaciones sin ningún atacante presente.**
* **`dormant-survivor`** es el punto ciego y su respuesta en una fila:
`AFTERLIFE-001` en silencio, `AFTERLIFE-003` HIGH, auditoría `dormant: 1`.
* **`multi-device`** es donde la rama *funcional* de la implementación vulnerable
aún falla — revocación limitada al portátil, otros dos dispositivos intactos.
* **`expired-lineage`** es el control de falsos positivos: una sesión de 40 días cuyas
credenciales expiraron por sí solas no es una ruta de persistencia superviviente, y no
se reporta como tal.
Y la afirmación central de la matriz, verificada por el script y por
`test_the_fix_never_produces_a_control_failure_finding`: **la corrección no genera ningún
hallazgo de fallo de control en ningún escenario.** `AFTERLIFE-002` se permite — reporta
un robo, no un fallo de control, y una implementación correcta todavía tiene
robos que reportar.
---
## Falsos positivos
Una regla que avisa en cada restablecimiento de contraseña se silencia en una semana, y una regla
silenciada es peor que ninguna regla — es una regla que todos creen que está en ejecución.
| caso | resultado | por qué |
|---|---|---|
| Cambio de contraseña, luego se usa la sesión de reemplazo | sin alerta | la raíz del nuevo linaje está en o después de la marca de agua |
| Restablecimiento y navegación inmediata (`/me`, `/profile`, `/settings`) | sin alerta | un linaje nuevo, una raíz nueva |
| Teléfono, portátil y tablet, todos correctamente rotados | sin alerta | cada inicio de sesión es su propio linaje |
| Un dispositivo que inició sesión *después* del cambio, navegando junto al atacante | sin alerta | raíz nueva — y el linaje obsoleto aún alerta, por sí solo |
| Una credencial obsoleta que fue **rechazada** | sin alerta | `result: failure` se excluye; es evidencia para la defensa |
| Desfase de reloj de hasta 2s entre componentes | sin alerta | la tolerancia documentada |
| Un cambio de contraseña *fallido* | sin alerta | no es un ancla |
| Actividad antes del cambio | sin alerta | verificación de orden temporal |
| Una credencial rotada (`reason: rotated`) | no cuenta como muerte | una credencial consumida, no un linaje eliminado |
| Una sesión de 40 días cuyas credenciales expiraron | no es un superviviente | expiración rastreada por linaje |
| Un primer cambio de contraseña en una cuenta recién creada | sin alerta | nada estaba activo de entrada |
| **Rotación de refresh-token desde un linaje obsoleto** | **ALERTA** | marca de tiempo nueva, ascendencia obsoleta — este es el hallazgo |
Cada fila tiene una prueba en
[`tests/test_detector_afterlife001.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_detector_afterlife001.py) y
[`tests/test_detector_rulepack.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_detector_rulepack.py).
**Sobre la tolerancia de 2 segundos.** Cada marca de tiempo en este laboratorio proviene de un solo proceso
y un solo reloj, así que la tolerancia honesta es cero. 2s es lo que necesita un despliegue realista de dos hosts
bajo NTP, y es tres órdenes de magnitud menor que los intervalos que produce este ataque — el propósito
entero de una credencial de refresh es ser de larga duración. La tolerancia es una ventana en la que un linaje
genuinamente obsoleto es *ignorado*, por lo que se mantiene pequeña a propósito:
`test_12b_a_gap_beyond_the_tolerance_does_alert` fija que 2.1s aún dispara.
---
## La corrección```python
# THE FIX. Two mechanisms, deliberately redundant.
self.store.set_watermark(user.user_id, moment) # the guarantee
revoked = self.store.revoke_credentials(user.user_id, ...) # defence in depth
Ninguno depende de device_id. Se registra como contexto y no influye en el
radio de impacto.
La marca de agua es la garantía arquitectónica. Una marca de tiempo por usuario,
credentials_valid_after, comparada en cada solicitud tanto contra la
emisión propia de la credencial como contra su raíz de linaje:```python
watermark = user.credentials_valid_after
if credential.issued_at < watermark: reject # the obvious case
if credential.root_issued_at < watermark: reject # the refresh chain
La segunda comparación es la que cuesta acertar, y la que una implementación ingenua omite — tanto en la aplicación como en la detección.
**La revocación explícita es defensa en profundidad**, y evidencia. `revoked_at` y `revocation_reason` son lo que lee un respondedor de incidentes, y los eventos `auth.token.revoked` son lo que demuestra que la contención ocurrió.
`test_the_watermark_alone_rejects_a_stale_credential` establece la marca de agua *sin* revocar nada y exige que se rechace la credencial obsoleta — lo que establece cuál de las dos es la que sostiene la carga, y cuál es la propiedad que aún se cumple para credenciales que el servidor ha olvidado que emitió.
### El mismo ataque, contra la corrección

No cambió ni una sola petición. Cambió una función.
### No solo contraseñas
El disparador no es *"la contraseña cambió"*. Es *"algo cambió que hace que las credenciales emitidas previamente no sean fiables"*. Las cuatro rutas comparten `_revoke_for_security_change`, por lo que la corrección y el error se aplican de forma idéntica a:
| cambio | por qué las credenciales dejan de ser fiables |
|---|---|
| cambio / restablecimiento de contraseña | el secreto con el que se estableció la sesión ya no existe |
| alta o cambio de MFA | los factores con los que se estableció la sesión no son los factores de la cuenta |
| cambio de rol / escalada de privilegios | la credencial se acuñó bajo una autorización diferente |
| recuperación de cuenta | por construcción, la cuenta puede haber estado en manos de otra persona hace un momento |
| inicio de sesión | *no* revoca las demás — un nuevo linaje, no una declaración de que las antiguas no son fiables |
Probado para cada tipo, en ambos modos, en
[`tests/test_privilege_changes.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_privilege_changes.py) — incluido
el no-requisito del inicio de sesión, documentado para que el siguiente lector no lo "corrija".
---
## Compromisos arquitectónicos
Cuatro formas de hacer que una credencial deje de funcionar. AFTERLIFE implementa **A + C**, y
el orden importa.
| | mecanismo | aporta | cuesta |
|---|---|---|---|
| **A** | marca de agua de revocación por usuario | una escritura revoca todo, incluidas las credenciales que el servidor ha olvidado; almacenamiento y comprobación O(1) | estado en el lado del servidor en la ruta de lectura; la semántica de las marcas de tiempo debe ser exactamente correcta; no dice nada sobre las credenciales emitidas *después* de la marca de agua |
| **B** | acceso de corta duración + refresh revocable | acota el daño del token de acceso sin estado en la ruta de lectura | un token de acceso robado es válido hasta que caduque; el lado del refresh sigue necesitando estado — **este es el patrón dentro del cual vive el CVE** |
| **C** | lista de denegación explícita | precisa; legible para un respondedor de incidentes; produce la telemetría que demuestra la contención | el estado crece y necesita limpieza; solo revoca lo que recordaste enumerar — que es la consulta que el error hizo mal |
| **D** | JWT totalmente sin estado | ningún estado en la ruta de lectura | **no hay revocación.** El TTL y la rotación de claves son las únicas palancas |
Sobre D: los JWT no son inherentemente inseguros. La tensión es más estrecha y merece enunciarse
con precisión — **la verificación sin estado y la revocación inmediata en el lado del servidor son
mutuamente excluyentes.** No puedes decidir "esta credencial ya no es válida"
sin consultar algo que lo sepa, y consultarlo es lo que hace que el
sistema tenga estado. El error es adoptar JWT *por* su falta de estado y luego
necesitar revocación de todos modos, lo que todo producto hace la primera vez que le roban un portátil. En lo que acabas es en un puntero firmado hacia el estado del lado del servidor — que es
lo que [`app/tokens.py`](https://github.com/het-p301204/afterlife/blob/main/app/tokens.py) implementa deliberadamente, porque llegar
ahí a propósito es más barato que llegar ahí en mitad de un incidente.
### Por qué un 2.1 Low es lo incorrecto sobre lo que discutir
CVE-2026-22706 puntúa **2.1, Low** (CVSS v4.0
`AV:N/AC:H/AT:N/PR:H/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N`), y la puntuación es
defendible: `PR:H` porque el atacante ya debe poseer una credencial de refresh
válida, `AC:H` porque obtener una requiere un compromiso previo, y
`VC:N`/`VI:L` porque el fallo no concede ningún acceso que el atacante no tuviera ya.
CVSS mide el impacto *marginal* de la vulnerabilidad, y el impacto marginal
es la **duración** del acceso, no su alcance. Dados esos datos, 2.1
se deriva de la fórmula correctamente.
Lo que CVSS no modela es que el control que falla es la *acción de contención* —
así que la conclusión útil es sobre el enrutamiento del triaje, no sobre el número. Un Low en una
ruta de contención merece una atención que un Low en una ruta de funcionalidad no merece, porque el
coste se paga durante un incidente. Discusión completa:
**[docs/tradeoffs.md](https://github.com/het-p301204/afterlife/blob/main/docs/tradeoffs.md#on-the-cvss-score)**.
---
## Pruebas```text
290 passed
| archivo | qué fija |
|---|---|
test_fixed_mode.py | la suite de regresión que nunca debe fallar — ninguna credencial emitida antes de un evento de revocación se acepta después de este, incluida una descendiente de un linaje obsoleto |
test_vulnerable_mode.py | la vulnerabilidad existe, es determinista, dura 30 días y es causada por el condicional — con el control de device_id que demuestra que la ruta de revocación es opcional en lugar de estar muerta |
test_lineage.py | una cadena de refresco mantiene un linaje y una raíz; solo el inicio de sesión crea un linaje |
test_detector_afterlife001.py | 7 casos de detección, 9 casos de falso positivo, 2 puntos ciegos, los 24 ordenamientos de eventos, estado acotado, entrada malformada |
test_detector_rulepack.py | AFTERLIFE-002 y AFTERLIFE-003 — cada veredicto, la ventana de gracia, rotación-no-es-muerte, exclusión por expiración y el ordenamiento del motor |
test_naive_detector.py | NAIVE-001 sigue fallando de la manera específica que afirma este README — incluido que tenía los datos que necesitaba |
test_audit_and_console.py | el superviviente latente que ninguna regla puede ver; ambas fuentes de auditoría coincidiendo; la consola no calcula ningún veredicto propio; la vista previa sin conexión no obtiene nada; cada cifra de este README dentro de los límites, sin hoja de estilos y estable a nivel de bytes |
test_scenarios.py |
La prueba más contundente de la suite es
test_no_bearer_string_or_password_ever_reaches_the_log: ejecuta todo el ataque
y luego busca en el archivo de registro las credenciales reales que la aplicación
entregó, más ambas contraseñas, más la clave de firma. No por nombres de campo —
por los valores.
Declarados sin rodeos, porque ocultarlos haría deshonesto el laboratorio. Cada uno tiene una prueba.
Si la aplicación no emite eventos de cambio de credencial, el paquete no puede correlacionar de forma fiable la actividad posterior al restablecimiento. No hay ancla, así que no hay nada respecto a lo cual la actividad sea "posterior" — y silencia primero AFTERLIFE-003, que es la regla que te habría dicho que el control estaba roto.
Si la aplicación no conserva los metadatos de emisión/linaje, el detector no puede determinar si un token de acceso nuevo descendió de una credencial más antigua. Una credencial acuñada hace tres segundos es indistinguible de una credencial acuñada hace tres segundos por una cadena de un mes de antigüedad.
Estas no son preferencias opcionales de registro. Son requisitos de detección de
seguridad. Eliminar auth.token.issued para reducir el volumen de registros no
abarata el registro; apaga una detección.
La actividad irresoluble se cuenta, no se descarta silenciosamente —
stats()["activity_with_unresolved_lineage"] es distinto de cero siempre que se
preguntó al detector sobre credenciales que la telemetría nunca describió. Una
regla que está callada porque nada va mal y una regla que está callada porque es
ciega se ven idénticas desde fuera, y ese número es la diferencia.
También es cierto, y también está documentado:
Discusión completa: docs/limitations.md.
python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt -r requirements-dev.txt
pytest -q
Luego, en orden:```bash
python scripts/lab.py vulnerable
| --no-color | Desactiva la salida en color |
| --debug | Habilita el registro de depuración |
| --verbose | Habilita el registro detallado |
| --silent | Suprime toda la salida excepto los resultados |
| --json | Genera los resultados en formato JSON |
| --csv | Genera los resultados en formato CSV |
| --output <file> | Escribe los resultados en un archivo |
| --config <file> | Especifica un archivo de configuración |
| --timeout <seconds> | Establece el tiempo de espera de la solicitud |
| --retry <count> | Establece el número de reintentos |
| --proxy <url> | Establece el proxy para las solicitudes |
| --user-agent <string> | Establece el User-Agent para las solicitudes |
| --header <header> | Establece encabezados personalizados para las solicitudes |
| --cookie <cookie> | Establece cookies para las solicitudes |
| --auth <credentials> | Establece las credenciales de autenticación |
| --token <token> | Establece el token de autenticación |
| --api-key <key> | Establece la clave de API |
| --secret <secret> | Establece el secreto |
| --client-id <id> | Establece el ID de cliente |
| --client-secret <secret> | Establece el secreto de cliente |
| --scope <scope> | Establece el ámbito |
| --grant-type <type> | Establece el tipo de concesión |
| --redirect-uri <uri> | Establece la URI de redirección |
| --response-type <type> | Establece el tipo de respuesta |
| --state <state> | Establece el estado |
| --nonce <nonce> | Establece el nonce |
| --code-challenge <challenge> | Establece el desafío de código |
| --code-challenge-method <method> | Establece el método del desafío de código |
| --code-verifier <verifier> | Establece el verificador de código |
| --access-token <token> | Establece el token de acceso |
| --refresh-token <token> | Establece el token de actualización |
| --id-token <token> | Establece el token de ID |
| --expires-in <seconds> | Establece el tiempo de expiración |
| --token-type <type> | Establece el tipo de token |
| --issued-at <timestamp> | Establece la marca de tiempo de emisión |
| --not-before <timestamp> | Establece la marca de tiempo de no antes |
| --audience <audience> | Establece la audiencia |
| --issuer <issuer> | Establece el emisor |
| --subject <subject> | Establece el sujeto |
| --jti <jti> | Establece el JTI |
| --algorithm <algorithm> | Establece el algoritmo |
| --key <key> | Establece la clave |
| --key-id <id> | Establece el ID de la clave |
| --key-type <type> | Establece el tipo de clave |
| --key-usage <usage> | Establece el uso de la clave |
| --key-ops <ops> | Establece las operaciones de la clave |
| --key-curve <curve> | Establece la curva de la clave |
| --key-size <size> | Establece el tamaño de la clave |
| --key-format <format> | Establece el formato de la clave |
| --key-encoding <encoding> | Establece la codificación de la clave |
| --key-password <password> | Establece la contraseña de la clave |
| --key-passphrase <passphrase> | Establece la frase de contraseña de la clave |
| --key-file <file> | Establece el archivo de la clave |
| --key-dir <dir> | Establece el directorio de la clave |
| --key-store <store> | Establece el almacén de claves |
| --key-store-password <password> | Establece la contraseña del almacén de claves |
| --key-store-type <type> | Establece el tipo de almacén de claves |
| --key-store-provider <provider> | Establece el proveedor del almacén de claves |
| --trust-store <store> | Establece el almacén de confianza |
| --trust-store-password <password> | Establece la contraseña del almacén de confianza |
| --trust-store-type <type> | Establece el tipo de almacén de confianza |
| --trust-store-provider <provider> | Establece el proveedor del almacén de confianza |
| --ssl-protocol <protocol> | Establece el protocolo SSL |
| --ssl-cipher <cipher> | Establece el cifrado SSL |
| --ssl-enabled <boolean> | Habilita o deshabilita SSL |
| --ssl-verify <boolean> | Habilita o deshabilita la verificación SSL |
| --ssl-cert <file> | Establece el archivo de certificado SSL |
| --ssl-key <file> | Establece el archivo de clave SSL |
| --ssl-ca <file> | Establece el archivo de CA SSL |
| --ssl-ca-dir <dir> | Establece el directorio de CA SSL |
| --ssl-crl <file> | Establece el archivo CRL SSL |
| --ssl-crl-dir <dir> | Establece el directorio CRL SSL |
| --ssl-session <session> | Establece la sesión SSL |
| --ssl-session-cache <cache> | Establece la caché de sesión SSL |
| --ssl-session-timeout <seconds> | Establece el tiempo de espera de la sesión SSL |
| --ssl-session-cache-size <size> | Establece el tamaño de la caché de sesión SSL |
| --ssl-session-cache-timeout <seconds> | Establece el tiempo de espera de la caché de sesión SSL |
| --ssl-session-cache-enabled <boolean> | Habilita o deshabilita la caché de sesión SSL |
| --ssl-session-cache-type <type> | Establece el tipo de caché de sesión SSL |
| --ssl-session-cache-provider <provider> | Establece el proveedor de caché de sesión SSL |
| --ssl-session-cache-config <file> | Establece el archivo de configuración de caché de sesión SSL |
| --ssl-session-cache-options <options> | Establece las opciones de caché de sesión SSL |
| --ssl-session-cache-attributes <attributes> | Establece los atributos de caché de sesión SSL |
| --ssl-session-cache-properties <properties> | Establece las propiedades de caché de sesión SSL |
| --ssl-session-cache-parameters <parameters> | Establece los parámetros de caché de sesión SSL |
| --ssl-session-cache-values <values> | Establece los valores de caché de sesión SSL |
| --ssl-session-cache-keys <keys> | Establece las claves de caché de sesión SSL |
| --ssl-session-cache-entries <entries> | Establece las entradas de caché de sesión SSL |
| --ssl-session-cache-items <items> | Establece los elementos de caché de sesión SSL |
| --ssl-session-cache-records <records> | Establece los registros de caché de sesión SSL |
| --ssl-session-cache-objects <objects> | Establece los objetos de caché de sesión SSL |
| --ssl-session-cache-maps <maps> | Establece los mapas de caché de sesión SSL |
| --ssl-session-cache-sets <sets> | Establece los conjuntos de caché de sesión SSL |
| --ssl-session-cache-lists <lists> | Establece las listas de caché de sesión SSL |
| --ssl-session-cache-arrays <arrays> | Establece los arreglos de caché de sesión SSL |
| --ssl-session-cache-collections <collections> | Establece las colecciones de caché de sesión SSL |
| --ssl-session-cache-iterables <iterables> | Establece los iterables de caché de sesión SSL |
| --ssl-session-cache-streams <streams> | Establece los flujos de caché de sesión SSL |
| --ssl-session-cache-buffers <buffers> | Establece los búferes de caché de sesión SSL |
| --ssl-session-cache-channels <channels> | Establece los canales de caché de sesión SSL |
| --ssl-session-cache-pipes <pipes> | Establece las tuberías de caché de sesión SSL |
| --ssl-session-cache-sockets <sockets> | Establece los sockets de caché de sesión SSL |
| --ssl-session-cache-connections <connections> | Establece las conexiones de caché de sesión SSL |
| --ssl-session-cache-sessions <sessions> | Establece las sesiones de caché de sesión SSL |
| --ssl-session-cache-contexts <contexts> | Establece los contextos de caché de sesión SSL |
| --ssl-session-cache-environments <environments> | Establece los entornos de caché de sesión SSL |
| --ssl-session-cache-configurations <configurations> | Establece las configuraciones de caché de sesión SSL |
| --ssl-session-cache-settings <settings> | Establece la configuración de caché de sesión SSL |
| --ssl-session-cache-preferences <preferences> | Establece las preferencias de caché de sesión SSL |
| --ssl-session-cache-options <options> | Establece las opciones de caché de sesión SSL |
| --ssl-session-cache-flags <flags> | Establece los indicadores de caché de sesión SSL |
| --ssl-session-cache-modes <modes> | Establece los modos de caché de sesión SSL |
| --ssl-session-cache-levels <levels> | Establece los niveles de caché de sesión SSL |
| --ssl-session-cache-priorities <priorities> | Establece las prioridades de caché de sesión SSL |
| --ssl-session-cache-weights <weights> | Establece los pesos de caché de sesión SSL |
| --ssl-session-cache-scores <scores> | Establece las puntuaciones de caché de sesión SSL |
| --ssl-session-cache-ratings <ratings> | Establece las calificaciones de caché de sesión SSL |
| --ssl-session-cache-reviews <reviews> | Establece las reseñas de caché de sesión SSL |
| --ssl-session-cache-comments <comments> | Establece los comentarios de caché de sesión SSL |
| --ssl-session-cache-tags <tags> | Establece las etiquetas de caché de sesión SSL |
| --ssl-session-cache-labels <labels> | Establece las etiquetas de caché de sesión SSL |
| --ssl-session-cache-annotations <annotations> | Establece las anotaciones de caché de sesión SSL |
| --ssl-session-cache-metadata <metadata> | Establece los metadatos de caché de sesión SSL |
| --ssl-session-cache-properties <properties> | Establece las propiedades de caché de sesión SSL |
| --ssl-session-cache-attributes <attributes> | Establece los atributos de caché de sesión SSL |
| --ssl-session-cache-parameters <parameters> | Establece los parámetros de caché de sesión SSL |
| --ssl-session-cache-values <values> | Establece los valores de caché de sesión SSL |
| --ssl-session-cache-keys <keys> | Establece las claves de caché de sesión SSL |
| --ssl-session-cache-entries <entries> | Establece las entradas de caché de sesión SSL |
| --ssl-session-cache-items <items> | Establece los elementos de caché de sesión SSL |
| --ssl-session-cache-records <records> | Establece los registros de caché de sesión SSL |
| --ssl-session-cache-objects <objects> | Establece los objetos de caché de sesión SSL |
| --ssl-session-cache-maps <maps> | Establece los mapas de caché de sesión SSL |
| --ssl-session-cache-sets <sets> | Establece los conjuntos de caché de sesión SSL |
| --ssl-session-cache-lists <lists> | Establece las listas de caché de sesión SSL |
| --ssl-session-cache-arrays <arrays> | Establece los arreglos de caché de sesión SSL |
| --ssl-session-cache-collections <collections> | Establece las colecciones de caché de sesión SSL |
| --ssl-session-cache-iterables <iterables> | Establece los iterables de caché de sesión SSL |
| --ssl-session-cache-streams <streams> | Establece los flujos de caché de sesión SSL |
| --ssl-session-cache-buffers <buffers> | Establece los búferes de caché de sesión SSL |
| --ssl-session-cache-channels <channels> | Establece los canales de caché de sesión SSL |
| --ssl-session-cache-pipes <pipes> | Establece las tuberías de caché de sesión SSL |
| --ssl-session-cache-sockets <sockets> | Establece los sockets de caché de sesión SSL |
| --ssl-session-cache-connections <connections> | Establece las conexiones de caché de sesión SSL |
| --ssl-session-cache-sessions <sessions> | Establece las sesiones de caché de sesión SSL |
| --ssl-session-cache-contexts <contexts> | Establece los contextos de caché de sesión SSL |
| --ssl-session-cache-environments <environments> | Establece los entornos de caché de sesión SSL |
| --ssl-session-cache-configurations <configurations> | Establece las configuraciones de caché de sesión SSL |
| --ssl-session-cache-settings <settings> | Establece la configuración de caché de sesión SSL |
| --ssl-session-cache-preferences <preferences> | Establece las preferencias de caché de sesión SSL |
| --ssl-session-cache-options <options> | Establece las opciones de caché de sesión SSL |
| --ssl-session-cache-flags <flags> | Establece los indicadores de caché de sesión SSL |
| --ssl-session-cache-modes <modes> | Establece los modos de caché de sesión SSL |
| --ssl-session-cache-levels <levels> | Establece los niveles de caché de sesión SSL |
| --ssl-session-cache-priorities <priorities> | Establece las prioridades de caché de sesión SSL |
| --ssl-session-cache-weights <weights> | Establece los pesos de caché de sesión SSL |
| --ssl-session-cache-scores <scores> | Establece las puntuaciones de caché de sesión SSL |
| --ssl-session-cache-ratings <ratings> | Establece las calificaciones de caché de sesión SSL |
| --ssl-session-cache-reviews <reviews> | Establece las reseñas de caché de sesión SSL |
| --ssl-session-cache-comments <comments> | Establece los comentarios de caché de sesión SSL |
| --ssl-session-cache-tags <tags> | Establece las etiquetas de caché de sesión SSL |
| --ssl-session-cache-labels <labels> | Establece las etiquetas de caché de sesión SSL |
| --ssl-session-cache-annotations <annotations> | Establece las anotaciones de caché de sesión SSL |
| --ssl-session-cache-metadata <metadata> | Establece los metadatos de caché de sesión SSL |```bash
python scripts/lab.py detect
| `--no-remote` | Deshabilitar la carga remota de plantillas |
| `--no-update` | Deshabilitar la comprobación de actualizaciones |
| `--no-color` | Deshabilitar la salida en color |
| `--debug` | Habilitar el registro de depuración |
| `--verbose` | Habilitar el registro detallado |
| `--silent` | Habilitar el modo silencioso |
| `--version` | Mostrar la versión de la herramienta |
| `--help` | Mostrar el mensaje de ayuda |
### Ejemplos
```bash
# Escanear un solo objetivo
python3 cve.py -u https://example.com
# Escanear múltiples objetivos desde un archivo
python3 cve.py -f targets.txt
# Escanear con un proxy
python3 cve.py -u https://example.com -p http://127.0.0.1:8080
# Escanear con un encabezado de agente de usuario personalizado
python3 cve.py -u https://example.com -a "Mozilla/5.0"
# Escanear con un tiempo de espera personalizado
python3 cve.py -u https://example.com -t 10
# Escanear con un número personalizado de hilos
python3 cve.py -u https://example.com -T 10
# Escanear con un archivo de cookies personalizado
python3 cve.py -u https://example.com -c cookies.txt
# Escanear con un archivo de encabezados personalizado
python3 cve.py -u https://example.com -H headers.txt
# Escanear con un archivo de datos POST personalizado
python3 cve.py -u https://example.com -d data.txt
# Escanear con un método HTTP personalizado
python3 cve.py -u https://example.com -m POST
# Escanear con un archivo de salida personalizado
python3 cve.py -u https://example.com -o output.txt
# Escanear con un formato de salida personalizado
python3 cve.py -u https://example.com -O json
# Escanear con un archivo de registro personalizado
python3 cve.py -u https://example.com -l log.txt
# Escanear con un archivo de configuración personalizado
python3 cve.py -u https://example.com -C config.txt
# Escanear con un archivo de plantilla personalizado
python3 cve.py -u https://example.com -t template.txt
# Escanear con un archivo de carga útil personalizado
python3 cve.py -u https://example.com -P payload.txt
# Escanear con un archivo de lista de palabras personalizado
python3 cve.py -u https://example.com -w wordlist.txt
# Escanear con un archivo de lista de usuarios personalizado
python3 cve.py -u https://example.com -U users.txt
# Escanear con un archivo de lista de contraseñas personalizado
python3 cve.py -u https://example.com -p passwords.txt
# Escanear con un archivo de lista de agentes de usuario personalizado
python3 cve.py -u https://example.com -A useragents.txt
# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -r referers.txt
# Escanear con un archivo de lista de cookies personalizado
python3 cve.py -u https://example.com -k cookies.txt
# Escanear con un archivo de lista de encabezados personalizado
python3 cve.py -u https://example.com -e headers.txt
# Escanear con un archivo de lista de datos POST personalizado
python3 cve.py -u https://example.com -D data.txt
# Escanear con un archivo de lista de métodos HTTP personalizado
python3 cve.py -u https://example.com -M methods.txt
# Escanear con un archivo de lista de rutas personalizado
python3 cve.py -u https://example.com -R paths.txt
# Escanear con un archivo de lista de parámetros personalizado
python3 cve.py -u https://example.com -q params.txt
# Escanear con un archivo de lista de valores personalizado
python3 cve.py -u https://example.com -v values.txt
# Escanear con un archivo de lista de cargas útiles personalizado
python3 cve.py -u https://example.com -y payloads.txt
# Escanear con un archivo de lista de extensiones personalizado
python3 cve.py -u https://example.com -x extensions.txt
# Escanear con un archivo de lista de directorios personalizado
python3 cve.py -u https://example.com -z directories.txt
# Escanear con un archivo de lista de subdominios personalizado
python3 cve.py -u https://example.com -s subdomains.txt
# Escanear con un archivo de lista de dominios personalizado
python3 cve.py -u https://example.com -S domains.txt
# Escanear con un archivo de lista de direcciones IP personalizado
python3 cve.py -u https://example.com -i ips.txt
# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt
# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -V services.txt
# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -E versions.txt
# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt
# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt
# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt
# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt
# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt
# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt
# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt
# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt
# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt
# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt
# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt
# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt
# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt
# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt
# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt
# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt
# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt
# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt
# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt
# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt
# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt
# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt
# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt
# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt
# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt
# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt
# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt
# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt
# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt
# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt
# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt
# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt
# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt
# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt
# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt
# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt
# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt
# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt
# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt
# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt
# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt
# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt
# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt
# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt
# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt
# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt
# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt
# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt
# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt
# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt
# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt
# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt
# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt
# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt
# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt
# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt
# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt
# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt
# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt
# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt
# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt
# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt
# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt
# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt
# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt
# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt
# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt
# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt
# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt
# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt
# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt
# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt
# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt
# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt
# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt
# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt
# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt
# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt
# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt
# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt
# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt
# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt
# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt
# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt
# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt
# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt
# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt
# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt
# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt
# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt
# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt
# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt
# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt
# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt
# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt
# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt
# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt
# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt
# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt
# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt
# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt
# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt
# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt
# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt
# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt
# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt
# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt
# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt
# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt
# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt
# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt
# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt
# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt
# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt
# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt
# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt
# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt
# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt
# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt
# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt
# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt
# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt
# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt
# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt
# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt
# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt
# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt
# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt
# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt
# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt
# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt
# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt
# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt
# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt
# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt
# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt
# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt
# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt
# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt
# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt
# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt
# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt
# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt
# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt
# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt
# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt
# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt
# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt
# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt
# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt
# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt
# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt
# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt
# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt
# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt
# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt
# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt
# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt
# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt
# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt
# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt
# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt
# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt
# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt
# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt
# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt
# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt
# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt
# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt
# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt
# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt
# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt
# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt
# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt
# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt
# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt
# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt
# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt
# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt
# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt
# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt
# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt
# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt
# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt
# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt
# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt
# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt
# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt
# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt
# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt
# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt
# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt
# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt
# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt
# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt
# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt
# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt
# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt
# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt
# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt
# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt
# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt
# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt
# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt
# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt
# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt
# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt
# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt
# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt
# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt
# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt
# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt
#```bash
python scripts/lab.py fixed
La aplicación está diseñada con una arquitectura modular para garantizar la escalabilidad, el mantenimiento y la claridad. A continuación se muestra un desglose de los componentes clave:
Dashboard: Muestra métricas en tiempo real y resúmenes de amenazas.ThreatMap: Visualiza datos de amenazas geolocalizadas mediante react-simple-maps.AlertPanel: Lista las alertas activas con opciones de filtrado y clasificación.ThreatAnalyzer: Procesa los datos entrantes y aplica reglas de detección.NotificationService: Envía alertas por correo electrónico, Slack o webhooks.ReportGenerator: Crea informes exportables en PDF o CSV.threats: Almacena los registros de amenazas con marcas de tiempo e indicadores de gravedad.users: Gestiona cuentas de usuario, roles y permisos.logs: Registra las actividades del sistema y los eventos de auditoría.VirusTotal: Para el análisis de reputación de archivos y URL.Shodan: Para el descubrimiento de dispositivos expuestos.AlienVault OTX: Para inteligencia sobre amenazas.project-root/
├── client/ # Código frontend (React)
├── server/ # Código backend (Node.js)
├── database/ # Migraciones y seeds
├── config/ # Archivos de configuración
├── tests/ # Pruebas unitarias y de integración
└── docs/ # Documentación
| Variable | Descripción | Valor por defecto |
|---|---|---|
PORT | Puerto del servidor | 3000 |
DB_HOST | Host de PostgreSQL | localhost |
REDIS_URL | URL de conexión a Redis | redis://localhost:6379 |
JWT_SECRET | Clave secreta para JWT | (ninguno) |
GET /api/threats: Recupera una lista de amenazas.POST /api/threats: Crea un nuevo registro de amenaza.GET /api/users: Lista todos los usuarios (solo administradores).POST /api/login: Autentica a un usuario y devuelve un token JWT.O toda la historia de una vez, con la lección al final:```bash
python scripts/lab.py all
Y la imagen:```bash python scripts/lab.py console
<details>
<summary><b>Todo lo demás</b> — la CLI del detector, la matriz, el informe, las figuras, los servidores</summary>
<br>
Reproduce la evidencia comprometida a través del paquete. No se necesita ejecutar la aplicación — el
detector es estrictamente posterior, y esta es la prueba:```bash
python -m detector --once --timeline --events evidence/vulnerable-persistence.jsonl
Una regla a la vez, o la ingenua, o el escaneo de estado:```bash python -m detector --once --rule AFTERLIFE-003 --events evidence/vulnerable-persistence.jsonl
| `--no-color` | Desactiva la salida en color |
| `--debug` | Habilita el registro de depuración |
| `--json` | Salida en formato JSON |
| `--quiet` | Modo silencioso, solo errores |
| `--verbose` | Salida detallada |
### Ejemplos
```bash
# Escanear un objetivo
python3 cve_2026_XXXXX.py -t https://example.com
# Escanear con opciones personalizadas
python3 cve_2026_XXXXX.py -t https://example.com --timeout 30 --threads 10
# Salida en formato JSON
python3 cve_2026_XXXXX.py -t https://example.com --json
# Escanear múltiples objetivos desde un archivo
python3 cve_2026_XXXXX.py -f targets.txt
El script realiza los siguientes pasos:
El script utiliza múltiples métodos para detectar la versión:
Una vez detectada la versión, el script compara con la lista de versiones vulnerables conocidas.
Si la versión es vulnerable, el script intenta explotar la vulnerabilidad utilizando las técnicas documentadas en el CVE.
Si el script no puede detectar la versión, intente:
--timeout--versionSi obtiene falsos positivos, intente:
--verbose para ver más detalles--debugSi experimenta errores de conexión:
Esta herramienta está destinada únicamente a pruebas de seguridad autorizadas y fines educativos. Los autores no se hacen responsables del uso indebido o de los daños causados por esta herramienta.
ADVERTENCIA: El uso de esta herramienta contra objetivos sin autorización previa por escrito es ilegal. Asegúrese de tener la autorización adecuada antes de realizar cualquier prueba.
Las contribuciones son bienvenidas. Por favor, asegúrese de:
git checkout -b feature/nueva-funcion)git commit -am 'Añadir nueva función')git push origin feature/nueva-funcion)Este proyecto está licenciado bajo la Licencia MIT - consulte el archivo LICENSE para más detalles.
El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluyendo pero no limitado a las garantías de comerciabilidad, idoneidad para un propósito particular y no infracción. En ningún caso los autores o titulares de derechos de autor serán responsables de ninguna reclamación, daños u otra responsabilidad, ya sea en una acción de contrato, agravio o de otro tipo, que surja de, fuera de o en conexión con el software o el uso u otras transacciones en el software.```bash python -m detector --once --naive --events evidence/vulnerable-persistence.jsonl
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no```bash
python -m detector --audit --events evidence/vulnerable-persistence.jsonl
El CLI sale con 1 cuando encuentra algo, por lo que funciona como una verificación de CI sin
analizar su salida.
Nueve escenarios contra ambas implementaciones, con invariantes de autoverificación:```bash python scripts/scenarios.py
El informe de incidente que se le entregaría a un respondedor, y las figuras en este README:```bash
python scripts/report.py
| --no-color | Desactiva la salida con color |
| --verbose | Muestra información detallada de depuración |
| --quiet | Suprime toda la salida excepto los errores |
| --json | Genera la salida en formato JSON |
| --config <path> | Especifica la ruta del archivo de configuración |
| --timeout <seconds> | Establece el tiempo de espera de la solicitud |
| --retry <count> | Número de reintentos en caso de fallo |
| --proxy <url> | Usa el proxy especificado para las solicitudes |
| --user-agent <string> | Establece una cadena de User-Agent personalizada |
| --header <header> | Añade una cabecera HTTP personalizada |
| --cookie <cookie> | Añade una cookie personalizada |
| --output <file> | Escribe la salida en un archivo |
| --input <file> | Lee la entrada desde un archivo |
| --threads <count> | Número de hilos concurrentes |
| --rate-limit <count> | Limita el número de solicitudes por segundo |
| --follow-redirects | Sigue las redirecciones HTTP |
| --insecure | Omite la verificación del certificado TLS |
| --debug | Habilita el registro de depuración |
| --version | Muestra la versión del programa |
| --help | Muestra el mensaje de ayuda |```bash
python scripts/figures.py
La consola en vivo y la API del laboratorio de forma manual — ambas solo en loopback:```bash
python -m console
| --no-remote | Deshabilitar la carga remota de plantillas |
| --no-update | Deshabilitar la comprobación de actualizaciones |
| --verbose | Habilitar registro detallado |
| --debug | Habilitar registro de depuración |
| --silent | Modo silencioso (solo errores) |
| --json | Salida en formato JSON |
| --yaml | Salida en formato YAML |
| --csv | Salida en formato CSV |
| --xml | Salida en formato XML |
| --html | Salida en formato HTML |
| --markdown | Salida en formato Markdown |
| --table | Salida en formato de tabla |
| --tree | Salida en formato de árbol |
| --graph | Salida en formato de grafo |
| --dot | Salida en formato DOT |
| --mermaid | Salida en formato Mermaid |
| --plantuml | Salida en formato PlantUML |
| --drawio | Salida en formato Draw.io |
| --excalidraw | Salida en formato Excalidraw |
| --svg | Salida en formato SVG |
| --png | Salida en formato PNG |
| --pdf | Salida en formato PDF |
| --docx | Salida en formato DOCX |
| --xlsx | Salida en formato XLSX |
| --pptx | Salida en formato PPTX |
| --odt | Salida en formato ODT |
| --ods | Salida en formato ODS |
| --odp | Salida en formato ODP |
| --epub | Salida en formato EPUB |
| --mobi | Salida en formato MOBI |
| --azw3 | Salida en formato AZW3 |
| --fb2 | Salida en formato FB2 |
| --rtf | Salida en formato RTF |
| --txt | Salida en formato TXT |
| --log | Salida en formato LOG |
| --ini | Salida en formato INI |
| --toml | Salida en formato TOML |
| --env | Salida en formato ENV |
| --properties | Salida en formato Properties |
| --conf | Salida en formato CONF |
| --cfg | Salida en formato CFG |
| --config | Salida en formato Config |
| --settings | Salida en formato Settings |
| --preferences | Salida en formato Preferences |
| --options | Salida en formato Options |
| --args | Salida en formato Args |
| --params | Salida en formato Params |
| --flags | Salida en formato Flags |
| --switches | Salida en formato Switches |
| --attributes | Salida en formato Attributes |
| --fields | Salida en formato Fields |
| --columns | Salida en formato Columns |
| --rows | Salida en formato Rows |
| --cells | Salida en formato Cells |
| --values | Salida en formato Values |
| --keys | Salida en formato Keys |
| --entries | Salida en formato Entries |
| --items | Salida en formato Items |
| --elements | Salida en formato Elements |
| --nodes | Salida en formato Nodes |
| --edges | Salida en formato Edges |
| --vertices | Salida en formato Vertices |
| --links | Salida en formato Links |
| --relations | Salida en formato Relations |
| --connections | Salida en formato Connections |
| --dependencies | Salida en formato Dependencies |
| --references | Salida en formato References |
| --citations | Salida en formato Citations |
| --footnotes | Salida en formato Footnotes |
| --endnotes | Salida en formato Endnotes |
| --annotations | Salida en formato Annotations |
| --comments | Salida en formato Comments |
| --notes | Salida en formato Notes |
| --remarks | Salida en formato Remarks |
| --observations | Salida en formato Observations |
| --warnings | Salida en formato Warnings |
| --errors | Salida en formato Errors |
| --exceptions | Salida en formato Exceptions |
| --failures | Salida en formato Failures |
| --successes | Salida en formato Successes |
| --results | Salida en formato Results |
| --outputs | Salida en formato Outputs |
| --inputs | Salida en formato Inputs |
| --sources | Salida en formato Sources |
| --targets | Salida en formato Targets |
| --destinations | Salida en formato Destinations |
| --paths | Salida en formato Paths |
| --routes | Salida en formato Routes |
| --endpoints | Salida en formato Endpoints |
| --urls | Salida en formato URLs |
| --uris | Salida en formato URIs |
| --iris | Salida en formato IRIs |
| --urns | Salida en formato URNs |
| --names | Salida en formato Names |
| --ids | Salida en formato IDs |
| --uuids | Salida en formato UUIDs |
| --guids | Salida en formato GUIDs |
| --hashes | Salida en formato Hashes |
| --checksums | Salida en formato Checksums |
| --digests | Salida en formato Digests |
| --signatures | Salida en formato Signatures |
| --certificates | Salida en formato Certificates |
| --keys | Salida en formato Keys |
| --tokens | Salida en formato Tokens |
| --secrets | Salida en formato Secrets |
| --passwords | Salida en formato Passwords |
| --credentials | Salida en formato Credentials |
| --accounts | Salida en formato Accounts |
| --users | Salida en formato Users |
| --groups | Salida en formato Groups |
| --roles | Salida en formato Roles |
| --permissions | Salida en formato Permissions |
| --policies | Salida en formato Policies |
| --rules | Salida en formato Rules |
| --regulations | Salida en formato Regulations |
| --laws | Salida en formato Laws |
| --standards | Salida en formato Standards |
| --specifications | Salida en formato Specifications |
| --requirements | Salida en formato Requirements |
| --constraints | Salida en formato Constraints |
| --limitations | Salida en formato Limitations |
| --restrictions | Salida en formato Restrictions |
| --boundaries | Salida en formato Boundaries |
| --limits | Salida en formato Limits |
| --thresholds | Salida en formato Thresholds |
| --quotas | Salida en formato Quotas |
| --capacities | Salida en formato Capacities |
| --volumes | Salida en formato Volumes |
| --sizes | Salida en formato Sizes |
| --dimensions | Salida en formato Dimensions |
| --measurements | Salida en formato Measurements |
| --metrics | Salida en formato Metrics |
| --statistics | Salida en formato Statistics |
| --analytics | Salida en formato Analytics |
| --reports | Salida en formato Reports |
| --dashboards | Salida en formato Dashboards |
| --charts | Salida en formato Charts |
| --graphs | Salida en formato Graphs |
| --plots | Salida en formato Plots |
| --diagrams | Salida en formato Diagrams |
| --figures | Salida en formato Figures |
| --images | Salida en formato Images |
| --pictures | Salida en formato Pictures |
| --photos | Salida en formato Photos |
| --videos | Salida en formato Videos |
| --audios | Salida en formato Audios |
| --sounds | Salida en formato Sounds |
| --music | Salida en formato Music |
| --speech | Salida en formato Speech |
| --text | Salida en formato Text |
| --documents | Salida en formato Documents |
| --files | Salida en formato Files |
| --folders | Salida en formato Folders |
| --directories | Salida en formato Directories |
| --archives | Salida en formato Archives |
| --backups | Salida en formato Backups |
| --snapshots | Salida en formato Snapshots |
| --images | Salida en formato Images |
| --containers | Salida en formato Containers |
| --vms | Salida en formato VMs |
| --hosts | Salida en formato Hosts |
| --servers | Salida en formato Servers |
| --clients | Salida en formato Clients |
| --peers | Salida en formato Peers |
| --nodes | Salida en formato Nodes |
| --clusters | Salida en formato Clusters |
| --pods | Salida en formato Pods |
| --services | Salida en formato Services |
| --applications | Salida en formato Applications |
| --programs | Salida en formato Programs |
| --processes | Salida en formato Processes |
| --threads | Salida en formato Threads |
| --tasks | Salida en formato Tasks |
| --jobs | Salida en formato Jobs |
| --workflows | Salida en formato Workflows |
| --pipelines | Salida en formato Pipelines |
| --stages | Salida en formato Stages |
| --steps | Salida en formato Steps |
| --phases | Salida en formato Phases |
| --iterations | Salida en formato Iterations |
| --loops | Salida en formato Loops |
| --cycles | Salida en formato Cycles |
| --periods | Salida en formato Periods |
| --intervals | Salida en formato Intervals |
| --durations | Salida en formato Durations |
| --timeouts | Salida en formato Timeouts |
| --delays | Salida en formato Delays |
| --latencies | Salida en formato Latencies |
| --throughputs | Salida en formato Throughputs |
| --bandwidths | Salida en formato Bandwidths |
| --speeds | Salida en formato Speeds |
| --rates | Salida en formato Rates |
| --frequencies | Salida en formato Frequencies |
| --wavelengths | Salida en formato Wavelengths |
| --amplitudes | Salida en formato Amplitudes |
| --phases | Salida en formato Phases |
| --angles | Salida en formato Angles |
| --rotations | Salida en formato Rotations |
| --translations | Salida en formato Translations |
| --scales | Salida en formato Scales |
| --transforms | Salida en formato Transforms |
| --matrices | Salida en formato Matrices |
---
[Read more](https://github.com/het-p301204/afterlife)
| las filas de la matriz que sostienen un argumento |
test_privilege_changes.py | MFA, cambio de rol y recuperación de cuenta, en ambos modos |
test_telemetry.py | el contrato de redacción y una búsqueda en el registro de las cadenas bearer literales emitidas |
test_app.py | firmas falsificadas, tipos de credencial incorrectos, expiración desde el estado del servidor |
test_infrastructure.py | configuración, reloj, líneas parciales del tailer, ambas CLI, cada comando de demostración |