
A blockchain Namecoin foi criada como uma alternativa aos registradores DNS tradicionais, protegidos contra censura e apreensão forçada de domínio. Nos últimos anos, operadores de redes de bots, como Dimnie, Shifu, RTM e Gandcrab, começaram a usá-lo para gerenciar os endereços dos servidores C&C.
Por um lado, a descentralização e estabilidade do blockchain impedem que pesquisadores e provedores removam esses domínios ou tomem o controle deles. Por outro lado, a infraestrutura baseada no blockchain tem um recurso arquitetônico: todas as alterações na rede estão disponíveis ao público e podem ser usadas para estudar e rastrear as ações dos invasores.
Este artigo apresenta a abordagem usada para mapear botnets no Namecoin e segui-los para extrair novos COIs. Usando a abordagem descrita, foram compiladas listas de ativos (consulte o apêndice) usados pelas redes de bots mencionadas acima.
Digressão lírica
Invenções que mudam a Internet geralmente resolvem não apenas um problema técnico, mas não tanto técnico quanto social. São precisamente essas tecnologias e serviços que permitem à comunidade olhar de lado alguns axiomas que pareciam inabaláveis, repensá-los, recriar a partir do zero, deixando apenas uma idéia e diminuindo a carga de convenções e limitações herdadas acumuladas ao longo dos anos. Blockchain e Bitcoin, Tor, Wikipedia - por trás do sucesso de cada um deles, há um pequeno grupo de entusiastas com olhos ardentes, sinceramente acreditando que estão criando uma sociedade melhor.
Infelizmente, outros costumam persegui-los - estranhos aos estranhos ideais dos pioneiros da Internet, mas muito mais práticos. Eles encontram
um aplicativo
alternativo para a tecnologia, no qual os criadores não pensaram (ou não queriam pensar). Estando na fronteira (e mais frequentemente, escondendo-se abertamente no exterior) do permitido, esse aplicativo alternativo, muitas vezes não sem a ajuda da mídia, pois a maioria se torna
implícita por padrão , ou mesmo a
única .
A equivalência da tecnologia como uma idéia e o método mais discutido para seu uso pode levar à rejeição pela sociedade da própria tecnologia. Como resultado da criminalização de seu uso, um serviço imaturo pode ser reduzido ao nível de uma cultura marginal ou completamente destruído. Então isso aconteceu há muito tempo com o
Napster , não há muito tempo - com
BitTorrent e Tor, agora isso está acontecendo com o Bitcoin.
Isso não passou do herói deste trabalho - Namecoin. O Namecoin é um blockchain projetado para armazenar pares de valores-chave arbitrários, o mais famoso dos quais é um sistema de registro de nomes DNS descentralizado e resistente à censura - Dot-Bit.
Nosso interesse no Namecoin aumentou depois que o grupo de gerenciamento de botnet RTM começou a usar o Dot-Bit para gerenciar seus servidores C&C. Em algum momento, nos perguntamos - é possível detectar novos servidores C & C imediatamente após o registro no Dot-Bit? E se não houvesse problemas com as atualizações de domínios conhecidos, o desenvolvimento de uma abordagem que permita detectar fortes evidências da conexão de novos domínios com uma pessoa de interesse de repente se tornou uma tarefa emocionante de pesquisa, cujo resultado foi este trabalho.
Em geral, a pesquisa da Namecoin e a coleta de indicadores de comprometimento no Dot-Bit foram realizadas anteriormente. O trabalho mais detalhado pode ser considerado
um artigo de Kevin Perlow . Ele foi o primeiro a chamar a atenção para a possibilidade fundamental de extrair dados do Namecoin e descreveu várias técnicas heurísticas que permitem a um especialista encontrar domínios com características semelhantes aos servidores C&C conhecidos de um grupo específico.
A abordagem apresentada neste estudo apresenta várias diferenças significativas em relação à técnica de indexação e pivotamento por especialistas descrita por Kevin. As regras heurísticas que desenvolvemos para determinar os proprietários de domínio são derivadas dos princípios da blockchain e da formação de transações nele e, além da descrição geral, são apresentadas na forma de formulações lógicas estritas. Juntamente com uma descrição formal do algoritmo de desvio, isso permite automatizar a pesquisa pelo COI, o que aumenta significativamente a eficácia da investigação. Além disso, o algoritmo desenvolvido ajuda não apenas a encontrar outros nomes que já foram usados pelo grupo de estudo, mas também permite rastrear a criação de novos domínios controlados pela mesma pessoa.
Todo o trabalho está dividido em três capítulos. O primeiro capítulo descreve os conceitos básicos do Bitcoin, cujo código foi usado como plataforma para criar o Namecoin. Muitas entidades, relacionamentos e suas implementações definidas no Bitcoin foram herdadas pelo Namecoin. Sua compreensão é crucial para uma discussão mais aprofundada.
O segundo capítulo é dedicado diretamente ao Namecoin e sua principal aplicação - Dot-Bit.
O terceiro capítulo descreve a abordagem proposta para extrair dados do Namecoin e também fornece uma descrição formal do algoritmo de desvio de blockchain e regras heurísticas usadas para estabelecer relacionamentos entre domínios.
Os apêndices contêm COI coletados usando o método descrito para algumas redes de bots, bem como uma lista de referências e repositórios que ajudarão os pesquisadores que desejam continuar trabalhando neste tópico.
Bitcoin 201
A maioria das informações nesta seção é coletada dos materiais da série de artigos de Sergey
Pavlov_dog Potekhin “
Bitcoin em poucas palavras ”. Para os leitores de língua russa, essa fonte, em nossa opinião, é a mais abrangente e profunda disponível ao público, mas é surpreendentemente fácil de ler. Pesquisadores interessados no dispositivo interno do Bitcoin, pedimos que não nos limitemos aos trechos fornecidos nesta seção, mas que se familiarizem com o texto completo dos artigos, disponível por referência no aplicativo. O restante das informações apresentadas abaixo será suficiente para entender a descrição do algoritmo e das regras heurísticas para encontrar o relacionamento entre os endereços no Namecoin, fornecido no capítulo anterior.
Embora seja habitual começar a história sobre o blockchain com blocos e a criptografia que os conecta, começaremos com as transações.
Transação
Como você sabe, o análogo mais próximo do Bitcoin é um livro de contas no qual todas as transações com moedas são registradas. Mas, estranhamente, no Bitcoin não existe uma tabela geral da forma
<, >
, assim como não há contador-chefe que edite essa tabela.
Em vez disso, a blockchain muito notória é usada, ou seja, todas as transações são geralmente armazenadas. Por uma questão de simplicidade, podemos assumir que estas são mensagens do formulário:
<address 1> sent <amount> BTC to <address 2>
Portanto, se você percorrer todo o blockchain, poderá calcular quantas moedas "pertencem" a um endereço específico.
Entradas e saídas
Uma transação real em uma rede Bitcoin é um pouco mais complicada do que a descrita acima. Essa é uma estrutura cujos componentes principais são entradas e saídas.
Entradas são transações às quais você "se refere". Imagine que três transações foram enviadas para o seu endereço X uma vez:
TXN_ID: 123456, VALUE: 40 BTC TXN_ID: 645379, VALUE: 10 BTC TXN_ID: 888888, VALUE: 100 BTC
Se você precisar gastar, por exemplo,
45 BTC
, poderá consultar a transação
888888
ou duas transações ao mesmo tempo:
123456
e
645379
.
Saídas - literalmente "saídas". Podemos assumir que esses são "endereços" para os quais as moedas serão "enviadas" como resultado da transação. Também pode haver várias saídas; cada uma delas possui sua própria quantidade.
Na figura abaixo, uma nova transação
C
, que se refere a duas saídas -
A
e
B
Como resultado, a transação possui
0.008 BTC
na entrada, que são divididos em duas saídas -
0.001 BTC
enviado para o primeiro endereço e
0.006 BTC
para o segundo.

