Prácticas recomendadas de seguridad
Un resumen condensado de las 25 prácticas de seguridad de programas más importantes extraídas de todas las páginas de esta sección.
-
Signer en cada mutación: Asocia cada movimiento de lamport/token a un
Signerrequerido (Comprobaciones de Signer y Propietario). -
Cuentas tipadas sobre UncheckedAccount: Usa
Account<'info, T>por defecto; documenta las excepciones. -
has_one para campos de autoridad: Vincula las claves públicas de autoridad del estado a las cuentas de firma.
-
Restricciones de Mint y propietario: Las cuentas de token deben coincidir con el mint esperado y el enlace de la bóveda (Validación de Cuentas).
-
Semillas canónicas de PDA: Almacena el bump en la inicialización; usa
seeds+bumpen cada ix de PDA (Ataques de PDA). -
Evita init_if_needed: Prefiere
initdedicado; si se usa, protégelo conis_initialized(Reinicialización). -
Matemáticas comprobadas en todas partes: No uses
+/-simples en saldos (Aritmética). -
Intermedios u128: Multiplica antes de dividir para las matemáticas de participación y AMM.
-
Redondea contra los usuarios: Las comisiones se redondean hacia arriba; los pagos se redondean hacia abajo - documenta la política.
-
Comprobaciones-efectos-interacciones: Actualiza el estado antes de CPI (Riesgos de CPI).
-
Lista de permitidos de programas de CPI:
require_keys_eq!en cada ID de programa externo. -
Programa de token tipado: Usa
Program<'info, Token>en lugar deAccountInfoen bruto. -
Antigüedad de oráculo:
get_price_no_older_thancon una antigüedad máxima estricta (Oráculos). -
Fija las claves públicas de oráculo: Nunca las proporcione el usuario sin una lista de permitidos.
-
Sin metadatos de cuenta duplicados:
constraint = a.key() != b.key()donde sea posible el doble conteo. -
Sysvars tipados:
Sysvar<'info, Clock>en lugar de cuentas falsificables. -
Atributo close de forma segura:
close = destinationsolo con comprobaciones de autoridad. -
Ejecuta el catálogo de Sealevel por PR: Pase rápido contra S1-S15 (Catálogo).
-
Pruebas negativas de LiteSVM: Conjuntos de cuentas adversarias para cada ix (Pruebas de CPIs).
-
Fuzzing de rutas matemáticas: Trident en los manejadores de depósito/retiro/intercambio (Fuzzing).
-
Compilaciones verificables: Publica el hash de
solana-verifycon las versiones. -
Autoridad de actualización multisig: Sin actualización de clave única en TVL de producción.
-
Minimiza el alcance de invoke_signed: Estrecha las semillas de PDA por CPI.
-
Audita antes de la TVL en mainnet: Sigue el Flujo de trabajo de auditoría.
-
Cierre ante fallos: Cuando la validación sea incierta, devuelve un error; nunca continúes con esfuerzo mínimo.
Preguntas frecuentes
¿Cuál es la práctica con mayor ROI?
Restricciones de Signer + mint + propietario en todas las instrucciones de token: previene la mayoría de los exploits históricos.
¿Debería prohibir init_if_needed por completo?
Prohíbelo en rutas de administración de producción; si se usa para la incorporación de usuarios, es obligatorio el guardián is_initialized.
¿Cómo interactúan las prácticas con los límites de CU?
Las restricciones añaden CU pero son mucho más baratas que los exploits: optimiza solo después de la cobertura de seguridad.
Relacionados
- Conceptos básicos de seguridad - entrada de sección
- Catálogo de ataques de Sealevel - mapa de ataques
- Prácticas recomendadas de pruebas - política de pruebas
- Prácticas recomendadas de implementación - seguridad de lanzamiento
Versiones de la pila: Esta página se escribió para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 y LiteSVM 0.6.x.