Logo
Nuevos usuarios de RPC: 35% de descuento el primer mesVer oferta
OnFinality Learn
Infraestructura y Operaciones11 min de lectura

Auditoría de seguridad blockchain: una metodología práctica para la revisión de protocolos, contratos e infraestructura

Un flujo de trabajo reproducible para definir el alcance, ejecutar y verificar una auditoría de seguridad blockchain en contratos inteligentes, infraestructura de nodos y controles operativos.

TL;DR

La auditoría de seguridad blockchain es un examen estructurado del código, la arquitectura, los supuestos criptográficos y los controles operativos de un sistema frente a un modelo de amenazas explícito. No es la ejecución de un único escáner ni un certificado único; es un proceso repetible de definición del alcance, modelado de amenazas, pruebas, informes, remediación y reverificación. Este artículo le proporciona una metodología que puede aplicar a contratos inteligentes, clientes de protocolo y la infraestructura de nodos/RPC de la que depende su aplicación, incluidos diagnósticos ejecutables y una tabla de resultados que usted completa con sus propias mediciones. Separa la práctica documentada de auditoría de las mediciones que solo su equipo puede producir.

Qué cubre realmente una auditoría de seguridad blockchain

Una auditoría de seguridad blockchain es una revisión sistemática de un sistema en cadena o adyacente a la blockchain frente a un modelo de amenazas definido y un conjunto de estándares. En la práctica, el alcance suele abarcar cuatro capas: los contratos inteligentes o chaincode, el software del protocolo o cliente, la infraestructura de red y nodos, y los controles operativos y de gestión de claves en torno al despliegue. Cada capa tiene diferentes modos de fallo, por lo que una auditoría creíble indica qué capas están dentro del alcance y cuáles se excluyen explícitamente.

El error más común es tratar una auditoría como una insignia binaria. Una auditoría de contratos inteligentes que revisa la lógica de Solidity no cubre automáticamente la disponibilidad de su proveedor de RPC, el manejo de su clave de despliegue o la gobernanza de actualizaciones. Cuando lea un informe de auditoría, revise primero la sección de alcance: le indica qué se probó, qué suposiciones se hicieron y qué riesgo residual queda. Esta página se centra en cómo ejecutar ese proceso usted mismo o cómo evaluar críticamente una auditoría de terceros.

  • Capa de código: lógica del contrato, control de acceso, aritmética, capacidad de actualización, llamadas externas.
  • Capa de protocolo: supuestos de consenso, manejo de mensajes, exposición entre pares, configuración del cliente.
  • Capa de infraestructura: endurecimiento de nodos, exposición de RPC, almacenamiento de claves, monitoreo y conmutación por error.
  • Capa operativa: procedimientos de despliegue, respuesta a incidentes y gestión de cambios.

Requisitos previos y supuestos antes de comenzar

Antes de cualquier prueba, reúna los artefactos que necesita un auditor: el hash de commit exacto del código bajo revisión, scripts de compilación y despliegue, archivos de bloqueo de dependencias, diagramas de arquitectura y una descripción escrita del comportamiento previsto. Si el sistema ya está desplegado, registre las direcciones desplegadas y el rango de bloques que está auditando. Sin un commit fijado y un bloque fijado, los hallazgos no se pueden reproducir y la remediación no se puede verificar.

También necesita un entorno. Para la revisión de contratos, una bifurcación local de la cadena objetivo suele ser suficiente; para la revisión de infraestructura, se requiere un nodo de staging que replique la configuración de producción. Suponga que necesitará acceso de lectura a registros históricos y la capacidad de reproducir transacciones. Si depende de un endpoint RPC alojado para las pruebas, tenga en cuenta que los límites de velocidad y la profundidad de archivo pueden cambiar los resultados, así que registre el proveedor y el método utilizados para cada medición. Para obtener orientación sobre la selección de endpoints en lugar de la metodología de auditoría, el Asistente de RPC cubre opciones concretas de proveedores; este artículo se mantiene en el proceso.

Construyendo el modelo de amenazas que impulsa la auditoría

Un modelo de amenazas convierte un objetivo vago ("ser seguro") en preguntas comprobables. Comience con los activos: fondos retenidos por contratos, roles privilegiados, claves de usuario y la integridad de las transiciones de estado. Luego enumere los adversarios: atacantes externos, personas internas maliciosas o comprometidas, e infraestructura defectuosa. Asigne cada activo al límite de confianza que lo protege y enumere los supuestos de los que depende ese límite.

Los modelos clásicos ayudan a estructurar esto. STRIDE (suplantación, manipulación, repudio, divulgación de información, denegación de servicio, elevación de privilegios) es útil para enumerar superficies de ataque en servicios fuera de la cadena y API de nodos. Para la lógica en cadena, concéntrese en invariantes económicos: ¿qué debe ser siempre cierto sobre los saldos, el suministro y el acceso? Escriba esos invariantes como aserciones que pueda probar. Un hallazgo solo es significativo en relación con el invariante que viola.

  • Enumere los roles privilegiados y quién puede asumirlos, incluida la autoridad de actualización y pausa.
  • Declare cada dependencia externa: oráculos, puentes, otros contratos y proveedores de RPC.
  • Defina invariantes como la conservación del suministro total o los ratios de colateralización.
  • Clasifique las amenazas por impacto y probabilidad para que el esfuerzo de remediación siga al riesgo.

