Resumen de gestión
Qtum se puso en contacto con Sayfer Security para realizar pruebas de penetración en MetaMask Snap de Qtum en 05/2024.
Antes de evaluar los servicios anteriores, realizamos una reunión inicial con el equipo técnico de Qtum y recibimos una descripción general del sistema y los objetivos de esta investigación.
Durante el período de investigación de 2 semanas, descubrimos 5 vulnerabilidades en el sistema, ninguna de ellas crítica.
En conclusión, se deben implementar varias correcciones después del informe, pero la postura de seguridad del sistema es competente.
Después de una revisión por parte del equipo de Sayfer, certificamos que todos los problemas de seguridad mencionados en este informe han sido abordados por el equipo de Qtum.
Metodología de Riesgo
En Sayfer, estamos comprometidos a ofrecer pruebas de penetración de la más alta calidad a nuestros clientes. Es por eso que hemos implementado un modelo integral de evaluación de riesgos para evaluar la gravedad de nuestros hallazgos y brindar a nuestros clientes las mejores recomendaciones posibles para la mitigación.
Nuestro modelo de evaluación de riesgos se basa en dos factores clave: IMPACTO y PROBABILIDAD. El impacto se refiere al daño potencial que podría resultar de un problema, como pérdidas financieras, daños a la reputación o un sistema no operativo. La probabilidad se refiere a la probabilidad de que ocurra un problema, teniendo en cuenta factores como la complejidad del ataque y la cantidad de atacantes potenciales.
Al combinar estos dos factores, podemos crear una comprensión integral del riesgo que plantea un problema en particular y brindar a nuestros clientes una evaluación clara y procesable de la gravedad del problema. Este enfoque nos permite priorizar nuestras recomendaciones y garantizar que nuestros clientes reciban el mejor asesoramiento posible sobre cómo proteger su negocio.
El riesgo se define de la siguiente manera:

