見出し画像

Bitcoinの取引データとランサムウェアの事件を紐づける

はじめに

今回は技術ブログを書こうと思いますが、この記事では「実際にランサムウェアの支払いに使われたBitcoinの取引と、現実に起きた事件の組み合わせ」のデータをどのように取得したかについてまとめます。

前提

私は「LLMを使った、ランサムウェアの支払いに使われたBitcoin取引の非匿名化」をテーマに研究をしています。

Bitcoinはその匿名性を利用して ランサムウェア の支払いの手段として使用されることが多くあります。実際、2019 年には 1 兆円以上の額が支払いに使用されたというデータがあります[1][2](2024 年 7 月 2 日時点での日本円レートです。)。Bitcoinの取引は全てオープンな台帳に記録されるので世界中の誰もが各取引履歴を参照することができるという点では透明性が高い(匿名性が低い)ですが、実際のところBitcoinを受け取るために必要な Wallet(銀行の口座のようなもの)の作成には特定の個人と結びつくような情報が不要で、かつ何個も作成することができます。そのため、取引履歴が見えてもそれが「誰かは分からない」という点で匿名性が高いのです。また、匿名性が高いと言われる他の理由として、どのノード(ここではノード = ブロックチェーンを動かしている PC とします。)がその取引を作成したのかを判別するのが難しいということもあります。それにより、誰が行った取引かを見つけることが難しいのです。各取引が生成され、ブロックが作成、承認されると、それが各ブロックチェーンのノードに伝搬していき、最終的には全てのノードが同期します。この時、次に情報が伝えられるノードがランダムに選ばれて伝搬していきます。このランダム性のため、起点となるノードや、そこに近いノードを特定することが難しく、ネットワークを利用した分析の観点からも匿名性が高いとも言えます。

これらの匿名性を暴くために、さまざまな方法が提案されていますが、その一つとして「ブロックチェーンのトランザクション以外の外部ソースを利用する」という方法があります。[3] 例えば、ランサムウェアの犯罪グループが利用するダークウェブがあるのですが、そこでは「この企業にこの金額を要求する」というような投稿がされます。それらのサイトを常時監視することで、要求額や日にちを絞り、それに関連しそうな Bitcoinのトランザクションを調べます。一致していそうなものがあれば、この取引に使われたこのアドレスはこの犯罪グループに使われている可能性があると仮定することができます。また、起点となる取引の場所もある程度絞ることができる、といった方法です。

私の研究では、この「外部ソースを利用してBitcoinの取引を非匿名化をする」という方法を、近年話題になっているLLMsを利用してより効率的にかつ利用者が使いやすくできないかということを調べています。これをすることで、ブロックチェーンのマイナスの側面ではなく本来の価値に焦点が当てられる社会になってほしいと願っています。
これをまず前提として以下を読み進めていただけると幸いです。


取得したいデータ

上記の目的を達成するために、色々な角度から調査や研究、実験をしていますが、まず目標としている最終的な成果物は以下です。

  • 警察や調査者が「<特定の日付>に、<特定の地域(ex. 日本など)> で起こった ランサムウェア に関連する可能性のあるBitcoinのトランザクションはありますか?」ということを LLMsに聞いたときに、関連するニュースと Bitcoinの取引データを提示する

これをするためにまず必要となってくるのが、「実際にランサムウェアの支払いに使われたBitcoinの取引と、現実に起きた事件の組み合わせ」のデータです。これがないと、まずLLMsをどのような形式で回答をするように訓練するのかや、訓練結果の測定ができないためです。

ランサムウェアの支払いに使われたBitcoinの取引データ

まず、政府機関や調査機関の協力がないと、私たち一般人がランサムウェアの支払いに使われたBitcoinの取引データを取得することは難しいです。しかし、ransomwhere[4]というサイトでは、限定的ですがこれらのデータが公開されています。ここでは実際に起こった ランサムウェア に支払われた、以下のようなデータを取得できます。

{
    "address": 取引が含まれているブロックのアドレス,
    "balance": 支払われた額,
    "blockchain": どのブロックチェーンか,
    "createdAt": いつこの情報が提供されたか,
    "transations": [
        {
            "hash": 取引のハッシュ値,
            "time": 取引の時間,
            "amount": 支払われた額,
            "amountUSD": USDドル換算
        }
    ],
    "updatedAt": いつこの情報が更新されたか,
    "family": ランサムウェアのグループ名,
    "balanceUSD" 合計のUSDドル換算額:
}

基本的に、こういったデータは手に入れることができないのでとても有用なデータです。しかし、私の研究に利用するにはもう一歩データが足りません。それは、「この取引データが現実世界の何のランサムウェアの事件と関連しているか」です。このデータは「ランサムウェア の支払いに使用された Bitcoin の取引のデータ」であって、どの事件のものかを提供していないのです。
そのため、このデータを「現実世界の何の ランサムウェア の事件と結びつける」必要があります。

