Este documento recopila los criterios de aceptación oficiales de PortSwigger para publicar extensiones en la BApp Store (BApp Store Acceptance Criteria) y el estado actual de cumplimiento de la extensión Dynamic Variables.
- Criterio: No duplicar la funcionalidad exacta de una extensión existente en la BApp Store.
- Estado: CUMPLE
- Detalle / Verificación: Dynamic Variables proporciona gestión avanzada de variables dinámicas entre peticiones y respuestas (extracción multi-fuente por Regex/JSON/Header/Body, auto-reemplazo en Repeater/Intruder/Proxy/Scanner con sintaxis personalizable, refresco en cascada/staged y persistencia por proyecto).
- Criterio: El nombre debe describir claramente la función de la extensión.
- Estado: CUMPLE
- Detalle / Verificación:
- Nombre configurado en código:
api.extension().setName("Dynamic Variables");ensrc/main/java/burp/DynamicVariables.java. - Incluye
README.mdcon descripción clara y guía de uso.
- Nombre configurado en código:
- Criterio: Tratar el contenido de los mensajes HTTP como no confiable (untrusted). Evitar que la extensión exponga al usuario a ataques o ejecuciones de código no deseadas.
- Estado: CUMPLE
- Detalle / Verificación:
- Extracción de Regex/JSON mediante parsers seguros y con manejo estricto de excepciones sin eval ni invocación de intérpretes de comandos externos.
- Sanitización en codificación de estado (
VariableStateCodec).
- Criterio: La extensión no debe requerir descargas o librerías externas adicionales en tiempo de ejecución.
- Estado: CUMPLE
- Detalle / Verificación:
build.gradleutiliza solomontoya-api:2026.7comocompileOnly(proporcionada por el núcleo de Burp Suite) y bibliotecas estándar de Java.
- Criterio: No realizar operaciones lentas (como peticiones HTTP) en el Swing Event Dispatch Thread (EDT). Capturar y registrar excepciones de hilos de fondo en el error stream (
api.logging().logToError(...)). Evitar bloqueos (deadlocks). - Estado: CUMPLE
- Detalle / Verificación:
- Las peticiones de refresco síncrono y prueba de reglas se ejecutan dentro de hilos separados (
new Thread(...)). - Las actualizaciones de interfaz utilizan
SwingUtilities.invokeLater(...). - Las excepciones en hilos secundarios capturan el trace y registran a
api.logging().logToError(...).
- Las peticiones de refresco síncrono y prueba de reglas se ejecutan dentro de hilos separados (
- Criterio: Registrar un manejador de descarga vía
Extension.registerUnloadingHandler()para liberar hilos, listeners y recursos. - Estado: CUMPLE
- Detalle / Verificación:
- En
src/main/java/burp/DynamicVariables.javase registra el handler deregisterUnloadingHandler.
- En
- Criterio: Hacer peticiones HTTP a través de la red de Burp (
api.http().sendRequest(...)) en lugar de librerías comojava.net.URLoHttpClient. - Estado: CUMPLE
- Detalle / Verificación:
- Las tres emisiones de peticiones de la extensión utilizan
api.http().sendRequest(...):VariableHttpHandler.java(reenvío de la petición original tras recuperar la sesión) yVariableManager.java, tanto en "Update Rule from Response..." como enfetchRefreshedVariable. Salen por la pila HTTP de Burp, por lo que se aplican el proxy upstream y la configuración TLS; las reglas de sesión se aplican si su ámbito incluyeExtensions. - No realiza llamadas de red en audit pasivo (
ScanCheck.passiveAudit()).
- Las tres emisiones de peticiones de la extensión utilizan
- Criterio: Las extensiones deben operar sin requerir conexión a internet para descargar reglas o definiciones externas.
- Estado: CUMPLE
- Detalle / Verificación:
- La extensión es 100% autónoma. No depende de servidores o servicios online externos.
- Criterio: Evitar mantener referencias de largo plazo a objetos pesados (
HttpRequestResponse, historial completo de Proxy). Si se necesita guardar un mensaje HTTP de forma duradera, usar la API de persistencia o datos mínimos necesarios. - Estado: CUMPLE
- Detalle / Verificación:
src/main/java/burp/LatestRequestTracker.javalimita en memoria los últimos rastreos por herramienta/herramienta objetivo.- Las reglas de extracción almacenan únicamente la plantilla de la petición en Base64 o estructuras livianas en lugar de mantener objetos vivos de la historia de Burp.
- Criterio: Elementos flotantes, cuadros de diálogo y popups deben tener como ventana padre la ventana principal de Burp (
api.userInterface().swingUtils().suiteFrame()). - Estado: CUMPLE
- Detalle / Verificación:
- Todos los
JDialogyJOptionPaneenVariableContextMenuProvider.javayVariableManager.javaespecificansuiteFrame(),mainPanelodialogcomo su ventana contenedora padre.
- Todos los
- Criterio: Referenciar el artefacto
montoya-apimediante Gradle o Maven. - Estado: CUMPLE
- Detalle / Verificación:
- Configurado en
build.gradlecomonet.portswigger.burp.extensions:montoya-api:2026.7.
- Configurado en
- Criterio: Si la extensión incluye funcionalidades de IA, debe utilizar Burp AI por defecto.
- Estado: NO APLICA (N/A)
- Detalle / Verificación:
- La extensión no hace uso de Inteligencia Artificial ni modelos de lenguaje en la versión actual.
Al realizar modificaciones en la extensión, asegúrate de verificar lo siguiente antes de compilar y enviar a la BApp Store:
- Compilación & Tests: El proyecto compila sin advertencias ni errores (
./gradlew test). - Sin Hilos Bloqueados en Swing: Ninguna petición HTTP o tarea de I/O se ejecuta en el Event Dispatch Thread (EDT).
- Log de Excepciones: Los bloques
catchen hilos secundarios reportan el stacktrace usandoapi.logging().logToError(...). - Diálogos Modal/Popups: Todos los
JDialog,JOptionPane,JFileChoosercreados tienen como padreapi.userInterface().swingUtils().suiteFrame(). - Requisitos de Red: Todas las peticiones HTTP externas utilizan
api.http().sendRequest(...), sinjava.net.URL,HttpURLConnectionniHttpClient. - Limpieza de Recursos: En
registerUnloadingHandler, se liberan adecuadamente hilos/recursos activos. - Gestión de Memoria: No se conservan referencias duraderas a grandes colecciones de
HttpRequestResponse.