Pseudo-nodo y vectores de ataque putativos en la red

Pseudo-Node se discute aquí en /r/Bitcoin de Reddit

Esencialmente, funciona para retransmitir llamadas desde nodos conectados de forma aleatoria.

Este fue un experimento sobre la facilidad con la que se pueden "falsificar" los nodos completos. En conclusión: muy fácilmente.

Una implementación de prueba de concepto (y documentación) está disponible aquí:

https://github.com/basil00/PseudoNodo

Para la red, PseudoNode parece ser un nodo completo normal. Retransmite inversiones, txs, bloques, etc. como un nodo completo. En realidad, PseudoNode es un tipo de servidor proxy p2p. Simplemente reenvía cualquier solicitud que no puede manejar (getdata, getheaders, etc.) a los nodos vecinos. Para obtener más información, consulte los enlaces anteriores.

PseudoNode no usa disco (no requiere descarga de blockchain), usa poca CPU/RAM y usa menos recursos de red (ancho de banda) que un nodo completo normal. Un PseudoNodo puede "sincronizarse" con la red en cuestión de segundos.

PseudoNode demuestra algunos de los problemas con los nodos completos incentivados (incluido el "Programa de incentivos de Bitnodes"). Es difícil probar que un nodo completo es realmente un nodo completo.

La implementación tiene principalmente valor de novedad/prueba de concepto. No pretende ser un software de "producción".

Y las preguntas frecuentes :

¿PseudoNode daña la red?

Respuesta corta: no.

Respuesta larga: no, a menos que la cantidad de pseudonodos supere significativamente la cantidad de nodos completos normales. De lo contrario, si PseudoNode puede conectarse al menos a algunos buenos nodos (predeterminado 2), entonces PseudoNode actuará como un nodo normal y contribuirá con el ancho de banda de la red.

¿Puede PseudoNode hacer que la red se bifurque?

No, PseudoNode simplemente sigue lo que hacen otros nodos.

¿Puede PseudoNode robar monedas?

No.

¿Se pueden prohibir los pseudonodos de la red?

No es fácil. Las solicitudes que PseudoNode no puede manejar directamente siempre se pueden reenviar a otros nodos completos (cooperativos).

Esto me parece increíblemente imprudente en términos de vectores de ataque. Obviamente, es necesario evaluar un equilibrio entre los pros y los contras, y dado que su valor es "novedad" (autodescrito por el desarrollador), varios contras parecen evidentes de inmediato:

  1. La latencia aumentará efectivamente los tiempos de descarga de blockchain de tal manera quenew latency = original latency * performance decrease %
  2. El pseudonodo nefasto podría acelerar la latencia justo por encima del umbral de los nodos que imponen la lista negra (es decir, throttled latency~> cutoff latency)
  3. Un mayor porcentaje de nodos nefastos podría ejecutar un ataque Sybil (?)

2 preguntas relacionadas:

  1. ¿Qué otros vectores de ataque (en términos de alto nivel) y sus repercusiones podrían esperarse de los Pseudo-Nodos?
  2. ¿Hay contingencias factibles en el protocolo para delinear entre un PN y un nodo? Por ejemplo, ¿diferentes versiones de Bitcoincore identificarían PN (o una simple modificación del protocolo)?
Cuando pregunta sobre psuedo nodos, ¿está preguntando sobre esta pieza específica de software o la idea general de modificar el cliente Bitcoin? Cuando dice, This seems incredibly reckless in terms of attack vectors¿quiere decir que los pseudonodos serían vulnerables a ataques que el cliente de Bitcoin no es, o que el autor no ha pensado en todos los ataques que podrían llevarse a cabo?
@NickODell Estoy enmarcando esto más a la luz del código fuente abierto que se está lanzando, lo que básicamente anula el tiempo de desarrollo que normalmente impediría que las partes infames persigan esto. También debo aclarar, ¿ha habido casos anteriores de pseudonodos? ¿O no es un tema nuevo?
@WizardOfOzzie Todos los "ataques" 1..3 son posibles con nodos completos normales.

Respuestas (1)

Una gran cantidad de pseudonodos interconectados hace que lanzar un ataque de agotamiento del ancho de banda sea mucho más fácil. Bitcoin Core valida la mayor parte de la información antes de transmitirla, pero los psuedo-nodos no validan, por lo que si puede conectar algunos psuedo-nodos, probablemente sea fácil hacer que desperdicien toneladas de ancho de banda al transmitirse datos basura entre sí. y luego a sus compañeros.

