Fallos de lógica de negocio: cuando la aplicación hace lo que no debe
Guía en castellano sobre vulnerabilidades de lógica de negocio: descuentos repetidos, pasos saltados, cantidades negativas y condiciones de carrera.
Qué es
Un fallo de lógica de negocio no es un error técnico clásico como una inyección: el código hace exactamente lo que se programó, pero lo que se programó permite algo que no debería. Aplicar el mismo cupón diez veces, comprar con un precio negativo o saltarse el pago y llegar a la confirmación del pedido.
Por eso ningún escáner automático los detecta bien: hace falta entender cómo debería funcionar la aplicación y probar qué pasa al salirse del camino previsto.
Ejemplos típicos
- Cantidades y precios: números negativos, decimales, cero o valores enormes que provocan desbordamientos.
- Pasos de un proceso: ir directamente al último paso de un registro, una compra o una verificación sin pasar por los anteriores.
- Condiciones de carrera (race conditions): enviar la misma petición muchas veces a la vez para canjear un saldo, un cupón o una invitación más de una vez.
- Límites que solo se comprueban en el cliente: el botón está desactivado, pero la API acepta la petición.
- Cambios de estado inconsistentes: cancelar un pedido y seguir usando lo comprado, o bajar de plan y conservar las funciones de pago.
Cómo se busca
- Antes de probar nada, entiende el negocio: qué cuesta dinero, qué está limitado y qué depende de un paso anterior.
- Para cada regla, pregúntate qué pasa si la rompes: si repites, saltas, cambias el orden o pones valores extremos.
- Para las condiciones de carrera, envía la misma petición en paralelo. Herramientas como el single-packet attack de Burp Suite hacen que lleguen al servidor casi a la vez.
- Compara lo que la interfaz impide con lo que la API acepta.
Cómo se evita
- Validar todas las reglas en el servidor: cantidades, precios, límites y orden de los pasos.
- Guardar el estado del proceso en el servidor en lugar de confiar en lo que envía el cliente.
- Operaciones atómicas y bloqueos en la base de datos para los recursos que no se pueden gastar dos veces.
- Pensar en casos de abuso al diseñar cada función, no solo en el uso normal.
Al reportarlo
Explica la regla que debería cumplirse, cómo se rompe y el efecto concreto (dinero, acceso, límites). Si es una condición de carrera, indica cuántas peticiones necesitaste y con qué frecuencia se reproduce.
Casos reales de Lógica de negocio
Ver los 11 →Mozilla Add-ons: un homoglifo Unicode permite usar "Mozilla" como nombre visible pese a estar prohibido
El filtro de nombres reservados de addons.allizom.org bloqueaba "Mozilla", pero aceptaba la misma palabra con la "M" sustituida por una letra cheroqui idéntica a la vista, lo que permitía hacerse pasar por la cuenta oficial.
2 min
Monero: las pruebas de reservas aceptaban la misma salida repetida y multiplicaban el saldo declarado
El verificador check_reserve_proof de la cartera de Monero no rechazaba entradas duplicadas, así que una sola salida repetida N veces hacía que una prueba de reservas válida declarase N veces el saldo real.
6 min
Monero GUI: un deeplink monero:// con tx_amount=(all) activa el modo «enviar todo el saldo»
La interfaz gráfica de Monero procesaba los enlaces monero:// externos sin validar el importe, de modo que el valor interno "(all)" colaba una transferencia de todo el saldo desbloqueado hacia la dirección del atacante.
3 min
Monero: un solo firmante malicioso de un multisig puede provocar un doble pago con la excusa de «datos obsoletos»
En los monederos multifirma de Monero, el último firmante podía guardarse una transacción ya firmada, alegar el error de «stale data» y conseguir que el grupo firmase otra al mismo destino. Al emitir ambas, el pago salía dos veces.
3 min
Monero GUI: la firma offline en carteras de solo lectura se salta el bloqueo de IDs de pago largos
En monero-gui, el botón «Create» de la firma offline de transacciones no comprobaba el aviso de ID de pago largo que sí bloquea «Send», lo que permitía preparar transacciones con metadatos sin cifrar que pueden vincular pagos.
4 min
Monero GUI rellenaba el destinatario con direcciones OpenAlias aunque fallase la validación DNSSEC
Al resolver un alias OpenAlias con DNSSEC inválido, Monero GUI mostraba un aviso de posible suplantación pero escribía igualmente la dirección en el campo de destinatario, abriendo la puerta a desviar pagos.
5 min