Cómo Namecoin Blockchain Research predijo ataques cibernéticos RTM



La cadena de bloques Namecoin se creó como una alternativa a los registradores DNS tradicionales, protegida contra la censura y la incautación forzada de dominios. En los últimos años, los operadores de botnets como Dimnie, Shifu, RTM y Gandcrab han comenzado a usarlo para administrar las direcciones de los servidores de C&C.

Por un lado, la descentralización y la estabilidad de blockchain evitan que los investigadores y proveedores eliminen dichos dominios o tomen el control de ellos. Por otro lado, la infraestructura basada en la cadena de bloques tiene una característica arquitectónica: todos los cambios en la red están disponibles públicamente y pueden usarse para estudiar y rastrear las acciones de los atacantes.

Este artículo presenta el enfoque utilizado para mapear botnets en Namecoin y seguirlas para extraer nuevos COI. Utilizando el enfoque descrito, se compilaron listas de activos (ver el apéndice) utilizados por las botnets mencionadas anteriormente.

Digresión lírica


Las invenciones que cambian Internet a menudo resuelven no solo y no tanto un problema técnico como social. Precisamente, esas tecnologías y servicios son los que permiten a la comunidad mirar de lado a algunos axiomas que parecían inquebrantables, repensarlos, recrearlos desde cero, dejando solo una idea y dejando caer la carga de convenciones y limitaciones heredadas acumuladas a lo largo de los años. Blockchain y Bitcoin, Tor, Wikipedia: detrás del éxito de cada uno de ellos hay un pequeño grupo de entusiastas con ojos ardientes, que creen sinceramente que están haciendo una sociedad mejor.

Por desgracia, otros a menudo los persiguen, ajenos a los extraños ideales de los pioneros de Internet, pero mucho más prácticos. Encuentran una aplicación alternativa para la tecnología, en la cual los creadores no pensaron (o no quisieron pensar). Estando en la frontera (y más a menudo, para esconderse, abiertamente en el extranjero) de lo permitido, esta aplicación alternativa, a menudo no sin la ayuda de los medios, ya que la mayoría se convierte en implícita por defecto , o incluso en la única .

La equivalencia de la tecnología como idea y el método más discutido de su uso puede llevar al rechazo de la sociedad por la tecnología misma. Como resultado de la criminalización de su uso, un servicio inmaduro puede reducirse al nivel de una cultura marginal o destruirse por completo. Entonces sucedió hace mucho tiempo con Napster , no hace mucho tiempo, con BitTorrent y Tor, en este momento esto está sucediendo con Bitcoin.

Este no es el héroe pasado de este trabajo: Namecoin. Namecoin es una cadena de bloques diseñada para almacenar pares arbitrarios de clave-valor, el más famoso de los cuales es un sistema de registro de nombre DNS descentralizado y resistente a la censura: Dot-Bit.

Nuestro interés en Namecoin creció después de que el grupo de administración de botnets RTM comenzó a usar Dot-Bit para administrar sus servidores de C&C. En algún momento, nos preguntamos: ¿es posible detectar nuevos servidores C & C inmediatamente después de que estén registrados en Dot-Bit? Y si no hubo problemas con las actualizaciones de dominios conocidos, el desarrollo de un enfoque que permita detectar evidencia sólida de la conexión de nuevos dominios con una persona de interés resultó ser una tarea de investigación emocionante, cuyo resultado fue este trabajo.

En general, la investigación de Namecoin y la recopilación de indicadores de compromiso en Dot-Bit se llevaron a cabo antes. El trabajo más detallado puede considerarse un artículo de Kevin Perlow . Fue el primero en llamar la atención sobre la posibilidad fundamental de extraer datos de Namecoin y describió varias técnicas heurísticas que permiten a un experto encontrar dominios similares en características a los conocidos servidores de C&C de un grupo en particular.

El enfoque presentado en este estudio tiene varias diferencias significativas con respecto a la técnica de indexación y pivote experta descrita por Kevin. Las reglas heurísticas que desarrollamos para determinar los propietarios de dominios se derivan de los principios del funcionamiento de la cadena de bloques y la formación de transacciones en ella y, además de la descripción general, se presentan en forma de formulaciones lógicas estrictas. Junto con una descripción formal del algoritmo de derivación, esto le permite automatizar la búsqueda de COI, lo que aumenta significativamente la efectividad de la investigación. Además, el algoritmo desarrollado ayuda no solo a encontrar otros nombres que alguna vez fueron utilizados por el grupo de estudio, sino que también le permite rastrear la creación de nuevos dominios controlados por la misma persona.

Todo el trabajo se divide en tres capítulos. El primer capítulo describe los conceptos básicos de Bitcoin, cuyo código se utilizó como plataforma para crear Namecoin. Namecoin ha heredado muchas entidades, relaciones y sus implementaciones definidas en Bitcoin. Su comprensión es crucial para una mayor discusión.

El segundo capítulo está dedicado directamente a Namecoin y su aplicación principal: Dot-Bit.

El tercer capítulo describe el enfoque propuesto para extraer datos de Namecoin, y también ofrece una descripción formal del algoritmo de derivación de blockchain y las reglas heurísticas utilizadas para establecer relaciones entre dominios.

Los apéndices contienen IOC recopilados utilizando el método descrito para algunas botnets, así como una lista de referencias y repositorios que ayudarán a los investigadores que quieran seguir trabajando en este tema.

Bitcoin 201


La mayor parte de la información en esta sección se recopila de los materiales de la serie de artículos de Sergey Pavlov_dog Potekhin " Bitcoin en pocas palabras ". Para los lectores de habla rusa, esta fuente, en nuestra opinión, es la más completa y profunda disponible públicamente, pero es sorprendentemente fácil de leer. Investigadores interesados ​​en el dispositivo interno de Bitcoin, instamos a no limitarnos a los extractos dados en esta sección, sino a familiarizarnos con el texto completo de los artículos, disponibles por referencia en la aplicación. El resto de la información presentada a continuación será suficiente para comprender la descripción del algoritmo y las reglas heurísticas para encontrar la relación entre las direcciones en Namecoin, que se proporciona en el último capítulo.

Aunque es costumbre comenzar la historia sobre blockchain con bloques y la criptografía que los conecta, comenzaremos con las transacciones.

Transacción


Como saben, el análogo más cercano a Bitcoin es un libro de cuentas en el que se registran todas las transacciones con monedas. Pero, curiosamente, en Bitcoin no hay una tabla general del formulario <, > , al igual que no hay un contador principal que edite esta tabla.

En cambio, se usa la cadena de bloques muy notoria, es decir, todas las transacciones generalmente se almacenan. Por simplicidad, podemos suponer que estos son mensajes de la forma:

 <address 1> sent <amount> BTC to <address 2> 

Entonces, si recorres toda la cadena de bloques, puedes calcular cuántas monedas "pertenecen" a una dirección en particular.

Entradas y salidas


Una transacción real en una red de Bitcoin es un poco más complicada que la descrita anteriormente. Esta es una estructura cuyos componentes principales son entradas y salidas.

Las entradas son transacciones a las que se "refiere". Imagine que se enviaron tres transacciones a su dirección X una vez:

 TXN_ID: 123456, VALUE: 40 BTC TXN_ID: 645379, VALUE: 10 BTC TXN_ID: 888888, VALUE: 100 BTC 

Si necesita gastar, por ejemplo, 45 BTC , puede consultar la transacción 888888 o dos transacciones a la vez: 123456 y 645379 .

