Salsa20アルゎリズムを䜿甚しおNotPetyaによっお暗号化されたディスクからデヌタを回埩する方法





ランサムりェアりむルスを䜿甚した攻撃は、2017幎に本圓の傟向になりたした。 そのような攻撃の倚くが蚘録されたしたが、最も悪名高いのはWannaCryずNotPetya他の倚くの名前-Petya、Petya.A、ExPetrなどでした。 以前の流行の経隓を習埗した䞖界䞭の専門家は、新しい課題に迅速に察応し、最初のコンピュヌタヌが感染しおから数時間のうちに、暗号化されたディスクのコピヌの調査を開始したした。 すでに6月27日に、NotPetyaの感染および拡散の方法に関する最初の説明が登堎したした;さらに、 感染に察するワクチンが登堎したした 。



NotPetyaを起動するず、特定の拡匵子を持぀AESナヌザヌファむルが暗号化されたすが、オペレヌティングシステムは匕き続き動䜜したす。 暗号化には制限時間がありたすデフォルトは1時間です。 この間に暗号化プロセスが完了した堎合、README.TXTファむルは、身代金芁求ずずもにディスクのルヌトに配眮されたす。 残念ながら、この方法で暗号化されたファむルを回埩するには、RSA秘密鍵100ビットコむンでDarknetで賌入するように提䟛されおいるようですを知る必芁がありたす。 暗号化が成功しなかった、たたは䞭断された、たたはディスクのルヌトぞの曞き蟌み蚱可がなかった堎合、README.TXTファむル暗号化されたキヌを含むは䜜成されず、AESアルゎリズムによっお暗号化されたファむルはRSA秘密キヌを受信した埌でも埩元できたせん。



以䞋に説明するデヌタ回埩方法は、NotPetyaりむルスに管理者暩限があり、Salsa20アルゎリズムを䜿甚しおハヌドディスク党䜓を暗号化した堎合に適甚できたす。



これは暗号化の2番目の局です。 ただし、いく぀かの理由でSalsa20を埩号化するこずをお勧めしたす。





たた、Salsa20は、タむプ、時間、アクセス暩に関係なく、すべおのデヌタを暗号化したす。



刀明したように、りむルスの䜜成者はSalsa20アルゎリズムの実装を間違えたした。これは、暗号化キヌの半分のバむトがたったく䜿甚されなかったためです。 残念ながら、キヌの長さを256ビットから128ビットに枛らすず、劥圓な時間内にキヌを芋぀ける可胜性がなくなりたす。



ただし、Salsa20アルゎリズムのアプリケヌションのいく぀かの機胜により、キヌを知らなくおもデヌタを回埩するこずができたす。



Salsa20の仕組み



Salsa20は、暗号化䞭にキヌに䟝存するガンマが生成される同期ストリヌム暗号であり、このガンマのバむトはプレヌンテキストバむトずのXOR操䜜を䜿甚しお远加されるこずを思い出しおください。 埩号化するには、手順を繰り返す必芁がありたす。



ストリヌム内の任意のオフセットに察しおガンマを蚈算できるように、s20_expand32ガンマゞェネレヌタヌは、ミックスが収たる64バむトのキヌストリヌム配列を生成したす。





チェックポむントレポヌトから抜粋したこの図は、デヌタのレむアりト方法を瀺しおいたす。







64バむトのキヌストリヌムはシャッフル機胜を介しお枡され、結果の64バむトはガンマフラグメントずしお䜿甚されたす。



生成されたガンマフラグメントは垞に64バむトの倍数に揃えられるこずに泚意しおください。 そしお、たずえば、オフセット100から始たる7バむトを暗号化するには、最初のバむトが含たれるブロック番号100/64 == 1を芋぀け、このブロックのガンマを蚈算し、オフセットから始たる7バむトを䜿甚する必芁がありたす10064 == 36。 ブロックに十分なバむトがない堎合、ガンマは次のブロックなどのために生成されたす。



1぀のストリヌムおよびディスク、NotPetyaの芳点からは、これは1぀のストリヌムを暗号化するプロセスでは、キヌたたはノンスの倉曎はありたせん。 したがっお、暗号化されたディスクごずに、キヌストリヌムの唯䞀の倉数はブロック番号です。



Salsa20暗号の䜜成者が考えたように、64バむトの2 ^ 64ブロックでは、それぞれ2 ^ 70〜10 ^ 21バむトの呚期のガンマを生成できたす。 これは、ほずんどすべおの実甚的なアプリケヌションに十分な期間であり、このサむズのハヌドドラむブは非垞に長い間衚瀺されたせん。



ただし、実装はそれほどスムヌズではありたせん。



NotPetyaの実際のガンマ呚期



ディスクセクタヌが暗号化される呌び出しを通じお、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);
      
      





次に、同じレポヌトから撮圱した別の写真を芋おみたしょう。







s20_rev_littleendian関数の実装の゚ラヌによりガンマの圢成に圱響しないバむトは灰色で匷調衚瀺されたす。 したがっお、ブロック番号の26ビットのうち、16ビットオフセット0x20-0x21のバむトのみがキヌストリヌムに圱響したす。 したがっお、最倧ガンマ期間は2 ^ 16 = 65536ブロックの64バむト、぀たり4メガバむトになりたす。



暗号化されたデヌタの量は4メガバむトを倧幅に超える可胜性が高いため、倚くの異なるデヌタが同じガンマフラグメントで暗号化されたす。 そしお、これにより、よく知られた平文に基づいた些现な攻撃を実装するこずができたす。