A capacidade de especificar várias saídas de uma só vez é um recurso muito importante, porque
a saída da transação pode ser usada como entrada apenas uma vez e somente na sua totalidade . Se você possui uma transação de entrada no
10 BTC
e precisa gastar 8 deles, basta criar uma transação com uma entrada e duas saídas:
8 BTC
para o vendedor e
2 BTC
volta para o seu endereço. Se você criar uma transação na qual a soma das saídas seja menor que a soma das entradas (como na figura), a diferença será enviada para o endereço do mineiro que escreveu sua transação no bloco.
Taxa
É essa diferença entre a soma das entradas e a soma das saídas que é chamada de “
transaction fee
”,
transaction fee
. É a segunda fonte de renda mais importante para os mineradores, e o tempo que leva para a transação ser incluída na blockchain depende disso. Isso se deve ao fato de cada minerador ter um determinado conjunto de transações não verificadas que alegam estar no bloco e, como regra, o minerador simplesmente as classifica em ordem decrescente, maximizando assim seu lucro. Portanto, quanto maior a comissão, mais você estará na fila e mais rápido será o pagamento.
A visão geral da transação é descrita na
especificação oficial do protocolo , aqui é apresentado um dos casos particulares mais comuns.

previous output hash
- identificador de
previous output hash
(hash) da transação à qual estamos nos referindo.
previous output index
- como precisamos nos referir não à transação em si, mas a uma de suas saídas, nesse parâmetro indicamos em qual saída específica estamos interessados. A numeração começa do zero.
value
- a quantidade de Satoshi (
1/100000000
BTC) enviada para a saída. É gravado em um formato little-endian, ou seja,
62 64 01 00 00 00 00 00
- é
0x016462
ou
0.00091234 BTC
.
O
block lock time
e os parâmetros de
sequence
raramente são usados na prática. Como não estamos interessados neles, omitiremos a descrição de seu propósito.
Mas sobre os parâmetros com a palavra
script
no título, nos debruçamos em mais detalhes.
Script
A rede Bitcoin possui um mecanismo baseado em algoritmos criptográficos com uma chave pública que permite criar um sistema no qual apenas o proprietário da chave possa usar as moedas associadas ao endereço obtido com essa chave. Vamos descobrir como isso é implementado sob o capô.
Para começar, dentro do Bitcoin existe uma linguagem de programação empilhada simples chamada
Script
. Aqui está o programa de script mais simples:
2 3 OP_ADD 5 OP_EQUAL
Cada instrução é chamada
opcode
, existem cerca de 80 no total.A figura abaixo mostra o processo de execução do programa acima.





No Bitcoin
Script
é usado para definir uma condição sob a qual será possível gastar a saída e para poder confirmar que a condição foi atendida. A condição (
locking script
) é armazenada na transação no campo
scriptPubKey
para cada saída. A confirmação de que a condição foi atendida (
unlocking script
) é gravada no campo
scriptSig
para cada entrada.
Para verificar o direito de usar a saída, você precisa conectar o
unlocking script
+
locking script
e executar o programa resultante como um todo. Se após a execução,
TRUE
permanecer no topo da pilha, a transação será válida.
Pagar para hash de chave pública (P2PKH)
O script
P2PKH
usado na maioria das transações, portanto, você deve entender como ele funciona. Aqui está sua visão geral:

Esse script é conhecido desde o advento do Bitcoin e executa a tarefa mencionada no início do capítulo - para garantir que apenas o proprietário da chave possa usar as moedas associadas ao endereço obtido com essa chave.
A idéia é a seguinte: deixe seu amigo
B
possuir um par de chaves -
P
(particular) e
K
(público). Usando a função hash, ele obtém o endereço
A
da chave pública e informa o endereço para você. Em seguida, você envia, por exemplo,
1 BTC
para o endereço
A
e escreve o seguinte no campo do
locking script
:
Somente alguém que possui a chave privada do endereço A
pode gastar esta transação. Como prova, escreva no unlocking script
, primeiro a chave pública K
e, em segundo lugar, a assinatura da transação com a chave privada P
Quando
B
decide usar sua transação como uma entrada, ele criará o seu, por exemplo,
0.5 BTC
, e no campo de
unlocking script
colocará a assinatura de sua transação com a chave privada
P
-
sig
e a chave pública K -
PubK
.
Aqui está o processo de execução do programa combinado:







Blocos e blockchain
Se toda a blockchain for um livro, os blocos individuais poderão ser representados como páginas nas quais as transações são registradas. Cada bloco "se refere" ao anterior e assim por diante até o primeiro bloco (
genesis block
). Isso é o que cria um recurso do blockchain como imutabilidade. Você não pode pegar e alterar o bloco
#123
para que ninguém note: a blockchain é projetada de forma a implicar uma alteração no bloco
#124
, depois
#125
e assim por diante, até o topo.
A estrutura do bloco é assim:

Os seis primeiros parâmetros (todos, exceto
txn_count
e
txn_count
) formam o cabeçalho do bloco. O hash do cabeçalho é chamado de hash do bloco; As próprias transações não participam diretamente do hash.
merkle_root
é responsável por sua imutabilidade - se simplificado, esse é um hash de todas as transações no bloco. Você pode ler mais sobre o algoritmo para construir a árvore Merkle aqui neste
link .
Nonce e bits estão diretamente relacionados ao processo de aparecimento de blocos - mineração.
Mineração
A mineração é um processo crítico para o Bitcoin, consistindo na criação de novos blocos e na busca de dois objetivos ao mesmo tempo. O primeiro é a produção de suprimentos monetários. Cada vez que um mineiro cria um novo bloco, ele é recompensado com o enésimo número de moedas que gasta em algum lugar, lançando novos fundos na rede.
O segundo, e muito mais importante, objetivo é controlar a conformidade com as regras da rede. São os mineradores que verificam os scripts e as entradas da transação antes de incluí-los no bloco.
Aqueles que desejam aprender mais sobre os fundamentos financeiros do Bitcoin podem aconselhar
este artigo . Não prestarei muita atenção ao primeiro aspecto da mineração e me concentrarei na segunda verificação de transações e lançá-las na rede.
Prova de trabalho
Deixe você ser um mineiro. Você tem 10 transações que deseja incluir no bloco. Você verifica a validade dessas transações, forma um bloco, especifica 0 no campo
nonce
e considera o hash do bloco. Em seguida, mude
nonce
para 1 e conte o hash novamente.
Sua tarefa é encontrar um
nonce
tal que o hash do bloco (número de 256 bits) seja menor que um número predeterminado
N
A busca por esse hash é possível apenas através de força bruta
nonce
. Portanto, quanto mais rápido você encontrar o nonce, mais energia será necessária.
O número
N
é exatamente esse parâmetro (também chamado de
target
), que a rede ajusta dependendo da potência total dos mineradores. Se amanhã os blocos começarem a sair, relativamente falando, a cada três minutos,
N
será reduzido, mais tempo será necessário para procurar nonce e o
block time
aumentará novamente para 10 minutos. E vice-versa.
É assim que o algoritmo de Prova de Trabalho subjacente ao Bitcoin e muitas outras blockchains se parece. Com aparente simplicidade, possui várias características importantes:
- Criar um novo bloco é uma tarefa computacionalmente difícil. Ao mesmo tempo, verificar se o bloco está correto é uma operação simples e quase instantânea.
- Toda a rede leva 10 minutos para calcular um novo bloco (em média). O tempo específico é diferente para cada blockchain, mas o resultado final é que o tempo médio é predefinido. Além disso, esse tempo não depende do número de participantes da rede. Mesmo que um dia haja cem vezes mais mineradores, o algoritmo alterará seus parâmetros para que se torne mais difícil encontrar o
block time
e o block time
volte para a vizinhança do tempo especificado.
Como descrito acima, o processo de mineração se resume a encontrar um hash de bloco menor que um número chamado target
. Na estrutura do bloco, esse número é gravado no campo de bits. Por exemplo, para o bloco #277316 target
era 1903a30c
.
Como descrito acima, o processo de mineração se resume a encontrar um hash de bloco menor que um número chamado
target
. Na estrutura do bloco, esse número é gravado no campo de
bits
. Por exemplo, para o bloco
#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" }
De fato
bits
em
bits
dois números são escritos ao mesmo tempo: o primeiro byte
0x19
é o expoente, os três bytes restantes
0x03a30c
são a mantissa. Para obter o
target
dos
bits
, você precisa usar a seguinte fórmula:
target = mantissa * 2^(8 * (exponent - 3))
Mas são os
bits
, como regra, que são indicados em todos os registros de bloco on-line, como, por exemplo,
https://namecha.in/ - registro de bloco Namecoin.
E sim, basta teoria. Tudo o que falamos acima quando aplicado ao Bitcoin se aplica igualmente ao Namecoin - exceto pelas pequenas diferenças, sobre as quais falaremos na próxima seção.
Namecoin
O Namecoin é um blockchain baseado nos algoritmos e no código-fonte do Bitcoin, cuja idéia principal é usar um esquema de registro de transações distribuídas para gerenciar um sistema de nomes de domínio, um análogo do DNS tradicional.
O Namecoin copia as principais abordagens Bitcoin (Prova de Trabalho, intervalo de geração de bloco de 10 minutos) e formatos de dados, com exceção de pequenas adições, sobre as quais falaremos mais adiante.
Os domínios da Namecoin têm o sufixo .bit. Esta zona não foi alocada pela IANA e não foi atribuída à lista de
domínios de finalidade especial . Servidores DNS regulares geralmente respondem a essas solicitações NXDOMAIN. Mas existem gateways do DNS para o Namecoin (por exemplo,
OpenNIC ), proxies públicos com suporte ao Namecoin,
plug-ins de navegador e
um projeto de código aberto que permite iniciar seu próprio servidor DNS com o suporte ao Namecoin.
Para gerenciar um domínio com o nome, digamos,
facebook.bit
, basta registrar a chave
d/facebook
prefixo
d/facebook
é usado no Namecoin para domínios) e determinar seu valor. O formato JSON é usado para definir os valores. Uma entrada que define a resolução do domínio para o endereço IP
1.2.3.4
é assim:
{"ip": ["1.2.3.4"]}
O Namecoin aloca nomes por ordem
de chegada . Mesmo para o próprio Mark Zuckerberg, será criptograficamente impossível retirar o domínio
facebook.bit
do proprietário.
De fato, nada restringe o uso do Namecoin apenas ao gerenciamento dos pacotes de nomes DNS - endereço IP. O Namecoin pode ser usado (e usado) como uma tabela distribuída para mapear chaves arbitrárias para valores. Mas vamos nos concentrar precisamente no cenário de seu uso, no qual ele representa um DNS alternativo sobre a blockchain.
Gerenciamento de domínio
O Namecoin usa uma transação para armazenar um registro de domínio. Ou seja, o campo
scriptPubKey
contém o programa é a condição para usar a saída da transação, à qual dedicamos tanto tempo no capítulo anterior. Para gerenciar registros, o Namecoin introduziu três novos operadores (mais precisamente, redefiniu os existentes):
- NAME_NEW
- NAME_FIRSTUPDATE
- NAME_UPDATE
Seu significado é claro nos nomes, mas, no entanto, analisaremos o objetivo e o formato de uso de cada um deles.
Você pode perceber que o operador de exclusão ou invalidação de domínio está ausente. Para limpar o registro de nomes não utilizados, um mecanismo é incorporado à rede que libera automaticamente um nome que não foi atualizado por 36.000 blocos (~ 250 dias).
NAME_NEW
O primeiro passo é anunciar a intenção de registrar um novo nome na rede. Para fazer isso, basta criar uma moeda especial (saída) pesando pelo menos
0.01 NMC
, cujo
output script
será algo como isto:
OP_NAMENEW <20 byte hash> OP_2DROP <lock script>
Para demonstrar, usarei as transações que Stephen Morse fez para
ilustrar seu artigo .
Portanto, se queremos anunciar o registro do nome
d/stephenmorse
, precisamos fazer o seguinte:

Observando a transação resultante, você pode perceber dois fatos interessantes. Primeiro, apesar do
output script
escrito na notação Namecoin, ele ainda é válido do ponto de vista do Bitcoin original. Os criadores do Namecoin escolheram com sucesso códigos para suas operações que no Bitcoin correspondem a operações que são essencialmente equivalentes a escrever na pilha constante.
NAME_NEW (0x51)
corresponde a
OP_1
, que
OP_1
pilha 1. Uma história semelhante com
NAME_FIRSTUPDATE
(
0x52
ou
OP_2
, coloca 2) e com
NAME_UPDATE
(
0x53
ou
OP_3
, coloca 3). Portanto, as duas primeiras etapas do script colocam apenas dois valores na pilha. E a próxima operação
OP_2DROP
remove da pilha, para que mais
P2PKH
funcione "do zero". Portanto, todos os truques de script que abordamos no capítulo sobre Bitcoin também são aplicáveis ao Namecoin, apesar da redefinição de algumas operações.
Em segundo lugar, as teclas que abrem uma moeda especial e mudam são diferentes. Embora tecnicamente nada impeça você de usar a mesma chave repetidamente, é prática comum gerar uma nova chave para cada recebimento. Isso é feito para dificultar a identificação de correlações entre transações e aumentar o nível de anonimato na rede.
À primeira vista, parece estranho que, ao contrário do senso comum, seja impossível obter e registrar imediatamente um nome mais um endereço IP para ele. Isso é feito para que ninguém possa interceptar o nome assim que perceber que você deseja registrá-lo (e depois revendê-lo para você).
Por exemplo, os mineradores, analisando transações não confirmadas (ainda não incluídas em nenhum dos blocos) na rede, poderiam criar sua própria transação para registrar o mesmo domínio e incluí-la (e não a sua) no bloco. Para implementar esse ataque, nem é necessário minar seu bloco. Será o suficiente para colocar sua transação na rede com uma taxa alta. Portanto, duas operações separadas
NAME_NEW
e
NAME_FIRSTUPDATE
e a segunda só pode ser executada por quem executou a primeira e somente depois que
NAME_NEW
entra em qualquer bloco.
De fato, essa restrição é ainda mais rígida:
NAME_FIRSTUPDATE
é possível não antes de 12 quarteirões após
NAME_NEW
(que é cerca de 2 horas). Para entender por que os bloqueios nessa restrição não são 1, 2 ou 3, mas especificamente 12, teremos que recuar um pouco da história principal e descobrir o que
51% attack
fork
e
51% attack
.
GarfoImagine que os mineradores estejam procurando pelo bloco
#123456
. E mais ou menos na mesma época, ele foi encontrado de forma independente por dois mineiros, um dos quais mora na Austrália e o outro nos Estados Unidos. Cada um deles começa a espalhar sua versão do bloco pela rede e, como resultado, verifica-se que metade do mundo tem uma blockchain e a outra tem outra.

Isso é possível? Sim, é possível. Além disso, isso acontece com bastante frequência. Nesse caso, cada nó continua aderindo à sua própria versão do blockchain até que alguém encontre o próximo bloco. Suponha que o novo bloco continue o ramo verde, como na figura abaixo. Nesse caso, os nós que aderem à versão vermelha sincronizam automaticamente a verde, porque a regra funciona no Bitcoin (e, consequentemente, no Namecoin): a versão mais longa do blockchain é verdadeira. A versão vermelha do blockchain será simplesmente esquecida, juntamente com recompensas para quem o encontrar.