Salidas - literalmente "salidas". Podemos suponer que estas son "direcciones" a las que se enviarán las monedas como resultado de la transacción. También puede haber varias salidas; cada una de ellas tiene su propia cantidad.

En la imagen a continuación, C una nueva transacción C , que se refiere a dos salidas: A y B Como resultado, la transacción tiene 0.008 BTC en la entrada, que luego se dividen en dos salidas: 0.001 BTC envía a la primera dirección y 0.006 BTC a la segunda.

imagen

La capacidad de especificar múltiples salidas a la vez es una característica muy importante, porque la salida de la transacción se puede usar como entrada solo una vez y solo en su totalidad . Si tiene una transacción entrante a 10 BTC y necesita gastar 8 de ellas, simplemente cree una transacción con una entrada y dos salidas: 8 BTC para el vendedor y 2 BTC regreso a su dirección. Si crea una transacción en la que la suma de las salidas es menor que la suma de las entradas (como en la imagen), la diferencia se envía a la dirección del minero que escribió su transacción en el bloque.

Tarifa


Es esta diferencia entre la suma de entradas y la suma de salidas lo que se denomina " transaction fee ", transaction fee . Es la segunda fuente de ingresos más importante para los mineros, y el tiempo que tarda la transacción en incluirse en la cadena de bloques depende de ello. Esto se debe al hecho de que cada minero tiene un cierto grupo de transacciones no verificadas que afirman estar en el bloque y, por regla general, el minero simplemente las ordena en orden descendente, maximizando así sus ganancias. Por lo tanto, cuanto mayor sea la comisión, más alto estará en la cola y más rápido irá su pago.

La vista general de la transacción se describe en la especificación oficial del protocolo , aquí se da uno de los casos particulares más comunes.



previous output hash : identificador (hash) de la transacción a la que nos referimos. previous output index : dado que necesitamos referirnos no a la transacción en sí, sino a una de sus salidas, en este parámetro indicamos en qué salida en particular estamos interesados. La numeración comienza desde cero. value : la cantidad de Satoshi ( 1/100000000 BTC) enviada a la salida. Se registra en una forma little-endian, es decir, 62 64 01 00 00 00 00 00 : es 0x016462 o 0.00091234 BTC .

El block lock time y los parámetros de sequence rara vez se usan en la práctica. No estamos interesados ​​en ellos, por lo que omitiremos la descripción de su propósito.

Pero en los parámetros con la palabra script en el título nos detenemos con más detalle.

Guión


La red Bitcoin tiene un mecanismo basado en algoritmos criptográficos con una clave pública que le permite crear un sistema en el que solo el propietario de la clave puede usar las monedas asociadas con la dirección obtenida de esta clave. Descubriremos cómo se implementa esto bajo el capó.

Para empezar, dentro de Bitcoin hay un lenguaje de programación simple y apilado llamado Script . Aquí está el programa de script más simple:

 2 3 OP_ADD 5 OP_EQUAL 

Cada instrucción se llama opcode , hay alrededor de 80 en total. La siguiente imagen muestra el proceso de ejecución del programa anterior.











Bitcoin Script se usa para establecer la condición bajo la cual será posible gastar la salida y poder confirmar que se cumple la condición. La condición ( locking script ) se almacena en la transacción en el campo scriptPubKey para cada salida. La confirmación de que se cumple la condición ( unlocking script ) se escribe en el campo scriptSig para cada entrada.

Para verificar el derecho a utilizar la salida, debe conectar el unlocking script + locking script y ejecutar el programa resultante en su conjunto. Si después de la ejecución, TRUE permanece en la parte superior de la pila, entonces la transacción es válida.


Pagar al hash de clave pública (P2PKH)


El script P2PKH usa en la mayoría de las transacciones, por lo que debe comprender cómo funciona. Aquí está su visión general:



Este script se conoce desde el advenimiento de Bitcoin, y realiza la tarea que se mencionó al principio del capítulo: asegurarse de que solo el propietario de la clave pueda usar las monedas asociadas con la dirección obtenida de esta clave.

La idea es esta: deje que su amigo B posea un par de claves: P (privado) y K (público). Usando la función hash, obtiene la dirección A de la clave pública y le dice la dirección. A continuación, envía, por ejemplo, 1 BTC a la dirección A y escribe lo siguiente en el campo de locking script :

Solo alguien que posee la clave privada para la dirección A puede gastar esta transacción. Como prueba, escriba en el unlocking script , en primer lugar, la clave pública K y, en segundo lugar, la firma de la transacción con la clave privada P

Cuando B decide utilizar su transacción como entrada, creará su, por ejemplo, 0.5 BTC , y en el campo de unlocking script pondrá la firma de su transacción con la clave privada P - sig y la clave pública K - PubK .

Aquí está el proceso de ejecución del programa combinado:















Bloques y blockchain


Si toda la cadena de bloques es un libro, los bloques individuales se pueden representar como páginas en las que se registran las transacciones. Cada bloque "se refiere" al anterior, y así sucesivamente hasta el primer bloque ( genesis block ). Esto es lo que crea una característica de blockchain como la inmutabilidad. No puede tomar y cambiar el bloque #123 para que nadie se dé cuenta: la cadena de bloques está diseñada de tal manera que implicará un cambio en el bloque #124 , luego en el #125 y así sucesivamente.

La estructura del bloque se ve así:



Los primeros seis parámetros (todos excepto txn_count y txns ) forman el encabezado del bloque. El hash de encabezado se llama hash de bloque; Las transacciones en sí mismas no participan directamente en el hash. merkle_root es responsable de su inmutabilidad; si se simplifica, este es un hash de todas las transacciones en el bloque. Puede leer más sobre el algoritmo para construir el árbol Merkle aquí en este enlace .

Nonce y bits están directamente relacionados con el proceso de aparición de bloques: minería.

Minería


La minería es un proceso crítico para Bitcoin, que consiste en crear nuevos bloques y perseguir dos objetivos a la vez. El primero es la producción de oferta monetaria. Cada vez que un minero crea un nuevo bloque, es recompensado por esto con la enésima cantidad de monedas que luego gasta en algún lugar, lanzando así nuevos fondos a la red.

El segundo objetivo, y mucho más importante, es controlar el cumplimiento de las reglas de la red. Son los mineros quienes verifican los scripts y las entradas de transacciones antes de incluirlos en el bloque.

Aquellos que deseen obtener más información sobre los fundamentos financieros de Bitcoin pueden aconsejar este artículo . No prestaré mucha atención al primer aspecto de la minería y me concentraré en el segundo: verificar las transacciones y lanzarlas en la red.

Prueba de trabajo


Deja que seas minero. Tiene 10 transacciones que desea incluir en el bloque. Verifica la validez de estas transacciones, forma un bloque fuera de ellas, especifica 0 en el campo nonce y considera el hash del bloque. Luego cambie nonce a 1, cuente el hash nuevamente.

Su tarea es encontrar un nonce tal que el hash de bloque (número de 256 bits) sea menor que un número predeterminado N La búsqueda de tal hash solo es posible a través de la fuerza bruta nonce . Por lo tanto, cuanto más rápido desee encontrar nonce, más potencia necesitará.

El número N es exactamente ese parámetro (también se llama target ), que la red ajusta según la potencia total de los mineros. Si mañana comienzan a salir bloques, en términos relativos, cada tres minutos, entonces se reducirá N , se necesitará más tiempo para buscar nonce y el block time aumentará nuevamente a 10 minutos. Y viceversa.

