⚠️ Solo reporte — NO cambies código. Esta es una issue de auditoría de seguridad. La entrega es únicamente el reporte en docs/security-reports/SEC-XX-*.md (resultado, evidencia, reproducción). No modifiques código de la app ni del backend — los fixes los implementa el equipo. Si tienes una propuesta de arreglo, descríbela en la sección Sugerencia de fix del reporte, no la implementes. Los PRs que cambien código de la aplicación no se aceptarán para esta issue (se pedirá separar el reporte del fix).
[SEC-12] Bypass total de x402: el prefijo mock: en X-PAYMENT se acepta sin gate de entorno
Archivo: apps/api/src/middleware/x402.ts:107-112
Contexto
verifyPayment() —el corazón del middleware x402 que protege todos los endpoints de pago— empieza con:
if (xdrBase64.startsWith("mock:")) {
return xdrBase64.replace("mock:", "").split(":")[0] ?? "GTEST_PAYER";
}
Cualquier petición con header X-PAYMENT: mock:G<cualquier-cosa>:0 es aceptada como pago válido y devuelve esa dirección como payerAddress, sin verificar nada. Esto no tiene ninguna guarda por entorno: index.ts:29-31 sí rechaza X402_MOCK_MODE=true en producción, pero ese flag no se consulta en x402.ts — el bypass mock: está siempre activo, incluso en producción.
Endpoints afectados (todos los que usan requirePayment): /api/v1/swaps/plan, /swaps/execute, /api/v1/credentials/buy, /api/v1/bazaar/intent|feed|quote|accept, /api/v1/fund. Esto convierte el pago en opcional y habilita SEC-16, SEC-17 y SEC-18 de forma gratuita.
Pasos para reproducir
curl -X POST .../api/v1/bazaar/feed -H "X-PAYMENT: mock:GAAAA...:0" → esperar 200 sin pago real
- Repetir contra
/api/v1/credentials/buy y /api/v1/swaps/plan
- Confirmar que
payer/payerAddress en la respuesta refleja la dirección arbitraria enviada
- Verificar que no existe ninguna variable de entorno que desactive la rama
mock:
Lo que reportar
- ¿Se obtiene acceso al recurso pagado sin un pago real?
- ¿La dirección
payer se puede falsificar a voluntad?
- ¿Existe algún gate (
NODE_ENV, env var) que desactive mock:? (esperado: no)
Severidad estimada: Crítica si llega a producción — anula todo el modelo de pago x402
Plantilla de respuesta: Resultado: Vulnerable/No vulnerable/Parcial · Evidencia: (curl/log) · Reproducible en testnet: sí/no · Sugerencia de fix: (opcional)
Cómo entregar
Completa la plantilla docs/security-reports/SEC-12-x402-mock-bypass.md con tu resultado, evidencia y entorno, y envíala como PR (el bot de Drips rastrea PRs) o como comentario en este issue. Un asignado por issue.
[SEC-12]Bypass total de x402: el prefijomock:enX-PAYMENTse acepta sin gate de entornoArchivo:
apps/api/src/middleware/x402.ts:107-112Contexto
verifyPayment()—el corazón del middleware x402 que protege todos los endpoints de pago— empieza con:Cualquier petición con header
X-PAYMENT: mock:G<cualquier-cosa>:0es aceptada como pago válido y devuelve esa dirección comopayerAddress, sin verificar nada. Esto no tiene ninguna guarda por entorno:index.ts:29-31sí rechazaX402_MOCK_MODE=trueen producción, pero ese flag no se consulta enx402.ts— el bypassmock:está siempre activo, incluso en producción.Endpoints afectados (todos los que usan
requirePayment):/api/v1/swaps/plan,/swaps/execute,/api/v1/credentials/buy,/api/v1/bazaar/intent|feed|quote|accept,/api/v1/fund. Esto convierte el pago en opcional y habilita SEC-16, SEC-17 y SEC-18 de forma gratuita.Pasos para reproducir
curl -X POST .../api/v1/bazaar/feed -H "X-PAYMENT: mock:GAAAA...:0"→ esperar 200 sin pago real/api/v1/credentials/buyy/api/v1/swaps/planpayer/payerAddressen la respuesta refleja la dirección arbitraria enviadamock:Lo que reportar
payerse puede falsificar a voluntad?NODE_ENV, env var) que desactivemock:? (esperado: no)Severidad estimada: Crítica si llega a producción — anula todo el modelo de pago x402
Plantilla de respuesta:
Resultado:Vulnerable/No vulnerable/Parcial ·Evidencia:(curl/log) ·Reproducible en testnet:sí/no ·Sugerencia de fix:(opcional)Cómo entregar
Completa la plantilla
docs/security-reports/SEC-12-x402-mock-bypass.mdcon tu resultado, evidencia y entorno, y envíala como PR (el bot de Drips rastrea PRs) o como comentario en este issue. Un asignado por issue.