Race condition attack
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 30/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript, sql
Línea de trabajo
Comienza con src/methods.js en las líneas referenciadas alrededor de updateEntity y revisa cómo se gestionan las actualizaciones concurrentes. Reproduce el comportamiento con solicitudes Promise.all paralelas e inspecciona la compatibilidad con transacciones del adaptador de base de datos. Se considera terminado cuando las actualizaciones concurrentes del saldo no pueden producir el resultado inconsistente demostrado, utilizando el comportamiento de transacciones o bloqueo compatible con el proyecto.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
There is such a problem as the race condition attack.
This problem is famous when using the ORM pattern as Active Record and Data Mapper.
We get a record for changes and change it outside the transaction, which means that we can execute precisely the same query in parallel.
Consider a simple attack in transferring $5 from Alice to Bob:
Get balance Alice -> $5 -> transfer to Bob -$5 -> get balance Bob -> $0 -> received from Alice +$5
And now, if two queries were running at the same time:
Query 1: Get balance Alice -> $5 (race condition!) -> transfer to Bob -$5 -> get balance Bob -> $0 -> received from Alice +$5
Query 2: Get balance Alice -> $5 (race condition!) -> transfer to Bob -$5 -> get balance Bob -> $5 -> recieved from Alice +$5
Bob has a balance of $10, and Alice has $5.
It is elementary to check this behaviour by calling the Promise.all() method, we generate ten requests and, depending on the network, and the processing speed of the database, from 2 to 10 requests will pass simultaneously.
In SQL, the first statement must be with SELECT FOR UPDATE to block against concurrent updates, or both wrapped in a SERIALIZABLE transaction isolation level.
How can we protect ourselves now?
We must wrap the updateEntity method in a transaction with isolation level SERIALIZABLE.
Or use moleculer-channels to update items in strong FIFO in Kafka.
- Lenguaje dominante
- JavaScript
- Estrellas
- 33
- Forks
- 15
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de moleculerjs/database
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
moleculerjs/database#99 ·
-
Request: TypeScript SupportAbiertoenhancement help wanted
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
moleculerjs/database#79 · 2 comentarios ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
moleculerjs/database#75 ·
-
enhancement help wanted
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
moleculerjs/database#69 · 1 comentario ·
-
Add support for Cassandra DBAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 15/100
moleculerjs/database#54 ·
Todos los issues de moleculerjs/database
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
-
tech-debt
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
srikanth235/centraid#1155 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
microsoft/monaco-editor#5563 ·
Los mantenedores suelen responder en 1 día
-
Package downloads never retry: getUrlWithResuming's retry catch cannot see a rejected requestAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
Los mantenedores suelen responder en 1 día