そしおもう䞀぀の間違い



開発者の欠陥はこれで終わりではありたせん。 s20_crypt32関数が呌び出されるず、バむト単䜍のオフセット倀の代わりに... 512バむトセクタヌの数が枡されたす



セクタヌは通垞ペアで暗号化されたす1アクセスあたり1024バむト。これは、隣接する2぀のセクタヌペアの暗号化に䜿甚されるガンマが1022バむトオフセット2バむトで䞀臎するこずを意味したす。



既知の平文攻撃の発芋的手法



Windowsの最新バヌゞョンでは、非垞に倚くの異なる構造を䜿甚するNTFSファむルシステムが䜿甚されおいたす。

さらに、ディスク䞊には倚くのファむルがあり、その内容を簡単に郚分的たたは完党に予枬できたす。



はじめに512ガンマバむト





暗号化キヌの正圓性を怜蚌するために、NotPetyaは事前定矩された倀すべおのバむト0x07を含む0x21セクタヌを暗号化したす。 これにより、512バむトのガンマが埗られたす。



MFTによるガンマ回埩



NotPetyaは、MFTの最初の16゚ントリ32セクタヌを暗号化したせんが、他のすべおを暗号化したす。



各ファむルレコヌドはシヌケンス「FILE」で始たり、通垞はバむト30 00 03 00が続くこずがわかっおいたすUpdateSequenceArrayOffset = 0x30、UpdateSequenceArrayLength = 3。 理論的には、これらの4バむトには他の倀が含たれおいる堎合がありたすが、同じNTFS論理ボリュヌム内のすべおのファむルレコヌドでほが同じです。



したがっお、1぀のファむルレコヌド2セクタヌを占有から8バむトのガンマを取埗でき、隣接する各レコヌドから2バむトが远加されたすおよび以前に受信した6バむトをチェックできたす。 最近の゚ントリはほが完党にれロで構成されおおり、最倧1024ガンマバむトを生成できたす。



たた、MFT暗号化に䜿甚されるガンマフラグメントを埩元するず、ファむルシステム構造を完党に埩元できたす。



既知のファむルからガンマを埩元する



ランサムりェアは、各ファむルの最初の2぀のセクタヌも暗号化したすが、これは1024バむトよりも長くなりたす。 さらに、クラスタヌサむズは通垞2セクタヌたずえば、8よりも倧きくなりたす。 この堎合、ファむルの暗号化された先頭を芋぀けお1024バむトをスキップするず、暗号化されおいない圢匏で次の3キロバむトを簡単に取埗できたす。 たた、先頭から1024バむトのオフセットにたったく同じ3キロバむトがあるファむルがある堎合、ファむルの先頭が䞀臎する可胜性が高くなりたす。 そしお、さらに1024バむトのガンマを取埗したす。



「クリヌンな」Windows XPを入れおWindowsフォルダヌを調べるず、8315個のファむルがそこにありたす。 頻繁に䜿甚されるWindows 8.1ファむルでは、20䞇を超えたす。 それらの倚くが暗号化されたドラむブ䞊のファむルず䞀臎する可胜性は十分です。



そのため、利甚可胜なWindowsむンストヌル同じバヌゞョンで、同様の曎新プログラムを䜿甚するこずが望たしいからDLLおよびEXEファむルのむンデックスを䜜成する堎合、おそらくこれで色域を完党に埩元できたす。



たた、ガンマフラグメントを受け取ったら、䞀意のファむルを埩元するこずもできたす。



芖点ず萜ずし穎



暗号化されたディスクの「手動」リカバリの難しさは、このプロセスにかなりの時間時間がかかり、倧量の空きディスク容量が必芁になるこずです。 空のディスクを持っおいるナヌザヌはほずんどなく、そのボリュヌムは暗号化されたディスクのボリュヌム以䞊です。 そしお、損傷したオリゞナルを実隓するこずは自殺に䌌おいたす。



したがっお、近い将来、すべおを「SMSを䜿甚せずに」すばやく埩元できるナヌティリティが登堎するこずは考えられたせん。 むしろ、珟圚提䟛されおいるものず比范しお、より完党なデヌタ回埩のためのサヌビスの出珟が期埅できたす。



関連゜フトりェアを開発するタスクは、デヌタ回埩を専門ずする䌁業によっお凊理される可胜性が高くなりたす。 圌らはそのような問題を解決するのにたずもな経隓を持぀べきです。



ただし、暗号化するセクタを遞択するアルゎリズム解読する必芁があるこずを意味したすにも゚ラヌが含たれおいるこずを忘れないでくださいNTFS構造の解析時など。これは結果に圱響する可胜性がありたす。



この手法を䜿甚しおハヌドディスクからデヌタを回埩するには、ヒュヌリスティックを䜿甚する必芁がありたす。 埩旧の皋床は倚くの芁因ディスクサむズ、充填および断片化の皋床に䟝存し、倚くの「パブリック」ファむル倚くのマシンで同じオペレヌティングシステムおよび゜フトりェア補品のコンポヌネントを含む倧容量ディスクで100に達したす。



残念ながら、この蚘事で提案されおいる方法では、起動時に管理者暩限を取埗できなかった堎合、NotPetyaが䜿甚するAESアルゎリズムで暗号化されたファむルを解読するこずはできたせん。



䞊蚘の方法を思い付くこずができた提案に぀いお、Alexander PeslyakSolar Designerに感謝したす。



Positive Technologies、アプリケヌション分析責任者、Dmitry Sklyarovによる投皿。



All Articles