
Die Namecoin-Blockchain wurde als Alternative zu herkömmlichen DNS-Registraren erstellt und vor Zensur und erzwungener Domainbeschlagnahme geschützt. In den letzten Jahren haben Botnetzbetreiber wie Dimnie, Shifu, RTM und Gandcrab damit begonnen, die Adressen von C & C-Servern zu verwalten.
Einerseits erlauben die Dezentralisierung und Stabilität der Blockchain Forschern und Anbietern nicht, solche Domänen zu entfernen oder die Kontrolle über sie zu übernehmen. Andererseits verfügt die auf der Blockchain basierende Infrastruktur über ein Architekturmerkmal: Alle Änderungen im Netzwerk sind öffentlich verfügbar und können zum Studieren und Verfolgen der Aktionen von Angreifern verwendet werden.
In diesem Artikel wird der Ansatz vorgestellt, mit dem Botnets in Namecoin zugeordnet und weiter verfolgt werden, um neue IOCs zu extrahieren. Unter Verwendung des beschriebenen Ansatzes wurden Listen von Assets (siehe Anhang) erstellt, die von den oben genannten Botnetzen verwendet wurden.
Lyrischer Exkurs
Erfindungen, die das Internet verändern, lösen oft nicht nur ein technisches, sondern ein soziales Problem. Es sind genau solche Technologien und Dienste, die es der Community ermöglichen, einige Axiome von der Seite zu betrachten, die unerschütterlich erschienen, sie zu überdenken, von Grund auf neu zu erstellen, nur eine Idee zu hinterlassen und die Last der im Laufe der Jahre angesammelten Konventionen und Einschränkungen fallen zu lassen. Blockchain und Bitcoin, Tor, Wikipedia - hinter dem Erfolg eines jeden von ihnen steht eine kleine Gruppe von Enthusiasten mit brennenden Augen, die aufrichtig glauben, dass sie eine bessere Gesellschaft schaffen.
Leider folgen ihnen oft andere - den seltsamen Idealen der Pioniere des Internets fremd, aber viel praktischer. Sie finden
eine alternative Anwendung für Technologie, über die die Entwickler nicht nachgedacht haben (oder nicht nachdenken wollten). Da diese alternative Anwendung an der Grenze (und häufiger, um sich offen im Ausland zu verstecken) des Zulässigen liegt, wird sie für die Mehrheit, oft nicht ohne die Hilfe der Medien, zu einem
impliziten oder sogar zum
einzigen Standard .
Die Gleichwertigkeit der Technologie als Idee und die am meisten diskutierte Methode ihrer Verwendung kann dazu führen, dass die Gesellschaft die Technologie selbst ablehnt. Infolge der Kriminalisierung seiner Nutzung kann ein unreifer Dienst auf das Niveau einer Grenzkultur reduziert oder vollständig zerstört werden. So ist es vor langer Zeit mit
Napster passiert, nicht so lange her - mit
BitTorrent und Tor passiert dies gerade mit Bitcoin.
Dies ist nicht vorbei an dem Helden dieser Arbeit - Namecoin. Namecoin ist eine Blockchain zum Speichern beliebiger Schlüssel-Wert-Paare. Das bekannteste davon ist ein dezentrales, zensurresistentes DNS-Namensregistrierungssystem - Dot-Bit.
Unser Interesse an Namecoin wuchs, nachdem die RTM-Botnet-Verwaltungsgruppe Dot-Bit zur Verwaltung ihrer C & C-Server einsetzte. Irgendwann haben wir uns gefragt: Ist es möglich, neue C & C-Server sofort nach ihrer Registrierung in Dot-Bit zu erkennen? Und wenn es keine Probleme mit der Aktualisierung bekannter Domänen gab, erwies sich die Entwicklung eines Ansatzes, der es ermöglicht, starke Beweise für die Verbindung neuer Domänen mit einer interessierenden Person zu finden, plötzlich als spannende Forschungsaufgabe, deren Ergebnis diese Arbeit war.
Im Allgemeinen wurden die Namecoin-Forschung und die Sammlung von Kompromissindikatoren in Dot-Bit früher durchgeführt. Die detaillierteste Arbeit kann als
Artikel von Kevin Perlow angesehen werden . Er war der erste, der auf die grundlegende Möglichkeit des Extrahierens von Daten aus Namecoin aufmerksam machte, und beschrieb mehrere heuristische Techniken, mit denen ein Experte Domänen finden kann, deren Eigenschaften den bekannten C & C-Servern einer bestimmten Gruppe ähneln.
Der in dieser Studie vorgestellte Ansatz unterscheidet sich erheblich von der von Kevin beschriebenen Indexierungs- und Schwenktechnik für Experten. Die heuristischen Regeln, die wir zur Bestimmung von Domaininhabern entwickelt haben, leiten sich aus den Prinzipien der Blockchain und der Bildung von Transaktionen darin ab und werden zusätzlich zur allgemeinen Beschreibung in Form strenger logischer Formulierungen dargestellt. Zusammen mit einer formalen Beschreibung des Bypass-Algorithmus können Sie so die Suche nach IOC automatisieren, was die Effektivität der Untersuchung erheblich erhöht. Darüber hinaus hilft der entwickelte Algorithmus nicht nur, andere Namen zu finden, die einmal von der Studiengruppe verwendet wurden, sondern ermöglicht es Ihnen auch, die Erstellung neuer Domänen zu verfolgen, die von derselben Person gesteuert werden.
Alle Arbeiten sind in drei Kapitel unterteilt. Das erste Kapitel beschreibt die Grundlagen von Bitcoin, dessen Code als Plattform für die Erstellung von Namecoin verwendet wurde. Viele in Bitcoin definierte Entitäten, Beziehungen und deren Implementierungen wurden von Namecoin geerbt. Ihr Verständnis ist entscheidend für die weitere Diskussion.
Das zweite Kapitel ist direkt Namecoin und seiner Hauptanwendung - Dot-Bit - gewidmet.
Das dritte Kapitel beschreibt den vorgeschlagenen Ansatz zum Extrahieren von Daten aus Namecoin und enthält eine formale Beschreibung des Blockchain-Bypass-Algorithmus und der heuristischen Regeln, die zum Herstellen von Beziehungen zwischen Domänen verwendet werden.
Die Anhänge enthalten IOCs, die mit der beschriebenen Methode für einige Botnets gesammelt wurden, sowie eine Liste von Referenzen und Repositories, die Forschern helfen, die weiter an diesem Thema arbeiten möchten.
Bitcoin 201
Die meisten Informationen in diesem Abschnitt stammen aus den Materialien der Artikelserie von Sergey
Pavlov_dog Potekhin „
Bitcoin auf den Punkt gebracht “. Für russischsprachige Leser ist diese Quelle unserer Meinung nach die umfassendste und am tiefsten öffentlich zugängliche, aber überraschend leicht zu lesen. Forscher, die sich für das interne Gerät von Bitcoin interessieren, möchten sich nicht auf die in diesem Abschnitt angegebenen Auszüge beschränken, sondern sich mit dem vollständigen Text der Artikel vertraut machen, die über den Link in der Anwendung verfügbar sind. Der Rest der unten aufgeführten Informationen reicht aus, um die Beschreibung des Algorithmus und die heuristischen Regeln zum Ermitteln der Beziehung zwischen den Adressen in Namecoin zu verstehen, die im letzten Kapitel angegeben wurden.
Obwohl es üblich ist, die Geschichte über die Blockchain mit Blöcken und der Kryptographie, die sie verbindet, zu beginnen, werden wir mit Transaktionen beginnen.
Transaktion
Wie Sie wissen, ist das nächste Analogon zu Bitcoin ein Kontobuch, in dem alle Transaktionen mit Münzen aufgezeichnet werden. Aber seltsamerweise gibt es in Bitcoin keine allgemeine Tabelle der Form
<, >
, genauso wie es keinen Hauptbuchhalter gibt, der diese Tabelle bearbeiten würde.
Stattdessen wird die sehr berüchtigte Blockchain verwendet, dh alle Transaktionen werden im Allgemeinen gespeichert. Der Einfachheit halber können wir annehmen, dass dies Nachrichten der Form sind:
<address 1> sent <amount> BTC to <address 2>
Wenn Sie also die gesamte Blockchain durchlaufen, können Sie berechnen, wie viele Münzen zu einer bestimmten Adresse gehören.
Ein- und Ausgänge
Eine echte Transaktion in einem Bitcoin-Netzwerk ist etwas komplizierter als die oben beschriebene. Dies ist eine Struktur, deren Hauptkomponenten Ein- und Ausgänge sind.
Eingaben sind Transaktionen, auf die Sie "verweisen". Stellen Sie sich vor, drei Transaktionen wurden einmal an Ihre Adresse X gesendet:
TXN_ID: 123456, VALUE: 40 BTC TXN_ID: 645379, VALUE: 10 BTC TXN_ID: 888888, VALUE: 100 BTC
Wenn Sie beispielsweise
45 BTC
ausgeben müssen, können Sie auf die Transaktion
888888
oder zwei Transaktionen gleichzeitig verweisen:
123456
und
645379
.
Ausgänge - wörtlich "Ausgänge". Wir können davon ausgehen, dass dies „Adressen“ sind, an die als Ergebnis der Transaktion Münzen „gesendet“ werden. Es kann auch mehrere Ausgänge geben, von denen jeder seinen eigenen Betrag hat.
In der Abbildung unten wird eine neue Transaktion
C
, die sich auf zwei Ausgänge bezieht -
A
und
B
Infolgedessen hat die Transaktion am Eingang
0.008 BTC
, die dann in zwei Ausgänge unterteilt werden -
0.001 BTC
an die erste Adresse und
0.006 BTC
an die zweite Adresse gesendet.