Así es como se ve el algoritmo de Prueba de trabajo subyacente de Bitcoin y muchas otras cadenas de bloques. Con aparente simplicidad, tiene una serie de características importantes:

  • Crear un nuevo bloque es una tarea computacionalmente difícil. Al mismo tiempo, verificar que el bloque sea correcto es una operación simple y casi instantánea.
  • Toda la red tarda 10 minutos en calcular un nuevo bloque (en promedio). El tiempo específico es diferente para cada cadena de bloques, pero la conclusión es que el tiempo promedio está preestablecido. Además, este tiempo no depende del número de participantes de la red. Incluso si algún día habrá cien veces más mineros, el algoritmo cambiará sus parámetros para que sea más difícil encontrar el block time y el block time vuelva a la proximidad del tiempo especificado.

    Como se describió anteriormente, el proceso de minería se reduce a encontrar un hash de bloque menor que un número llamado target . En la estructura de bloques, este número se escribe en el campo de bits. Por ejemplo, para el bloque #277316 target era 1903a30c .

Como se describió anteriormente, el proceso de minería se reduce a encontrar un hash de bloque menor que un número llamado target . En la estructura de bloques, este número se escribe en el campo de bits . Por ejemplo, para el bloque #277316 target era 1903a30c .

 $ bitcoin-cli getblock 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4 { "hash" : "0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4", "confirmations" : 35561, "size" : 218629, "height" : 277316, "version" : 2, "merkleroot" : "c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e", "tx" : ["d5ada064c6417ca25c4308bd158c34b77e1c0eca2a73cda16c737e7424afba2f", ...], "time" : 1388185914, "nonce" : 924591752, "bits" : "1903a30c", // <--   "difficulty" : 1180923195.25802612, "chainwork" : "000000000000000000000000000000000000000000000934695e92aaf53afa1a", "previousblockhash" : "0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569", "nextblockhash" : "000000000000000010236c269dd6ed714dd5db39d36b33959079d78dfd431ba7" } 

En bits de hecho, se escriben dos números a la vez: el primer byte 0x19 es el exponente, los tres bytes restantes 0x03a30c son la mantisa. Para obtener el target de bits , debe usar la siguiente fórmula:

 target = mantissa * 2^(8 * (exponent - 3)) 

Pero los bits , como regla, se indican en todos los registros de bloque en línea, como, por ejemplo, https://namecha.in/ - Registro de bloque de Namecoin.

Y sí, suficiente teoría. Todo lo que mencionamos anteriormente cuando se aplica a Bitcoin se aplica igualmente a Namecoin, a excepción de las pequeñas diferencias, de las que hablaremos en la siguiente sección.

Namecoin


Namecoin es una cadena de bloques basada en los algoritmos y el código fuente de Bitcoin, cuya idea principal es utilizar un esquema de registro de transacciones distribuidas para administrar un sistema de nombres de dominio, un análogo del DNS tradicional.

Namecoin copia los enfoques básicos de Bitcoin (Prueba de trabajo, intervalo de generación de bloques de 10 minutos) y formatos de datos, con la excepción de pequeñas adiciones, de las que hablaremos más adelante.

Los dominios Namecoin tienen el sufijo .bit. Esta zona no fue asignada por IANA y no fue asignada a la lista de dominios de propósito especial . Los servidores DNS normales suelen responder a tales solicitudes NXDOMAIN. Pero hay puertas de enlace de DNS a Namecoin (por ejemplo, OpenNIC ), servidores proxy públicos con soporte de Namecoin, complementos de navegador y un proyecto de código abierto que le permite iniciar su propio servidor DNS con soporte de Namecoin.

Para administrar un dominio con el nombre, digamos, facebook.bit , es suficiente registrar la clave d/facebook prefijo d/facebook se usa en Namecoin para dominios) y determinar su valor. El formato JSON se usa para establecer los valores. Una entrada que establece la resolución del dominio en la dirección IP 1.2.3.4 tiene este aspecto:

 {"ip": ["1.2.3.4"]} 

Namecoin asigna nombres por orden de llegada. Incluso para el propio Mark Zuckerberg, será criptográficamente imposible quitarle el dominio facebook.bit al propietario.

De hecho, nada restringe el uso de Namecoin a solo administrar los paquetes de nombres DNS: la dirección IP. Namecoin se puede usar (y usar) como una tabla distribuida para asignar claves arbitrarias a valores. Pero nos concentraremos precisamente en el escenario de su uso en el que representa un DNS alternativo sobre blockchain.

Gestión de dominios


Namecoin utiliza una transacción para almacenar un registro de dominio. A saber, el campo scriptPubKey contiene el programa es la condición para usar la salida de transacción, a la que dedicamos tanto tiempo en el capítulo anterior. Para administrar registros, Namecoin introdujo tres nuevos operadores (más precisamente, redefinió los existentes):

  • NAME_NEW
  • NAME_FIRSTUPDATE
  • NAME_UPDATE

Su significado es claro a partir de los nombres, pero sin embargo analizaremos el propósito y el formato de uso de cada uno de ellos.

Puede notar que falta el operador de eliminación o invalidación de dominio. Para limpiar el registro de los nombres no utilizados, se ha incorporado un mecanismo en la red que libera automáticamente un nombre que no se ha actualizado durante 36,000 bloques (~ 250 días).

NAME_NEW


El primer paso es anunciar la intención de registrar un nuevo nombre en la red. Para hacer esto, solo cree una moneda especial (salida) que pese al menos 0.01 NMC , cuyo output script se verá más o menos así:

 OP_NAMENEW <20 byte hash> OP_2DROP <lock script> 

Para demostrarlo, utilizaré las transacciones que hizo Stephen Morse para ilustrar su artículo .

Entonces, si queremos anunciar el registro del nombre d/stephenmorse , debemos hacer lo siguiente:



Al observar la transacción resultante, puede observar dos hechos interesantes. En primer lugar, a pesar de que el output script escrito en notación Namecoin, sigue siendo válido desde el punto de vista del Bitcoin original. Los creadores de Namecoin han elegido códigos con tanto éxito para sus operaciones que en Bitcoin corresponden a operaciones que son esencialmente equivalentes a escribir en la pila constante. NAME_NEW (0x51) corresponde a OP_1 , que empuja OP_1 pila 1. Una historia similar con NAME_FIRSTUPDATE ( 0x52 u OP_2 , pone 2) y con NAME_UPDATE ( 0x53 u OP_3 , pone 3). Entonces, los primeros dos pasos del script solo ponen dos valores en la pila. Y la siguiente operación OP_2DROP elimina de la pila, de modo que más P2PKH funciona "desde cero". Por lo tanto, todos esos trucos de script que cubrimos en el capítulo sobre Bitcoin también son aplicables a Namecoin, a pesar de la redefinición de algunas operaciones.

En segundo lugar, las teclas que abren una moneda especial y cambian son diferentes. Aunque técnicamente nada le impide usar la misma clave repetidamente, es una práctica común generar una nueva clave para cada recibo. Esto se hace para dificultar la identificación de correlaciones entre transacciones y aumentar el nivel de anonimato en la red.

A primera vista, parece extraño que, al contrario del sentido común, es imposible tomar y registrar de inmediato un nombre más una dirección IP. Esto se hace para que nadie pueda interceptar el nombre tan pronto como vea que desea registrarlo (y luego revenderlo).

Por ejemplo, los mineros, al analizar transacciones no confirmadas (aún no incluidas en ninguno de los bloques) en la red, podrían crear su propia transacción para el registro del mismo dominio e incluirla (y no la suya) en su bloque. Para implementar este ataque, ni siquiera es necesario extraer tu bloque. Será suficiente para poner su transacción en la red con una tarifa grande. Por lo tanto, NAME_FIRSTUPDATE dos operaciones separadas NAME_NEW y NAME_FIRSTUPDATE , y la segunda solo puede realizarla la persona que realizó la primera, y solo después de que NAME_NEW entre en cualquier bloque.