Obviamente, teoricamente, no segundo passo, a situação pode se repetir e, ao mesmo tempo, com o roxo, eles encontrarão outro que continuará a versão vermelha do blockchain. E no terceiro, e assim por diante. Mas a probabilidade até do primeiro garfo é bastante pequena, o segundo é ainda menor e assim por diante. O maior garfo da história do Bitcoin foi de apenas
quatro blocos . Portanto, em algum momento, um dos ramos seguirá em frente e toda a rede irá para ele.
Ataque de 51%O fato de a cadeia mais longa da blockchain ser dominante é baseado em um ataque com o nome 51%.
Imagine que você é um scammer e compra mercadorias a
1000 BTC
em uma loja. Você concorda com o vendedor e envia o dinheiro. O vendedor verifica a blockchain, vê que essa transação realmente foi, passou todas as verificações e até entrou em algum bloco, por exemplo
#123
. Depois disso, o vendedor vai para o correio e envia a mercadoria.
Nesse momento, você liga sua fazenda de mineração e inicia a mineração a partir do bloco
#122
. Se você tiver energia suficiente, poderá ultrapassar o resto da rede e contar o mais rápido para bloquear o
#124
, após o qual o mundo inteiro mudará para a sua versão do blockchain. Ao mesmo tempo, você não incluirá sua transação de
1000 BTC
em nenhum dos blocos, o que significa que será esquecida para sempre, como se nunca tivesse sido. .
, . . 11
, , 6 , 0,1% , 10% . , . , Namecoin , 20% .
. , . ,
NAME_NEW
, 12 ,
NAME_FIRSTUPDATE
.
NAME_FIRSTUPDATE
O objetivo da operação NAME_FIRSTUPDATE
é publicar o nome que anunciei NAME_NEW
e especificar um valor para ele. Para fazer isso, preciso iniciar uma transação na rede, cuja entrada é a moeda muito especial que geramos na saída NAME_NEW
. Para confirmar o direito de usá-lo, apresento no script de entrada minha chave pública e a assinatura da transação NAME_NEW
feita pela chave de par privada, exatamente de acordo com o esquema que examinamos no capítulo sobre P2PKH
.Um dos resultados da transação será uma nova moeda especial que pesa, como a anterior, nada menos 0.01 NMC
. Seu script de saída deve ser assim: OP_NAME_FIRSTUPDATE <Name> <Salt> <Value> OP_2DROP OP_2DROP <lock script>
Salt
É o número muito aleatório 0xd5eeb22ee8117f57
que criamos no primeiro estágio de preparação do script NAME_NEW
. Name
- é d/stephenmorse
em hexadecimal 0x642f7374657068656e6d6f727365
.O campo Value
deve conter uma matriz associativa representando as regras pelas quais o nome será resolvido. Uma lista completa de possíveis chaves e regras para preenchê-las aqui . Em uma primeira aproximação, este é um análogo do arquivo de zona; o link acima mostra o mapeamento de entidades Namecoin para entidades DNS familiares. Os mais populares deles são ip, um exemplo com o maior, e ns, que usamos agora.Para indicar qual será o servidor NS para o domínio, 1.2.3.4
colocaremos um valor em Value {“ns”:[“1.2.3.4”]}
, mas, é claro, em hexadecimal - 0x7b226e73223a5b22312e322e332e34225d7d
.Como da última vez, feche a moeda com P2PKH
. Em seu exemplo, Stephen criou deliberadamente uma moeda na etapa NAME_NEW com um peso não exatamente 0.01 NMC
, mas com uma margem, de modo que, na próxima etapa, essa margem seria suficiente para a comissão ao minerador. No caso geral, a transação terá mais uma entrada para garantir a comissão - e mais uma saída para entrega.Coletamos tudo em uma transação e jogamos na rede .
Quando a transação cai no bloco, os hosts atualizam em suas tabelas o valor da chave d/stephenmorse
ativada {“ns”:[“1.2.3.4”]}
. Todos os navegadores com suporte à Namecoin agora resolverão o domínio stephenmorse.bit
e seus subdomínios para endereços IP através do servidor DNS localizado em 1.2.3.4
.NAME_UPDATE
A “mesa” com chaves e seus significados, que mencionei no final da última seção, é chamada de fato UTXO set (unspent transaction output)
. Como é fundamental para a rede impedir gastos repetidos de fundos, antes de adicionar uma transação ao bloco, o mineiro verifica se as entradas especificadas anteriormente na transação foram usadas. Para acelerar esta operação, todas as saídas não utilizadas são armazenadas em uma estrutura de dados separada. Essa estrutura não existe no nível da rede, mas é calculada e armazenada por cada nó localmente.Depois de concluir a transação NAME_FIRSTUPDATE
, a saída da minha moeda com um peso 0.01 NMC
, ao qual o valor da chave está anexado d/stephenmorse
, atinge a mesaUTXO
. Se essa saída não for gasta por 36.000 blocos (que é mais de 8 meses com 10 minutos por bloco em média), ela será considerada inválida e o nome correspondente como livre.Este período de 36.000 blocos (assim como o valor mínimo de uma moeda especial 0.01 NMC
) é claramente definido no início da rede e permanece inalterado. Para estender o registro do nome, bem como para quaisquer alterações no registro ou transferi-lo para outro proprietário, uma transação é usada NAME_UPDATE
.As regras para a formação de tal transação praticamente não diferem das descritas acima. A entrada para a transação deve ser a saída da moeda obtida na transaçãoNAME_FIRSTUPDATE
. É necessária uma entrada adicional para garantir a comissão. Das duas saídas da transação, uma é uma nova moeda com um valor atualizado para o nome e a segunda é projetada para transferir a alteração da comissão. O formato do script de saída para a moeda é: OP_NAME_UPDATE <Name> <Value> OP_2DROP OP_DROP <lock script>
Como no caso anterior, Name
este é d/stephenmorse
, e Value
- JSON com um valor, ambos em hexadecimal. Feche a saída usando P2PKH e jogue a transação na rede .
Em geral, isso é quase tudo o que eu queria contar sobre o gerenciamento de nomes no Namecoin. Tudo o que resta é dizer algumas palavras sobre os custos de propriedade de um domínio.Custo
Vamos calcular quanto o conteúdo do nome em Dot-Bit
(o nome da zona DNS .bit, que opera com base no Namecoin) custa em criptomoeda e, traduzindo os números em moeda fiduciária, é comparável ao custo de um domínio DNS "normal".Portanto, como pode ser visto na seção anterior, para uma transação, os NAME_NEW
custos do proprietário do domínio serão 0.01 NMC
criar uma moeda à qual a zona será anexada, além da comissão do mineiro. Para uma transação, uma NAME_FIRSTUPDATE
nova moeda é criada às custas da antiga e, além disso, o proprietário paga apenas a comissão. Após cerca de 8 meses, o proprietário terá que concluir a transação NAME_UPDATE
para manter o nome registrado. E é aí que os custos necessários para o primeiro ano terminam.A maioria dos artigos sobre Namecoin (incluindo o artigo citado anteriormente por Stephen Morse) baseiam-se em dados dos primeiros anos de existência da rede e afirmam que a comissão do mineiro é 0,005 NMC. Mas desde então, o valor médio da comissão diminuiu gradualmente e, no início de 2019, é de cerca de 0,0003 NMC. A taxa de câmbio da NMC em relação ao dólar norte-americano, pelo contrário, tendo sofrido vários altos, retornou ao nível de 2015 e atinge cerca de US $ 0,7 por 1 NMC. É fácil calcular que o domínio na zona .bit no primeiro ano custará ao proprietário 0,0109 NMC ou US $ 0,00763. Talvez seja mais fácil para alguém lembrar de um análogo aproximado desse valor em moeda russa - 50 coroas.Bem, esse é o limite inferior que corresponde ao cenário para comprar um nome para uso futuro ou cyberquatting. E o limite superior? Como a entrada de cada transação que atualiza a zona deve ser uma moeda de um dos blocos anteriores, o máximo teórico da frequência de atualização do nome é igual à frequência de aparecimento de novos blocos. Lembrando que o valor médio desse valor foi definido no início da rede e é de cerca de 10 minutos, pode-se estimar que o limite superior do custo de manutenção de um domínio seja 15,7744 NMC ou pouco mais de US $ 11.Como você pode ver, mesmo um cenário tão fantástico de usar um nome no Namecoin a um custo é aproximadamente equivalente ao primeiro ano de propriedade de um domínio regular na zona .com mais popular. Se compararmos um cenário mais realista com uma atualização média uma vez por dia, o nome na zona .bit custará cerca de 8 centavos de dólar por ano, uma ordem de magnitude mais barata que as ofertas mais vantajosas no DNS tradicional, que não ficam abaixo de US $ 1. No cenário de uso de curto prazo do domínio (de várias horas a um mês), a diferença a favor do Namecoin já será de duas ordens de magnitude.Levando em conta a atratividade financeira do serviço, bem como o anonimato do proprietário do domínio, incluindo a falta de uma “trilha de dinheiro” tradicional para o DNS comum, fica claro por que o Namecoin se tornou uma rede popular para proprietários de serviços com um risco maior de desconexão ou bloqueio, em particular botnets.Botnets em Namecoin
De fato, o fato de as operadoras de botnet começarem a usar o anonimato Dot-Bit
para proteger seus servidores C&C não é surpreendente. Outra coisa é mais interessante - quanto tempo as botnets em .bit permanecem ativas.Os domínios C&C registrados em zonas DNS "comuns" são retirados, mais cedo ou mais tarde, do proprietário, o que força o operador a pagar pelo registro de um novo nome e iniciar um novo conjunto de bots na rede, com um novo servidor de gerenciamento. A impossibilidade fundamental de remover um domínio na zona .bit aumentou a vida útil da botnet em ordens de magnitude.Tomemos, por exemplo, o pationare.bit
domínio registrado em dezembro de 2016. Foi usado para controlar um botnet Chthronic
(distribuir um trojan bancário construído com base no famoso ZeuS). Campanha de distribuiçãoChthronic
foi associado ao uso do RIG do pacote de exploração e foi descrito em detalhes por vários pesquisadores (por exemplo, malware-traffic-analysis.net ) no final de 2016 - o primeiro semestre de 2017.Pode-se supor que essa botnet tenha sido destruída há muito tempo. Mas não - mais de dois anos após o lançamento, o domínio C&C da botnet e sua rede ainda estão ativos. Como pode ser visto na captura de tela abaixo, a última atualização foi feita em dezembro de 2018.
Parece tentador, certo? Como o nome DNS do servidor de gerenciamento permanece intacto, não é necessário atualizar frequentemente o código bot e reiniciar a campanha de distribuição. Tudo o que resta é o custo de alterar a hospedagem após o bloqueio do endereço IP, mas esses custos também podem ser reduzidos usando servidores da Web invadidos como proxies, cujas conchas custam menos de um dólar.Por outro lado, todas as transações na blockchain estão disponíveis ao público para qualquer participante. Como discutimos em detalhes nos capítulos anteriores, as moedas no Namecoin não desaparecem sem deixar vestígios, o que significa que podemos rastrear sua redistribuição entre endereços. E conhecendo as regras e restrições, levando em conta quais transações são formadas no Namecoin, podemos encontrar padrões significativos nos quais o gerenciamento uniforme de alguns endereços envolvidos na transação será óbvio. Nesse caso, os domínios pagos com moedas a partir desses endereços terão um proprietário em comum - o grupo que estamos gerenciando, que controla a botnet.Vamos desenvolver essa idéia ainda mais.Esquema Geral de Coleta do COI
Vamos descrever o esquema geral de pesquisa usando o exemplo de uma botnet real do grupo RTM. Vamos construir sobre esta amostra , que foi identificada como Win32/Spy.RTM.N
.
Como você pode ver na captura de tela acima, após iniciar, ele tenta obter o endereço IP para o nome stat-counter-4.bit
. Nós obtemos informações sobre o histórico de transações para esse nome no Namecoin.
O identificador da transação que criou este domínio, obtemos clicando no link para a operação NAME_NEW. O endereço de entrada dessa transação, com a ajuda da qual o domínio foi criado, é obviamente gerenciado pelo grupo de interesse para nós. Ele será o conjunto inicial de dados: N3KPt8py24EAsAiKquyFgoKGyTYeR5Tmry
.
Com base no conjunto de dados inicial, percorremos iterativamente a blockchain, avançando na direção de seu crescimento (movimento ascendente ou movimento ascendente). No início de cada etapa, obtemos uma transação, uma certa moeda cuja entrada pertence à pessoa em que estamos interessados. Na primeira etapa, verificamos a transação a partir do conjunto de dados inicial, o proprietário das moedas nas entradas das quais sabemos a priori.A transação é verificada quanto à conformidade com as regras heurísticas (as formularemos abaixo), que garantem que uma determinada moeda (ou moedas) na saída da transação pertença à mesma pessoa que a moeda de entrada conhecida. Se a transação em questão atender a uma ou mais heurísticas, essas moedas indicadoras indicarão a direção do movimento adicional. A transação que gasta a moeda guia será o próximo passo na iteração.Em cada etapa da iteração, reabastecemos a lista de domínios que participaram das transações e a lista de endereços IP para os quais esses domínios foram resolvidos. Estes são identificadores históricos de compromisso (COI), que podem ser usados por especialistas forenses, bem como para identificar táticas e métodos de agrupamento.O movimento é interrompido se a transação em questão não atender a nenhuma das heurísticas. Isso significa que não podemos afirmar com certeza que qualquer resultado da transação em questão é controlado pela pessoa em que estamos interessados.Outra situação que interrompe o movimento é a falta de transações do endereço de saída. Salvaremos esses endereços em uma lista separada de moedas não gastas (UTXO). Eles representam o maior valor em todo o estudo. Como estamos confiantes de que esses endereços são gerenciados pela pessoa em que estamos interessados, qualquer transação futura usando esses endereços gerará um novo COI anteriormente desconhecido - o nome de domínio ou o endereço IP - que ainda não foi usado pelo agrupamento. Mas com alta probabilidade, será em breve.Para ignorar o blockchain, é conveniente exportá-lo para o banco de dados. Para isso, você pode usar, por exemplo, o utilitário rusty-blockparser modificado , no qual aprimoramos o suporte ao Namecoin adicionando reconhecimento de operações NAME_*
, estruturas de dados Auxiliary Proof-of-Work
e expandindo o formato de exportação.O pseudo-código Python para o movimento ascendente é apresentado abaixo. Daqui em diante, supõe-se que os dados da transação blockchain sejam armazenados no 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)
A segunda parte do desvio da blockchain é o movimento contra o crescimento da blockchain (movimento descendente ou movimento a jusante). Em geral, o algoritmo de movimento descendente não é diferente do algoritmo ascendente. Um movimento começa com uma transação do conjunto de dados original. Em cada etapa, a transação é verificada quanto à conformidade com as regras heurísticas (em geral, diferentes das regras para movimento ascendente). A única diferença é que a moeda, cuja filiação é conhecida a priori, está na saída da transação e as heurísticas garantem que a mesma pessoa tenha uma ou mais moedas na entrada.Um movimento descendente também para se a transação atual não satisfizer nenhuma das heurísticas. Diferentemente do movimento ascendente, não podemos encontrar moedas não gastas entre as guias, e essa opção para sair da recursão no movimento descendente não funcionará. Mas, como no movimento ascendente, reabastecemos a lista de nomes e a lista de endereços IP.O pseudo-código Python para o movimento descendente ficaria assim: 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)
Agora considere as regras heurísticas que usaremos ao mover ao longo da blockchain.Regras heurísticas
Mudança comum
Vejamos novamente a transação, cuja captura de tela é fornecida acima. Um endereço N3KPt8py24EAsAiKquyFgoKGyTYeR5Tmry
contendo dinheiro para criar um novo nome é enviado para a entrada da transação . Haverá dois endereços para transações NAME_FIRSTUPDATE
e NAME_UPDATE
na entrada - uma moeda especial com uma zona da transação anterior por domínio e fundos adicionais para cobrir a comissão.Notarei imediatamente que, no contexto das transações, falaremos sobre moedas e endereços. Apesar de em alguns trabalhos esses conceitos serem considerados quase equivalentes, é importante indicar claramente a diferença entre esses termos, pois, no decorrer do estudo, tiraremos conclusões sobre moedas e endereços.Dizendo "moeda", queremos dizer um saldo positivo formado como a saída de uma transação. Essa moeda é identificada pelo número da transação que a gerou e pelo índice de saída. Por exemplo, uma moeda na entrada da transação considerada acima possui um identificador 5778be8e1901e9931e9b41a128a0b7f963e6e1ae72e461df2cba26e6279d433a:1
, pois foi formada como uma saída (com o índice 1) da transação 5778be8e1901e9931e9b41a128a0b7f963e6e1ae72e461df2cba26e6279d433a
.Uma moeda especial, como antes, chamaremos uma moeda com um valor nominal de b 0.01 NMC
, locking script
que contém a operação com um nome de domínio. Examinamos detalhadamente o mecanismo para a formação de tais moedas na seção Gerenciamento de Domínio. Uma moeda comum que chamaremos de moeda de denominação arbitrária, à qual a operação com o domínio não está vinculada.A principal propriedade das moedas é sua imutabilidade. Qualquer moeda pode ser gasta apenas uma vez e somente na sua totalidade. Assim, qualquer um é mencionado na rede Namecoin no máximo duas vezes: uma vez na criação e uma segunda vez nas despesas.Dizendo "endereço", queremos dizer um identificador que identifica exclusivamente um par de chaves que pode abrir um script de bloqueio em um formato P2PKH
que fecha uma moeda localizada na entrada ou saída de uma transação. Como apenas a chave correspondente ao endereço pode gastar uma moeda, a analogia mais próxima do mundo físico ao endereço é a carteira na qual as moedas são armazenadas (e da qual são gastas).Apesar do fato de que no Namecoin um endereço também costuma ser usado apenas duas vezes, não é necessário receber e consumir uma única moeda. Os fatos da reutilização de endereços nos ajudarão um pouco no futuro.Falamos com mais detalhes sobre entradas, saídas e endereços no capítulo Bitcoin 201.Assim, duas moedas são formadas na saída da transação. A N2hgZoWaTKoJ7FPmLuytTow3XrCCfEj2ca
mesma moeda especial, pesando 0,01 NMC, à qual o domínio está vinculado, foi para o endereço . Uma NKMMLwyMw4nwGuke6vd3AuDBMP18FWRaF1
moeda comum com troco foi enviada para o segundo endereço .Este é o esquema de transação mais comum. Ainda existem opções quando há mais de uma moeda na entrada, mas sua propriedade comum é que a moeda com troco é sempre exatamente a mesma.Você pode supor que essa transação corresponda a uma simples atualização das informações do domínio. O pagamento para atualização é realizado usando uma (menos frequentemente várias) moedas pertencentes a uma pessoa. De fato, como uma transação sempre tem apenas um autor, ela deve gerenciar todos os endereços de entrada. Sem isso, ele não poderá criar um script de desbloqueio, necessário para usar as moedas dessa carteira.Bem, como todas as alterações desta operação são coletadas em uma moeda, fica claro que essa moeda pertence à mesma pessoa que as moedas na entrada.Um esquema semelhante para o Bitcoin é descrito neste trabalho , onde é chamado one-time change
. Ele reflete o método pelo qual aplicativos Bitcoin nativos realizam transações - bitcoind
ebitcoin-qt
. Uma vez (uma vez) é chamado devido a outro recurso desses aplicativos. Por padrão, eles geram novos endereços para moedas na saída da transação criada.O Namecoin, junto com a base de código do Bitcoin, herdou a maior parte do código para esses aplicativos, chamados namecoind
e namecoin-qt
. Em relação às moedas comuns, podemos usar com segurança essa heurística sem nenhuma alteração.As estatísticas de reutilização de endereços para armazenar moedas especiais mostram que essa regra também é observada na maioria dos casos. A reutilização desses endereços é bastante rara. Endereços usados mais de uma vez, cerca de 6% do total; mais de duas vezes - cerca de 1%. Com base no objetivo do Namecoin, parece razoável supor que a maioria das transações com moedas especiais na rede são operações simples de criação e atualização, durante as quais o proprietário do domínio não muda. Portanto, podemos argumentar que tal operação corresponde à retirada de uma moeda especial para um novo endereço anteriormente não utilizado.Agora vamos ver um exemplo de transação com um endereço reutilizado para uma moeda de saída especial. Para fazer isso, faça outra transação do grupo RTM -b3c7ce9ca3a689c6236b9d6df3c257c5fab6c3985187669ccf731ac42a127a11
.
O endereço NDpWDEx1mBkUYywqxDTAZZeGCfUV4GkVE8
para o qual a moeda especial foi usada já foi usado em transações anteriores.
Conforme mencionado anteriormente, os scripts padrão nos aplicativos clientes nativos do Namecoin não resultam na reutilização de endereço. Para enviar uma moeda especial para um endereço existente, o proprietário precisará fazer esforços opcionais e separados, descobrindo e indicando o endereço de saída explicitamente no estágio de formação da transação.Por que isso pode ser necessário? A única menção à situação em que o endereço de saída é especificado manualmente, encontrei apenas nas instruções para transferir o domínio para outro proprietário.
A conjectura é confirmada se considerarmos o destino adicional dos endereços na saída da transação em questão. No diagrama abaixo, essa transação é marcada por um marco verde brilhante. Pode-se observar que a próxima transação 9e16f6be
no domínio stat-counter-4 ocorreu usando um endereço monetário NJ8xUePv
que não possui uma conexão explícita com o endereço usado na transação "pai". Obviamente, o domínio foi transferido para o gerenciamento de outra pessoa.
No caso geral, pode ser a venda de um domínio para outro proprietário que não esteja relacionado às atividades da pessoa em questão ou a transferência de um domínio entre as contas de uma pessoa. A segunda opção é a simplicidade e o baixo custo do registro de um novo domínio, bem como a falta de interesse visível das organizações e proprietários de marcas registradas no registro de domínios na zona .bit. Não fomos capazes de apresentar pelo menos um pouco de motivação justificada para comprar um domínio, notada em atividades maliciosas. Portanto, acreditamos que, apesar da possibilidade de transferir o domínio para outra pessoa, as transações com endereços reutilizáveis para a retirada de uma moeda especial representam um rearranjo de ativos entre várias contas controladas por um grupo.Formulamos os argumentos acima na forma de uma regra heurística, que chamaremos de mudança comum:, , , .
, , .
, , .
O esquema para usar esta regra é mostrado na figura. Fluxos cinzentos - moedas comuns, verdes - uma moeda especial. As guias serão todas as moedas do final da transação opostas à moeda pela qual chegamos a essa transação: todas as saídas são para movimento ascendente e todas as entradas são para movimento descendente.
Observamos várias características dessa heurística. Em primeiro lugar, bidirecional: funciona tanto para o movimento ascendente, quando conhecemos o dono da entrada, quanto para o movimento descendente, quando conhecemos o dono de uma das moedas na saída.Em segundo lugar, a disponibilidade opcional de uma moeda especial: apesar de, na sua ausência, a transação não estar relacionada à atualização do domínio, o raciocínio lógico dado acima em relação ao proprietário de uma moeda comum permanece válido.O pseudo-código para testar uma transação quanto à conformidade com a regra de mudança comum ficaria assim: 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
Gastos comuns
A heurística considerada acima tem outra propriedade importante, além da bidirecionalidade. Mudança comum - heurística "sem memória"; o resultado da verificação é determinado apenas pelas características da transação em questão e não depende dos resultados de outras heurísticas e dados acumulados. Essa heurística é indispensável nas primeiras iterações de uma travessia, para o preenchimento inicial de um conjunto de dados. Por outro lado, é fácil perceber as limitações de sua aplicação. Por exemplo, ela se concentrará em uma transação contendo duas ou mais saídas de caixa.Como um exemplo dessa transação, considere db4ff4082f39d0a501508706e627f26aa92712d27b4f633ded59917d201cfae5
. Esta transação está relacionada às atividades do grupo que gerencia o botnet Dimnie.
Descemos essa transação pelo endereçoMy7Ap3nH5f4X6Us2KiUWisd77wRpMG1MDY
que foi usado na transação CC anterior como o endereço de login. Apesar de sua atitude em relação à pessoa que está sendo estudada estar fora de dúvida, não podemos dizer o mesmo (nem o contrário) sobre nenhuma das outras saídas e entradas. Isso pode ser uma redistribuição de moedas entre os endereços do grupo. Nesse caso, todos os endereços são controlados pela pessoa em que estamos interessados. Ou é, talvez, uma recarga dos endereços de qualquer uma das trocas que vendem tokens Namecoin. Ou uma transferência de outro membro da rede que não está relacionado às atividades da pessoa que está sendo estudada. É impossível fazer uma conclusão definitiva apenas sobre os atributos dessa transação.Considere o endereçoN4XtLb7xpC4Zk72T8QcshKhTW17ZCyQ1j1
na entrada desta transação. Esse endereço já foi usado anteriormente ("mais cedo" para um movimento descendente significa "no futuro", "na direção do crescimento da blockchain") na entrada de uma transação de CC 6bffc741eb66de074c09a380fb5e6bd13d4bd5205c36a76e3682674dba08461e
, o que nos permite considerar esse endereço como sendo gerenciado pela pessoa de seu interesse. E, como já foi mostrado, as chaves de todas as moedas na entrada da transação são controladas por uma pessoa (o que não pode ser dito sobre as saídas), temos motivos para acreditar que todas as outras entradas também pertencem ao grupo de interesse para nós.A condição estrita dos gastos comuns heurísticos parece muito simples:Se for sabido que pelo menos um dos endereços na entrada da transação é controlado por uma determinada pessoa, todos os outros endereços nas entradas dessa transação são controlados pela mesma pessoa. As moedas nessas entradas pertencem à mesma pessoa.
Como você pode ver, essa heurística faz sentido apenas para o movimento descendente. Ao avançar na direção do crescimento da blockchain, chegamos à transação em estudo através de uma das entradas. Nesse caso, a condição da regra é satisfeita automaticamente, mas não diz nada sobre as saídas da transação e não permite que você continue se movendo na direção upstream. Em outras palavras, essa é uma heurística unidirecional.A segunda característica dessa heurística, que é digna de nota, é que aqui usamos os dados acumulados como resultado da verificação de transações anteriores - uma lista de endereços gerenciados pela pessoa sob investigação. Por esse motivo, essa heurística secundária não pode ser usada para movimentos independentes, sem nenhuma heurística primária que não dependa dos resultados acumulados (como alterações comuns).O pseudo-código para testar uma transação quanto à conformidade com a regra de gastos comum ficaria assim: 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 {}
Endereço conhecido
A última heurística que consideraremos na estrutura desta seção é a mais simples de todas. Essa é uma heurística bidirecional secundária que (uma vez que é bidirecional) pode ser usada para movimentos para cima e para baixo. A formulação estrita do endereço heurístico conhecido para o movimento ascendente é assim:Se for sabido que o endereço na entrada (saída) da transação é controlado por uma determinada pessoa, as moedas recebidas nesse endereço (gastas nesse endereço) pertencem à mesma pessoa.
Embora a heurística pareça um truísmo franco, essa regra ajuda a encontrar ramificações e interseções nos fluxos de moedas e adiciona conectividade à árvore de transações. Além disso, permite não interromper o movimento em transações que não se enquadram em outras heurísticas. Um exemplo é a transação da 7a35b9cb0a16b3eba92781be014555eaa4255bd17655bb00f2b3f42c3950ac69
botnet Dimnie já mencionada.
Depois de alcançá-lo em um movimento ascendente, não poderemos avançar com a ajuda de mudanças comuns, uma vez que a produção é mais do que uma moeda comum. Observando uma transação, não podemos dizer quantas moedas na saída pertencem à mesma pessoa que a moeda na entrada - ambas, uma ou nenhuma. O uso da heurística de endereço conhecido permite avançar devido ao fato de o endereçoMwMdTb8WQvoRW9jEW5dHn9SkkCJTRn31wQ
esteve envolvido na transação CC cf7ac8986f9855246c6cf26df9a24aa5645cb9258bf787e034a33e75101ae1fc
que criou o domínio que foi encontrado anteriormente no movimento upstream d/sectools
.Por uma questão de integridade, fornecemos o pseudocódigo do endereço conhecido heurístico: 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
Portanto, agora temos o algoritmo de desvio geral e as heurísticas necessárias para mover ao longo da blockchain, para que possamos reuni-las para obter um pouco do COI do Namecoin.Vamos lá!
Iremos realizar as transações RTM com o movimento para cima e para baixo, começando com 37d40bc2f3ca7415908dc9e276593b50d3120158cd540cb088246f2e2cf88b16
. Durante o avanço do blockchain, coletaremos não apenas o COI, mas também as próprias transações que satisfazem as heurísticas. As moedas fluem entre as transações que visualizamos usando o gráfico Sankey.O diagrama completo é muito grande para ser exibido no formato deste documento, portanto, darei aqui apenas uma parte necessária para a história posterior.
Um fluxo de moedas comuns é destacado em cinza. As cores restantes correspondem aos fluxos de moedas especiais. Uma cor separada é selecionada para cada nome. Marcos brancos correspondem a transações que atendem às condições heurísticas. Os marcos vermelhos brilhantes à direita são UTXO.O elemento do gráfico que eu gostaria de chamar a atenção é destacado com um marco azul. Esta é uma entrada pendente - uma moeda que surgiu na entrada de uma transação que o algoritmo transmitiu no movimento ascendente, mas a transação que criou essa moeda não o encontrou.Entradas oscilantes são sinais de que a estrutura em estudo possui ramificações laterais que não estão conectadas ao tronco principal ao longo do qual o algoritmo se move. No caso mostrado, essa é outra conta independente. Como pode ser visto no diagrama, começa a ser usado para pagar alterações nos domínios que já conhecemos. A partir desse fato, podemos concluir que essa conta também é controlada pela pessoa sob investigação. Para obter o COI associado às operações nessa conta até que apareça no gráfico, iniciaremos um movimento descendente separado, iniciando uma transação com uma entrada pendente.Da mesma forma, em um movimento descendente, podem ocorrer saídas pendentes. Para cada um deles, lançaremos um movimento ascendente separado a partir da transação correspondente.Além das transações do grupo que controla a botnet RTM, também examinamos as transações dos grupos que controlam as botnets Shifu, Dimnie e GandCrab. Como resultado, foram encontrados 164 domínios registrados no interesse desses grupos e 277 endereços IP associados a esses nomes. No momento da redação deste artigo, do UTXO coletado pertencente a esses grupos, 39 moedas permaneciam em vigor.As listas do COI, bem como os endereços Namecoin nos quais as moedas não utilizadas dos grupos permaneceram, são fornecidas no Apêndice A.Conclusão
Os testes da vida real são um desafio para quase qualquer tecnologia. Em meados da década de 2000, a Wikipedia havia se tornado uma fonte de informação tão popular e confiável que, ao mudar o texto dos artigos, tornou-se possível controlar a opinião pública, começar, ganhar dinheiro. Esse período na história do serviço é famoso por suas enormes guerras de revisão - o uso agressivo do mecanismo de correção de artigos e a reversão de edições por várias partes em guerra para vencer a disputa sobre o conteúdo do artigo. As páginas da Wikipedia se transformaram em uma feira internacional da vaidade, onde todos queriam literalmente dizer a última palavra.Por um lado, começaram a brigar com as emendas, estabelecendo regras especiais que, em caso de disputa, permitem excluir temporariamente a possibilidade de editar o artigo - até que os debatedores da seção "Discussão" encontrem uma redação comprometida. Por outro lado, a guerra de edição forçou a Wikipedia a lançar um mecanismo dinâmico para gerenciar os recursos dos administradores, o que lhes permitiu se envolver rapidamente na solução de conflitos nas áreas mais quentes. Além disso, a enciclopédia aproveitou a atenção do público que se chocava com artigos individuais para atrair mais participantes para a edição desses artigos e obter a cobertura mais correta e completa de um tópico específico.O Namecoin, como a Wikipedia, pode crescer e lidar com seu desafio? Espere e veja.As tabelas PS com indicadores de comprometimento estão disponíveis no GitHub .Postado por Alexey Goncharov, PT Expert Security Center