[![Logo](https://www.paloaltonetworks.com/wp-content/uploads/2021/07/PANW_Parent.png)](https://www.paloaltonetworks.jp/)  
[![Unit42 Logo](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/unit42-logo-white.svg)](https://unit42.paloaltonetworks.com/ja/)  
Menu

* [セキュリティ コンサルティング](https://www.paloaltonetworks.com/unit42)
* [**現在、攻撃を受けていますか?**](https://start.paloaltonetworks.com/contact-unit42.html)  
  Japanese
* [English](https://unit42.paloaltonetworks.com/unit42-decrypting-lockcrypt-ransomware/)
* [Japanese](https://unit42.paloaltonetworks.com/ja/unit42-decrypting-lockcrypt-ransomware/)
* [Threat Research Center](https://unit42.paloaltonetworks.com/ja/ "Threat Research")
* [脅威リサーチ](https://unit42.paloaltonetworks.com/ja/category/threat-research-ja/ "脅威リサーチ")
* [ランサムウェア](https://unit42.paloaltonetworks.com/ja/category/ransomware-ja/ "ランサムウェア")  
  [ランサムウェア](https://unit42.paloaltonetworks.com/ja/category/ransomware-ja/)

# LockCrypt ランサムウェアの復号

![Clock Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-clock.svg) 5 分で読めます

* ![Profile Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-profile-grey.svg)  
  著者:
  
  * [Tomer Harpaz](https://unit42.paloaltonetworks.com/ja/author/tomer-harpaz/)

* ![Published Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-calendar-grey.svg)  
  公開日:2018年7月27日

* ![Tags Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-category.svg)  
  カテゴリー
  
  * [脅威リサーチ](https://unit42.paloaltonetworks.com/ja/category/threat-research-ja/)
  * [ランサムウェア](https://unit42.paloaltonetworks.com/ja/category/ransomware-ja/)

* ![Tags Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-tags-grey.svg)  
  タグ:
  
  * [Decryptor](https://unit42.paloaltonetworks.com/ja/tag/decryptor-ja/)
  * [LockCrypt](https://unit42.paloaltonetworks.com/ja/tag/lockcrypt-ja/)
  * [Tool](https://unit42.paloaltonetworks.com/ja/tag/tool-ja/)

* [![Download Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-download.svg)](https://unit42.paloaltonetworks.com/ja/unit42-decrypting-lockcrypt-ransomware/?pdf=download&lg=ja&_wpnonce=9455982592 "Click here to download")

* [![Print Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-print.svg)](https://unit42.paloaltonetworks.com/ja/unit42-decrypting-lockcrypt-ransomware/?pdf=print&lg=ja&_wpnonce=9455982592 "Click here to print")

共有![Down arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/down-arrow.svg)

* ![Link Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-share-link.svg)
* [![Link Email](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-sms.svg)](mailto:?subject=LockCrypt%20ランサムウェアの復号&body=Check%20out%20this%20article%20https%3A%2F%2Funit42.paloaltonetworks.com%2Fja%2Funit42-decrypting-lockcrypt-ransomware%2F "Share in email")
* [![Facebook Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-fb-share.svg)](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Funit42.paloaltonetworks.com%2Fja%2Funit42-decrypting-lockcrypt-ransomware%2F "Share in Facebook")
* [![LinkedIn Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-linkedin-share.svg)](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Funit42.paloaltonetworks.com%2Fja%2Funit42-decrypting-lockcrypt-ransomware%2F&title=LockCrypt%20ランサムウェアの復号 "Share in LinkedIn")
* [![Twitter Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-twitter-share.svg)](https://twitter.com/intent/tweet?url=https%3A%2F%2Funit42.paloaltonetworks.com%2Fja%2Funit42-decrypting-lockcrypt-ransomware%2F&text=LockCrypt%20ランサムウェアの復号 "Share in Twitter")
* [![Reddit Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-reddit-share.svg)](https://www.paloaltonetworks.com//www.reddit.com/submit?url=https%3A%2F%2Funit42.paloaltonetworks.com%2Fja%2Funit42-decrypting-lockcrypt-ransomware%2F&ts=markdown "Share in Reddit")
* [![Mastodon Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-mastodon-share.svg)](https://mastodon.social/share?text=LockCrypt%20ランサムウェアの復号%20https%3A%2F%2Funit42.paloaltonetworks.com%2Fja%2Funit42-decrypting-lockcrypt-ransomware%2F "Share in Mastodon")

## 概要

LockCryptはEncryptServer2018という別名でも知られるランサムウェアファミリで、2017年の半ばからインターネット上に出回りはじめて以降依然として活発です。このマルウェアはリバースエンジニアリングによる[完全な分析を](https://blog.malwarebytes.com/threat-analysis/2018/04/lockcrypt-ransomware/) Malwarebytes Labsが2018年4月に行っていますが、利用されている自家製の暗号はお粗末なもので、解読は可能と正しく結論づけています。

ただし、Malwarebytesのリサーチャーは本マルウェア用の復号ツールは公開しておらず、ほかにオンライン上で公開済みの復号ツールも確認できませんでした。また、これ以外にあげられている支援は[同ラボの新しいブログエントリ](https://www.bleepingcomputer.com/news/security/lockcrypt-ransomware-cracked-due-to-bad-crypto/)しかなく、そこでも同ランサムウェアの被害にあった人はMichael Gillespie ([@demonslay335](https://twitter.com/demonslay335))に復号について相談するよう勧めているのみでした。

そこで私たちはGillepsie氏に連絡を取り、[@hasherezade](https://twitter.com/hasherezade)、[@FraMauronz](https://twitter.com/framauronz)の両氏と[復号ツールの作成](https://download.bleepingcomputer.com/demonslay335/LockCryptDecrypter.zip)をしましたが、この復号ツールは完全とはいえませんでした。既知の平文ファイル(1MB)が大量に必要でしたし、復元できないファイル名があったり、ファイルの末尾1-2バイト分が復号できずに残る場合があったのです。

これを受け、本稿では、本マルウェアの自家製暗号について分析した結果とその解読方法、また25KB程度のごく小さい平文のみで暗号キーを復元する方法について説明します。このシナリオであれば現実的といえるでしょう。というのも、LockCryptは手当たり次第すべてのファイルを暗号化しますが、DLL のようなアプリケーションファイルもその例外ではないため、同じバージョンのソフトウェアを別のコンピュータにインストールすれば容易に復元可能だからです。復元用スクリプトや手順などは本稿の末尾に記載します。

ただし最近、別の暗号方式を利用する新しい亜種が見つかっている点はご注意ください。私たちはこの新しいバージョンの解析は行っていませんが、こちらはずっと堅牢な暗号が利用されているようです。

### 初期の分析

このマルウェアの暗号を逆アセンブルしてみてわかったことは、このマルウェアの作成者は、ファイルを暗号化するにあたり、カスタムメイドの非常に弱い暗号を選んだということでした。私たちは、2018年にもなってカスタムメイドの暗号モデルを利用したランサムウェアと遭遇することがあるなどとは思ってもいませんでした。というのも、Windows API を利用すれば、今現在ないし近い将来に利用可能なハードウェアでは復号に数十億年かかるような方式で、簡単にデータを暗号化できるからです(たとえば、十分に暗号強度の高いメソッドを使って生成されたキーを持つ128ビットAES暗号方式など)。

以下に示すのは、本マルウェアの暗号関数を逆アセンブルした結果を同等のPythonコードで示したものです。なお当該encrypt()関数のC言語版は[Malwarebyteによる分析](https://blog.malwarebytes.com/threat-analysis/2018/04/lockcrypt-ransomware/)に掲載されています。ポインタ操作がある分、こちらの方が分かりやすいかもしれません。  
def grouper(iterable, n, fillvalue=None): """returns a generator which iterates iterable in groups of size n. in case the last group is incomplete, it is padded with fillvalue""" args = \[iter(iterable)\] \* n return itertools.izip\_longest(fillvalue=fillvalue, \*args) def rol(val, n, width): """equivalent to the x86 rol opcode""" return (val \&lt;\&lt; n) \&amp; ((1\&lt;\&lt;width)-1) | \\ ((val \&amp; ((1\&lt;\&lt;width)-1)) \&gt;\&gt; (width-n)) def encrypt(key, plain): size = len(plain)-2 enc = io.BytesIO(plain) # phase 1 key\_cyclic = grouper(itertools.cycle(key), 4) for \_ in xrange(0, size\&amp;(~0x3), 2): # align the size of the data to a multiple of 4 bytes # get the next key dword k = "".join(key\_cyclic.next()) k = struct.unpack("\&lt;I", k)\[0\] # get the next data dword d = enc.read(4) d = struct.unpack("\&lt;I", d)\[0\] # XOR them and put it back to the data e = k^d e = struct.pack("\&lt;I", e) enc.seek(-4, os.SEEK\_CUR) enc.write(e) # go back 2 bytes in the data stream (so that loop iterations overlap) enc.seek(-2, os.SEEK\_CUR) # phase 2 enc.seek(0, os.SEEK\_SET) key\_cyclic = grouper(itertools.cycle(key), 4) for i in xrange(0, size\&amp;(~0x3), 4): # get the next key dword k = "".join(key\_cyclic.next()) k = struct.unpack("\&lt;I", k)\[0\] # get the next data dword d = enc.read(4) d = struct.unpack("\&lt;I", d)\[0\] # rotate the data dword e = rol(d, 5, 32) # XOR it with the key dword e = e^k # swap the byte order e = struct.pack("\&gt;I", e) # put the data dword back enc.seek(-4, os.SEEK\_CUR) enc.write(e) return enc.getvalue() def encrypt\_file(key, file): # len(key) == 25000 # leave the first 4 bytes as-is file.seek(4, os.SEEK\_SET) # encrypt the rest of the first 1MB of the file plain\_data = file.read(0x100000 - 4) enc\_data = encrypt(key, plain\_data) file.seek(4, os.SEEK\_SET) file.write(enc\_data) # leave the rest of the file as is

|----------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | def grouper(iterable, n, fillvalue=None): """returns a generator which iterates iterable in groups of size n. in case the last group is incomplete, it is padded with fillvalue""" args = \[iter(iterable)\] \* n return itertools.izip\_longest(fillvalue=fillvalue, \*args) def rol(val, n, width): """equivalent to the x86 rol opcode""" return (val \&lt;\&lt; n) \&amp; ((1\&lt;\&lt;width)-1) | \\ ((val \&amp; ((1\&lt;\&lt;width)-1)) \&gt;\&gt; (width-n)) def encrypt(key, plain): size = len(plain)-2 enc = io.BytesIO(plain) # phase 1 key\_cyclic = grouper(itertools.cycle(key), 4) for \_ in xrange(0, size\&amp;(~0x3), 2): # align the size of the data to a multiple of 4 bytes # get the next key dword k = "".join(key\_cyclic.next()) k = struct.unpack("\&lt;I", k)\[0\] # get the next data dword d = enc.read(4) d = struct.unpack("\&lt;I", d)\[0\] # XOR them and put it back to the data e = k^d e = struct.pack("\&lt;I", e) enc.seek(-4, os.SEEK\_CUR) enc.write(e) # go back 2 bytes in the data stream (so that loop iterations overlap) enc.seek(-2, os.SEEK\_CUR) # phase 2 enc.seek(0, os.SEEK\_SET) key\_cyclic = grouper(itertools.cycle(key), 4) for i in xrange(0, size\&amp;(~0x3), 4): # get the next key dword k = "".join(key\_cyclic.next()) k = struct.unpack("\&lt;I", k)\[0\] # get the next data dword d = enc.read(4) d = struct.unpack("\&lt;I", d)\[0\] # rotate the data dword e = rol(d, 5, 32) # XOR it with the key dword e = e^k # swap the byte order e = struct.pack("\&gt;I", e) # put the data dword back enc.seek(-4, os.SEEK\_CUR) enc.write(e) return enc.getvalue() def encrypt\_file(key, file): # len(key) == 25000 # leave the first 4 bytes as-is file.seek(4, os.SEEK\_SET) # encrypt the rest of the first 1MB of the file plain\_data = file.read(0x100000 - 4) enc\_data = encrypt(key, plain\_data) file.seek(4, os.SEEK\_SET) file.write(enc\_data) # leave the rest of the file as is |

この関数からは以下の結論が導き出せます:

1. フェーズ1が定義する変換は周期的で、1サイクルの長さは12500バイト
2. フェーズ2が定義する変換は周期的で、1サイクルの長さは25000バイト
3. エッジケース(後述)を除き、各平文ビットは3つのキービットとXOR演算される(2つのキーはフェーズ1、残り1つはフェーズ2で)
4. つまり、フェーズ2で行われたビット シフトを「取り消す」(バイト順を入れ替え戻した上で5ビット分ROR演算を行う)ことで、両フェーズをひとまとめとし、長さ25000バイトの周期的キーをもつストリーム暗号として扱うことができる(また、それがオリジナルのキーの機能でもある)。

最後の2つの結論について次の図で説明します。この図はデータの4バイト目から8バイト目を変換する様子を、各暗号関数のそれぞれのステップの流れを追って可視化したものです。各行の間にある⊕という記号は、それらのビットが互いにXOR演算されているということを意味しています。

変換が行われる前の4バイト目から8バイト目の各ビットは以下のような状態です:

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-98.png)

フェーズ1ループの2回目の繰り返しが終わった後は次のようになります:

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-99.png)

フェーズ1ループの3回目の繰り返しが終わった後は次のようになります:

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-100.png)

フェーズ1ループの4回目の繰り返しが終わった後は次のようになります(フェーズ1のループはすべて同じことの繰り返し):

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-101.png)

フェーズ2ループの2回目の繰り返し中、ROL演算が終わった後は次のようになります:

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-102.png)

フェーズ2ループの2回目の繰り返し中、XOR演算が終わった後は次のようになります:

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-103.png)

バイト順を入れ替えてこれらのバイトの暗号化は終了です。

### 「ストリーム キー」を復元する

先の図で暗号化された4バイト目から8バイト目を使い、バイト順の入れ替えを元に戻して5ビット分ROR演算をすると次の結果が得られます:

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-104.png)

要するに、この演算(バイト順の入れ替えを元に戻して5ビット分ROR演算する)により、この暗号を典型的なストリーム暗号に「正規化」したわけです。この後、これらのバイトと既知の平文とのXOR演算を行えば、先の結論4で述べたキー ビットの機能が得られます:

![](https://unit42.paloaltonetworks.com/wp-content/uploads//2020/02/word-image-105.png)

このストリーム(実際には各ビットがキー ビットと3回XOR演算されている)を「ストリーム キー」と呼ぶことにしましょう。このストリームキーは25000バイト長のサイクルで周期性があるので、25000(25k)バイトの長さの平文と暗号文があれば、キーを復元してファイルを復号するのに十分といえそうです。

なにか既知の平文と暗号データのペアを次のPythonの関数で処理すればストリーム キーを復元できます。ここでインデックス パラメータは、与えられた文字列中の25000バイト分の既知の平文バイトに対するインデックスを示しています。ただし、先頭4バイト分は暗号化されることがないため、ここから 4 を引いています。つまり、平文の文字列のインデックスidx+4からidx+4+25000の範囲が使用されます。このため、既知の平文ファイルのサイズが50000バイトなら0 \<= idx \< 24998の範囲が利用されます。  
key\_len = 25000 def ror(val, n, width): return ((val \&amp; ((1\&lt;\&lt;width)-1)) \&gt;\&gt; n) | \\ (val \&lt;\&lt; (width-n) \&amp; ((1\&lt;\&lt;width)-1)) def recover\_stream\_key(plain, enc, idx): assert len(plain) == len(enc) assert len(plain) \&gt;= 4 + idx + key\_len plain = io.BytesIO(plain) enc = io.BytesIO(enc) assert plain.read(4) == enc.read(4) plain.seek(idx \&amp; (~3), os.SEEK\_CUR) enc.seek(idx \&amp; (~3), os.SEEK\_CUR) stream\_key = io.BytesIO() for i in xrange(0, key\_len + (idx % 4), 4): # read the next plain dword p = plain.read(4) p = struct.unpack("\&lt;I", p)\[0\] # read the next encrypted dword and undo the bit shifts on it e = enc.read(4) # unswap the byte order e = struct.unpack("\&gt;I", e)\[0\] # ROR back 5 bits e = ror(e, 5, 32) # XOR the plain and normalized encrypted dwords k = p^e k = struct.pack("\&lt;I", k) # write the stream key dword to the recovered stream key stream if i == 0: stream\_key.write(k\[idx % 4:\]) elif i \&lt; key\_len: stream\_key.write(k) else: # i == key\_len stream\_key.write(k\[:-idx % 4\]) stream\_key = stream\_key.getvalue() assert len(stream\_key) == key\_len return stream\_key

|-------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | key\_len = 25000 def ror(val, n, width): return ((val \&amp; ((1\&lt;\&lt;width)-1)) \&gt;\&gt; n) | \\ (val \&lt;\&lt; (width-n) \&amp; ((1\&lt;\&lt;width)-1)) def recover\_stream\_key(plain, enc, idx): assert len(plain) == len(enc) assert len(plain) \&gt;= 4 + idx + key\_len plain = io.BytesIO(plain) enc = io.BytesIO(enc) assert plain.read(4) == enc.read(4) plain.seek(idx \&amp; (~3), os.SEEK\_CUR) enc.seek(idx \&amp; (~3), os.SEEK\_CUR) stream\_key = io.BytesIO() for i in xrange(0, key\_len + (idx % 4), 4): # read the next plain dword p = plain.read(4) p = struct.unpack("\&lt;I", p)\[0\] # read the next encrypted dword and undo the bit shifts on it e = enc.read(4) # unswap the byte order e = struct.unpack("\&gt;I", e)\[0\] # ROR back 5 bits e = ror(e, 5, 32) # XOR the plain and normalized encrypted dwords k = p^e k = struct.pack("\&lt;I", k) # write the stream key dword to the recovered stream key stream if i == 0: stream\_key.write(k\[idx % 4:\]) elif i \&lt; key\_len: stream\_key.write(k) else: # i == key\_len stream\_key.write(k\[:-idx % 4\]) stream\_key = stream\_key.getvalue() assert len(stream\_key) == key\_len return stream\_key |

それではいよいよ(まだ不完全ですが)次の関数を使ってファイルを復号していきましょう:  
def decrypt(stream\_key, enc): size = len(enc) - 2 plain = io.BytesIO(enc) stream\_key\_cyclic = grouper(itertools.cycle(stream\_key), 4) for i in xrange(0, size\&amp;(~3), 4): # read the next stream key dword sk = "".join(stream\_key\_cyclic.next()) sk = struct.unpack("\&lt;I", sk)\[0\] # read the next encrypted dword and undo the bit shifts on it e = plain.read(4) # unswap the byte order e = struct.unpack("\&gt;I", e)\[0\] # ROR back 5 bits e = ror(e, 5, 32) # XOR the normalized encrypted dword with the stream key dword to recover # the plain dword p = e^sk p = struct.pack("\&lt;I", p) plain.seek(-4, os.SEEK\_CUR) plain.write(p) return plain.getvalue() def decrypt\_file(stream\_key, file): assert len(stream\_key) == key\_len # leave the first 4 bytes as-is file.seek(4, os.SEEK\_SET) # decrypt the rest of the first 1MB of the file enc\_data = file.read(0x100000 - 4) plain\_data = decrypt(stream\_key, enc\_data) file.seek(4, os.SEEK\_SET) file.write(plain\_data) # leave the rest of the file as is

|-------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | def decrypt(stream\_key, enc): size = len(enc) - 2 plain = io.BytesIO(enc) stream\_key\_cyclic = grouper(itertools.cycle(stream\_key), 4) for i in xrange(0, size\&amp;(~3), 4): # read the next stream key dword sk = "".join(stream\_key\_cyclic.next()) sk = struct.unpack("\&lt;I", sk)\[0\] # read the next encrypted dword and undo the bit shifts on it e = plain.read(4) # unswap the byte order e = struct.unpack("\&gt;I", e)\[0\] # ROR back 5 bits e = ror(e, 5, 32) # XOR the normalized encrypted dword with the stream key dword to recover # the plain dword p = e^sk p = struct.pack("\&lt;I", p) plain.seek(-4, os.SEEK\_CUR) plain.write(p) return plain.getvalue() def decrypt\_file(stream\_key, file): assert len(stream\_key) == key\_len # leave the first 4 bytes as-is file.seek(4, os.SEEK\_SET) # decrypt the rest of the first 1MB of the file enc\_data = file.read(0x100000 - 4) plain\_data = decrypt(stream\_key, enc\_data) file.seek(4, os.SEEK\_SET) file.write(plain\_data) # leave the rest of the file as is |

残念ながら、上記のソリューションにはいくつかのエッジケースは扱えていません:

1. 暗号化された最初の2バイト(元のファイルの4バイト目から6バイト目)は、2つのキー ビットとしかXOR演算されていないので:
   1. 残りのバイトを復号するには、idx \>= 2 のストリーム キーを使う必要がある
   2. 最初の2バイトを復号するには、idx == 0 のストリーム キーを使う必要がある
2. 元ファイルのサイズが2 (mod 4)に等しくなければ、encrypt()関数にlen(plain) != 0 (mod 4)があることから、ファイルの末尾1-2バイトはフェーズ1の最終の繰り返し回によってしか暗号化されていないことになる。これら末尾1-2バイトの各平文ビットは1つのキービット(得られていないキー ビット)としかXOR演算が行われていないため、復号できない。

さらに[Malwarebytes](https://blog.malwarebytes.com/threat-analysis/2018/04/lockcrypt-ransomware/)が示したように、ファイル名はオリジナルのキーのサブセットと直接XOR演算して暗号化されているため、ファイル名も復号できません。ただし、@demonslay335 氏が復号ツールの中で使っているように、暗号化されたファイル名の長さをmとした場合、n \>= m の長さをもつ既知のファイル名があれば復号は可能です。

つまるところ、任意の長さのファイルとファイル名を復元したければ、本稿で述べたストリーム キーだけでなく、実際のオリジナル暗号キーが必要そうだ、ということです。

## オリジナル暗号キーを復元する

実は、これまでの分析から(XORを加算演算とする[ガロア体(2)](<https://en.wikipedia.org/wiki/GF(2)>)上の)連立一次方程式が得られ、ストリーム キーとオリジナル キーをこの方程式で結びつけることができるようになります。この分析を一般化するなら、次のPythonの関数によって、オリジナル キーをそのビット インデックス間でXOR演算した結果が得られ、それが各ストリーム キーのビット(i をインデックスとして使用)が生成されます:  
key\_bitlen = 25000\*8 def k\_for\_i(i): i\_dword = i \&gt;\&gt; 5 # the index of the dword for bit i i\_offset = i % 32 # the index of bit i in its dword i = i + key\_bitlen k = \[\] k.append((i\_dword \&lt;\&lt; 6) + i\_offset) if i\_offset \&lt; 16: k.append(k\[0\] - 16) else: k.append(k\[0\] + 16) k.append((i\_dword \&lt;\&lt; 5) + ((i\_offset + 5) % 32)) return \[x % key\_bitlen for x in k if x \&gt;= 0\]

|-------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | key\_bitlen = 25000\*8 def k\_for\_i(i): i\_dword = i \&gt;\&gt; 5 # the index of the dword for bit i i\_offset = i % 32 # the index of bit i in its dword i = i + key\_bitlen k = \[\] k.append((i\_dword \&lt;\&lt; 6) + i\_offset) if i\_offset \&lt; 16: k.append(k\[0\] - 16) else: k.append(k\[0\] + 16) k.append((i\_dword \&lt;\&lt; 5) + ((i\_offset + 5) % 32)) return \[x % key\_bitlen for x in k if x \&gt;= 0\] |

つまり、stream\_key\[i\] == reduce(xor, (key\[k\] for k in k\_for\_i(i))) ということです。

この関数により、ガロア体(2)上に、オリジナル キーとストリーム キー間の変換を表す200000x200000の非常に疎な行列が生成されます:  
def gen\_equations(idx): A\_i\_j\_s = \[\] for i in xrange(idx \&lt;\&lt; 3, (idx \&lt;\&lt; 3) + key\_bitlen): A\_i\_j\_s.append(k\_for\_i(i)) return A\_i\_j\_s

|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 | def gen\_equations(idx): A\_i\_j\_s = \[\] for i in xrange(idx \&lt;\&lt; 3, (idx \&lt;\&lt; 3) + key\_bitlen): A\_i\_j\_s.append(k\_for\_i(i)) return A\_i\_j\_s |

この行列Aは、A\_i\_j\_s\[i\]列だけが1で、残りの行iはすべて0となります。

またこの行列は各行に3つしか値がないという「非常に」疎な行列なので、普通のコンピュータ上で線形代数モデルを使って解くことも可能です。たとえば数学ソフトウェアの[SageMath](https://www.sagemath.org/)で次のコードを実行させます:

# fix the following parameters to those of your own stream\_key\_idx = 25000 \# the stream key idx you recovered stream\_key\_path = "key-stream-idx-25000.bin" \# the path to the stream key you recovered original\_key\_path = "key.bin" \# the path to write the original key to import itertools import struct def grouper(iterable, n, fillvalue=None): args = \[iter(iterable)\] \* n return itertools.izip\_longest(fillvalue=fillvalue, \*args) def str2bits(s): bits = \[\] for dword in grouper(s, 4): dword = "".join(dword) dword = struct.unpack("\&lt;I", dword)\[0\] bits += \[(dword \&gt;\&gt; i) \&amp; 1 for i in xrange(32)\] return bits def bits2str(bits): s = \[\] for dword\_bits in grouper(bits, 32): dword = 0 for i, bit in enumerate(dword\_bits): dword = dword | (bit \&lt;\&lt; i) s.append(struct.pack("\&lt;I", dword)) return "".join(s) with open(stream\_key\_path) as f: stream\_key = f.read() assert len(stream\_key) == 25000 stream\_key\_bits = str2bits(stream\_key) Y = vector(GF(2), 200000, stream\_key\_bits) \# create a matrix with the equations for the stream key bit A\_i\_j\_s = gen\_equations(stream\_key\_idx) A = matrix(GF(2), 200000, sparse=True) for i, A\_i\_j in enumerate(A\_i\_j\_s): for j in A\_i\_j: A\[i,j\] = 1 \# recover the original key bits X = A.solve\_right(Y) key\_bits = \[int(x) for x in X.list()\] key = bits2str(key\_bits) with open(original\_key\_path, 'wb') as f: f.write(key)

|----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | # fix the following parameters to those of your own stream\_key\_idx = 25000 # the stream key idx you recovered stream\_key\_path = "key-stream-idx-25000.bin" # the path to the stream key you recovered original\_key\_path = "key.bin" # the path to write the original key to import itertools import struct def grouper(iterable, n, fillvalue=None): args = \[iter(iterable)\] \* n return itertools.izip\_longest(fillvalue=fillvalue, \*args) def str2bits(s): bits = \[\] for dword in grouper(s, 4): dword = "".join(dword) dword = struct.unpack("\&lt;I", dword)\[0\] bits += \[(dword \&gt;\&gt; i) \&amp; 1 for i in xrange(32)\] return bits def bits2str(bits): s = \[\] for dword\_bits in grouper(bits, 32): dword = 0 for i, bit in enumerate(dword\_bits): dword = dword | (bit \&lt;\&lt; i) s.append(struct.pack("\&lt;I", dword)) return "".join(s) with open(stream\_key\_path) as f: stream\_key = f.read() assert len(stream\_key) == 25000 stream\_key\_bits = str2bits(stream\_key) Y = vector(GF(2), 200000, stream\_key\_bits) # create a matrix with the equations for the stream key bit A\_i\_j\_s = gen\_equations(stream\_key\_idx) A = matrix(GF(2), 200000, sparse=True) for i, A\_i\_j in enumerate(A\_i\_j\_s): for j in A\_i\_j: A\[i,j\] = 1 # recover the original key bits X = A.solve\_right(Y) key\_bits = \[int(x) for x in X.list()\] key = bits2str(key\_bits) with open(original\_key\_path, 'wb') as f: f.write(key) |

検証してみたところ 16GB の RAM を搭載した Intel Core i7-4790 CPU と SageMath 上でこの方程式を数十分から数百分程度で解くことができました。重要なファイルを完全に復元したいなら、これは十分実用的といえるでしょう。なお、idxが25000の倍数であれば、処理が速くなるようです。これは、行列が行階段形に近くなるためかもしれません。したがって、十分に大きい(50KB以上など)既知の平文ファイルがあるならidx = 25000とすることを推奨します。

### ファイルを復号する

以上をまとめますと、マルウェアが利用する暗号キーを復元する手順は以下のようになります:

1. 暗号化済ファイルについて、暗号化される前の平文ファイルを用意します。この元ファイルは、少なくとも 25006 バイト以上のものが必要です。
   1. 暗号化前の元ファイルを用意するには、ランサムウェアによって暗号化されたソフトウェアと同じバージョンのソフトウェアを別のコンピュータ上にインストールしてから、ファイルサイズをヒントとして、暗号化された DLL ファイルと対応する平文DLLファイルを探すとよいでしょう。
2. まだインストールされていない場合は[Python 2.7](https://www.python.org/downloads/release/python-2715/)をインストールします。
3. [recover\_stream\_key.py](https://github.com/pan-unit42/public_tools/tree/master/lockcrypt)スクリプトを使い、暗号化されたファイルとそうでないファイルのペアから特定のidx用のストリーム キーを復元します。
   1. 先に説明したとおり、十分に大きな平文ファイルがあるならidx = 25000にすることをお勧めします。
4. [SageMathをインストールします。](https://www.sagemath.org/download-windows.html)
5. SageMath Jupyter Notebookを開き、「オリジナル暗号キーを復元する」セクションに記載されている 3 つのコード スニペットを上から順にペーストしてから実行します(訳注: 日本語版ではコード部分を画像として記載しておりますので、ここでは[英語ブログ](https://blog.paloaltonetworks.com/2018/07/unit42-decrypting-lockcrypt-ransomware/)の「Recovering the original key」セクションからコピーすることをおすすめします)。これによりオリジナルの暗号キーを復元します。
   1. 重要: コード実行前に必ずスニペット上部に記載されている3つのパラメータをご自身のものに書き換えてください。
   2. 検証によれば、この段階に20分から数時間かかることがあります。
6. 本稿末尾のリンクからダウンロードしたdecryptor.pyスクリプトで、暗号化されたファイルを復号します。

本稿の分析とスクリプトファイルが、当該ランサムウェアの被害に遭われた方々の失われたファイルを復元するお役に立てば幸いです。

両スクリプトは[こちら](https://github.com/pan-unit42/public_tools/tree/master/lockcrypt) のUnit 42チームのGitHubからダウンロードできます。
トップに戻る

### タグ

* [Decryptor](https://unit42.paloaltonetworks.com/ja/tag/decryptor-ja/ "decryptor")
* [LockCrypt](https://unit42.paloaltonetworks.com/ja/tag/lockcrypt-ja/ "LockCrypt")
* [Tool](https://unit42.paloaltonetworks.com/ja/tag/tool-ja/ "Tool")  
  [Threat Research Center](https://unit42.paloaltonetworks.com/ja/ "Threat Research") [次ページ:OilRig、QUADAGENTを使用してテクノロジ サービス プロバイダと政府機関を標的に](https://unit42.paloaltonetworks.com/ja/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/ "OilRig、QUADAGENTを使用してテクノロジ サービス プロバイダと政府機関を標的に")

### 目次

* 

### 関連記事

## 関連項目 ランサムウェア リソース

![Pictorial representation of Iran cyber attacks. Close-up of a person wearing glasses, with computer code reflected in the lenses.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/03/12_Security-Technology_Category_1920x900-786x368.jpg)  
[![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/07/top-threats.svg)主なサイバー脅威](https://unit42.paloaltonetworks.com/ja/category/top-cyberthreats-ja/) 2026年4月17日 [#### 脅威情報: 2026年イランに関するサイバー リスクの激化(4月17日更新)](https://unit42.paloaltonetworks.com/ja/iranian-cyberattacks-2026/)

* [APK](https://unit42.paloaltonetworks.com/ja/tag/apk-ja/ "APK")

* [DDoS attacks](https://unit42.paloaltonetworks.com/ja/tag/ddos-attacks-ja/ "DDoS attacks")

* [GenAI](https://unit42.paloaltonetworks.com/ja/tag/genai-ja/ "GenAI")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/iranian-cyberattacks-2026/ "脅威情報: 2026年イランに関するサイバー リスクの激化(4月17日更新)")  
  ![Pictorial representation of RaaS RansomHouse. Digital representation of cybersecurity concept with a padlock superimposed over computer circuit boards, symbolizing data protection and encryption technologies.](https://unit42.paloaltonetworks.com/wp-content/uploads/2025/12/06_Ransomware_Category_1920x900-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/07/threat-actor-groups.svg)脅威アクター グループ](https://unit42.paloaltonetworks.com/ja/category/threat-actor-groups-ja/) 2025年12月17日 [#### 直線的なものからの複雑化:RansomHouse暗号化のアップグレード](https://unit42.paloaltonetworks.com/ja/ransomhouse-encryption-upgrade/)

* [ESXi](https://unit42.paloaltonetworks.com/ja/tag/esxi-ja/ "ESXi")

* [Jolly Scorpius](https://unit42.paloaltonetworks.com/ja/tag/jolly-scorpius-ja/ "Jolly Scorpius")

* [RansomHouse](https://unit42.paloaltonetworks.com/ja/tag/ransomhouse-ja/ "RansomHouse")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/ransomhouse-encryption-upgrade/ "直線的なものからの複雑化:RansomHouse暗号化のアップグレード")  
  ![Pictorial representation of 01flip ransomware written in Rust. Digital artwork of a pixelated U.S. dollar bill disintegrating into small blocks against a blue data matrix background.](https://unit42.paloaltonetworks.com/wp-content/uploads/2025/12/05_Ransomware_Category_1920x900-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)脅威リサーチ](https://unit42.paloaltonetworks.com/ja/category/threat-research-ja/) 2025年12月10日 [#### 01flip:Rustで書かれたマルチプラットフォーム ランサムウェア](https://unit42.paloaltonetworks.com/ja/new-ransomware-01flip-written-in-rust/)

* [Bitcoin](https://unit42.paloaltonetworks.com/ja/tag/bitcoin-ja/ "Bitcoin")

* [CL-CRI-103](https://unit42.paloaltonetworks.com/ja/tag/cl-cri-103-ja/ "CL-CRI-103")

* [Cryptocurrency](https://unit42.paloaltonetworks.com/ja/tag/cryptocurrency-ja/ "Cryptocurrency")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/new-ransomware-01flip-written-in-rust/ "01flip:Rustで書かれたマルチプラットフォーム ランサムウェア")  
  ![Pictorial representation of malicious LLMs. Close-up view of a digital wall displaying various glowing icons, representing a high-tech network interface.](https://unit42.paloaltonetworks.com/wp-content/uploads/2025/11/AdobeStock_1270203474-786x440.jpeg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)脅威リサーチ](https://unit42.paloaltonetworks.com/ja/category/threat-research-ja/) 2025年11月25日 [#### AIのデュアルユースのジレンマ：悪意あるLLM](https://unit42.paloaltonetworks.com/ja/dilemma-of-ai-malicious-llm/)

* [Credential Harvesting](https://unit42.paloaltonetworks.com/ja/tag/credential-harvesting-ja/ "Credential Harvesting")

* [Data exfiltration](https://unit42.paloaltonetworks.com/ja/tag/data-exfiltration-ja/ "data exfiltration")

* [LLM](https://unit42.paloaltonetworks.com/ja/tag/llm-ja/ "LLM")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/dilemma-of-ai-malicious-llm/ "AIのデュアルユースのジレンマ：悪意あるLLM")  
  ![Pictorial representation of Unit 42 threat attribution system. Illustration featuring a white triangle centered within an abstract cosmic background of purple and blue swirls and stars.](https://unit42.paloaltonetworks.com/wp-content/uploads/2025/07/Generic-A-1920x900-1-786x368.png)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/07/threat-actor-groups.svg)脅威アクター グループ](https://unit42.paloaltonetworks.com/ja/category/threat-actor-groups-ja/) 2025年7月31日 [#### Unit 42のアトリビューション フレームワークの紹介](https://unit42.paloaltonetworks.com/ja/unit-42-attribution-framework/)

* [Advanced Persistent Threat](https://unit42.paloaltonetworks.com/ja/tag/advanced-persistent-threat-ja/ "Advanced Persistent Threat")

* [Bookworm](https://unit42.paloaltonetworks.com/ja/tag/bookworm-ja/ "Bookworm")

* [Nomenclature](https://unit42.paloaltonetworks.com/ja/tag/nomenclature-ja/ "nomenclature")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/unit-42-attribution-framework/ "Unit 42のアトリビューション フレームワークの紹介")  
  ![Pictorial representation of the ransomware landscape. Digital artwork of a disintegrating U.S. dollar bill with pixelated effects on a cyber-inspired background.](https://unit42.paloaltonetworks.com/wp-content/uploads/2025/04/05_Ransomware_Category_1920x900-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-report-white-1.svg)トレンド レポート](https://unit42.paloaltonetworks.com/ja/category/trend-reports-ja/) 2025年5月22日 [#### 恐喝とランサムウェアの動向 2025年1月～3月](https://unit42.paloaltonetworks.com/ja/2025-ransomware-extortion-trends/)

* [AI](https://unit42.paloaltonetworks.com/ja/tag/ai-ja/ "AI")

* [Akira ransomware](https://unit42.paloaltonetworks.com/ja/tag/akira-ransomware-ja/ "Akira ransomware")

* [BianLian](https://unit42.paloaltonetworks.com/ja/tag/bianlian-ja/ "BianLian")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/2025-ransomware-extortion-trends/ "恐喝とランサムウェアの動向 2025年1月～3月")  
  ![](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/03_Ransomware_Category_1505x922-718x440.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)脅威リサーチ](https://unit42.paloaltonetworks.com/ja/category/threat-research-ja/) 2024年8月9日 [#### ランサムウェア振り返り: 2024 年上半期](https://unit42.paloaltonetworks.com/ja/unit-42-ransomware-leak-site-data-analysis/)

* [Healthcare](https://unit42.paloaltonetworks.com/ja/tag/healthcare-ja/ "Healthcare")

* [LockBit](https://unit42.paloaltonetworks.com/ja/tag/lockbit-ja/ "LockBit")

* [RansomHub](https://unit42.paloaltonetworks.com/ja/tag/ransomhub-ja/ "RansomHub")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/unit-42-ransomware-leak-site-data-analysis/ "ランサムウェア振り返り: 2024 年上半期")  
  ![Constellation image representing the constellation schema used by Palo Alto Networks Unit 42 to track nation-state and](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/Generic-B-1920x900-1-786x368.png)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/07/threat-actor-groups.svg)脅威アクター グループ](https://unit42.paloaltonetworks.com/ja/category/threat-actor-groups-ja/) 2024年8月4日 [#### パロアルトネットワークス Unit 42 が追跡している脅威アクター グループの一覧](https://unit42.paloaltonetworks.com/ja/threat-actor-groups-tracked-by-palo-alto-networks-unit-42/)

* [Agent Serpens](https://unit42.paloaltonetworks.com/ja/tag/agent-serpens-ja/ "Agent Serpens")

* [Agonizing Serpens](https://unit42.paloaltonetworks.com/ja/tag/agonizing-serpens-ja/ "Agonizing Serpens")

* [Alloy Taurus](https://unit42.paloaltonetworks.com/ja/tag/alloy-taurus-ja/ "Alloy Taurus")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/threat-actor-groups-tracked-by-palo-alto-networks-unit-42/ "パロアルトネットワークス Unit 42 が追跡している脅威アクター グループの一覧")  
  ![A pictorial representation of RA World ransomware group. A digital graphic of a U.S. dollar bill disintegrating into pixels, symbolizing digital transformation or the concept of cryptocurrency against a backdrop of a dark, tech-inspired visual theme.](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/07/05_Ransomware_Category_1505x922-718x440.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)脅威リサーチ](https://unit42.paloaltonetworks.com/ja/category/threat-research-ja/) 2024年7月22日 [#### RA Group から RA World へ: ランサムウェア グループの進化](https://unit42.paloaltonetworks.com/ja/ra-world-ransomware-group-updates-tool-set/)

* [Extortion](https://unit42.paloaltonetworks.com/ja/tag/extortion-ja/ "Extortion")

* [Leak site](https://unit42.paloaltonetworks.com/ja/tag/leak-site-ja/ "Leak site")

* [Babuk](https://unit42.paloaltonetworks.com/ja/tag/babuk-ja/ "babuk")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/ra-world-ransomware-group-updates-tool-set/ "RA Group から RA World へ: ランサムウェア グループの進化")  
  ![](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/02/02_Ransomware_Category_1505x922-718x440.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)脅威リサーチ](https://unit42.paloaltonetworks.com/ja/category/threat-research-ja/) 2024年2月6日 [#### 2024 年 ランサムウェア振り返り: Unit 42 によるリーク サイト分析](https://unit42.paloaltonetworks.com/ja/unit-42-ransomware-leak-site-data-analysis-all-2023/)

* [Ambitious Scorpius](https://unit42.paloaltonetworks.com/ja/tag/ambitious-scorpius-ja/ "Ambitious Scorpius")

* [Ignoble Scorpius](https://unit42.paloaltonetworks.com/ja/tag/ignoble-scorpius-ja/ "Ignoble Scorpius")

* [Leak site](https://unit42.paloaltonetworks.com/ja/tag/leak-site-ja/ "Leak site")  
  [今すぐ読む ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ja/unit-42-ransomware-leak-site-data-analysis-all-2023/ "2024 年 ランサムウェア振り返り: Unit 42 によるリーク サイト分析")

* ![Slider arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/slider-arrow-left.svg)

* ![Slider arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/slider-arrow-left.svg)  
  ![Close button](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/close-modal.svg) ![Enlarged Image]()  
  ![Newsletter](https://unit42.paloaltonetworks.com/wp-content/uploads/2025/04/Unit-42_get-updates-banner.png)  
  ![UNIT 42 Small Logo](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/palo-alto-logo-small.svg) Unit 42 からの最新情報を取得

## 進化する脅威の状況を常に先取り

メール アドレス

本フォームを送信することにより、[利用規約](https://www.paloaltonetworks.jp/legal-notices/terms-of-use)に同意し、[プライバシー ポリシー](https://www.paloaltonetworks.jp/legal-notices/privacy)を承認したことになります。

本サイトは reCAPTCHA で保護されており、Googleの[プライバシー ポリシー](https://policies.google.com/privacy) と[サービス利用規約](https://policies.google.com/terms)が適用されます。

Invalid captcha!
サブスクライブ ![Right Arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/right-arrow.svg) ![loader](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-loader.svg)  
{#footer} 製品とサービス

* [AI利用ネットワーク セキュリティ プラットフォーム](https://www.paloaltonetworks.jp/network-security)

* [AIのセキュア バイ デザイン](https://www.paloaltonetworks.jp/precision-ai-security/secure-ai-by-design)

* [Prisma AIRS](https://www.paloaltonetworks.jp/prisma/prisma-ai-runtime-security)

* [AI Access Security](https://www.paloaltonetworks.jp/sase/ai-access-security)

* [クラウド提供型セキュリティ サービス](https://www.paloaltonetworks.jp/network-security/security-subscriptions)

* [Advanced Threat Prevention](https://www.paloaltonetworks.jp/network-security/advanced-threat-prevention)

* [Advanced URL Filtering](https://www.paloaltonetworks.jp/network-security/advanced-url-filtering)

* [Advanced WildFire](https://www.paloaltonetworks.jp/network-security/advanced-wildfire)

* [Advanced DNS Security](https://www.paloaltonetworks.jp/network-security/advanced-dns-security)

* [Enterprise Data Loss Prevention](https://www.paloaltonetworks.jp/sase/enterprise-data-loss-prevention)

* [Enterprise IoT Security](https://www.paloaltonetworks.jp/content/pan/ja_JP/network-security/enterprise-iot-security)

* [Medical IoT Security](https://www.paloaltonetworks.jp/network-security/medical-device-security)

* [Industrial OT Security](https://www.paloaltonetworks.jp/content/pan/ja_JP/network-security/industrial-ot-security)

* [SaaS Security](https://www.paloaltonetworks.jp/sase/saas-security)

* [次世代ファイアウォール](https://www.paloaltonetworks.jp/network-security/next-generation-firewall)

* [ハードウェア ファイアウォール](https://www.paloaltonetworks.jp/network-security/hardware-firewall-innovations)

* [ソフトウェア ファイアウォール](https://www.paloaltonetworks.jp/network-security/software-firewalls)

* [Strata Cloud Manager](https://www.paloaltonetworks.jp/network-security/strata-cloud-manager)

* [SD-WAN for NGFW](https://www.paloaltonetworks.jp/network-security/sd-wan-subscription)

* [PAN-OS](https://www.paloaltonetworks.jp/network-security/pan-os)

* [Panorama](https://www.paloaltonetworks.jp/network-security/panorama)

* [セキュア アクセス サービス エッジ](https://www.paloaltonetworks.jp/sase)

* [Prisma SASE](https://www.paloaltonetworks.jp/sase)

* [App Acceleration](https://www.paloaltonetworks.jp/sase/app-acceleration)

* [自律型デジタルエクスペリエンス管理](https://www.paloaltonetworks.jp/sase/adem)

* [Enterprise DLP](https://www.paloaltonetworks.jp/sase/enterprise-data-loss-prevention)

* [Prisma Access](https://www.paloaltonetworks.jp/sase/access)

* [Prisma Browser](https://www.paloaltonetworks.jp/sase/prisma-browser)

* [Prisma SD-WAN](https://www.paloaltonetworks.jp/sase/sd-wan)

* [リモート ブラウザ分離](https://www.paloaltonetworks.jp/sase/remote-browser-isolation)

* [SaaS Security](https://www.paloaltonetworks.jp/sase/saas-security)

* [AI駆動型セキュリティ運用プラットフォーム](https://www.paloaltonetworks.jp/cortex)

* [Cloud Security](https://www.paloaltonetworks.jp/cortex/cloud)

* [Cortex Cloud](https://www.paloaltonetworks.jp/cortex/cloud)

* [Application Security](https://www.paloaltonetworks.jp/cortex/cloud/application-security)

* [Cloud Posture Security](https://www.paloaltonetworks.jp/cortex/cloud/cloud-posture-security)

* [Cloud Runtime Security](https://www.paloaltonetworks.jp/cortex/cloud/runtime-security)

* [Prisma Cloud](https://www.paloaltonetworks.jp/prisma/cloud)

* [AI駆動型SOC](https://www.paloaltonetworks.jp/cortex)

* [Cortex XSIAM](https://www.paloaltonetworks.jp/cortex/cortex-xsiam)

* [Cortex XDR](https://www.paloaltonetworks.jp/cortex/cortex-xdr)

* [Cortex XSOAR](https://www.paloaltonetworks.jp/cortex/cortex-xsoar)

* [Cortex Xpanse](https://www.paloaltonetworks.jp/cortex/cortex-xpanse)

* [Unit 42マネージド ディテクション\&レスポンス](https://www.paloaltonetworks.jp/cortex/managed-detection-and-response)

* [マネージドXSIAM](https://www.paloaltonetworks.jp/cortex/managed-xsiam)

* [次世代のアイデンティティ セキュリティ](https://www.paloaltonetworks.jp/idira)

* [特権アクセス管理](https://www.paloaltonetworks.jp/idira/human/privileged-access-management)

* [アイデンティティ管理とアクセス管理](https://www.paloaltonetworks.jp/idira/human/identity-and-access-management)

* [Endpoint Privilege Manager](https://www.paloaltonetworks.jp/idira/human/endpoint-privilege-manager)

* [アイデンティティ ガバナンス](https://www.paloaltonetworks.jp/idira/human/identity-governance)

* [従業員パスワード管理](https://www.paloaltonetworks.jp/idira/human/workforce-password-management)

* [エージェンティック アイデンティティ](https://www.paloaltonetworks.jp/idira/agentic)

* [シークレット管理](https://www.paloaltonetworks.jp/idira/machine/secrets-management)

* [統合型シークレット ガバナンス](https://www.paloaltonetworks.jp/idira/machine/unified-secrets-governance)

* [アプリケーションの認証情報配信](https://www.paloaltonetworks.jp/idira/machine/application-credentials-delivery)

* [ベンダーの特権アクセス](https://www.paloaltonetworks.jp/idira/human/vendor-privileged-access)

* [脅威インテリジェンス\&インシデント レスポンス サービス](https://www.paloaltonetworks.jp/unit42)

* [予防評価](https://www.paloaltonetworks.jp/unit42/assess)

* [インシデント レスポンス](https://www.paloaltonetworks.jp/unit42/respond)

* [セキュリティ戦略を変革](https://www.paloaltonetworks.jp/unit42/transform)

* [脅威インテリジェンスについて](https://www.paloaltonetworks.jp/unit42/threat-intelligence-partners)  
  会社名

* [パロアルトネットワークスについて](https://www.paloaltonetworks.jp/about-us)

* [採用情報](https://jobs.paloaltonetworks.com/en/)

* [お問合せ](https://www.paloaltonetworks.jp/company/contact-sales)

* [企業責任](https://www.paloaltonetworks.com/about-us/corporate-responsibility)

* [お客様向け](https://www.paloaltonetworks.jp/customers)

* [IR](https://investors.paloaltonetworks.com/)

* [拠点](https://www.paloaltonetworks.com/about-us/locations)

* [ニュースルーム](https://www.paloaltonetworks.jp/company/newsroom)  
  人気のあるリンク

* [ブログ](https://www.paloaltonetworks.com/blog/?lang=ja)

* [コミュニティ](https://www.paloaltonetworks.com/communities)

* [コンテンツライブラリ](https://www.paloaltonetworks.jp/resources)

* [Cyberpedia](https://www.paloaltonetworks.jp/cyberpedia)

* [イベントセンター](https://events.paloaltonetworks.com/)

* [電子メール設定の管理](https://start.paloaltonetworks.com/preference-center)

* [製品A〜Z](https://www.paloaltonetworks.jp/products/products-a-z)

* [製品認証](https://www.paloaltonetworks.com/legal-notices/trust-center/compliance)

* [脆弱性の報告](https://www.paloaltonetworks.com/security-disclosure)

* [サイトマップ](https://www.paloaltonetworks.jp/sitemap)

* [テクニカル ドキュメント](https://docs.paloaltonetworks.com/)

* [Unit 42](https://unit42.paloaltonetworks.jp/)

* [個人情報の販売および共有禁止](https://panwedd.exterro.net/portal/dsar.htm?target=panwedd)
  ![Palo Alto Networks Logo](https://www.paloaltonetworks.jp/etc/clientlibs/clean/imgs/pan-logo-dark.svg)

* [プライバシー](https://www.paloaltonetworks.jp/legal-notices/privacy)

* [トラスト センター](https://www.paloaltonetworks.jp/legal-notices/trust-center)

* [利用規約](https://www.paloaltonetworks.jp/legal-notices/terms-of-use)

* [ドキュメント](https://www.paloaltonetworks.jp/legal-notices)

Copyright © 2026 Palo Alto Networks. All Rights Reserved

* [![](https://www.paloaltonetworks.jp/etc/clientlibs/clean/imgs/social/youtube-black.svg)](https://www.youtube.com/user/paloaltonetworks)
* [![](https://www.paloaltonetworks.jp/etc/clientlibs/clean/imgs/social/twitter-x-black.svg)](https://twitter.com/PaloAltoNtwks)
* [![](https://www.paloaltonetworks.jp/etc/clientlibs/clean/imgs/social/facebook-black.svg)](https://www.facebook.com/PaloAltoNetworks/)
* [![](https://www.paloaltonetworks.jp/etc/clientlibs/clean/imgs/social/linkedin-black.svg)](https://www.linkedin.com/company/palo-alto-networks)
* [![](https://www.paloaltonetworks.jp/content/dam/pan/en_US/images/icons/podcast.svg)](https://unit42.paloaltonetworks.com/unit-42-threat-vector-podcast/)
* JP  
  Select your language  
  ![Play](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-play-icon.svg) ![Pause](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-pause-icon1.svg) ![Minimize](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-minimize.svg) ![Close button](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/close-modal.svg)

### Default Heading

Read the article ![Right Arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/right-arrow.svg)  
Seekbar

![Play](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-play-icon.svg) ![Pause](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-pause-icon1.svg)  
![Volume](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-volume.svg)  
Volume
![Minimize](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-minimize.svg)