Revisión estática y escaneo automatizado del código del contrato

Las herramientas automatizadas encuentran patrones conocidos rápidamente pero pasan por alto fallos de lógica de negocio. Ejecute primero analizadores estáticos y linters para eliminar ruido de bajo valor, luego dedique tiempo de revisión humana a las transiciones de estado, el control de acceso y el orden de las llamadas externas. Registre la versión y configuración de la herramienta para que los resultados sean reproducibles. Trate cada hallazgo automatizado como una pista, no como una conclusión: confirme la explotabilidad manualmente antes de informarlo.

El siguiente ejemplo ejecuta un analizador estático contra un directorio de contratos fijado y escribe una salida legible por máquina. Reemplace la invocación de la herramienta con el analizador que use su stack; el punto es la entrada fijada y la salida guardada.

  • Audite siempre un hash de commit, nunca una rama en movimiento.
  • Guarde la salida sin procesar de la herramienta; los revisores necesitarán compararla después de la remediación.
  • Clasifique los hallazgos en confirmados, falsos positivos y necesitan revisión manual.
# Pin the code under review
cd contracts && git checkout <AUDIT_COMMIT_SHA>

# Run a static analyzer and save reproducible output
slither . --json audit-output/slither-$(date +%Y%m%d).json

# Record tool and dependency versions alongside the report
slither --version > audit-output/tool-versions.txt
forge --version >> audit-output/tool-versions.txt

Pruebas dinámicas con una cadena bifurcada

Las pruebas dinámicas ejercitan el estado desplegado, no solo el código fuente. Bifurque la cadena en el bloque que está auditando, suplante cuentas privilegiadas en el entorno de prueba e intente los ataques que predice su modelo de amenazas. Aquí es donde la reentrada, la manipulación de oráculos y los bypass de control de acceso se vuelven concretos. Mantenga cada prueba como un script para que un revisor pueda volver a ejecutarla después de una corrección.

El fragmento a continuación bifurca una cadena y suplanta una cuenta para probar una ruta privilegiada. Use marcadores de posición para su propia URL de RPC y direcciones; no codifique credenciales.

  • Fije el bloque de bifurcación para que los resultados sean estables entre ejecuciones.
  • Pruebe tanto la ruta feliz como la ruta adversarial para cada función privilegiada.
  • Capture el uso de gas y los motivos de reversión; a menudo revelan errores de lógica.
// test/privileged-path.test.js (conceptual example)
const { ethers } = require("ethers");

async function main() {
  const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
  const blockNumber = Number(process.env.AUDIT_BLOCK);

  // Impersonate a privileged account on the fork
  await provider.send("anvil_impersonateAccount", [process.env.PRIVILEGED_ADDRESS]);
  const signer = await provider.getSigner(process.env.PRIVILEGED_ADDRESS);

  const target = new ethers.Contract(process.env.TARGET_ADDRESS, ABI, signer);
  const tx = await target.sensitiveFunction();
  const receipt = await tx.wait();
  console.log("status", receipt.status, "block", blockNumber);
}

main().catch((e) => { console.error(e); process.exit(1); });

Auditoría de exposición de nodos, RPC e infraestructura

Los hallazgos de infraestructura suelen ser los de mayor impacto y menos revisados. Un endpoint RPC que expone espacios de nombres administrativos, una cuenta desbloqueada o una API de depuración sin restricciones es una vía directa a la pérdida de fondos. Revise los módulos habilitados del nodo, las direcciones de enlace, las reglas de firewall y la autenticación. Luego verifique el comportamiento desde fuera del host, no solo desde el archivo de configuración.

El siguiente diagnóstico comprueba qué métodos JSON-RPC expone un nodo y si filtra información de cuentas. Ejecútelo contra su propio nodo de staging, no contra el endpoint de un tercero. Interprete la salida según su exposición prevista: un endpoint público de solo lectura no debería responder a métodos administrativos o personales.

  • Esperado: los endpoints públicos exponen solo métodos de lectura; los espacios de nombres administrativos y personales están deshabilitados.
  • eth_accounts debería devolver un array vacío en un nodo que no contiene claves.
  • El número de pares y el estado de sincronización confirman que el nodo está saludable, no solo accesible.
curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"rpc_modules","params":[]}'

curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"eth_accounts","params":[]}'

curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":3,"method":"net_peerCount","params":[]}'

Registro de mediciones en una tabla de resultados

Los hallazgos de auditoría se vuelven defendibles cuando son reproducibles. Para las comprobaciones relacionadas con infraestructura y rendimiento, registre cada medición con su método, entorno y marca de tiempo. No publique cifras que no haya medido; la siguiente tabla es una plantilla que usted completa durante su propia auditoría.