De hecho, esta restricción es incluso un poco más estricta: NAME_FIRSTUPDATE es posible no antes de 12 bloques después de NAME_NEW (que es aproximadamente 2 horas). Para comprender por qué los bloqueos en esta restricción no son 1, ni 2, ni 3, sino específicamente 12, tendremos que retroceder un poco de la historia principal y descubrir qué son fork y 51% attack .

Tenedor
Imagine que los mineros están buscando el bloque #123456 . Y casi al mismo tiempo, fue encontrado independientemente por dos mineros, uno de los cuales vive en Australia y el otro en los Estados Unidos. Cada uno de ellos comienza a dispersar su versión del bloque a través de la red, y como resultado resulta que la mitad del mundo tiene una cadena de bloques y la otra tiene otra.



¿Es esto posible? Si es posible. Además, esto sucede con bastante frecuencia. En este caso, cada nodo continúa adhiriéndose a su propia versión de la cadena de bloques hasta que alguien encuentre el siguiente bloque. Suponga que el nuevo bloque continúa la rama verde, como en la imagen a continuación. En este caso, los nodos que se adhieren a la versión roja sincronizan automáticamente la versión verde, porque la regla funciona en Bitcoin (y, en consecuencia, en Namecoin): la versión más larga de blockchain es verdadera. La versión roja de la cadena de bloques simplemente se olvidará, junto con las recompensas para aquellos que la encuentren.



Por supuesto, teóricamente, en el segundo paso, la situación puede repetirse y al mismo tiempo con púrpura encontrarán otra que continuará con la versión roja de la cadena de bloques. Y en el tercero, y así sucesivamente. Pero la probabilidad de incluso la primera bifurcación es bastante pequeña, la segunda es aún menor y así sucesivamente. La bifurcación más larga en la historia de Bitcoin fue de solo cuatro bloques . Entonces, en algún momento, una de las ramas se abrirá paso, y toda la red irá a ella.

51% de ataque
El hecho de que la cadena más larga en la cadena de bloques sea dominante se basa en un ataque que lleva el nombre del 51%.

Imagine que es un estafador y compra productos a 1000 BTC en una tienda. Usted está de acuerdo con el vendedor y le envía el dinero. El vendedor verifica la cadena de bloques, ve que tal transacción realmente fue, pasó todas las verificaciones e incluso entró en algún bloque, por ejemplo #123 . Después de eso, el vendedor va al correo y le envía la mercancía.

En este momento, enciende su granja minera y comienza a minar, comenzando desde el bloque #122 . Si tiene suficiente potencia, puede adelantar al resto de la red y contar el más rápido para bloquear #124 , después de lo cual todo el mundo cambiará a su versión de blockchain. Al mismo tiempo, no incluirá su transacción por 1000 BTC en ninguno de los bloques, lo que significa que se olvidará para siempre, como si nunca lo hubiera sido. .

, . . 11 , , 6 , 0,1% , 10% . , . , Namecoin , 20% .

. , . , NAME_NEW , 12 , NAME_FIRSTUPDATE .

NAME_FIRSTUPDATE


El propósito de la operación NAME_FIRSTUPDATEes publicar el nombre que anuncié NAME_NEWy especificarle un valor. Para hacer esto, necesito iniciar una transacción en la red, cuya entrada es la moneda muy especial que generé en la salida NAME_NEW. Para confirmar el derecho a usarlo, presento en el script de entrada mi clave pública y la firma de la transacción NAME_NEWrealizada por la clave de par privado, exactamente de acuerdo con el esquema que examinamos en el capítulo sobre P2PKH.

Uno de los resultados de la transacción será una nueva moneda especial que pese, como la anterior, nada menos 0.01 NMC. Su script de salida debería ser así:

 OP_NAME_FIRSTUPDATE <Name> <Salt> <Value> OP_2DROP OP_2DROP <lock script> 

SaltEs el número muy aleatorio 0xd5eeb22ee8117f57que creamos en la primera etapa de preparación del guión NAME_NEW. Name- es d/stephenmorseen hexadecimal 0x642f7374657068656e6d6f727365.

El campo Valuedebe contener una matriz asociativa que represente las reglas mediante las cuales se resolverá el nombre. Una lista completa de posibles claves y reglas para completarlas aquí . En una primera aproximación, este es un análogo del archivo de zona; el enlace de arriba muestra la asignación de entidades Namecoin a entidades DNS familiares. Los más populares son ip, un ejemplo con el que era más alto, y ns, que usamos ahora.

Para indicar cuál será el servidor NS para el dominio, pondremos 1.2.3.4un valor en Value {“ns”:[“1.2.3.4”]}, pero, por supuesto, en hexadecimal - 0x7b226e73223a5b22312e322e332e34225d7d.

Como la última vez, cierre la moneda con P2PKH. En su ejemplo, Stephen creó deliberadamente una moneda en el paso NAME_NEW con un peso no exactamente 0.01 NMC, pero con un margen, de modo que en el siguiente paso este margen sería suficiente para la comisión al minero. En el caso general, la transacción tendrá una entrada más para garantizar la comisión y una salida más para la entrega.

Recopilamos todo en una transacción y lo lanzamos a la red .



Cuando la transacción cae en el bloque, los hosts actualizarán en sus tablas el valor de la clave d/stephenmorseactivada {“ns”:[“1.2.3.4”]}. Todos los navegadores con soporte de Namecoin ahora resolverán el dominio stephenmorse.bity sus subdominios a direcciones IP a través del servidor DNS ubicado en 1.2.3.4.

NAME_UPDATE


La "tabla" con claves y sus significados, que mencioné al final de la última sección, en realidad se llama UTXO set (unspent transaction output). Dado que es fundamental que la red evite el gasto repetido de fondos, antes de agregar una transacción al bloque, el minero verifica si se usaron las entradas especificadas previamente en la transacción. Para acelerar esta operación, todas las salidas no utilizadas se almacenan en una estructura de datos separada. Esta estructura no existe a nivel de red, pero cada nodo la calcula y almacena localmente.

Después de completar la transacción NAME_FIRSTUPDATE, la salida de mi moneda con un peso 0.01 NMC, al que se adjunta el valor de la clave d/stephenmorse, golpeó la mesaUTXO. Si esta salida no se gasta en 36,000 bloques (que es más de 8 meses con 10 minutos por bloque en promedio), se considerará no válida y el nombre correspondiente será gratuito.

Este período de 36,000 bloques (así como el valor mínimo de una moneda especial en 0.01 NMC) está claramente definido al inicio de la red y no cambia. Para extender el registro del nombre, así como para cualquier cambio en el registro o transferirlo a otro propietario, se utiliza una transacción NAME_UPDATE.

Las reglas para la formación de tal transacción prácticamente no difieren de las descritas anteriormente. La entrada para la transacción debe ser la salida de la moneda obtenida en la transacción.NAME_FIRSTUPDATE. Se necesita una entrada adicional para garantizar la comisión. De las dos salidas de la transacción, una es una moneda nueva con un valor actualizado para el nombre, y la segunda está diseñada para transferir el cambio de la comisión. El formato del script de salida para la moneda es:

 OP_NAME_UPDATE <Name> <Value> OP_2DROP OP_DROP <lock script> 

