Ataque de Doble Gasto o Double Spend en Bitcoin: ¿Mito o realidad?

Ataque de 51%

Un ataque de 51% es un ataque donde un actor malicioso o conjunto de actores, logran hacerse con el 51% del poder de cómputo de una red que funcione usando la Prueba de Trabajo. Con ese poder a disposición, los actores estarían en la capacidad de afectar de forma significativamente negativa el funcionamiento de la red.

Por ejemplo, podrían modificar el funcionamiento de la red haciendo que esta respete otra reglas de consenso y llevando a un hard fork, donde el resto de nodos y usuarios se verían afectados al no poder usar de forma correcta la red. También abre la posibilidad de modificar las transacciones y bloques ya confirmados de la red, habilitando el doble gasto, e incluso, pueden aprobar transacciones falsas que les permitan obtener fondos de forma ilegal dentro de la red.

Este tipo de ataque fue descrito por Satoshi Nakamoto en el whitepaper de Bitcoin, y desde entonces ha sido una de las principales preocupaciones de la comunidad que apoya a Bitcoin. La forma de evitar el mismo es aumentar la descentralización del poder de cómputo. Esto haciendo que más y más actores distintos participen en la red. Así se evita que uno (o unos pocos) pueda tener tanto poder de cómputo dentro de la red. La mayor diversificación también lleva a que el poder total de la red aumente, haciendo con esto más difícil alcanzar ese 51% necesaria para llevar con éxito este tipo de ataques.

Relacionado: Promover un ataque del 51% a la red de Bitcoin cuesta 93 BTCs por hora

Ataque Finney

Hal Finney es uno de los personajes conocidos del mundo Bitcoin, y la razón es que él fue la primera persona después de Satoshi Nakamoto en ejecutar un nodo de Bitcoin. Es más, Hal Finney recibió la primera transacción de Bitcoin, por un total de 10 BTC, directamente de Nakamoto. Durante todo su tiempo en la comunidad Bitcoin, Finney fue ampliamente entusiasta de la tecnología de Bitcoin y colaboró en la medida de sus posibilidades con el desarrollo del mismo.

Pero Finney llamaría poderosamente la atención de la comunidad, cuando el 13 de Febrero de 2011, en el foro de Bitcointalk, hablaba sobre la posibilidad de un ataque de doble gasto sobre Bitcoin. Las palabras exactas de Finney fueron:

Supongamos que el atacante está generando bloques ocasionalmente. En cada bloque que genera, incluye una transferencia de la dirección A a la dirección B, las cuales controla.

Para engañarte, cuando genera un bloque, no lo transmite. En cambio, corre a tu tienda y realiza un pago a tu dirección C con su dirección A. Espera unos segundos, no escucha nada y toma los productos. Entonces transmite su bloque ahora, y su transacción tendrá prioridad sobre la tuya.

Lo descrito llamó poderosamente la atención de la comunidad, en especial de Gavin Andresen, quien comentó:

Creo que el verdadero peligro es que un gran operador minero cree un negocio secundario que venda espacio en sus bloques para este tipo de doble gasto intencional. Cuando generan un bloque, pueden enviar un mensaje de texto a un grupo de personas diciendo «Pruebe gastar AHORA».

Me pregunto si hay alguna forma de desalentar ese tipo de comportamiento antisocial; ¿Podría la red detectar lo que se estaba haciendo y «evitar» los bloques de ese minero?

Claramente, Gavin reconocía el problema y de hecho el problema en la actualidad aún existe. El ataque Finney ciertamente es complejo y necesita de la participación de un minero con gran poder de cómputo. Pero es factible de ser realizado y lo peor, no puede ser mitigado de forma correcta sin alterar el protocolo de consenso y validación de transacciones de la red Bitcoin.

Ataque de Carrera

El Ataque de Carrera o Race Attack, es un tipo de doble gasto que afecta a los comerciantes o usuarios de Bitcoin que aceptan pagos sin confirmaciones. Básicamente este ataque consiste en que el atacante realiza un pago a un comerciante usando unas monedas, y al mismo tiempo, realiza otra transacción usando dichas monedas para enviárselas a otra dirección bajo su control. Manipulando las comisiones de ambas transacciones (bajando la comisión de la primera y subiendo la de la segunda) este tipo de ataques pueden tener mayor oportunidad de éxito. Especialmente si la mempool se encuentra congestionada y los mineros sólo dan prioridad a las transacciones con mayores comisiones.

Este es otro ejemplo de porqué se recomienda a los usuarios de criptomonedas como Bitcoin esperar al menos 3 o más confirmaciones para dar por realizada una transacción.

Ataque de Vector76

El Ataque de Vector76, fue un ataque ideado por el usuario de Bitcointalk, vector76. El 17 de agosto de 2011, vector76 usuario de Bitcointalk, comentó lo siguiente en el foro:

No necesitas extraer 2 bloques seguidos. Minar un solo bloque es suficiente si la red resuelve la bifurcación de la manera que deseas, y podría ser posible configurar las cosas para que esto sea probable.