ComprobaciónMétodoEntornoObservadoEsperadoEstado
Módulos RPC expuestosrpc_modulesnodo de staging(registrar)conjunto de solo lectura(aprobado/fallido)
Material de claves en el nodoeth_accountsnodo de staging(registrar)array vacío(aprobado/fallido)
Conectividad entre paresnet_peerCountnodo de staging(registrar)> 0(aprobado/fallido)
Invariante del contratoprueba de bifurcaciónbifurcación en el bloque N(registrar)el invariante se cumple(aprobado/fallido)
Control de accesoprueba de suplantaciónbifurcación en el bloque N(registrar)reversión para no autorizados(aprobado/fallido)

Mantenga la salida sin procesar del comando junto a la tabla. Cuando se aplique una corrección, vuelva a ejecutar el comando idéntico contra el mismo entorno y agregue una segunda fila en lugar de sobrescribir la primera. Ese historial es lo que convierte una auditoría en evidencia.

Solución de problemas comunes que bloquean la auditoría

Las auditorías se estancan por razones predecibles. Si los hallazgos no se pueden reproducir, la causa habitual es un commit no fijado, un bloque de bifurcación diferente o un proveedor de RPC diferente que devuelve un estado inconsistente. Si las pruebas dinámicas pasan localmente pero fallan en staging, compare la configuración del nodo y la altura de la cadena antes de asumir un error de código. Si un analizador le inunda con hallazgos, ajuste su configuración en lugar de ignorar la salida por completo.

Las comprobaciones de infraestructura a menudo fallan por razones ambientales: una regla de firewall bloquea la sonda, el nodo aún se está sincronizando o el endpoint tiene límite de velocidad. Confirme el estado de sincronización y los límites de velocidad antes de concluir que un método está deshabilitado. Cuando dependa de un endpoint alojado, documente sus límites en el alcance de la auditoría para que los revisores entiendan qué resultados dependen del proveedor.

  • Resultados inconsistentes: verifique el hash del commit, el bloque de bifurcación y el proveedor.
  • Fallos silenciosos de RPC: revise el estado HTTP y los objetos de error JSON-RPC, no solo los códigos de salida.
  • Datos de archivo faltantes: confirme que el endpoint admite estado histórico para su rango de bloques.
  • Pruebas inestables: aísle el estado por ejecución de prueba en lugar de compartir una bifurcación mutable.

Limitaciones, compensaciones y lo que una auditoría no puede probar

Ninguna auditoría prueba que un sistema sea seguro. Muestrea un alcance definido en un momento dado frente a un modelo de amenazas que puede ser incompleto. Los cambios de código posteriores a la auditoría invalidan sus conclusiones a menos que se revise el delta. Los ataques económicos, la captura de gobernanza y los escenarios de compromiso de claves a menudo quedan completamente fuera de la revisión de código y requieren controles operativos.

También hay una compensación de costos. Una revisión más profunda de cada dependencia es costosa, por lo que el alcance debe seguir al riesgo: las funciones privilegiadas, la lógica que retiene fondos y la infraestructura accesible externamente merecen la mayor atención. Sea explícito sobre el riesgo residual en el informe en lugar de implicar completitud. Una declaración de alcance breve y honesta es más útil que un informe largo con suposiciones ocultas.

De la auditoría a la garantía continua

El paso final es convertir los hallazgos únicos en controles continuos. Convierta los hallazgos confirmados en pruebas de regresión, agregue comprobaciones de invariantes a CI y monitoree las comprobaciones de infraestructura de forma programada. Vuelva a auditar después de cambios materiales como actualizaciones, nuevas dependencias externas o cambios en la gestión de claves. Realice un seguimiento del estado de remediación en la misma tabla que utilizó durante la auditoría para que nada se pierda entre rondas.

Si su aplicación depende de infraestructura RPC alojada, incluya el comportamiento del proveedor en su plan de garantía: la disponibilidad, la cobertura de métodos y la profundidad de archivo afectan lo que su monitoreo puede detectar. Para decisiones concretas de endpoints y proveedores, use el Asistente de RPC; para la metodología circundante, mantenga actualizados el alcance de la auditoría, el modelo de amenazas y la tabla de resultados. Para profundizar en el lado de la infraestructura, consulte la guía de alojamiento de nodos blockchain, compare opciones de servicio RPC, revise la cobertura de red y evalúe nodo dedicado y precios de RPC frente a los requisitos de disponibilidad de su auditoría.

  • Agregue pruebas de invariantes y control de acceso a CI para que las regresiones fallen rápidamente.
  • Programe sondas de infraestructura y alerte sobre exposición inesperada de métodos.
  • Vuelva a auditar después de actualizaciones, cambios de dependencias y cambios en la gestión de claves.
  • Mantenga la tabla de resultados versionada junto al código que describe.

Nunca te preocupes por la infraestructura nuevamente

OnFinality elimina la carga pesada de DevOps para que puedas construir de forma más inteligente y rápida.

Comenzar