Como en el caso anterior, Nameesto es d/stephenmorse, y Value- JSON con un valor, ambos en hexadecimal. Cierre la salida con P2PKH y lance la transacción a la red .


En general, esto es casi todo lo que quería contar sobre la gestión de nombres en Namecoin. Todo lo que queda es decir algunas palabras sobre los costos de poseer un dominio.

Costo


Calculemos cuánto cuesta el contenido del nombre Dot-Bit(el nombre de la zona DNS .bit, que opera sobre la base de Namecoin) en criptomoneda y, traduciendo los números a moneda fiduciaria, es comparable al costo de un dominio DNS "normal".

Entonces, como se puede ver en la sección anterior, para una transacción, los NAME_NEWcostos del propietario del dominio serán 0.01 NMCcrear una moneda a la que se adjuntará la zona, más la comisión del minero. Para una transacción, NAME_FIRSTUPDATEse crea una nueva moneda a expensas de la antigua, y además el propietario paga solo la comisión. Después de aproximadamente 8 meses, el propietario tendrá que completar la transacción NAME_UPDATEpara conservar el nombre registrado. Y aquí es donde los costos requeridos para el primer año finalizan.

La mayoría de los artículos sobre Namecoin (incluido el artículo citado anteriormente por Stephen Morse) se basan en datos de los primeros años de existencia de la red y afirman que la comisión del minero es de 0.005 NMC. Pero desde entonces, el valor medio de la comisión ha disminuido gradualmente y a principios de 2019 es de aproximadamente 0,0003 NMC. El tipo de cambio NMC frente al dólar estadounidense, por el contrario, después de haber sufrido varias alzas, volvió al nivel de 2015 y asciende a alrededor de $ 0.7 por 1 NMC. Es fácil calcular que el dominio en la zona .bit en el primer año le costará al propietario de 0.0109 NMC o $ 0.00763. Quizás sea más fácil para alguien recordar un análogo aproximado de esta cantidad en moneda rusa: 50 kopeks.

Bueno, este es el límite inferior que coincide con el escenario para comprar un nombre para uso futuro o ciberocupación. ¿Qué pasa con el límite superior? Dado que la entrada de cada transacción que actualiza la zona debe ser una moneda de uno de los bloques anteriores, el máximo teórico de la frecuencia de actualización del nombre es igual a la frecuencia de aparición de nuevos bloques. Recordando que el valor promedio de este valor se estableció al inicio de la red y es de aproximadamente 10 minutos, se puede estimar que el límite superior del costo de mantener un dominio será 15.7744 NMC o un poco más de $ 11.

Como puede ver, incluso un escenario tan fantástico de usar un nombre en Namecoin a un costo es aproximadamente equivalente al primer año de poseer un dominio regular en la zona .com más popular. Si comparamos un escenario más realista con una actualización en promedio una vez al día, entonces el nombre en la zona .bit costará alrededor de 8 centavos al año, que es un orden de magnitud más barato que las ofertas más ventajosas en el DNS tradicional, que no caen por debajo de $ 1. En el escenario de uso a corto plazo del dominio (de varias horas a un mes), la diferencia a favor de Namecoin ya será de dos órdenes de magnitud.

Teniendo en cuenta el atractivo financiero del servicio, así como el anonimato del propietario del dominio, incluida la falta de un "rastro de dinero" tradicional para el DNS ordinario, queda claro por qué Namecoin se ha convertido en una red popular para los propietarios de servicios con un mayor riesgo de desconexión o bloqueo, en particular botnets.

Botnets en Namecoin


De hecho, el hecho de que los operadores de botnets comenzaron a usar el anonimato Dot-Bitpara proteger sus servidores de C&C no es sorprendente. Otra cosa es más interesante: cuánto tiempo permanecen activas las botnets en .bit.

Los dominios C&C registrados en zonas DNS "ordinarias" se retiran tarde o temprano del propietario, lo que obliga al operador a pagar por registrar un nuevo nombre y lanzar un nuevo conjunto de bot en la red, con un nuevo servidor de administración. La imposibilidad fundamental de eliminar un dominio en la zona .bit aumentó la vida útil de la botnet en órdenes de magnitud.

Tomemos, por ejemplo, el pationare.bitdominio registrado en diciembre de 2016. Fue utilizado para controlar una botnet Chthronic(distribuyendo un troyano bancario construido sobre la base del famoso ZeuS). Campaña de distribuciónChthronicse asoció con el uso del paquete de exploits RIG y fue descrito en detalle por varios investigadores (por ejemplo, malware-traffic-analysis.net ) a fines de 2016 y la primera mitad de 2017.

Se podría suponer que esta botnet fue destruida hace mucho tiempo. Pero no: más de dos años después del lanzamiento, el dominio C&C de la botnet y su red aún están activos. Como se puede ver en la captura de pantalla a continuación, la última actualización se realizó en diciembre de 2018.



Se ve tentador, ¿verdad? Dado que el nombre DNS del servidor de administración permanece intacto, no es necesario actualizar con frecuencia el código bot y reiniciar la campaña de distribución. Solo queda el costo de cambiar el alojamiento después de bloquear la dirección IP, pero estos costos también se pueden reducir mediante el uso de servidores web pirateados como servidores proxy, cuyos costos cuestan menos de un dólar.

Por otro lado, todas las transacciones en la cadena de bloques están disponibles públicamente para cualquier participante. Como discutimos en detalle en capítulos anteriores, las monedas en Namecoin no desaparecen sin dejar rastro, lo que significa que podemos rastrear su redistribución entre direcciones. Y conociendo las reglas y restricciones, teniendo en cuenta qué transacciones se forman en Namecoin, podemos encontrar patrones significativos en los que la gestión uniforme de algunas direcciones involucradas en la transacción será obvia. En este caso, los dominios pagados con monedas de estas direcciones tendrán un propietario común: el grupo que administramos, que controla la botnet.

Desarrollaremos más esta idea.

Esquema general de cobro del COI


Describamos el esquema de búsqueda general usando el ejemplo de una botnet real del grupo RTM. Nos basaremos en esta muestra , que se identificó como Win32/Spy.RTM.N.





Como puede ver en la captura de pantalla anterior, después de comenzar, intenta obtener la dirección IP para el nombre stat-counter-4.bit. Obtenemos información sobre el historial de transacciones de este nombre en Namecoin.



El identificador de la transacción que creó este dominio, lo obtenemos haciendo clic en el enlace a la operación NAME_NEW. La dirección de entrada de esta transacción, con la ayuda de la cual se creó el dominio, obviamente es administrada por el grupo que nos interesa. Él será el conjunto inicial de datos: N3KPt8py24EAsAiKquyFgoKGyTYeR5Tmry.



Según el conjunto de datos inicial, recorrimos iterativamente la cadena de bloques, moviéndonos en la dirección de su crecimiento (movimiento ascendente o movimiento ascendente). Al comienzo de cada paso, obtenemos una transacción, cuya moneda en la entrada pertenece a la persona que nos interesa. En el primer paso, verificamos la transacción del conjunto de datos inicial, el propietario de las monedas en la entrada de las cuales sabemos a priori.

Se verifica el cumplimiento de la transacción con las reglas heurísticas (las formularemos a continuación), que garantizan que cierta moneda (o monedas) a la salida de la transacción pertenece a la misma persona que la moneda de entrada conocida. Si la transacción en cuestión satisface una o más heurísticas, entonces dichas monedas indicadoras indicarán la dirección de un movimiento adicional. La transacción que gasta la moneda guía será el siguiente paso en la iteración.

