En la competencia por la palabra más popular del año, la palabra "blockchain" probablemente se convertiría en el ganador de la esfera de TI. A pesar del hecho de que existe una tendencia
poco saludable a introducirlo activamente en cualquier lugar: en medicina, economía, Internet de las cosas, criar conejos y hacer pasteles, las criptomonedas siguen siendo el alcance principal de la cadena de bloques. Y todos lo saben: billeteras virtuales para hackers, como un gato con crema agria.
En este artículo, consideraremos el ataque "Timejacking", basado en la vulnerabilidad en el procesamiento de marcas de tiempo de bloques en el sistema de criptomonedas Bitcoin, e intentaremos explicar por qué el ataque es así, y su implementación exitosa no lo es.
PD: Habrá muchos derivados de la palabra "tiempo". Mucho
En pocas palabras
Por primera vez, Alex Boverman escribió sobre el ataque de Timejacking. Puede familiarizarse con su publicación
aquí . Cuál es la esencia: el ataque explota las vulnerabilidades del mecanismo para verificar las marcas de tiempo de los bloques y el contador de tiempo en Bitcoin. El atacante manipula uno de los contadores de tiempo del nodo víctima y crea un bloque "envenenado". La víctima soltará este bloqueo, y el resto de la red aceptará con éxito, y por favor, ¡hemos provocado una bifurcación! Toda la red utiliza una cadena de bloques construidos después del "envenenado", y la víctima considera que una cadena alternativa con gasto repetido de fichas (también conocido como doble gasto), en el que el bloque "envenenado" no aparece, es válida.
El ataque se lleva a cabo en dos etapas. Para que quede más claro, hablemos de cada uno de ellos por separado.
Acto 1. Creando un tenedor y aislando a la víctima
Un atacante necesita generar una "MANZANA de contención", el bloque muy "envenenado" que la víctima ignorará. Del mismo modo, la víctima soltará otros bloques que se agregarán secuencialmente después del "envenenado".
¿Cómo engañar a una víctima y obligarla a soltar el bloqueo correcto?El encabezado de cada bloque tiene una marca de tiempo que el nodo verifica durante la verificación. Este valor debe caer en un cierto rango, lo llamaremos una ventana temporal. El intervalo de la ventana de tiempo se muestra en la figura a continuación:
La ventana de tiempo tiene dos límites:
- menor - t min , es igual a la mediana de las marcas de tiempo de 11 bloques que preceden al bloque verificado
- superior - igual al valor del tiempo de red t 0 + 2 horas
El valor de la marca de tiempo del bloque se verifica no con respecto al tiempo del sistema del nodo, sino con respecto al tiempo medio de sus vecinos: tiempo de red (también conocido como tiempo ajustado por la red).
Cómo se considera el tiempo de red:
- Cuando se establece una nueva conexión, los nodos intercambian la hora de su sistema
- Cada nodo calcula la desviación de su propio tiempo del sistema del tiempo del sistema de cada uno de sus vecinos
- Para las desviaciones calculadas, se selecciona el valor medio.
- Hora del sistema nativo + desviación media = hora de la red
Aquí hay un ejemplo de cálculo del tiempo de red:
Por lo tanto, un atacante puede manipular el valor del tiempo de red de la víctima conectándose a él un número suficiente de vecinos que anuncian el tiempo de retraso del sistema. El valor del tiempo de red de la víctima disminuye: el límite superior del rango de valores admisibles de la marca de tiempo del bloque verificado disminuye. Pero si la desviación del tiempo del vecino excede los
70 minutos , entonces su tiempo no se tendrá en cuenta al calcular el tiempo de la red. Por lo tanto, el valor máximo por el cual se puede reducir el tiempo de red de la víctima es de 70 minutos.
En consecuencia, nuestro bloque "envenenado" es un bloque cuya marca de tiempo debe caer en la ventana de tiempo de todos los nodos de la red, excepto la víctima. Solo entonces toda la red lo aceptará con éxito, y la víctima cuyo tiempo de red se modifique no lo dejará con menos éxito. En la figura siguiente, la ventana de tiempo de la víctima frente a la ventana de tiempo de los nodos restantes.
Tenga en cuenta que, gracias al protocolo NTP, podemos suponer que para la mayoría de los nodos la hora del sistema es aproximadamente la misma, es decir, la hora de la red de cada nodo tiene un valor cercano a la hora de su sistema.
Como resultado, la víctima está aislada de la red principal y considera que la cadena principal de bloques es incorrecta, que será construida por el resto de los nodos del bloque "envenenado". Al mismo tiempo, la víctima aceptará con confianza los otros bloques, generosamente generados por el atacante para la cadena alternativa.
Acto 2. Doble gasto
En esta etapa, el atacante genera una cadena alternativa, en la que agrega una transacción que transfiere fichas a la billetera de la víctima. Se envían bloques de cadena alternativos a la víctima. En la figura siguiente, el rango de valores de la marca de tiempo del bloque "envenenado".
La víctima aceptará esta cadena, porque el intruso selecciona el valor de las marcas de tiempo de su propia ventana de tiempo, y los nodos restantes lo ignorarán correctamente; después de todo, ya están construyendo su cadena del bloque "envenenado", que es más largo que la alternativa. Como resultado, la víctima cree que recibió tokens y envía los bienes. Y la red principal está segura de que los tokens no dejaron la billetera del atacante, y él recibe los productos por "gracias"; después de todo, la mayoría no puede confundirse. ¡Final, el héroe del lado oscuro triunfa!
Pero no tan simple
Escollo No. 1Enorme poder de cómputo está involucrado en la minería de Bitcoin hoy. La probabilidad de la generación exitosa de un bloque "envenenado" puede estimarse mediante la siguiente fórmula:
Hoy, el
hashrate total de la red Bitcoin es aproximadamente igual a H = 34 ∙ 10
18 hash / s. En este caso, utilizando el dispositivo más productivo de
esta lista , cuya tasa de hash declarada es h = 18 ∙ 10
12 hash / s, la probabilidad de generar un bloque "envenenado" en 1 año (t = 365 ∙ 24 ∙ 60) es aproximadamente 3%. Y si tomamos de
estas estadísticas un grupo minero relativamente pequeño que tiene el 0.3% del hashrate total, entonces la probabilidad de una generación exitosa de bloques en 3 días es del 73%.
Escollo No. 2Con el paso del tiempo de la red de la víctima, la marca de tiempo del bloque "envenenado" finalmente caerá en la ventana de tiempo de la víctima. Luego, la víctima cambiará la cadena alternativa a la principal, ya que toda la red funciona en ella y su altura será mayor. El bloque "envenenado" caerá en el intervalo de tiempo de la víctima en no más de 70 minutos; este es el tiempo máximo durante el cual es necesario completar la segunda etapa.
Para que la víctima acepte la transacción con doble gasto, el bloqueo debe ser confirmado por otros 6 bloques (para un cliente estándar). El infractor deberá generar bloques de confirmación de forma independiente, y al mismo tiempo es necesario cumplir con los 70 minutos antes mencionados. Boverman
considera una situación en la que un atacante posee el 10% del poder de toda la red. En tal situación, tomará ~ 5.5 horas generar 6 bloques con una tasa de éxito del 10%. Durante 3.3 horas, la probabilidad de éxito cae al 1%, durante 140 minutos - 0.147%. Según estas estimaciones, generar 6 bloques con éxito en 70 minutos es una fantasía.
Escollo No. 3Cuando el nodo calcula el tiempo de la red, tiene en cuenta el tiempo del sistema de solo los
primeros 200 vecinos ; luego, la desviación media no se volverá a calcular. Esto significa que el ataque debe implementarse hasta que el número de vecinos ya conectados a la víctima no exceda de 99; de lo contrario, el tiempo anunciado por el atacante no será la mediana. Este número de vecinos se ejecutará en aproximadamente 24 horas, y después de eso, la víctima deberá reiniciarse, por ejemplo, utilizando DoS.
El final
En conclusión, podemos decir que el ataque "Timejacking" es muy bueno, pero en las duras realidades Bitcoin se está volviendo inaplicable. ¿Qué pasa con otros sistemas que usan blockchain? ¡Permítanos dejar esta pregunta para su investigación adicional!