現実世界で起こったランサムウェアの事件

では、どうやって現実世界のランサムウェアの事件と結びつけるかです。これをするために、何らかの方法で現実のランサムウェアの事件と関連するキーワードを含むデータを取得することが必要です。
そのために、私は ransomwatch[5]というレポジトリを参考に、web のスクレイピングを行いました。具体的には特定のダークウェブをいくつか定期的に監視して、情報が更新されたら被害者の情報(支払いを要求されている企業)と、ランサムウェア のグループ名、投稿された日時を取得します。これをすることで、以下のデータを取得することに成功しました。

{
    "victim_data": 被害企業名,
    "group_name": ランサムウェアのグループ名,
    "discovered": 投稿された日時
}


データを組み合わせる

その後に上記の 2 つのデータを以下の 2 つの属性を key にして組み合わせました。

  • createdAtdiscovered

  • familygroup_name

この時、"discovered" は、ダークウェブに投稿された時刻なので、実際のBitcoinの取引が行われた時刻よりは前の時間です。そのため、"discovered"から 一ヶ月後以内の"createdAt"に一致するもので、かつ "family"と"group_name"が一致するデータを抽出しました。また、"blockchain"は"bitcoin"に絞っています。その結果、300個程度一致するデータが確認できました。以下は取得できたデータの一例です。(具体的な企業名や address は伏せます。)

victim_name, group_name, discovered, createdAt, address, balance, transactions
ABC compnay, akira, 2024-02-15, 2024-03-12, xxxxxxxxxxxxxxx, 29860000, [{......}]

Bitcoin Block Explorerを使って実際の取引をチェックする

BitcoinにはBlock Explorerという、すべての取引が確認できるサイトがあります。そこではブロックのアドレスやハッシュ値を使って取引履歴を検索できるので、上記で取得した可能性のあるアドレスを使って取引を検索します。そこで、異常な量のBitcoinの送金があればこれが疑わしい取引の一つであると仮定できます。

実際のニュースを調べる

疑わしい取引を発見したら、"vicitm_name"と"discovered"を使って、Googleで「被害企業名 日付」で検索します。そこで一致したニュースがあればそのニュースをcurlを使ってhtmlフォーマットで取得します。そのhtmlデータをGPTを使ってparseし、要約します。この時利用したモデルはGPT-3.5-turboで、promptは以下を使用しました。理由は3.5-turboが圧倒的にコストが安く、promptを工夫することで適切な結果を得ることができたためです。入力トークンが多すぎる場合は、htmlをBeautifulSoup[6]を利用してtextデータのみを取り出して、それをGPTを使って本文のみを取り出すという方法も利用しました。

prompt = """
The following html data contains data from which only the text needs to be extracted.
However, there is a lot of extraneous text included for analysis.
The goal is to extract only the main body of the news.
Please parse the html file and extract only the main body of the news for me.
"""

上記の結果を組み合わせる

ニュースの要約ができたら、取引のデータ、日付、と要約文で以下のようなデータを作成します。


date, transactions, victim_name, news_text
2024-03-12, [{...}, ABC company, March 12, 2024, there was a ransomware incident targed to ABC company. ~~~~~~~~~~~~]

これを、一致する可能性のあるデータで行います。これらの処理はすべてBitcoinのBlock Explorerを使用するところ以外は自動化します。Block ExplorerのAPIがあれば良かった。。これで欲しいデータが取得できました。

今やっていることと今後の予定

このデータは完全に正しいものではあると現段階では言えませんが、外部ソースを利用した Bitcoin取引の非匿名化にLLMsがどの程度利用できるかを検証するのに有用であると考えています。
このデータを利用して、オープンソースである Llama2と組み合わせて非匿名化を実現しようとしています。訓練したLLMsの評価データとしても使えると考えていますし、より大規模なデータを作成する際のseedとしても使用できると考えています。
自動化含めたソースコードも論文が発表されたらオープンソースにするつもりです。
読んでくださりありがとうございました!

引用

[1] Raheem, Ali, Raheem, Rand, Chen, Thomas M., Alkhayyat, Ahmed, Estimation of Ransomware Payments in Bitcoin Ecosystem, 10.1109/ISPA-BDCloud-SocialCom-SustainCom52081.2021.00224, 2021

[2] Masarah Paquet-Clouston, Ransomware payments in the Bitcoin ecosystem, 10.1093/cybsec/tyz003, 2019
[4] M.X.Kus Khalilov, A survey on anonymity and privacy in bitcoin-like digital cash systems, 10.1109/COMST.2018.2818623, 2018

[4] https://ransomwhe.re/, 2024年7月2日閲覧

[5] https://github.com/joshhighet/ransomwatch, 2024年7月2日閲覧

[6] https://beautiful-soup-4.readthedocs.io/en/latest/. 2024年7月2日閲覧

この記事が気に入ったらサポートをしてみませんか?