Die Möglichkeit, mehrere Ausgaben gleichzeitig anzugeben, ist ein sehr wichtiges Merkmal, da
die Transaktionsausgabe nur einmal und nur vollständig als Eingabe verwendet werden kann . Wenn Sie eine eingehende Transaktion bei
10 BTC
haben und 8 davon ausgeben müssen, erstellen Sie einfach eine Transaktion mit einer Eingabe und zwei Ausgaben:
8 BTC
an den Verkäufer und
2 BTC
zurück an Ihre Adresse. Wenn Sie eine Transaktion erstellen, bei der die Summe der Ausgaben kleiner ist als die Summe der Eingaben (wie im Bild), wird die Differenz an die Adresse des Miners gesendet, der Ihre Transaktion in den Block geschrieben hat.
Gebühr
Es ist diese Differenz zwischen der Summe der Eingaben und der Summe der Ausgaben, die als "
transaction fee
",
transaction fee
. Es ist die zweitwichtigste Einnahmequelle für Bergleute, und die Zeit, die benötigt wird, um die Transaktion in die Blockchain aufzunehmen, hängt davon ab. Dies liegt an der Tatsache, dass jeder Bergmann über einen bestimmten Pool nicht verifizierter Transaktionen verfügt, die behaupten, im Block zu sein, und der Bergmann sortiert sie in der Regel einfach in absteigender Reihenfolge, um so seinen Gewinn zu maximieren. Je höher die Provision, desto höher stehen Sie in der Warteschlange und desto schneller wird Ihre Zahlung ausgeführt.
Die allgemeine Ansicht der Transaktion ist in der
offiziellen Spezifikation des Protokolls beschrieben , hier wird einer der häufigsten Sonderfälle angegeben.

previous output hash
- Kennung (Hash) der Transaktion, auf die wir uns beziehen.
previous output index
- Da wir uns nicht auf die Transaktion selbst, sondern auf eine ihrer Ausgaben beziehen müssen, geben wir in diesem Parameter an, an welcher bestimmten Ausgabe wir interessiert sind. Die Nummerierung beginnt bei Null.
value
- Die Menge an Satoshi (
1/100000000
BTC), die an den Ausgang gesendet wurde. Es wird in einer Little-Endian-Form aufgezeichnet, d. H.
62 64 01 00 00 00 00 00
- es ist
0x016462
oder
0.00091234 BTC
.
Die
block lock time
und
sequence
werden in der Praxis selten verwendet. Wir sind nicht an ihnen interessiert, daher werden wir die Beschreibung ihres Zwecks weglassen.
Aber auf die Parameter mit dem Wort
script
im Titel werden wir näher eingehen.
Skript
Das Bitcoin-Netzwerk verfügt über einen Mechanismus, der auf kryptografischen Algorithmen mit einem öffentlichen Schlüssel basiert und es Ihnen ermöglicht, ein System zu erstellen, in dem nur der Besitzer des Schlüssels die Münzen verwenden kann, die der von diesem Schlüssel erhaltenen Adresse zugeordnet sind. Wir werden herausfinden, wie dies unter der Haube umgesetzt wird.
Zunächst gibt es in Bitcoin eine einfache gestapelte Programmiersprache namens
Script
. Hier ist das einfachste Skriptprogramm:
2 3 OP_ADD 5 OP_EQUAL
Jeder Befehl heißt
opcode
, es gibt insgesamt etwa 80 davon. Das folgende Bild zeigt den Ausführungsprozess des obigen Programms.





In Bitcoin
Script
verwendet, um eine Bedingung
Script
unter der die Ausgabe ausgegeben werden kann, und um zu bestätigen, dass die Bedingung erfüllt ist. Die Bedingung (
scriptPubKey
) wird in der Transaktion für jeden Exit im Feld
scriptPubKey
gespeichert. Die Bestätigung, dass die Bedingung erfüllt ist (
unlocking script
), wird für jede Eingabe in das Feld
scriptSig
geschrieben.
Um das Recht zur Verwendung der Ausgabe zu überprüfen, müssen Sie das
unlocking script
+ das
unlocking script
verbinden und das resultierende Programm als Ganzes ausführen. Wenn nach der Ausführung
TRUE
oben auf dem Stapel bleibt, ist die Transaktion gültig.
Pay to Public Key Hash (P2PKH)
Das
P2PKH
Skript
P2PKH
in den meisten Transaktionen verwendet, daher sollten Sie verstehen, wie es funktioniert. Hier ist seine allgemeine Ansicht:

Dieses Skript ist seit dem Aufkommen von Bitcoin bekannt und führt die am Anfang des Kapitels erwähnte Aufgabe aus - um sicherzustellen, dass nur der Besitzer des Schlüssels die Münzen verwenden kann, die der von diesem Schlüssel erhaltenen Adresse zugeordnet sind.
Die Idee ist folgende: Lassen Sie Ihren Freund
B
ein Schlüsselpaar besitzen -
P
(privat) und
K
(öffentlich). Mit der Hash-Funktion erhält er die Adresse
A
vom öffentlichen Schlüssel und teilt Ihnen die Adresse mit. Als Nächstes senden Sie beispielsweise
1 BTC
an Adresse
A
und schreiben Folgendes in das Feld für das
locking script
:
Nur jemand, der den privaten Schlüssel für Adresse A
kann diese Transaktion ausgeben. Schreiben Sie als Beweis in das unlocking script
erstens den öffentlichen Schlüssel K
und zweitens die Signatur der Transaktion mit dem privaten Schlüssel P
Wenn
B
beschließt, Ihre Transaktion als Eingabe zu verwenden, erstellt er beispielsweise
0.5 BTC
und trägt im Feld zum
unlocking script
die Signatur seiner Transaktion mit dem privaten Schlüssel
P
sig
und dem öffentlichen Schlüssel K-
PubK
.
Hier ist der Ausführungsprozess des kombinierten Programms:







Blöcke und Blockchain
Wenn die gesamte Blockchain ein Buch ist, können einzelne Blöcke als Seiten dargestellt werden, auf denen Transaktionen aufgezeichnet werden. Jeder Block "bezieht" sich auf den vorherigen und so weiter bis zum allerersten Block (
genesis block
). Dies schafft ein Merkmal der Blockchain wie Unveränderlichkeit. Sie können Block
#123
nicht übernehmen und ändern, damit niemand es bemerkt: Die Blockchain ist so konzipiert, dass Block
#124
, dann
#125
usw. ganz oben geändert werden.
Die Blockstruktur sieht folgendermaßen aus:

