2017年7月31日
株式会社Doctor Web Pacific
ですが悲しいことに、このアプローチを遵守していないユーザーもいるため、ウェブ上にマルウェア作成者へのヒントが示されていることがあります。
NotPetya(別名Petya、Petya.A、ExPetr)の著者がSalsa20ルーチンの実装に間違いを起こしたことが判明しました。その結果、暗号化キーバイトの半分は未使用のままでした。 残念ながら、キーの長さを256バイトから128バイトに減らしても、すぐにクラックする可能性はありません。
ただし、Salsa20の特定の機能によって、実際のキーが分からなくてもデータを復元することができます。
この投稿はとても面白いものですが、この テキストには専門的な用語がたくさん含まれているので、広範囲に引用することはせず、この投稿の内、数点について考えてみることにします。
ここでは、マルウェア作成者が適切なインデックスの長さには不十分と思われるデータ型を使用する方法を検討します。
s20_crypt32()関数プロトタイプを見てみましょう。 この関数は、データを暗号化するために使用されます。
enum s20_status_t s20_crypt32(uint8_t *key,
uint8_t nonce[static 8],
uint32_t si,
uint8_t *buf,
uint32_t buflen)
si引数(明らかにStream Index)は、ストリームバイトオフセットを定義するために使用されます。引数型で判断すると、64ビットではなく32ビットしか許されないことがわかります。この値は64ビットで割り算された後にキーストリームに渡されます。 したがって、26ビット以上は残っていません。
// Set the second-to-highest 4 bytes of n to the block number
s20_rev_littleendian(n+8, si / 64);
ルーチンの実装におけるエラーは、同じパラメータを使用して異なるデータを暗号化できるようにします。
ブロック番号(オフセット0x20〜0x21)の26のうち16ビットのみがキーストリームに影響します。したがって、最大ガンマ期間は2 ^ 16 = 65536ブロック(64バイトまたは4メガバイト)になります。
それは些細な論理エラーです。
s20_crypt32()関数が呼び出されると、バイトオフセットの代わりに512バイトセクタの番号が送信されます。
暗号化パラメータを復元する方法は次のとおりです。
ランサムウェアは、1024バイトを超える各ファイルのデータを含む最初の2つのセクタを暗号化します。原則、クラスタは2つ以上のセクタを占有します(8など)。この場合、暗号化されていないファイルの開始点、1024バイトをスキップし、暗号化されていない後続の3キロバイトを取得できます。また、1024バイトのオフセットで同じ3キロバイトのファイルを保持すると、ファイルの先頭も一致する可能性が非常に高いです。結果、別の1024ガンマバイトを得ることになるでしょう。
残念なことに、ランサムウェアが管理権限を取得し、Salsa20ルーチンを使用してハードドライブ全体を暗号化する場合、使用される暗号化モジュールで間違いが起きました。 マルウェアがパーミッションの取得に失敗した場合は、AES暗号を使用してユーザーデータのみを暗号化します。 また、このルーチンを使用して侵害された情報を復元するには、RSA秘密鍵が必要となります。
#encryption_ransomware #Trojan #Trojan.Encoder
Tell us what you think
To ask Doctor Web’s site administration about a news item, enter @admin at the beginning of your comment. If your question is for the author of one of the comments, put @ before their names.
Other comments