En cada paso de la iteración, reponemos la lista de dominios que participaron en las transacciones y la lista de direcciones IP en las que se resolvieron estos dominios. Estos son identificadores históricos de compromiso (COI), que pueden utilizarse para forenses, así como para identificar tácticas y métodos de agrupación.

El movimiento se detiene si la transacción en cuestión no satisface ninguna de las heurísticas. Esto significa que no podemos decir con certeza que cualquiera de los resultados de la transacción en cuestión esté controlada por la persona que nos interesa.

Otra situación que detiene el movimiento es la falta de transacciones desde la dirección de salida. Guardaremos dichas direcciones en una lista separada de monedas no gastadas (UTXO). Representan el mayor valor en todo el estudio. Dado que confiamos en que estas direcciones son administradas por la persona que nos interesa, cualquier transacción futura que use estas direcciones generará un IOC nuevo y previamente desconocido, el nombre de dominio o la dirección IP, que aún no ha sido utilizado por la agrupación. Pero con alta probabilidad será pronto.

Para evitar la cadena de bloques, es conveniente exportarla a la base de datos. Para esto, puede usar, por ejemplo, la utilidad modificada oxidado-blockparser , en la cual mejoramos el soporte para Namecoin agregando reconocimiento de operaciones NAME_*, estructuras de datos Auxiliary Proof-of-Worky expandiendo el formato de exportación.

El pseudocódigo de Python para el movimiento ascendente se presenta a continuación. En lo sucesivo, se supone que los datos de transacción de blockchain se almacenan en MongoDB.

 start = "37d40bc2f3ca7415908dc9e276593b50d3120158cd540cb088246f2e2cf88b16" tx = namecoin.transactions.find_one({"id": start}) def upstream_movement(tx): global names global IPs global utxo global known_addresses heuristic_result = upstream_heuristic_test(tx) if heuristic_result and heuristic_result.guiding_outs: if tx.has_name_op(): names.add(tx.name_op.name) for ip_address in tx.name_op.get_ip(): IPs.add(ip_address) for guiding_out in heuristic_result.guiding_outs: known_addresses.add(guiding_out.address) tx = namecoin.transactions.find_one({"in.id": guiding_out.id}) if tx: upstream_movement(tx) else: utxo.add(guiding_out) 

La segunda parte del bypass de blockchain es el movimiento contra el crecimiento de blockchain (movimiento hacia abajo o hacia abajo). En general, el algoritmo de movimiento hacia abajo no es diferente del algoritmo hacia arriba. Un movimiento comienza con una transacción del conjunto de datos original. En cada paso, se verifica el cumplimiento de la transacción con las reglas heurísticas (en general, diferentes de las reglas para el movimiento ascendente). La única diferencia es que la moneda, cuya membresía se conoce a priori, está a la salida de la transacción, y la heurística garantiza que la misma persona tiene una o más monedas en la entrada.

Un movimiento hacia abajo también se detiene si la transacción actual no satisface ninguna de las heurísticas. A diferencia del movimiento hacia arriba, no podemos encontrar monedas no gastadas entre las guías, y esta opción para salir de la recursión en el movimiento hacia abajo no funcionará. Pero, al igual que con el movimiento ascendente, reponemos tanto la lista de nombres como la lista de direcciones IP.

El pseudocódigo de Python para el movimiento descendente se vería así:

 start = "37d40bc2f3ca7415908dc9e276593b50d3120158cd540cb088246f2e2cf88b16" tx = namecoin.transactions.find_one({"id": start}) def downstream_movement(tx): global names global IPs global utxo global known_addresses heristic_result = downstream_heuristic_test(tx) if heuristic_result and heuristic_result.guiding_ins: if tx.has_name_op(): names.add(tx.name_op.name) for ip_address in tx.name_op.get_ip(): IPs.add(ip_address) for guiding_in in heuristic_result.guiding_ins: known_addresses.add(guiding_in.address) tx = namecoin.transactions.find_one({"out.id": guiding_in.id}) if tx: downstream_movement(tx) 

Ahora considere las reglas heurísticas que usaremos al movernos por la cadena de bloques.

Reglas heurísticas


Cambio común


Veamos nuevamente la transacción, cuya captura de pantalla se muestra arriba. Se envía una dirección que N3KPt8py24EAsAiKquyFgoKGyTYeR5Tmrycontiene dinero para crear un nuevo nombre a la entrada de la transacción . Habrá dos direcciones para las transacciones NAME_FIRSTUPDATEy NAME_UPDATEen la entrada: una moneda especial con una zona de la transacción anterior por dominio y fondos adicionales para cubrir la comisión.

Notaré de inmediato que, en el contexto de las transacciones, hablaremos tanto de monedas como de direcciones. A pesar de que en algunos trabajos estos conceptos se consideran casi equivalentes, es importante que indiquemos claramente la diferencia entre estos términos, ya que en el curso del estudio sacaremos conclusiones sobre las monedas y las direcciones.

Al decir "moneda", nos referiremos a un saldo positivo formado como el resultado de una transacción. Esta moneda se identifica por el número de transacción que la generó y el índice de salida. Por ejemplo, una moneda en la entrada de la transacción considerada anteriormente tiene un identificador 5778be8e1901e9931e9b41a128a0b7f963e6e1ae72e461df2cba26e6279d433a:1, ya que se formó como una salida (con índice 1) de la transacción 5778be8e1901e9931e9b41a128a0b7f963e6e1ae72e461df2cba26e6279d433a.

Una moneda especial, como antes, llamaremos una moneda con un valor nominal de b 0.01 NMC, locking scriptque contiene la operación con un nombre de dominio. Examinamos en detalle el mecanismo para la formación de tales monedas en la sección de Gestión de Dominios. Una moneda ordinaria que llamaremos una moneda de denominación arbitraria, a la que la operación con el dominio no está vinculada.

La propiedad principal de las monedas es su inmutabilidad. Cualquier moneda se puede gastar solo una vez y solo en su totalidad. Por lo tanto, cualquiera se menciona en la red Namecoin un máximo de dos veces: una vez en la creación y una segunda vez en el gasto.

Al decir "dirección", nos referiremos a un identificador que identifica de forma exclusiva un par de claves que puede abrir un script de bloqueo en un formato P2PKHque cierra una moneda ubicada en la entrada o salida de una transacción. Dado que solo la clave correspondiente a la dirección puede gastar una moneda, la analogía más cercana del mundo físico a la dirección es la billetera en la que se almacenan las monedas (y de las cuales se gastan).

A pesar de que en Namecoin, una dirección a menudo también se usa solo dos veces, no es necesario recibir y consumir una sola moneda. Los hechos de reutilizar direcciones nos ayudarán un poco en el futuro.

Hablamos con más detalle sobre entradas, salidas y direcciones en el capítulo de Bitcoin 201.

Entonces, se forman dos monedas a la salida de la transacción. La N2hgZoWaTKoJ7FPmLuytTow3XrCCfEj2camisma moneda especial, con un peso de 0.01 NMC, a la que está vinculado el dominio, fue a la dirección . Se NKMMLwyMw4nwGuke6vd3AuDBMP18FWRaF1envió una moneda ordinaria con cambio a la segunda dirección .

Este es el esquema de transacción más común. Todavía hay opciones cuando hay más de una moneda en la entrada, pero su propiedad común es que la moneda con cambio siempre es exactamente la misma.

Puede adivinar que dicha transacción corresponde a una simple actualización de la información del dominio. El pago de la actualización se realiza utilizando una (menos frecuentemente varias) monedas pertenecientes a una persona. De hecho, dado que una transacción siempre tiene un solo autor, debe administrar todas las direcciones de entrada. Sin esto, no podrá crear un script de desbloqueo, que es necesario para usar las monedas de esta billetera.