Por ejemplo, si hay 101 psuedo-nodos (PN) conectados entre sí, puede enviar a PN1 un invpaquete de aspecto válido que anuncie una sola transacción falsa (alrededor de 61 bytes más la sobrecarga del paquete TCP). Cada PN transmite eso invpor un mínimo de 6100 bytes de carga desperdiciados.

Pero esas PN también están conectadas a nodos reales. Digamos 500 nodos reales, por lo que ahora el ancho de banda de carga de PN desperdiciado es de 36 600 bytes (más la sobrecarga de TCP), todo porque un atacante creó un único archivo inv. Peor aún, los nodos reales solicitarán la transacción utilizando un getdatapaquete de 61 bytes , desperdiciando 30 500 bytes de ancho de banda de carga de nodos reales.

Si el atacante envía 1 MB de datos falsos por segundo durante todo un día, usará 86 gigabytes de su propio ancho de banda, pero desperdiciará 52 terabytes de ancho de banda de carga de PN agregado y potencialmente 43 terabytes de ancho de banda de carga de nodo real.

(Dependiendo de cómo se escriban las PN, pueden desperdiciar aún más ancho de banda al retransmitir el getdatapaquete).

Compare esto con el costo de ejecutar el ataque contra un solo nodo real. Por cada paquete de 61 bytes invque carga el atacante, el nodo real responde cargando un único paquete de 61 bytes getdata. Por lo tanto, un ataque de agotamiento del ancho de banda contra un nodo real requiere aproximadamente 1:1 de ancho de banda desperdiciado. El nodo real no transmite más invhasta que recibe y valida la transacción a la que se refiere, por lo que ningún otro nodo tiene ancho de banda desperdiciado.

¿Hay contingencias factibles en el protocolo para delinear entre un PN y un nodo? Por ejemplo, ¿diferentes versiones de Bitcoincore identificarían PN (o una simple modificación del protocolo)?

El protocolo ya tiene la noción de una puntuación de prohibición DoS, en la que cada nodo de Bitcoin Core asigna una puntuación privada a cada uno de sus pares por cualquier mal comportamiento que realicen. Una vez que la puntuación de prohibición de DoS para un par en particular alcanza un umbral (100 de forma predeterminada), el nodo se desconecta del par y rechaza más conexiones desde su dirección IP durante un tiempo (un día de forma predeterminada). El mal comportamiento incluye el envío de transacciones y bloques no válidos.

Debido a que las PN no validan los datos, felizmente transmitirán datos no válidos. Si se vuelven comunes, alguien que quiera dañar las PN podría simplemente conectarse a cualquier nodo anunciado y enviarle un montón de datos no válidos. Si fuera un nodo completo real, se desconectará (prohibición de DoS). Si fuera un PN, transmitiría esos datos a los nodos completos reales, lo que provocaría que los nodos completos reales lo prohibieran. Esto haría que la PN fuera inútil y permitiría que el afligido detectara qué nodos son PN; entonces, el afligido podría publicar una base de datos (no autenticable) de direcciones IP de PN.

Este método funciona mejor contra las NP a largo plazo. Para dificultar la ejecución de ataques Sybil a corto plazo desde muchas PN livianas, se podría usar algo como la prueba de almacenamiento de Greg Maxwell para hacer que el consumo de recursos distribuidos sea costoso .

Gracias por la teoría detallada; Modifiqué mi consulta para determinar qué, en todo caso, podría delinear entre un PN y un nodo (por ejemplo, dónde compensa el protocolo estos escenarios).
@WizardOfOzzie editado para responder a la segunda parte de su pregunta.
Fantástico, eso tiene mucho sentido. Es bueno saber que esto no es un problema importante. Te estoy otorgando una recompensa que estoy configurando cuando puedo hacerlo
@DavidA.Harding De forma predeterminada, una PN no transmitirá datos a menos que al menos otros 2 nodos seleccionados al azar también transmitan los mismos datos. Por lo tanto, es difícil "engañar" a una PN para que transmita datos no válidos.
@Basil eso es genial, aunque no creo que cambie nada fundamentalmente. Simplemente significa que tanto el atacante como el agresor descritos anteriormente necesitan una sola dirección IP adicional, y el atacante también necesita conectarse a varias PN.
También debería haber mencionado que PN no confía en las conexiones entrantes. Por lo tanto, solo cuenta las inversiones vistas desde los pares salientes. De lo contrario, sería fácil engañar a PN como lo describe.
@Basil Je. ¡Buena idea! Eso ciertamente hace que los ataques que usan PN sean mucho menos triviales. Supongo que todavía es fácil detectar una PN enviando datos incorrectos a un nodo, como una transacción incorrecta en un mensaje sin formato inv( txla forma en que BitcoinJ envía transacciones en modo SPV), y luego esperando a ver si el nodo se desconecta.