Digamos que observó el momento en que los nodos transmiten transacciones y cómo se propagan a través de la red. Al observar qué nodos son los primeros en transmitir las transacciones desde mi objetivo, logró establecer una conexión directa con mi objetivo.

Utilizó un método similar para ver transmisiones en bloque para establecer conexiones con la mayoría de los grupos de minería.

Ahora creo una transacción haciendo un depósito válido y grande en mi objetivo. No transmito esta transacción, pero la agrego a un bloque que estoy intentando extraer. Solo mío, como de costumbre, excepto que tengo un TX extra no emitida que estoy incluyendo.

Finalmente, logró crear un bloque válido. No lo transmito de inmediato, sino que esperó hasta que alguien extrae un bloque, y cuando eso sucede, inmediatamente transmito mi bloque a mi objetivo. Si mi objetivo ve mi bloque antes que el otro bloque, lo aceptarán y mi transacción tendrá una confirmación. La cadena de bloques se ha bifurcado, y mi objetivo (y posiblemente otros nodos, si mi objetivo se retransmite lo suficientemente rápido) creerán que mi bloque es el correcto, mientras que otros nodos creerán que el otro fork es el correcto.

Solicito inmediatamente un retiro, y mi objetivo genera una transacción que envía la gran cantidad de monedas a una dirección que controlo. También gastó dos veces algunas de las entradas, enviándome las monedas. La parte de la red que no recibió mi bloque primero (que con suerte es la mayoría de los mineros) aceptará esto como válido y trabajará para incluirlo en el siguiente bloque.

Si mi bloque finalmente «gana» porque suficientes mineros vieron mi bloque primero y lo agregaron primero, entonces acabo de hacer un depósito y retiro, y no pierdo nada.

Pero si mi bloque finalmente «pierde», el depósito se invalida. Si el depósito TX no fue una de las entradas a la transacción de retiro, entonces el retiro aún es válido.

Lo descrito acá por vector76 es un ataque de doble gasto, en donde se manipula la red para hacer ganar validez a una transacción claramente ilegal. Básicamente lo que hace este ataque es hacer creer a un comerciante e incluso un exchange, que una transacción enviada a su dirección es válida.

Pero la verdad, es que esa transacción ha sido incluida y enviada a la red en un bloque prefabricado. Un bloque preparado única y exclusivamente para hacer válido el ataque de doble gasto. Como consecuencia, el bloque prefabricado del atacante y el bloque real de la red buscan llegar a la mayoría de nodos posible. El que alcance ese objetivo (replicar en la copia blockchain de la mayoría de nodos) es el bloque que ganará. Pero si el atacante logra hacerse de la mayor cantidad de conexiones relevantes dentro de la red desde un principio, logrará ese objetivo (replicar su bloque) con suma facilidad.

Este tipo de ataques es posible porque se alimenta de dos puntos estructurales de Bitcoin. En primer lugar, los nodos de Bitcoin en su mayoría tienen conexiones con direcciones IP públicas. Para un hacker resulta sencillo observar el tránsito de información dentro de la red y saber cuáles son los nodos relevantes (que tienen mayor cantidad de conexiones). Ubicados estos nodos, el atacante puede conectar nodos bajo su control y enviar información a los nodos relevantes para usarlos a favor. Al conectar estos nodos maliciosos con sus víctimas, les hace «ver» una versión de la cadena ajustada a lo que necesita para realizar su ataque con éxito.

El segundo fallo, viene dado por el protocolo de funcionamiento de la red Bitcoin. Bitcoin usa un protocolo de red propio construido usando lo mejor del protocolo Kademlia y el protocolo Gossip. Esto hace que la red Bitcoin sea muy segura y rápida.  Esto es usado a favor por el atacante para hacer que su bloque prefabricado se extienda rápidamente por la red. Al lograrlo, el protocolo de Bitcoin actúa: la blockchain válida será aquella que más nodos acepten y que sea la más larga. Así tiene garantizado el éxito de su ataque.

Ataque Eclipse

El Ataque Eclipse, por su parte es un ataque donde un hacker interfiere la conexión de un objetivo y la redirige a un grupo de nodos y mineros que el manipula. Si el atacante tiene éxito en realizar el ataque, puede manipular a su gusto el objetivo. Con ello, por ejemplo, puede hacer creer a un comerciante que una determinada transacción ha sido confirmada un número X de veces. Cuando la verdad es que todo ese tiempo ha estado recibiendo información falsa de un nodo manipulado.

Este tipo de ataques son posible en Bitcoin, debido a la apertura de la red. De hecho, un sistema parecido al Ataque Eclipse es usado por el Ataque Vector76.  Más allá de esto, el Ataque Eclipse también puede hacer algo peligroso. Puede manipular a los mineros dividiendo su poder y haciéndolos minar para una versión alterna y manipulada de la blockchain.

Este tipo de ataques fue descrito por un equipo de especialistas en el USENIX Security Symposium, en 2015.

Relacionado: El doble gasto en Bitcoin es difícil, una mirada hacia el supuesto problema