Vulnerabilidades por Riesgo
Alto – Amenaza directa a los procesos clave del negocio.
Media – Amenaza indirecta a los procesos comerciales clave o amenaza parcial a los procesos comerciales.
Bajo – No existe amenaza directa. La vulnerabilidad puede explotarse utilizando otras vulnerabilidades.
Informativo – Este hallazgo no indica vulnerabilidad, pero establece un comentario que notifica sobre fallas de diseño e implementación incorrecta que podría causar un problema a largo plazo.
Nuevo enfoque
Metodología de Evaluación de Seguridad
usos sayfer OWASP WSTG como nuestro estándar técnico al revisar aplicaciones web. Después de obtener una comprensión profunda del sistema, decidimos qué pruebas OWASP se requieren para evaluar el sistema.
Evaluacion de seguridad
Después de comprender y definir el alcance, realizar modelos de amenazas y evaluar las pruebas correctas necesarias para verificar completamente la aplicación en busca de fallas de seguridad, realizamos nuestra evaluación de seguridad.
Descripción de la tabla de problemas
Título del problema
| ID | DECIR-??: Una identificación para facilitar la comunicación sobre cada vulnerabilidad |
| Estado | Abierto/Fijo/Reconocido |
| Supervisión | Representa el factor de riesgo del problema. Para obtener más descripción, consulte la Vulnerabilidades por Riesgo . |
| Impacto en el negocio | El principal riesgo de la vulnerabilidad a nivel empresarial. |
| Ubicación | La URL o el archivo en el que se detectó este problema. Los problemas sin ubicación no tienen una ubicación particular y se refieren al producto en su conjunto. |
Descripción
Aquí proporcionamos una breve descripción del problema y cómo se formó, los pasos que seguimos para encontrarlo o explotarlo, junto con una prueba de concepto (si está presente) y cómo este problema puede afectar al producto o a sus usuarios.
Mitigación
Opciones de resolución sugeridas para este problema y enlaces a sitios recomendados para una mayor solución.
Evaluación de seguridad
Se realizaron las siguientes pruebas mientras se auditaba el sistema.
Recopilación de información
| Recopilación de información | Nombre de la prueba |
| WSTG-INFO-01 | Llevar a cabo un reconocimiento de descubrimiento de motores de búsqueda para detectar fugas de información |
| WSTG-INFO-02 | Servidor web de huellas dactilares |
| WSTG-INFO-03 | Revise los metarchivos del servidor web para detectar fugas de información |
| WSTG-INFO-04 | Enumerar aplicaciones en el servidor web |
| WSTG-INFO-05 | Revisar el contenido de la página web para detectar fugas de información |
| WSTG-INFO-06 | Identificar los puntos de entrada de la aplicación |
| WSTG-INFO-07 | Asignar rutas de ejecución a través de la aplicación |
| WSTG-INFO-08 | Marco de aplicaciones web de huellas dactilares |
| WSTG-INFO-09 | Aplicación web de huellas dactilares |
| WSTG-INFO-10 | Arquitectura de aplicaciones de mapas |
Pruebas de gestión de configuración e implementación
| Pruebas de gestión de configuración e implementación | Nombre de la prueba |
| WSTG-CONF-01 | Configuración de infraestructura de red de prueba |
| WSTG-CONF-02 | Configuración de la plataforma de aplicaciones de prueba |
| WSTG-CONF-03 | Manejo de extensiones de archivo de prueba para información confidencial |
| WSTG-CONF-04 | Revise la copia de seguridad antigua y los archivos sin referencia en busca de información confidencial |
| WSTG-CONF-05 | Enumerar interfaces de administración de aplicaciones e infraestructura |
| WSTG-CONF-06 | Probar métodos HTTP |
| WSTG-CONF-07 | Probar la seguridad de transporte estricta de HTTP |
| WSTG-CONF-08 | Probar la política de dominios cruzados de RIA |
| WSTG-CONF-09 | Permiso de archivo de prueba |
| WSTG-CONF-10 | Prueba de adquisición de subdominio |
| WSTG-CONF-11 | Prueba de almacenamiento en la nube |
Pruebas de gestión de identidad
| Pruebas de gestión de identidad | Nombre de la prueba |
| WSTG-IDNT-01 | Definiciones de roles de prueba |
| WSTG-IDNT-02 | Proceso de registro de usuario de prueba |
| WSTG-IDNT-03 | Proceso de aprovisionamiento de cuenta de prueba |
| WSTG-IDNT-04 | Pruebas de enumeración de cuenta y cuenta de usuario adivinable |
| WSTG-IDNT-05 | Prueba de política de nombre de usuario débil o no aplicada |
Pruebas de autenticación
| Pruebas de autenticación | Nombre de la prueba |
| WSTG-ATHN-01 | Prueba de credenciales transportadas a través de un canal cifrado |
| WSTG-ATHN-02 | Prueba de credenciales predeterminadas |
| WSTG-ATHN-03 | Prueba de mecanismo de bloqueo débil |
| WSTG-ATHN-04 | Prueba para eludir el esquema de autenticación |
| WSTG-ATHN-05 | Prueba para recordar contraseña vulnerable |
| WSTG-ATHN-06 | Prueba de debilidades de caché del navegador |
| WSTG-ATHN-07 | Prueba de política de contraseña débil |
| WSTG-ATHN-08 | Prueba de respuesta de pregunta de seguridad débil |
| WSTG-ATHN-09 | Prueba de funcionalidades de cambio o restablecimiento de contraseña débil |
| WSTG-ATHN-10 | Prueba de autenticación más débil en canal alternativo |
Pruebas de autorización
| Pruebas de autorización | Nombre de la prueba |
| WSTG-ATHZ-01 | Prueba de inclusión de archivos transversales de directorios |
| WSTG-ATHZ-02 | Pruebas para eludir el esquema de autorización |
| WSTG-ATHZ-03 | Pruebas de escalada de privilegios |
| WSTG-ATHZ-04 | Pruebas de referencias de objetos directos inseguros |
Pruebas de gestión de sesiones
| Pruebas de gestión de sesiones | Nombre de la prueba |
| WSTG-SESS-01 | Prueba del esquema de gestión de sesiones |
| WSTG-SESS-02 | Prueba de atributos de cookies |
| WSTG-SESS-03 | Prueba de Fijación de Sesión |
| WSTG-SESS-04 | Prueba de variables de sesión expuestas |
| WSTG-SESS-05 | Pruebas de falsificación de solicitudes entre sitios |
| WSTG-SESS-06 | Prueba de funcionalidad de cierre de sesión |
| WSTG-SESS-07 | Tiempo de espera de la sesión de prueba |
| WSTG-SESS-08 | Prueba de desconcierto de sesión |
| WSTG-SESS-09 | Prueba de secuestro de sesión |
Pruebas de validación de datos
| Pruebas de validación de datos | Nombre de la prueba |
| WSTG-INPV-01 | Pruebas de secuencias de comandos de sitios cruzados reflejadas |
| WSTG-INPV-02 | Pruebas de secuencias de comandos entre sitios almacenadas |
| WSTG-INPV-03 | Prueba de manipulación de verbos HTTP |
| WSTG-INPV-04 | Pruebas de contaminación de parámetros HTTP |
| WSTG-INPV-05 | Pruebas de inyección SQL |
| WSTG-INPV-06 | Prueba de inyección LDAP |
| WSTG-INPV-07 | Pruebas de inyección XML |
| WSTG-INPV-08 | Pruebas de inyección de SSI |
| WSTG-INPV-09 | Prueba de inyección XPath |
| WSTG-INPV-10 | Pruebas de inyección IMAP SMTP |
| WSTG-INPV-11 | Pruebas de inyección de código |
| WSTG-INPV-12 | Prueba de inyección de comandos |
| WSTG-INPV-13 | Prueba de inyección de cadenas de formato |
| WSTG-INPV-14 | Pruebas de vulnerabilidad incubada |
| WSTG-INPV-15 | Pruebas de contrabando de división HTTP |
| WSTG-INPV-16 | Prueba de solicitudes entrantes HTTP |
| WSTG-INPV-17 | Prueba de inyección de encabezado de host |
| WSTG-INPV-18 | Prueba de inyección de plantilla del lado del servidor |
| WSTG-INPV-19 | Pruebas de falsificación de solicitudes del lado del servidor |
Gestión de errores
| Gestión de errores | Nombre de la prueba |
| WSTG-ERRH-01 | Pruebas para el manejo inadecuado de errores |
| WSTG-ERRH-02 | Prueba de rastros de pila |
Criptografía
| Criptografía | Nombre de la prueba |
| WSTG-CRYP-01 | Pruebas de seguridad de capa de transporte débil |
| WSTG-CRYP-02 | Pruebas para Padding Oracle |
| WSTG-CRYP-03 | Pruebas de información confidencial enviada a través de canales no cifrados |
| WSTG-CRYP-04 | Pruebas de cifrado débil |
Pruebas de lógica de negocios
| Pruebas de lógica de negocios | Nombre de la prueba |
| WSTG-BUSL-01 | Prueba de validación de datos de lógica empresarial |
| WSTG-BUSL-02 | Capacidad de prueba para falsificar solicitudes |
| WSTG-BUSL-03 | Comprobaciones de integridad de la prueba |
| WSTG-BUSL-04 | Prueba de temporización del proceso |
| WSTG-BUSL-05 | Prueba Número de veces que se puede usar una función Límites |
| WSTG-BUSL-06 | Pruebas de elusión de flujos de trabajo |
| WSTG-BUSL-07 | Pruebe las defensas contra el mal uso de la aplicación |
| WSTG-BUSL-08 | Carga de prueba de tipos de archivos inesperados |
| WSTG-BUSL-09 | Carga de prueba de archivos maliciosos |
Pruebas del lado del cliente
| Pruebas del lado del cliente | Nombre de la prueba |
| WSTG-CLNT-01 | Pruebas para Cross Site Scripting basado en DOM |
| WSTG-CLNT-02 | Prueba de ejecución de JavaScript |
| WSTG-CLNT-03 | Prueba de inyección de HTML |
| WSTG-CLNT-04 | Prueba de redirección de URL del lado del cliente |
| WSTG-CLNT-05 | Pruebas de inyección de CSS |
| WSTG-CLNT-06 | Pruebas de manipulación de recursos del lado del cliente |
| WSTG-CLNT-07 | Probar el intercambio de recursos de origen cruzado |
| WSTG-CLNT-08 | Prueba de intermitencia entre sitios |
| WSTG-CLNT-09 | Pruebas de secuestro de clics |
| WSTG-CLNT-10 | Prueba de WebSockets |
| WSTG-CLNT-11 | Prueba de mensajería web |
| WSTG-CLNT-12 | Probar el almacenamiento del navegador |
| WSTG-CLNT-13 | Pruebas para la inclusión de secuencias de comandos en sitios cruzados |
Prueba de API
| Prueba de API | Nombre de la prueba |
| WSTG-APIT-01 | Probando GraphQL |
Ordenar auditoría de Sayfer
Conclusiones de la evaluación de seguridad
No hay método para eliminar redes agregadas
| ID | DECIR-01 |
| Estado | Fijo |
| Supervisión | Bajo |
| Impacto en el negocio | No es posible eliminar redes individuales agregadas desde el complemento. |
| Ubicación | – paquetes/snap/src/helpers.ts:105 |
Descripción
El código implementa la capacidad de agregar redes adicionales, ampliando su lista más allá de la predeterminada. Sin embargo, se observó que no hay forma de eliminarlos excepto reinstalando el complemento. Esta funcionalidad probablemente fue planeada, porque existe una función removeNetwork(), pero no es posible llamarla desde métodos disponibles públicamente.
export const networks = {
get: getNetworks,
setCurrent: setCurrentNetwork,
add: addNetwork,
remove: removeNetwork,
};
Mitigación
Recomendamos implementar este método, como probablemente se pretendía.
Falta mensaje de confirmación para exportar claves privadas
| ID | DECIR-02 |
| Estado | Fijo |
| Supervisión | Bajo |
| Impacto en el negocio | Riesgo de fuga de la clave privada cuando se muestra por error en una pantalla, por ejemplo en un lugar público. |
| Ubicación | – paquetes/snap/src/index.ts:145 |
Descripción
En la mayoría de las funciones críticas del complemento, se muestra un cuadro de diálogo que informa al usuario sobre la acción que se está realizando y solicita su aprobación.
Sin embargo, esta medida de seguridad no está presente en el método WalletExportPrivateKey, el que se utiliza para mostrar la clave privada en la pantalla instantánea. Si se invoca por error, mostrará inmediatamente la clave privada.
Mitigación
Antes de mostrar la clave privada, agregue un mensaje de confirmación solicitando la aprobación del usuario.
Múltiples métodos no implementados
| ID | DECIR-03 |
| Estado | Fijo |
| Supervisión | Bajo |
| Impacto en el negocio | Existe el riesgo de que algunos de los métodos que no se implementaron puedan ser importantes para la funcionalidad del complemento y se pasen por alto accidentalmente. |
| Ubicación | – paquetes/snap/src/index.ts:163, 169, 260, 266, 272, 278, 284, 290, 296, 302, 308, 314, 320, 326, 472, 509, 541, 568, 574, 580 , 586, 592, 609, 615, 637, 643, 649, 655, 696, 735, 741, 747, 753, 759, 765, 771, 777, 783 |
Descripción
Una gran parte de los métodos presentes en el complemento parecen no utilizarse. Sólo existe el texto estándar que los rodea, pero no ninguna lógica concreta.
Mitigación
Recomendamos revisar los métodos que le gustaría implementar en su complemento y asegurarse de que todos contengan una lógica real. El usuario no debería poder llamar a métodos innecesarios que no pretende implementar.
Código redundante
| ID | DECIR-04 |
| Estado | Fijo |
| Supervisión | Informativo |
| Impacto en el negocio | Los métodos que hacen lo mismo y devuelven los mismos datos aumentan innecesariamente el tamaño del código base del complemento. |
| Ubicación | – paquetes/snap/src/index.ts:332, 338 |
Descripción
Durante nuestro análisis, notamos que dos métodos RPC, EthRequestAccounts y EthAccounts, parecen hacer lo mismo y devolver los mismos valores.
case RPCMethods.EthRequestAccounts: {
const wallet = await getWallet();
return [wallet.address];
}
case RPCMethods.EthAccounts: {
console.log('RPCMethods.EthAccounts');
console.log('request.params', JSON.stringify(request.params));
const wallet = await getWallet();
return [wallet.address];
}
En ambos casos, estos métodos recuperan los datos de la billetera activa usando getWallet() y luego devuelven su dirección. Actualmente, la única diferencia es que EthAccounts registra mientras que EthRequestAccounts no.
Mitigación
Considere eliminar uno de los métodos o modificar uno para diferenciarlo del otro.
Comentarios TODO sobrantes
| ID | DECIR-05 |
| Estado | Fijo |
| Supervisión | Informativo |
| Impacto en el negocio | Los comentarios TODO y las secciones de código comentadas pueden proporcionar a los atacantes potenciales información valiosa, además de parecer poco profesionales. |
| Ubicación | – paquetes/snap/src/index.ts:460, 550 – paquetes/snap/src/polyfill.ts:7 – paquetes/snap/src/helpers/parsers/tx.ts:55 |
Descripción
El código base contiene varios comentarios TODO y también secciones de código comentado que ya no se utiliza.
Si bien esto es aceptable en un entorno de prueba, debe eliminarse en producción. Dichos comentarios pueden proporcionar a una posible parte interesada información valiosa sobre las funcionalidades faltantes, las medidas de seguridad y las opiniones de los desarrolladores, que pueden usarse para perfilar los ataques.
Mitigación
Sugerimos eliminar los comentarios marcados como TODO y los fragmentos de código no utilizados en su rama de producción.