Die ersten sechs Parameter (alle außer
txn_count
und
txns
) bilden den Header des Blocks. Der Header-Hash wird als Block-Hash bezeichnet. Transaktionen selbst nehmen nicht direkt am Hashing teil.
merkle_root
ist für ihre Unveränderlichkeit verantwortlich - wenn vereinfacht, dann ist dies ein Hash aller Transaktionen im Block. Weitere Informationen zum Algorithmus zum Erstellen des Merkle-Baums finden Sie hier unter diesem
Link .
Nonce und Bits stehen in direktem Zusammenhang mit dem Prozess des Auftretens von Blöcken - Mining.
Bergbau
Bergbau ist ein kritischer Prozess für Bitcoin, der darin besteht, neue Blöcke zu erstellen und zwei Ziele gleichzeitig zu verfolgen. Das erste ist die Geldmengenproduktion. Jedes Mal, wenn ein Bergmann einen neuen Block erstellt, wird er dafür mit der N-ten Anzahl von Münzen belohnt, die er dann irgendwo ausgibt, wodurch neue Mittel in das Netzwerk eingeführt werden.
Das zweite und viel wichtigere Ziel ist die Kontrolle der Einhaltung der Regeln im Netzwerk. Es sind die Miner, die die Skripte und Transaktionseingaben überprüfen, bevor sie in den Block aufgenommen werden.
Wer mehr über die finanziellen Grundlagen von Bitcoin erfahren möchte, kann
diesen Artikel empfehlen. Ich werde dem ersten Aspekt des Bergbaus nicht viel Aufmerksamkeit schenken und mich auf den zweiten konzentrieren - Transaktionen überprüfen und im Netzwerk starten.
Arbeitsnachweis
Lass dich ein Bergmann sein. Sie haben 10 Transaktionen, die Sie in den Block aufnehmen möchten. Sie überprüfen diese Transaktionen auf Gültigkeit, bilden einen Block daraus, geben im Feld
nonce
0 an und berücksichtigen den Block-Hash. Ändern Sie dann
nonce
auf 1 und zählen Sie den Hash erneut.
Ihre Aufgabe ist es, eine
nonce
so zu finden, dass der Block-Hash (256-Bit-Nummer) kleiner als eine vorgegebene Nummer
N
Die Suche nach einem solchen Hash ist nur durch Brute Force
nonce
. Je schneller Sie Nonce finden möchten, desto mehr Leistung benötigen Sie.
Die Zahl
N
ist genau der Parameter (sie wird auch als
target
), den das Netzwerk abhängig von der Gesamtleistung der Bergleute anpasst. Wenn die Blöcke von morgen relativ gesehen alle drei Minuten herauskommen, wird
N
reduziert, es wird mehr Zeit für die Suche nach Nonce benötigt und die
block time
wird erneut auf 10 Minuten erhöht. Umgekehrt.
So sieht der Proof-of-Work-Algorithmus aus, der Bitcoin und vielen anderen Blockchains zugrunde liegt. Mit scheinbarer Einfachheit weist es eine Reihe wichtiger Merkmale auf:
- Das Erstellen eines neuen Blocks ist eine rechenintensive Aufgabe. Gleichzeitig ist die Überprüfung des Blocks auf Richtigkeit eine einfache und fast sofortige Operation.
- Das gesamte Netzwerk benötigt 10 Minuten, um einen neuen Block zu berechnen (im Durchschnitt). Die spezifische Zeit ist für jede Blockchain unterschiedlich, aber unter dem Strich ist die durchschnittliche Zeit voreingestellt. Darüber hinaus hängt diese Zeit nicht von der Anzahl der Netzwerkteilnehmer ab. Selbst wenn es eines Tages hundertmal mehr Bergleute geben wird, ändert der Algorithmus seine Parameter, so dass es schwieriger wird, den
block time
zu finden block time
und die block time
fällt in die Nähe der angegebenen Zeit zurück.
Wie oben beschrieben, läuft der Mining-Prozess darauf hinaus, einen Block-Hash zu finden, der kleiner als eine Zahl ist, die als target
. In der Blockstruktur wird diese Nummer in das Bitfeld geschrieben. Für Block #277316 target
1903a30c
.
Wie oben beschrieben, läuft der Mining-Prozess darauf hinaus, einen Block-Hash zu finden, der kleiner als eine Zahl ist, die als
target
. In der Blockstruktur wird diese Nummer in das
bits
. Für Block
#277316
target
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" }
In
bits
tatsächlich zwei Zahlen gleichzeitig geschrieben: Das erste Byte
0x19
ist der Exponent, die verbleibenden drei Bytes
0x03a30c
sind die Mantisse. Um das
target
aus
bits
, müssen Sie die folgende Formel verwenden:
target = mantissa * 2^(8 * (exponent - 3))
In der Regel werden jedoch
bits
in allen Online-Blockregistern angezeigt, z. B. in
https://namecha.in/ - Namecoin-Blockregister.
Und ja, genug Theorie. Alles, worüber wir oben bei der Anwendung auf Bitcoin gesprochen haben, gilt auch für Namecoin - mit Ausnahme der kleinen Unterschiede, über die wir im nächsten Abschnitt sprechen werden.
Namecoin
Namecoin ist eine Blockchain, die auf den Algorithmen und dem Quellcode von Bitcoin basiert. Die Hauptidee besteht darin, ein Registrierungsschema für verteilte Transaktionen zu verwenden, um ein Domain Name System zu verwalten, ein Analogon zu herkömmlichem DNS.
Namecoin kopiert die wichtigsten Bitcoin-Ansätze (Proof-of-Work, 10-minütiges Blockgenerierungsintervall) und Datenformate, mit Ausnahme kleiner Ergänzungen, über die wir später sprechen werden.
Namecoin-Domains haben das Suffix .bit. Diese Zone wurde von IANA nicht zugewiesen und nicht der Liste der
Spezialdomänen zugewiesen. Normale DNS-Server antworten normalerweise auf solche NXDOMAIN-Anforderungen. Es gibt jedoch Gateways von DNS zu Namecoin (z. B.
OpenNIC ), öffentliche Proxys mit Namecoin-Unterstützung, Browser-
Plugins und
ein Open Source-Projekt , mit dem Sie Ihren eigenen DNS-Server mit Namecoin-Unterstützung starten können.
Um eine Domain mit dem Namen
facebook.bit
, reicht es aus, den Schlüssel
d/facebook
Präfix
d/facebook
wird in Namecoin für Domains verwendet) zu registrieren und seinen Wert zu bestimmen. Das JSON-Format wird zum Festlegen der Werte verwendet. Ein Eintrag, der die Domänenauflösung auf die IP-Adresse
1.2.3.4
sieht
1.2.3.4
aus:
{"ip": ["1.2.3.4"]}
Namecoin weist Namen nach Verfügbarkeit zu. Selbst für Mark Zuckerberg selbst wird es kryptografisch unmöglich sein, die Domain
facebook.bit
vom Eigentümer zu übernehmen.
Tatsächlich beschränkt nichts die Verwendung von Namecoin auf die Verwaltung der DNS-Namenspakete - IP-Adresse. Namecoin kann als verteilte Tabelle verwendet (und verwendet) werden, um beliebige Schlüssel Werten zuzuordnen. Wir werden uns jedoch genau auf das Szenario seiner Verwendung konzentrieren, in dem es ein alternatives DNS über Blockchain darstellt.
Domänenverwaltung
Namecoin verwendet eine Transaktion zum Speichern eines Domäneneintrags. Das
scriptPubKey
Feld, das das Programm enthält, ist nämlich die Bedingung für die Verwendung des Transaktions-
scriptPubKey
, dem wir im vorherigen Kapitel so viel Zeit gewidmet haben. Um Datensätze zu verwalten, führte Namecoin drei neue Operatoren ein (genauer gesagt, neu definierte bestehende):
- NAME_NEU
- NAME_FIRSTUPDATE
- NAME_UPDATE
Ihre Bedeutung ergibt sich aus den Namen, aber wir werden dennoch den Zweck und das Format der Verwendung jedes einzelnen von ihnen analysieren.
Möglicherweise stellen Sie fest, dass der Operator zum Löschen oder Ungültigmachen von Domains fehlt. Um die Registrierung von nicht verwendeten Namen zu bereinigen, ist im Netzwerk ein Mechanismus integriert, der automatisch einen Namen freigibt, der seit 36.000 Blöcken (~ 250 Tage) nicht aktualisiert wurde.
NAME_NEU
Der erste Schritt besteht darin, die Absicht anzukündigen, einen neuen Namen im Netzwerk zu registrieren. Erstellen Sie dazu einfach eine spezielle Münze (Ausgabe) mit einem Gewicht von mindestens
0.01 NMC
, deren
output script
ungefähr so aussieht:
OP_NAMENEW <20 byte hash> OP_2DROP <lock script>
Zur Demonstration werde ich die Transaktionen, die Stephen Morse durchgeführt hat, verwenden,
um seinen Artikel zu
veranschaulichen .
Wenn wir also die Registrierung des Namens
d/stephenmorse
, müssen wir Folgendes tun:

Wenn Sie sich die resultierende Transaktion ansehen, können Sie zwei interessante Fakten feststellen. Erstens ist das
output script
trotz der Tatsache, dass es in Namecoin-Notation geschrieben ist, aus Sicht des ursprünglichen Bitcoin weiterhin gültig. Die Ersteller von Namecoin haben Codes für ihre Operationen so erfolgreich ausgewählt, dass sie in Bitcoin Operationen entsprechen, die im Wesentlichen dem Schreiben in den konstanten Stapel entsprechen.
NAME_NEW (0x51)
-Code von
NAME_NEW (0x51)
entspricht
OP_1
, der
OP_1
Stapel 1
OP_1
wird. Eine ähnliche Geschichte mit
NAME_FIRSTUPDATE
(
0x52
oder
OP_2
, Puts 2) und mit
NAME_UPDATE
(
0x53
oder
OP_3
, Puts 3). Die ersten beiden Schritte des Skripts setzen also nur zwei Werte auf den Stapel. Und die nächste Operation
OP_2DROP
entfernt sie vom Stapel, so dass weiteres
P2PKH
„von Grund auf neu“ funktioniert. Daher gelten alle Skript-Tricks, die wir im Kapitel über Bitcoin behandelt haben, trotz der Neudefinition einiger Operationen auch für Namecoin.
Zweitens sind die Schlüssel, die eine spezielle Münze öffnen und wechseln, unterschiedlich. Obwohl technisch nichts Sie daran hindert, denselben Schlüssel wiederholt zu verwenden, ist es üblich, für jede Quittung einen neuen Schlüssel zu generieren. Dies geschieht, um es schwierig zu machen, Korrelationen zwischen Transaktionen zu identifizieren und die Anonymität im Netzwerk zu erhöhen.
Auf den ersten Blick erscheint es seltsam, dass es entgegen dem gesunden Menschenverstand unmöglich ist, einen Namen und eine IP-Adresse sofort zu übernehmen und zu registrieren. Dies geschieht, damit niemand den Namen abfangen kann, sobald er sieht, dass Sie ihn registrieren möchten (und ihn dann an Sie weiterverkaufen).
Zum Beispiel könnten Bergleute, die unbestätigte (noch nicht in einem der Blöcke enthaltene) Transaktionen im Netzwerk analysieren, ihre eigene Transaktion für die Registrierung derselben Domain erstellen und diese (und nicht Ihre) in ihren Block aufnehmen. Um diesen Angriff zu implementieren, ist es nicht einmal notwendig, Ihren Block abzubauen. Es reicht aus, Ihre Transaktion mit einer hohen Gebühr ins Netzwerk zu stellen. Daher wurden zwei separate Operationen
NAME_NEW
und
NAME_FIRSTUPDATE
, und die zweite kann nur von demjenigen ausgeführt werden, der die erste ausgeführt hat, und erst, nachdem
NAME_NEW
in einen Block
NAME_NEW
.
Tatsächlich ist diese Einschränkung noch etwas strenger:
NAME_FIRSTUPDATE
ist
NAME_FIRSTUPDATE
12 Blöcke nach
NAME_NEW
(ca. 2 Stunden) möglich. Um zu verstehen, warum die Blöcke in dieser Einschränkung nicht 1, nicht 2, nicht 3, sondern speziell 12 sind, müssen wir ein wenig von der Hauptgeschichte zurücktreten und herausfinden, was
fork
und
51% attack
.
GabelStellen Sie sich vor, Bergleute suchen nach Block
#123456
. Ungefähr zur gleichen Zeit wurde er unabhängig von zwei Bergleuten gefunden, von denen einer in Australien und der andere in den Vereinigten Staaten lebt. Jeder von ihnen beginnt, seine Version des Blocks über das Netzwerk zu verteilen, und als Ergebnis stellt sich heraus, dass eine Hälfte der Welt eine Blockchain und die andere eine andere hat.

Ist das möglich Ja, vielleicht. Darüber hinaus passiert dies ziemlich oft. In diesem Fall bleibt jeder Knoten bei seiner eigenen Version der Blockchain, bis jemand den nächsten Block findet. Angenommen, der neue Block setzt den grünen Zweig wie in der Abbildung unten fort. In diesem Fall synchronisieren die Knoten, die der roten Version entsprechen, automatisch die grüne, da die Regel in Bitcoin (und entsprechend in Namecoin) funktioniert: Die längste Version der Blockchain ist wahr. Die rote Version der Blockchain wird einfach vergessen, zusammen mit Belohnungen für diejenigen, die sie finden.