Bueno, dado que todo el cambio de esta operación se recoge en una moneda, está claro que esta moneda pertenece a la misma persona que las monedas en la entrada.

Un esquema similar para Bitcoin se describe en este trabajo , donde se llama one-time change. Refleja el método por el cual las aplicaciones nativas de Bitcoin realizan transacciones, bitcoindybitcoin-qt. Se llama una sola vez (una vez) debido a otra característica de estas aplicaciones. Por defecto, generan nuevas direcciones para monedas en la salida de la transacción creada.

Namecoin, junto con la base de código de Bitcoin, ha heredado la mayor parte del código de estas aplicaciones, que se denominan namecoindy namecoin-qt. Con respecto a las monedas ordinarias, podemos usar esta heurística de manera segura sin ningún cambio.

Las estadísticas de reutilización de direcciones para almacenar monedas especiales muestran que esta regla también se observa en la mayoría de los casos. La reutilización de tales direcciones es bastante rara. Direcciones utilizadas más de una vez, aproximadamente el 6% del total; más de dos veces, alrededor del 1%. Basado en el propósito de Namecoin, parece razonable suponer que la mayoría de las transacciones con monedas especiales en la red son simples operaciones de creación y actualización, durante las cuales el propietario del dominio no cambia. Por lo tanto, podemos argumentar que dicha operación corresponde al retiro de una moneda especial a una nueva dirección, previamente no utilizada.

Ahora veamos un ejemplo de una transacción con una dirección reutilizada para una moneda de salida especial. Para hacer esto, tome otra transacción del grupo RTM:b3c7ce9ca3a689c6236b9d6df3c257c5fab6c3985187669ccf731ac42a127a11.



La dirección NDpWDEx1mBkUYywqxDTAZZeGCfUV4GkVE8a la que se dirigió la moneda especial ya se usó en transacciones anteriores.



Como se mencionó anteriormente, los scripts predeterminados en las aplicaciones cliente nativas para Namecoin no dan como resultado la reutilización de direcciones. Para enviar una moneda especial a una dirección existente, el propietario deberá realizar esfuerzos opcionales por separado, descubrir e indicar la dirección de salida explícitamente en la etapa de formación de la transacción.

¿Por qué podría ser requerido? La única mención de la situación en la que la dirección de salida se especifica manualmente, me reuní solo en las instrucciones para transferir el dominio a otro propietario.



La conjetura se confirma si consideramos el destino adicional de las direcciones a la salida de la transacción en cuestión. En el diagrama a continuación, esta transacción está marcada por un hito verde brillante. Se puede ver que la siguiente transacción 9e16f6been el dominio stat-counter-4 se realizó utilizando una dirección de dinero NJ8xUePvque no tiene una conexión explícita con la dirección utilizada en la transacción "padre". Obviamente, el dominio fue transferido a la gestión de otra persona.



En el caso general, esto puede ser la venta de un dominio a otro propietario que no está relacionado con las actividades de la persona en cuestión o la transferencia de un dominio entre las cuentas de una persona. La segunda opción es la simplicidad y el bajo costo de registrar un nuevo dominio, así como la falta de interés visible de las organizaciones y los propietarios de marcas registradas en el registro de dominios en la zona .bit. No pudimos encontrar al menos un poco de motivación justificada para comprar un dominio, notado en actividades maliciosas. Por lo tanto, creemos que a pesar de la posibilidad de transferir el dominio a otra persona, las transacciones con direcciones reutilizables para el retiro de una moneda especial representan una reorganización de activos entre varias cuentas controladas por un grupo.

Formulamos los argumentos anteriores en forma de una regla heurística, que llamaremos cambio común:

, , , .

, , .

, , .

El esquema para usar esta regla se muestra en la figura. Corrientes grises - monedas ordinarias, verdes - una moneda especial. Las guías serán todas las monedas desde el final de la transacción opuesta a la moneda a través de la cual llegamos a esta transacción: todas las salidas son para el movimiento hacia arriba, y todas las entradas son para el movimiento hacia abajo.



Observamos varias características de esta heurística. En primer lugar, bidireccional: funciona tanto para el movimiento hacia arriba, cuando conocemos al propietario de la entrada, como para el movimiento hacia abajo, cuando conocemos al propietario de una de las monedas en la salida.

En segundo lugar, la disponibilidad opcional de una moneda especial: a pesar de que, en su ausencia, la transacción no está relacionada con la actualización del dominio, el razonamiento lógico dado anteriormente con respecto al propietario de una moneda regular sigue siendo válido.

El pseudocódigo para probar una transacción para el cumplimiento de la regla de cambio común se vería así:

 def common_change(tx): result = {"guiding_outs": [], "guiding_ins": []} if len(tx.outs.money) != 1: return {} addr = tx.outs.money[0].address first_tx = namecoin.tx.find_one({"out.id": addr}, sort=[("block", 1)]) if first_tx.id != tx.id: return {} else: result["guiding_outs"] = tx.outs.all result["guiding_ins"] = tx.ins.all return result 

Gasto común


La heurística considerada anteriormente tiene otra propiedad importante, además de la bidireccionalidad. Cambio común - heurístico "sin memoria"; el resultado de la verificación está determinado solo por las características de la transacción en cuestión y no depende de los resultados de otras heurísticas y datos acumulados. Tal heurística es indispensable en las primeras iteraciones de un recorrido, para el llenado inicial de un conjunto de datos. Por otro lado, es fácil notar las limitaciones de su aplicación. Por ejemplo, se centrará en una transacción que contenga dos o más salidas de efectivo.

Como ejemplo de tal transacción, considere db4ff4082f39d0a501508706e627f26aa92712d27b4f633ded59917d201cfae5. Esta transacción se relaciona con las actividades del grupo que administra la botnet Dimnie.



Bajamos esta transacción a través de la direcciónMy7Ap3nH5f4X6Us2KiUWisd77wRpMG1MDYque se usó en la transacción CC anterior como la dirección de inicio de sesión. A pesar de que su actitud hacia la persona en estudio está fuera de toda duda, no podemos decir lo mismo (ni lo contrario) sobre ninguna de las otras salidas y entradas. Esto puede ser una redistribución de monedas entre direcciones de grupo, en cuyo caso todas las direcciones están controladas por la persona que nos interesa. O es, tal vez, una recarga de las direcciones de cualquiera de los intercambios que venden tokens Namecoin. O una transferencia de otro miembro de la red que no está relacionado con las actividades de la persona en estudio. Es imposible llegar a una conclusión definitiva sobre los atributos de esta transacción solo.

Considera la direcciónN4XtLb7xpC4Zk72T8QcshKhTW17ZCyQ1j1a la entrada de esta transacción. Esta dirección ya se ha utilizado anteriormente ("anterior" para un movimiento descendente significa "en el futuro", "en la dirección del crecimiento de blockchain") en la entrada de una transacción CC 6bffc741eb66de074c09a380fb5e6bd13d4bd5205c36a76e3682674dba08461e, lo que nos permite considerar que esta dirección sea administrada por la persona que nos interesa. Y dado que, como ya se ha mostrado, las claves de todas las monedas en la entrada de la transacción están controladas por una persona (lo que no se puede decir sobre las salidas), tenemos razones para creer que todas las demás entradas también pertenecen al grupo de interés para nosotros.

La condición estricta del gasto común heurístico parece muy simple:

Si se sabe que al menos una de las direcciones en la entrada de la transacción está controlada por una determinada persona, entonces todas las demás direcciones en las entradas de esta transacción están controladas por la misma persona. Las monedas en estas entradas pertenecen a la misma persona.

Como puede ver, esta heurística tiene sentido solo para el movimiento hacia abajo. Al avanzar en la dirección del crecimiento de blockchain, llegamos a la transacción en estudio a través de una de las entradas. En este caso, la condición de la regla se cumple automáticamente, pero no dice nada sobre los resultados de la transacción y no le permite continuar moviéndose en la dirección ascendente. En otras palabras, esta es una heurística unidireccional.

La segunda característica de esta heurística, que vale la pena señalar, es que aquí usamos primero los datos acumulados como resultado de la verificación de transacciones anteriores: una lista de direcciones administradas por la persona bajo investigación. Por esta razón, esta heurística secundaria no puede usarse para un movimiento independiente, sin ninguna heurística primaria que no dependa de los resultados acumulados (como el cambio común).

El pseudocódigo para probar una transacción para el cumplimiento de la regla de gasto común se vería así:

 def common_spending(tx): result = { "guiding_ins": [] } for input in tx.get_ins(): if input.address in known_addresses: return {"guiding_ins": tx.ins.all} return {} 

Dirección conocida


La última heurística que consideraremos en el marco de esta sección es la más simple de todas. Esta es una heurística bidireccional secundaria que (dado que es bidireccional) puede usarse tanto para movimiento hacia arriba como hacia abajo. La formulación estricta de la dirección heurística conocida para el movimiento ascendente se ve así:

Si se sabe que la dirección en la entrada (salida) de la transacción está controlada por una determinada persona, entonces las monedas recibidas en esta dirección (gastadas desde esta dirección) pertenecen a la misma persona.

Aunque la heurística parece una verdad obvia, esta regla ayuda a encontrar sucursales e intersecciones en los flujos de monedas y agrega conectividad al árbol de transacciones. Además, le permite no detener el movimiento en transacciones que no se incluyen en otras heurísticas. Un ejemplo es la transacción de la 7a35b9cb0a16b3eba92781be014555eaa4255bd17655bb00f2b3f42c3950ac69botnet Dimnie ya mencionada.



Al haberlo alcanzado en un movimiento ascendente, no podremos avanzar con la ayuda de un cambio común, ya que la salida es más de una moneda ordinaria. Al observar una transacción, no podemos decir cuántas monedas en la salida pertenecen a la misma persona que la moneda en la entrada, ambas, una o ninguna. El uso de la dirección heurística conocida le permite avanzar debido al hecho de que la direcciónMwMdTb8WQvoRW9jEW5dHn9SkkCJTRn31wQparticipó en la transacción CC cf7ac8986f9855246c6cf26df9a24aa5645cb9258bf787e034a33e75101ae1fcque creó el dominio que se conoció anteriormente en el movimiento ascendente d/sectools.

En aras de la integridad, damos el pseudocódigo de la dirección heurística conocida:

 def known_address(tx): result = { "guiding_outs": [], "guiding_ins": [] } for output in tx.get_outs(): if output.address in known_addresses: result["guiding_outs"].append(output) for input in tx.get_ins(): if input.address in known_addresses: result["guiding_ins"].append(input) return result 

Entonces, ahora tenemos tanto el algoritmo de derivación general como las heurísticas necesarias para moverse a lo largo de la cadena de bloques, de modo que podamos juntarlos para obtener algo de COI de Namecoin.

Vamos!


Comenzaremos con las transacciones RTM con el movimiento hacia arriba y hacia abajo, comenzando con 37d40bc2f3ca7415908dc9e276593b50d3120158cd540cb088246f2e2cf88b16. En el curso de avanzar en la cadena de bloques, recopilaremos no solo el COI, sino también las transacciones mismas que satisfacen la heurística. Las monedas fluyen entre las transacciones que visualizamos usando el gráfico de Sankey.

El diagrama completo es demasiado grande para mostrarse en el formato de este documento, por lo que daré aquí solo una parte que es necesaria para la historia adicional.



Una corriente de monedas ordinarias se resalta en gris. Los colores restantes corresponden a los flujos de monedas especiales. Se selecciona un color separado para cada nombre. Los hitos blancos corresponden a transacciones que satisfacen las condiciones heurísticas. Los hitos rojos brillantes a la derecha son UTXO.

El elemento del gráfico al que me gustaría llamar la atención está resaltado con un hito azul. Esta es una entrada colgante: una moneda que surgió a la entrada de una transacción que el algoritmo pasó en el movimiento ascendente, pero la transacción que creó esta moneda no lo encontró.

Las entradas colgantes son signos de que la estructura en estudio tiene ramas laterales que no están conectadas al tronco principal a lo largo del cual se mueve el algoritmo. En el caso que se muestra, esta es otra cuenta independiente. Como se puede ver en el diagrama, comienza a usarse para pagar los cambios en los dominios que ya conocemos. De este hecho podemos concluir que esta cuenta también está controlada por la persona bajo investigación. Para obtener el COI asociado con las operaciones en esta cuenta hasta que aparezca en el gráfico, comenzaremos un movimiento descendente por separado, comenzando en una transacción con una entrada colgante.

Del mismo modo, en un movimiento hacia abajo, pueden ocurrir salidas colgantes. Para cada uno de ellos, lanzaremos un movimiento ascendente separado a partir de la transacción correspondiente.

Además de las transacciones del grupo que controla la botnet RTM, también examinamos las transacciones de los grupos que controlan las botnets Shifu, Dimnie y GandCrab. Como resultado, se encontraron 164 dominios registrados en interés de estos grupos y 277 direcciones IP asociadas con estos nombres. Al momento de escribir este artículo, de las UTXO recolectadas pertenecientes a estos grupos, 39 monedas seguían vigentes.

Las listas de COI, así como las direcciones de Namecoin en las que permanecieron las monedas no utilizadas de los grupos, se dan en el Apéndice A.

Conclusión


Las pruebas de la vida real son un desafío para casi cualquier tecnología. A mediados de la década de 2000, Wikipedia se había convertido en una fuente de información confiable y tan popular que al cambiar los textos de los artículos se hizo posible controlar la opinión pública, comenzar y ganar dinero. Este período en la historia del servicio es famoso por sus enormes guerras de revisión: el uso agresivo del mecanismo para corregir artículos y la reversión de ediciones por varias partes beligerantes para ganar la disputa sobre el contenido del artículo. Las páginas de Wikipedia se convirtieron en una feria internacional de tocadores, donde todos querían decir literalmente la última palabra.

Por un lado, comenzaron a luchar con las enmiendas, estableciendo reglas especiales que, en caso de disputa, permiten excluir temporalmente la posibilidad de editar el artículo, hasta que los debatientes en la sección "Discusión" encuentren una redacción de compromiso. Por otro lado, la guerra de revisiones obligó a Wikipedia a lanzar un mecanismo dinámico para administrar los recursos de los administradores, lo que les permitió participar rápidamente en la resolución de conflictos en las áreas más calientes. Además, la enciclopedia aprovechó la atención pública que atrajo los enfrentamientos en torno a artículos individuales para atraer a más participantes a la edición de estos artículos y lograr la cobertura más correcta y completa de un tema en particular.

¿Puede Namecoin, como Wikipedia, crecer y hacer frente a su desafío? Espera y mira.

Las tablas PS con indicadores de compromiso están disponibles en GitHub .

Publicado por Alexey Goncharov, PT Expert Security Center

Source: https://habr.com/ru/post/460857/


All Articles