Theoretisch kann sich die Situation im zweiten Schritt natürlich wiederholen, und gleichzeitig finden sie mit lila eine andere, die die rote Version der Blockchain fortsetzt. Und am dritten und so weiter. Aber die Wahrscheinlichkeit selbst der ersten Gabel ist eher gering, die zweite ist noch geringer und so weiter. Die längste Gabelung in der Geschichte von Bitcoin war nur
vier Blocks . Irgendwann wird jedoch eine der Niederlassungen ausbrechen und das gesamte Netzwerk wird dorthin gehen.
51% AngriffDie Tatsache, dass die längste Kette in der Blockchain dominiert, basiert auf einem Angriff mit dem Namen 51%.
Stellen Sie sich vor, Sie sind ein Betrüger und kaufen Waren bei
1000 BTC
in einem Geschäft. Sie stimmen dem Verkäufer zu und senden ihm das Geld. Der Verkäufer überprüft die Blockchain, stellt fest, dass eine solche Transaktion tatsächlich durchgeführt wurde, hat alle Überprüfungen bestanden und ist sogar in einen Block geraten, zum Beispiel
#123
. Danach geht der Verkäufer zur Post und schickt Ihnen die Ware.
Zu diesem Zeitpunkt schalten Sie Ihre Mining-Farm ein und beginnen mit dem Mining ab Block
#122
. Wenn Sie über genügend Strom verfügen, können Sie den Rest des Netzwerks überholen und am schnellsten bis Block
#124
zählen. Danach wechselt die ganze Welt zu Ihrer Version der Blockchain. Gleichzeitig werden Sie Ihre Transaktion für
1000 BTC
in keinen der Blöcke aufnehmen, was bedeutet, dass sie für immer vergessen wird, als wäre es nie gewesen. .
, . . 11
, , 6 , 0,1% , 10% . , . , Namecoin , 20% .
. , . ,
NAME_NEW
, 12 ,
NAME_FIRSTUPDATE
.
NAME_FIRSTUPDATE
Der Zweck der Operation NAME_FIRSTUPDATE
besteht darin, den Namen, in dem ich angekündigt habe NAME_NEW
, zu veröffentlichen und einen Wert dafür anzugeben. Dazu muss ich eine Transaktion im Netzwerk starten, deren Eingabe die ganz besondere Münze ist, die ich am Ausgang generiert habe NAME_NEW
. Um das Nutzungsrecht zu bestätigen, präsentiere ich im Eingabeskript meinen öffentlichen Schlüssel und die Signatur der Transaktion, NAME_NEW
die vom privaten Paarschlüssel ausgeführt wird, genau nach dem Schema, das wir im Kapitel über untersucht haben P2PKH
.Eines der Ergebnisse der Transaktion wird eine neue Spezialmünze sein, die wie die vorherige nicht weniger wiegt 0.01 NMC
. Ihr Ausgabeskript sollte folgendermaßen aussehen: OP_NAME_FIRSTUPDATE <Name> <Salt> <Value> OP_2DROP OP_2DROP <lock script>
Salt
Ist die sehr zufällige Zahl 0xd5eeb22ee8117f57
, die wir in der ersten Phase der Vorbereitung des Skripts erstellt haben NAME_NEW
. Name
- es ist d/stephenmorse
in hexadezimal 0x642f7374657068656e6d6f727365
.Das Feld Value
sollte ein assoziatives Array enthalten, das die Regeln darstellt, nach denen der Name aufgelöst wird. Eine vollständige Liste möglicher Schlüssel und Regeln zum Ausfüllen finden Sie hier . In erster Näherung ist dies ein Analogon der Zonendatei; Der obige Link zeigt die Zuordnung von Namecoin-Entitäten zu bekannten DNS-Entitäten. Die beliebtesten von ihnen sind ip, ein Beispiel, bei dem es höher war, und ns, das wir jetzt verwenden.Um anzugeben, was der NS-Server für die Domäne sein wird, setzen wir 1.2.3.4
einen Wert in Value {“ns”:[“1.2.3.4”]}
, aber natürlich in hexadezimal - 0x7b226e73223a5b22312e322e332e34225d7d
.Schließen Sie wie beim letzten Mal die Münze mit P2PKH
. In seinem Beispiel hat Stephen in Schritt NAME_NEW absichtlich eine Münze mit einem Gewicht von nicht genau 0.01 NMC
, aber mit einem Rand erstellt, so dass dieser Rand im nächsten Schritt für die Provision an den Bergmann ausreichen würde. Im allgemeinen Fall hat die Transaktion einen weiteren Eingang, um die Provision sicherzustellen - und einen weiteren Ausgang für die Lieferung.Wir sammeln alles in einer Transaktion und werfen es in das Netzwerk .
Wenn die Transaktion in den Block fällt, aktualisieren die Hosts in ihren Tabellen den Wert für den Schlüssel d/stephenmorse
an {“ns”:[“1.2.3.4”]}
. Alle Browser mit Namecoin-Unterstützung lösen die Domain stephenmorse.bit
und ihre Subdomains jetzt über den DNS-Server unter in IP-Adressen auf 1.2.3.4
.NAME_UPDATE
Die "Tabelle" mit Schlüsseln und ihren Bedeutungen, die ich am Ende des letzten Abschnitts erwähnt habe, heißt eigentlich UTXO set (unspent transaction output)
. Da es für das Netzwerk wichtig ist, wiederholte Ausgaben von Geldern zu verhindern, prüft der Miner vor dem Hinzufügen einer Transaktion zum Block, ob die zuvor in der Transaktion angegebenen Eingaben verwendet wurden. Um diesen Vorgang zu beschleunigen, werden alle nicht verwendeten Ausgaben in einer separaten Datenstruktur gespeichert. Diese Struktur existiert nicht auf Netzwerkebene, sondern wird von jedem Knoten lokal berechnet und gespeichert.Nachdem ich die Transaktion abgeschlossen habe NAME_FIRSTUPDATE
, wird die Ausgabe meiner Münze mit einem Gewicht 0.01 NMC
, an das der Wert für den Schlüssel angehängt ist d/stephenmorse
, auf den Tisch gelegtUTXO
. Wenn diese Ausgabe nicht für 36.000 Blöcke ausgegeben wird (das sind mehr als 8 Monate mit durchschnittlich 10 Minuten pro Block), wird sie als ungültig und der entsprechende Name als frei betrachtet.Dieser Zeitraum von 36.000 Blöcken (sowie der Mindestwert einer Spezialmünze 0.01 NMC
) ist zu Beginn des Netzwerks klar definiert und unverändert. Um die Registrierung des Namens zu erweitern sowie Änderungen am Datensatz vorzunehmen oder ihn an einen anderen Eigentümer zu übertragen, wird eine Transaktion verwendet NAME_UPDATE
.Die Regeln für den Abschluss einer solchen Transaktion unterscheiden sich praktisch nicht von den oben beschriebenen. Die Eingabe für die Transaktion sollte die Ausgabe der in der Transaktion erhaltenen Münze seinNAME_FIRSTUPDATE
. Ein zusätzlicher Input ist erforderlich, um die Provision sicherzustellen. Von den beiden Ausgaben der Transaktion ist eine eine neue Münze mit einem aktualisierten Wert für den Namen, und die zweite dient dazu, Änderungen von der Provision zu übertragen. Das Ausgabeskriptformat für die Münze lautet: OP_NAME_UPDATE <Name> <Value> OP_2DROP OP_DROP <lock script>
Wie im vorherigen Fall ist Name
dies d/stephenmorse
und Value
- JSON mit einem Wert, beide hexadezimal. Schließen Sie den Exit mit P2PKH und werfen Sie die Transaktion in das Netzwerk .
Im Allgemeinen ist dies fast alles, was ich über die Namensverwaltung in Namecoin erzählen wollte. Alles, was bleibt, ist ein paar Worte über die Kosten für den Besitz einer Domain zu sagen.Kosten
Berechnen wir, wie viel der Inhalt des Namens in Dot-Bit
(der Name der DNS-Zone .bit, die auf der Basis von Namecoin arbeitet) in Kryptowährung kostet und die Zahlen in Fiat-Währung umgerechnet mit den Kosten einer „normalen“ DNS-Domain vergleichbar sind.Wie aus dem vorherigen Abschnitt hervorgeht, werden für eine Transaktion die NAME_NEW
Kosten des Domaininhabers 0.01 NMC
darin bestehen, eine Münze zu erstellen, an die die Zone angehängt wird, zuzüglich der Provision des Bergmanns. Bei einer Transaktion NAME_FIRSTUPDATE
wird auf Kosten der alten eine neue Münze erstellt, und der Eigentümer zahlt zusätzlich nur die Provision. Nach ca. 8 Monaten muss der Eigentümer die Transaktion abschließen NAME_UPDATE
, um den registrierten Namen beizubehalten. Und hier enden die erforderlichen Kosten für das erste Jahr.Die meisten Artikel über Namecoin (einschließlich des zuvor zitierten Artikels von Stephen Morse) basieren auf Daten aus den ersten Jahren des Bestehens des Netzwerks und behaupten, dass die Bergbaukommission 0,005 NMC beträgt. Seitdem ist der Medianwert der Provision jedoch allmählich gesunken und liegt zu Beginn des Jahres 2019 bei etwa 0,0003 NMC. Der NMC-Wechselkurs gegenüber dem US-Dollar hingegen kehrte nach mehreren Aufschwüngen auf das Niveau von 2015 zurück und beträgt für 1 NMC etwa 0,7 USD. Es ist leicht zu berechnen, dass die Domain in der .bit-Zone im ersten Jahr den Eigentümer ab 0,0109 NMC oder 0,00763 USD kostet. Vielleicht fällt es jemandem leichter, sich an ein ungefähres Analogon dieses Betrags in russischer Währung zu erinnern - 50 Kopeken.Nun, dies ist die Untergrenze, die dem Szenario für den Kauf eines Namens für die zukünftige Verwendung oder das Cybersquatting entspricht. Was ist mit der Obergrenze? Da die Eingabe von jeder Transaktion, die die Zone aktualisiert, eine Münze aus einem der vorherigen Blöcke sein sollte, ist das theoretische Maximum der Häufigkeit der Namensaktualisierung gleich der Häufigkeit des Auftretens neuer Blöcke. Unter Hinweis darauf, dass der Durchschnittswert dieses Werts zu Beginn des Netzwerks festgelegt wurde und etwa 10 Minuten beträgt, kann geschätzt werden, dass die Obergrenze der Kosten für die Wartung einer Domain 15,7744 NMC oder etwas mehr als 11 USD beträgt.Wie Sie sehen können, entspricht selbst ein solch fantastisches Szenario, bei dem ein Name in Namecoin kostenpflichtig verwendet wird, ungefähr dem ersten Jahr, in dem Sie eine reguläre Domain in der beliebtesten .com-Zone besitzen. Wenn wir ein realistischeres Szenario mit einem Update durchschnittlich einmal am Tag vergleichen, kostet der Name in der Bit-Zone etwa 8 Cent pro Jahr, was viel billiger ist als die vorteilhaftesten Angebote im traditionellen DNS, die nicht unter 1 US-Dollar fallen. Im Szenario der kurzfristigen Nutzung der Domain (von mehreren Stunden bis zu einem Monat) beträgt der Unterschied zugunsten von Namecoin bereits zwei Größenordnungen.Unter Berücksichtigung der finanziellen Attraktivität des Dienstes sowie der Anonymität des Domaininhabers, einschließlich des Fehlens einer traditionellen „Geldspur“ für gewöhnliches DNS, wird deutlich, warum Namecoin zu einem beliebten Netzwerk für Dienstbesitzer mit einem erhöhten Risiko der Trennung oder Blockierung, insbesondere von Botnetzen, geworden ist.Botnets in Namecoin
In der Tat ist die Tatsache, dass Botnetzbetreiber anfingen, Anonymität Dot-Bit
zum Schutz ihrer C & C-Server zu verwenden, nicht überraschend. Eine andere Sache ist interessanter - wie lange Botnets in .bit aktiv bleiben.C & C-Domänen, die in „normalen“ DNS-Zonen registriert sind, werden früher oder später vom Eigentümer zurückgezogen, wodurch der Betreiber gezwungen ist, für die Registrierung eines neuen Namens zu zahlen und eine neue Bot-Assembly im Netzwerk mit einem neuen Verwaltungsserver zu starten. Die grundsätzliche Unmöglichkeit, eine Domäne in der .bit-Zone zu entfernen, erhöhte die Botnet-Lebensdauer um Größenordnungen.Nehmen wir zum Beispiel die pationare.bit
im Dezember 2016 registrierte Domain. Es wurde verwendet, um ein Botnetz zu steuern Chthronic
(Verteilung eines Bankentrojaners, der auf der Basis des berühmten ZeuS gebaut wurde). VertriebskampagneChthronic
war mit der Verwendung des Exploit Packs RIG verbunden und wurde von verschiedenen Forschern (z. B. malware-traffic-analysis.net ) Ende 2016 - dem ersten Halbjahr 2017 - ausführlich beschrieben .Es ist davon auszugehen, dass dieses Botnetz längst zerstört wurde. Aber nein - mehr als zwei Jahre nach dem Start sind die C & C-Domain und das Netzwerk des Botnetzes noch aktiv. Wie aus dem folgenden Screenshot ersichtlich, wurde das letzte Update im Dezember 2018 durchgeführt.
Es sieht verlockend aus, oder? Da der DNS-Name des Verwaltungsservers intakt bleibt, muss der Bot-Code nicht häufig aktualisiert und die Verteilungskampagne neu gestartet werden. Es bleiben nur die Kosten für das Ändern des Hostings nach dem Blockieren der IP-Adresse, aber diese Kosten können auch reduziert werden, indem gehackte Webserver als Proxys verwendet werden, deren Shells weniger als einen Dollar kosten.Andererseits sind alle Transaktionen in der Blockchain für jeden Teilnehmer öffentlich zugänglich. Wie wir in den vorherigen Kapiteln ausführlich besprochen haben, verschwinden Münzen in Namecoin nicht spurlos, was bedeutet, dass wir ihre Umverteilung zwischen Adressen verfolgen können. Wenn wir die Regeln und Einschränkungen kennen und berücksichtigen, welche Transaktionen in Namecoin gebildet werden, können wir aussagekräftige Muster finden, in denen die einheitliche Verwaltung einiger an der Transaktion beteiligter Adressen offensichtlich ist. In diesem Fall haben die mit Münzen von diesen Adressen bezahlten Domains einen gemeinsamen Eigentümer - die von uns verwaltete Gruppe, die das Botnetz steuert.Wir werden diese Idee weiterentwickeln.Allgemeines IOC-Sammlungsschema
Beschreiben wir das allgemeine Suchschema am Beispiel eines echten Botnetzes der RTM-Gruppe. Wir werden auf diesem Beispiel aufbauen , das als identifiziert wurde Win32/Spy.RTM.N
.
Wie Sie dem obigen Screenshot entnehmen können, wird nach dem Start versucht, die IP-Adresse für den Namen abzurufen stat-counter-4.bit
. Informationen zum Transaktionsverlauf für diesen Namen erhalten wir in Namecoin.
Die Kennung der Transaktion, die diese Domain erstellt hat, erhalten wir durch Klicken auf den Link zur Operation NAME_NEW. Die Eingabeadresse dieser Transaktion, mit deren Hilfe die Domain erstellt wurde, wird offensichtlich von der für uns interessanten Gruppe verwaltet. Er wird die erste Reihe von Daten sein: N3KPt8py24EAsAiKquyFgoKGyTYeR5Tmry
.
Basierend auf dem anfänglichen Datensatz gehen wir iterativ um die Blockchain herum und bewegen uns in Richtung ihres Wachstums (Aufwärtsbewegung oder Aufwärtsbewegung). Zu Beginn jedes Schritts erhalten wir eine Transaktion, deren bestimmte Münze der Person gehört, an der wir interessiert sind. Im ersten Schritt überprüfen wir die Transaktion anhand des ursprünglichen Datensatzes, dessen Eigentümer wir a priori kennen.Die Transaktion wird auf Übereinstimmung mit heuristischen Regeln überprüft (wir werden sie unten formulieren), die garantieren, dass eine bestimmte Münze (oder Münzen) am Ende der Transaktion derselben Person gehört wie die bekannte Eingabemünze. Wenn die betreffende Transaktion eine oder mehrere Heuristiken erfüllt, geben solche Leitmünzen die Richtung der weiteren Bewegung an. Die Transaktion, die die Leitmünze ausgibt, ist der nächste Schritt in der Iteration.Bei jedem Schritt der Iteration füllen wir die Liste der Domänen, die an den Transaktionen teilgenommen haben, und die Liste der IP-Adressen, in die diese Domänen aufgelöst wurden, auf. Dies sind historische Identifikatoren des Kompromisses (IOC), die für Forensiker sowie zur Identifizierung von Taktiken und Gruppierungsmethoden verwendet werden können.Die Bewegung stoppt, wenn die betreffende Transaktion keine der Heuristiken erfüllt. Dies bedeutet, dass wir nicht mit Sicherheit sagen können, dass die Ergebnisse der betreffenden Transaktion von der Person kontrolliert werden, an der wir interessiert sind.Eine andere Situation, die die Bewegung stoppt, ist das Fehlen von Transaktionen von der Ausgabeadresse. Wir werden solche Adressen in einer separaten Liste nicht ausgegebener Münzen (UTXO) speichern. Sie stellen den größten Wert in der gesamten Studie dar. Da wir sicher sind, dass diese Adressen von der Person verwaltet werden, an der wir interessiert sind, generiert jede zukünftige Transaktion, die diese Adressen verwendet, ein neues, zuvor unbekanntes IOC - den Domänennamen oder die IP-Adresse -, das von der Gruppierung noch nicht verwendet wurde. Aber mit hoher Wahrscheinlichkeit wird es bald sein.Um die Blockchain zu umgehen, ist es bequem, sie in die Datenbank zu exportieren. Hierfür können Sie beispielsweise das modifizierte Dienstprogramm rusty-blockparser verwenden , mit dem wir die Unterstützung für Namecoin verbessert haben, indem wir die Erkennung von Vorgängen NAME_*
, Datenstrukturen Auxiliary Proof-of-Work
und das Exportformat erweitert haben.Der Python-Pseudocode für die Aufwärtsbewegung ist unten dargestellt. Im Folgenden wird angenommen, dass die Blockchain-Transaktionsdaten in MongoDB gespeichert sind. 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)
Der zweite Teil des Blockchain-Bypasses ist die Bewegung gegen das Wachstum der Blockchain (Abwärtsbewegung oder Abwärtsbewegung). Im Allgemeinen unterscheidet sich der Abwärtsbewegungsalgorithmus nicht vom Aufwärtsalgorithmus. Eine Bewegung beginnt mit einer Transaktion aus dem Originaldatensatz. Bei jedem Schritt wird die Transaktion auf Übereinstimmung mit heuristischen Regeln überprüft (im Allgemeinen anders als bei den Regeln für die Aufwärtsbewegung). Der einzige Unterschied besteht darin, dass sich die Münze, deren Mitgliedschaft a priori bekannt ist, am Ende der Transaktion befindet und die Heuristik garantiert, dass dieselbe Person eine oder mehrere Münzen am Eingang hat.Eine Abwärtsbewegung stoppt auch, wenn die aktuelle Transaktion keine der Heuristiken erfüllt. Im Gegensatz zur Aufwärtsbewegung können wir nicht ausgegebene Münzen unter den Führungen nicht treffen, und diese Option zum Beenden der Rekursion in der Abwärtsbewegung funktioniert nicht. Aber wie bei der Aufwärtsbewegung füllen wir sowohl die Liste der Namen als auch die Liste der IP-Adressen auf.Python-Pseudocode für die Abwärtsbewegung würde folgendermaßen aussehen: 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)
Betrachten Sie nun die heuristischen Regeln, die wir beim Bewegen entlang der Blockchain verwenden werden.Heuristische Regeln
Gemeinsame Veränderung
Schauen wir uns noch einmal die Transaktion an, von der oben ein Screenshot gezeigt wurde. Eine Adresse, N3KPt8py24EAsAiKquyFgoKGyTYeR5Tmry
die Geld zum Erstellen eines neuen Namens enthält, wird an die Transaktionseingabe gesendet . Es gibt zwei Adressen für Transaktionen NAME_FIRSTUPDATE
und NAME_UPDATE
am Eingang - eine spezielle Münze mit einer Zone aus der vorherigen Transaktion nach Domain und zusätzlichen Mitteln zur Deckung der Provision.Ich werde sofort feststellen, dass wir im Zusammenhang mit Transaktionen sowohl über Münzen als auch über Adressen sprechen werden. Trotz der Tatsache, dass diese Konzepte in einigen Werken als nahezu gleichwertig angesehen werden, ist es wichtig, dass wir den Unterschied zwischen diesen Begriffen klar angeben, da wir im Verlauf der Studie Schlussfolgerungen sowohl zu Münzen als auch zu Adressen ziehen werden.Mit "Münze" meinen wir einen positiven Saldo, der als Ergebnis einer Transaktion gebildet wird. Diese Münze wird durch die Transaktionsnummer, die sie generiert hat, und den Exit-Index identifiziert. Beispielsweise hat eine Münze am Eingang der oben betrachteten Transaktion eine Kennung 5778be8e1901e9931e9b41a128a0b7f963e6e1ae72e461df2cba26e6279d433a:1
, da sie als Ausgabe (mit Index 1) der Transaktion gebildet wurde 5778be8e1901e9931e9b41a128a0b7f963e6e1ae72e461df2cba26e6279d433a
.Eine spezielle Münze nennen wir nach wie vor eine Münze mit dem Nennwert b 0.01 NMC
, locking script
die die Operation mit einem Domainnamen enthält. Wir haben den Mechanismus für die Bildung solcher Münzen im Abschnitt Domain Management eingehend untersucht. Eine gewöhnliche Münze nennen wir eine Münze willkürlichen Nennwerts, an die die Operation mit der Domäne nicht gebunden ist.Die Haupteigenschaft von Münzen ist ihre Unveränderlichkeit. Jede Münze kann nur einmal und nur in ihrer Gesamtheit ausgegeben werden. Daher wird jede im Namecoin-Netzwerk maximal zweimal erwähnt: einmal bei der Erstellung und ein zweites Mal bei Ausgaben.Mit "Adresse" meinen wir eine Kennung, die ein Schlüsselpaar eindeutig identifiziert, das ein Sperrskript in einem Format öffnen kann P2PKH
, das eine Münze schließt, die sich am Eingang oder Ausgang einer Transaktion befindet. Da nur der der Adresse entsprechende Schlüssel eine Münze ausgeben kann, ist die nächste Analogie der physischen Welt zur Adresse die Brieftasche, in der die Münzen aufbewahrt werden (und von der sie ausgegeben werden).Trotz der Tatsache, dass in Namecoin eine Adresse oft nur zweimal verwendet wird, ist es nicht erforderlich, eine einzelne Münze zu empfangen und zu konsumieren. Die Fakten der Wiederverwendung von Adressen werden uns in Zukunft ein wenig helfen.Wir haben im Kapitel von Bitcoin 201 ausführlicher über Eingaben, Ausgaben und Adressen gesprochen.Am Ende der Transaktion werden also zwei Münzen gebildet. N2hgZoWaTKoJ7FPmLuytTow3XrCCfEj2ca
Dieselbe Spezialmünze mit einem Gewicht von 0,01 NMC, an die die Domain gebunden ist, ging an die Adresse . Eine NKMMLwyMw4nwGuke6vd3AuDBMP18FWRaF1
gewöhnliche Münze mit Wechselgeld wurde an die zweite Adresse geschickt .Dies ist das häufigste Transaktionsschema. Es gibt immer noch Optionen, wenn sich mehr als eine Münze am Eingang befindet, aber ihre gemeinsame Eigenschaft ist, dass die Münze mit Wechselgeld immer genau gleich ist.Sie können davon ausgehen, dass eine solche Transaktion einer einfachen Aktualisierung der Domäneninformationen entspricht. Die Zahlung für die Aktualisierung erfolgt mit einer (seltener mehreren) Münzen einer Person. Da eine Transaktion immer nur einen Autor hat, muss sie alle Eingabeadressen verwalten. Ohne dies kann er kein Entsperrskript erstellen, das für die Verwendung der Münzen aus dieser Brieftasche erforderlich ist.Nun, da alle Änderungen aus dieser Operation in einer Münze gesammelt sind, ist es klar, dass diese Münze derselben Person gehört wie die Münzen am Eingang.Ein ähnliches Schema für Bitcoin wird in dieser Arbeit beschrieben , wo es aufgerufen wird one-time change
. Es spiegelt die Methode wider, mit der native Bitcoin-Anwendungen Transaktionen ausführen - bitcoind
undbitcoin-qt
. Einmalig (einmalig) wird es aufgrund einer anderen Funktion dieser Anwendungen aufgerufen. Standardmäßig generieren sie am Ausgang der erstellten Transaktion neue Adressen für Münzen.Namecoin hat zusammen mit der Bitcoin-Codebasis den Großteil des Codes für diese Anwendungen geerbt, die als namecoind
und bezeichnet werden namecoin-qt
. Bei normalen Münzen können wir diese Heuristik ohne Änderungen verwenden.Die Statistik der Wiederverwendung von Adressen zur Aufbewahrung von Spezialmünzen zeigt, dass diese Regel in den meisten Fällen auch für sie eingehalten wird. Die Wiederverwendung solcher Adressen ist ziemlich selten. Mehrfach verwendete Adressen, etwa 6% der Gesamtzahl; mehr als zweimal - ungefähr 1%. Basierend auf dem Zweck von Namecoin kann davon ausgegangen werden, dass die meisten Transaktionen mit speziellen Münzen im Netzwerk einfache Erstellungs- und Aktualisierungsvorgänge sind, bei denen sich der Domaininhaber nicht ändert. Daher können wir argumentieren, dass eine solche Operation dem Abheben einer speziellen Münze an eine neue, zuvor nicht verwendete Adresse entspricht.Schauen wir uns nun ein Beispiel für eine Transaktion mit einer wiederverwendeten Adresse für eine spezielle Ausgabemünze an. Nehmen Sie dazu eine andere Transaktion der RTM-Gruppe vor -b3c7ce9ca3a689c6236b9d6df3c257c5fab6c3985187669ccf731ac42a127a11
.
Die Adresse, NDpWDEx1mBkUYywqxDTAZZeGCfUV4GkVE8
an die die Spezialmünze ging, wurde bereits in früheren Transaktionen verwendet.
Wie bereits erwähnt, führen die Standardskripte in nativen Clientanwendungen für Namecoin nicht zur Wiederverwendung von Adressen. Um eine spezielle Münze an eine vorhandene Adresse zu senden, muss der Eigentümer separate, optionale Anstrengungen unternehmen, um die Ausgangsadresse in der Phase der Transaktionsbildung explizit herauszufinden und anzugeben.Warum könnte dies erforderlich sein? Die einzige Erwähnung der Situation, in der die Exit-Adresse manuell angegeben wird, traf ich nur in den Anweisungen zum Übertragen der Domain auf einen anderen Eigentümer.
Die Vermutung wird bestätigt, wenn wir das weitere Schicksal der Adressen am Ende der betreffenden Transaktion berücksichtigen. In der folgenden Abbildung ist diese Transaktion durch einen hellgrünen Meilenstein gekennzeichnet. Es ist ersichtlich, dass die nächste Transaktion 9e16f6be
in der stat-counter-4-Domäne unter Verwendung einer Geldadresse stattfand NJ8xUePv
, die keine explizite Verbindung mit der in der "übergeordneten" Transaktion verwendeten Adresse hat. Offensichtlich wurde die Domain an die Verwaltung einer anderen Person übertragen.
Im allgemeinen Fall kann dies entweder der Verkauf einer Domain an einen anderen Eigentümer sein, der nicht mit den Aktivitäten der betreffenden Person zusammenhängt, oder die Übertragung einer Domain zwischen den Konten einer Person. Die zweite Option ist die Einfachheit und die geringen Kosten für die Registrierung einer neuen Domain sowie das fehlende sichtbare Interesse von Organisationen und Markeninhabern an der Registrierung von Domains in der .bit-Zone. Wir konnten nicht wenigstens eine berechtigte Motivation für den Kauf einer Domain finden, die bei böswilligen Aktivitäten festgestellt wurde. Wir glauben daher, dass trotz der Möglichkeit, die Domain auf eine andere Person zu übertragen, Transaktionen mit wiederverwendbaren Adressen für den Abzug einer speziellen Münze eine Neuordnung von Vermögenswerten zwischen mehreren Konten darstellen, die von einer Gruppe kontrolliert werden.Wir formulieren die obigen Argumente in Form einer heuristischen Regel, die wir als allgemeine Änderung bezeichnen werden:, , , .
, , .
, , .
Das Schema zur Verwendung dieser Regel ist in der Abbildung dargestellt. Graue Bäche - gewöhnliche Münzen, grün - eine besondere Münze. Die Hilfslinien sind alle Münzen vom Ende der Transaktion gegenüber der Münze, durch die wir zu dieser Transaktion gekommen sind: Alle Ausgaben sind für die Aufwärtsbewegung und alle Eingaben für die Abwärtsbewegung.
Wir stellen einige Merkmale dieser Heuristik fest. Erstens bidirektional: Es funktioniert sowohl für die Aufwärtsbewegung, wenn wir den Besitzer des Eingangs kennen, als auch für die Abwärtsbewegung, wenn wir den Besitzer einer der Münzen am Ausgang kennen.Zweitens die optionale Verfügbarkeit einer speziellen Münze: Trotz der Tatsache, dass die Transaktion in Abwesenheit nicht mit der Aktualisierung der Domain zusammenhängt, bleibt die oben angegebene logische Begründung bezüglich des Besitzers einer regulären Münze gültig.Der Pseudocode zum Testen einer Transaktion auf Übereinstimmung mit der allgemeinen Änderungsregel würde folgendermaßen aussehen: 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
Gemeinsame Ausgaben
Die oben betrachtete Heuristik hat neben der Bidirektionalität eine weitere wichtige Eigenschaft. Gemeinsame Veränderung - Heuristik "ohne Gedächtnis"; Das Überprüfungsergebnis wird nur durch die Merkmale der betreffenden Transaktion bestimmt und hängt nicht von den Ergebnissen anderer Heuristiken und akkumulierter Daten ab. Eine solche Heuristik ist in den ersten Iterationen einer Durchquerung für das anfängliche Füllen eines Datensatzes unverzichtbar. Andererseits ist es leicht, die Einschränkungen seiner Anwendung zu bemerken. Zum Beispiel wird sie sich auf eine Transaktion konzentrieren, die zwei oder mehr Geldausgaben enthält.Betrachten Sie als Beispiel für eine solche Transaktion db4ff4082f39d0a501508706e627f26aa92712d27b4f633ded59917d201cfae5
. Diese Transaktion bezieht sich auf die Aktivitäten der Gruppe, die das Dimnie-Botnetz verwaltet.
Wir haben diese Transaktion über die Adresse abgewickeltMy7Ap3nH5f4X6Us2KiUWisd77wRpMG1MDY
Dies wurde in der vorherigen CC-Transaktion als Anmeldeadresse verwendet. Trotz der Tatsache, dass seine Haltung gegenüber der untersuchten Person zweifelsfrei ist, können wir über keinen der anderen Ausgänge und Eingänge dasselbe (wie auch das Gegenteil) sagen. Dies kann eine Umverteilung von Münzen zwischen Gruppenadressen sein. In diesem Fall werden alle Adressen von der Person kontrolliert, an der wir interessiert sind. Oder handelt es sich möglicherweise um eine Aufladung von den Adressen einer der Börsen, an denen Namecoin-Token verkauft werden? Oder eine Übertragung von einem anderen Netzwerkmitglied, das nicht mit den Aktivitäten der untersuchten Person zusammenhängt. Es ist unmöglich, allein aus den Attributen dieser Transaktion einen endgültigen Schluss zu ziehen.Betrachten Sie die AdresseN4XtLb7xpC4Zk72T8QcshKhTW17ZCyQ1j1
am Eingang dieser Transaktion. Diese Adresse wurde bereits zuvor ("früher" für eine Abwärtsbewegung bedeutet "in der Zukunft", "in Richtung Blockchain-Wachstum") bei der Eingabe einer CC-Transaktion verwendet 6bffc741eb66de074c09a380fb5e6bd13d4bd5205c36a76e3682674dba08461e
, sodass wir davon ausgehen können, dass diese Adresse von der für uns interessierenden Person verwaltet wird. Und da, wie bereits gezeigt wurde, die Schlüssel für alle Münzen am Eingang der Transaktion von einer Person gesteuert werden (was nicht über die Ausgaben gesagt werden kann), haben wir Grund zu der Annahme, dass alle anderen Eingaben ebenfalls zu der für uns interessanten Gruppe gehören.Die strenge Bedingung der heuristischen gemeinsamen Ausgaben sieht sehr einfach aus:Wenn bekannt ist, dass mindestens eine der Adressen am Eingang der Transaktion von einer bestimmten Person gesteuert wird, werden alle anderen Adressen an den Eingängen dieser Transaktion von derselben Person gesteuert. Münzen an diesen Eingängen gehören derselben Person.
Wie Sie sehen, ist diese Heuristik nur für die Abwärtsbewegung sinnvoll. Wenn wir uns in Richtung Blockchain-Wachstum bewegen, kommen wir über einen der Inputs zu der untersuchten Transaktion. In diesem Fall wird die Regelbedingung automatisch erfüllt, sagt jedoch nichts über die Ausgaben der Transaktion aus und ermöglicht es Ihnen nicht, sich weiter in die Upstream-Richtung zu bewegen. Mit anderen Worten, dies ist eine unidirektionale Heuristik.Das zweite erwähnenswerte Merkmal dieser Heuristik ist, dass wir hier zuerst die Daten verwendet haben, die bei der Überprüfung früherer Transaktionen gesammelt wurden - eine Liste von Adressen, die von der untersuchten Person verwaltet werden. Aus diesem Grund kann diese sekundäre Heuristik nicht für unabhängige Bewegungen verwendet werden, ohne eine primäre Heuristik, die nicht von den akkumulierten Ergebnissen abhängt (z. B. gemeinsame Änderung).Der Pseudocode zum Testen einer Transaktion auf Übereinstimmung mit der allgemeinen Ausgabenregel würde folgendermaßen aussehen: 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 {}
Bekannte Adresse
Die letzte Heuristik, die wir im Rahmen dieses Abschnitts betrachten werden, ist die einfachste von allen. Dies ist eine sekundäre bidirektionale Heuristik, die (da sie bidirektional ist) sowohl für Aufwärts- als auch für Abwärtsbewegungen verwendet werden kann. Die strikte Formulierung der heuristischen bekannten Adresse für die Aufwärtsbewegung sieht folgendermaßen aus:Wenn bekannt ist, dass die Adresse am Eingang (Ausgang) der Transaktion von einer bestimmten Person gesteuert wird, gehören die an dieser Adresse empfangenen Münzen (die von dieser Adresse ausgegeben werden) derselben Person.
Obwohl die Heuristik wie eine offene Binsenweisheit aussieht, hilft diese Regel dabei, Zweige und Schnittpunkte in Münzflüssen zu finden, und fügt dem Transaktionsbaum Konnektivität hinzu. Darüber hinaus können Sie die Bewegung von Transaktionen, die nicht unter andere Heuristiken fallen, nicht stoppen. Ein Beispiel ist die Transaktion des 7a35b9cb0a16b3eba92781be014555eaa4255bd17655bb00f2b3f42c3950ac69
bereits erwähnten Dimnie-Botnetzes.
Wenn wir es in einer Aufwärtsbewegung erreicht haben, werden wir nicht in der Lage sein, mit Hilfe gemeinsamer Veränderungen voranzukommen, da die Ausgabe mehr als eine gewöhnliche Münze ist. Bei einer Transaktion können wir nicht sagen, wie viele Münzen in der Ausgabe derselben Person gehören wie die Münze in der Ausgabe - beide, eine oder gar keine. Die Verwendung der bekannten Adressheuristik ermöglicht es Ihnen, aufgrund der Tatsache, dass die AdresseMwMdTb8WQvoRW9jEW5dHn9SkkCJTRn31wQ
war an der CC-Transaktion beteiligt cf7ac8986f9855246c6cf26df9a24aa5645cb9258bf787e034a33e75101ae1fc
, mit der die Domain erstellt wurde, die zuvor in der Upstream-Bewegung erfüllt wurde d/sectools
.Der Vollständigkeit halber geben wir den Pseudocode der heuristischen bekannten Adresse an: 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
Jetzt haben wir also sowohl den allgemeinen Bypass-Algorithmus als auch die Heuristiken, die für die Bewegung entlang der Blockchain erforderlich sind, damit wir sie zusammenstellen können, um ein IOC von Namecoin zu erhalten.Lass uns gehen!
Wir werden die RTM-Transaktionen mit der Aufwärts- und Abwärtsbewegung beginnen, beginnend mit 37d40bc2f3ca7415908dc9e276593b50d3120158cd540cb088246f2e2cf88b16
. Im Zuge der Weiterentwicklung der Blockchain werden wir nicht nur das IOC sammeln, sondern auch die Transaktionen selbst, die die Heuristiken erfüllen. Münzen fließen zwischen Transaktionen, die wir anhand des Sankey-Diagramms visualisieren.Das vollständige Diagramm ist zu groß, um im Format dieses Dokuments angezeigt zu werden. Daher werde ich hier nur einen Teil davon angeben, der für die weitere Geschichte erforderlich ist.
Ein Strom gewöhnlicher Münzen ist grau hervorgehoben. Die restlichen Farben entsprechen den Flüssen von Spezialmünzen. Für jeden Namen wird eine eigene Farbe ausgewählt. Weiße Meilensteine entsprechen Transaktionen, die die heuristischen Bedingungen erfüllen. Die leuchtend roten Meilensteine rechts sind UTXO.Das Diagrammelement, auf das ich aufmerksam machen möchte, ist mit einem blauen Meilenstein hervorgehoben. Dies ist ein baumelnder Eintrag - eine Münze, die bei der Eingabe einer Transaktion entstanden ist, die der Algorithmus an die Aufwärtsbewegung weitergegeben hat, aber die Transaktion, die diese Münze erstellt hat, hat ihn nicht getroffen.Baumelnde Eingaben sind Anzeichen dafür, dass die untersuchte Struktur Seitenzweige aufweist, die nicht mit dem Hauptstamm verbunden sind, entlang dem sich der Algorithmus bewegt. Im gezeigten Fall ist dies ein weiteres unabhängiges Konto. Wie im Diagramm zu sehen ist, werden damit Änderungen für die bereits bekannten Domänen bezahlt. Daraus können wir schließen, dass dieses Konto auch von der untersuchten Person kontrolliert wird. Um das IOC zu erhalten, das mit Vorgängen auf diesem Konto verknüpft ist, bis es im Diagramm angezeigt wird, starten wir eine separate Abwärtsbewegung, beginnend mit einer Transaktion mit einem baumelnden Eintrag.In ähnlicher Weise können bei einer Abwärtsbewegung baumelnde Ausgänge auftreten. Für jeden von ihnen starten wir ab der entsprechenden Transaktion eine separate Aufwärtsbewegung.Zusätzlich zu den Transaktionen der Gruppe, die das RTM-Botnetz steuert, haben wir auch die Transaktionen der Gruppen untersucht, die die Shifu-, Dimnie- und GandCrab-Botnetze steuern. Als Ergebnis wurden 164 im Interesse dieser Gruppen registrierte Domains und 277 mit diesen Namen verknüpfte IP-Adressen gefunden. Zum Zeitpunkt dieses Schreibens blieben von den gesammelten UTXO, die zu diesen Gruppen gehören, 39 Münzen in Kraft.Die IOC-Listen sowie die Namecoin-Adressen, auf denen die nicht verwendeten Münzen der Gruppen verblieben sind, sind in Anhang A aufgeführt.Fazit
Das Testen im realen Leben ist eine Herausforderung für fast jede Technologie. Mitte der 2000er Jahre war Wikipedia zu einer so beliebten vertrauenswürdigen Informationsquelle geworden, dass es durch die Änderung der Artikeltexte möglich wurde, die öffentliche Meinung zu kontrollieren, loszulegen und Geld zu verdienen. Diese Periode in der Geschichte des Dienstes ist berühmt für seine enormen Revisionskriege - den aggressiven Einsatz des Mechanismus zur Korrektur von Artikeln und die Rücknahme von Änderungen durch mehrere Kriegsparteien, um den Streit um den Inhalt des Artikels zu gewinnen. Wikipedia-Seiten wurden zu einer internationalen Eitelkeitsmesse, auf der jeder buchstäblich das letzte Wort sagen wollte.Einerseits begannen sie mit den Änderungen zu kämpfen und stellten spezielle Regeln auf, die es im Streitfall erlauben, die Möglichkeit der Bearbeitung des Artikels vorübergehend auszuschließen - bis die Debattierer im Abschnitt "Diskussion" einen Kompromisswortlaut finden. Andererseits zwang der Revisionskrieg Wikipedia, einen dynamischen Mechanismus für die Verwaltung der Ressourcen von Administratoren einzuführen, der es ihnen ermöglichte, schnell an der Lösung von Konflikten in den heißesten Bereichen beteiligt zu sein. Darüber hinaus nutzte die Enzyklopädie die öffentliche Aufmerksamkeit, die durch Zusammenstöße um einzelne Artikel auf sich gezogen wurde, um mehr Teilnehmer für die Bearbeitung dieser Artikel zu gewinnen und die korrekteste und vollständigste Berichterstattung über ein bestimmtes Thema zu erreichen.Kann Namecoin wie Wikipedia erwachsen werden und seine Herausforderung bewältigen? Kommt Zeit, kommt Rat.PS-Tabellen mit Kompromissindikatoren sind auf GitHub verfügbar .Gepostet von Alexey Goncharov, PT Expert Security Center