Intel®Tamper Protection ToolkitでScrypt Encryption Utilityを保護

この蚘事では、 むンテルタンパヌプロテクションツヌルキットが、 Scrypt暗号化ナヌティリティの重芁なコヌドず貎重なデヌタを、静的/動的リバヌス゚ンゞニアリングず倉曎から保護する方法を瀺したす。 Scryptは、実際に広く䜿甚されおいる最新か぀最も安党なパスワヌドキヌ生成機胜です。 ただし、 scrypt関数のパラメヌタヌが改ざんされるリスクがあり、ナヌザヌパスワヌドの脆匱性が発生したす。 ツヌルキットは、これらの脅嚁を枛らすのに圹立ちたす。 問題のアプリケヌションの脅嚁モデルを定矩し、 改ざん防止ツヌルをアプリケヌションに適甚する现目を考慮しお、さらに保護するためにリファクタリングする方法を説明したす。

この蚘事の䞻な目暙は、実際のアプリケヌションで芋぀かった重芁なコヌドセクションや貎重なデヌタに察する攻撃から保護するためのIntel Tamper Protection Toolkitの機胜を実蚌するこずです。 ツヌルキットを䜿甚するず、難読化によっお静的および動的なリバヌス゚ンゞニアリングに察抗し、実行時に敎合性を監芖するこずにより、保護されたアプリケヌションに倉曎が加えられないようにするこずができたす。



ここでは、ツヌルキットの難読化に䜿甚されるiprotず呌ばれるコンポヌネントを1぀だけ芋お、それをScrypt暗号化ナヌティリティバヌゞョン1.1.6に適甚したす。 このナヌティリティは、入力されたパスワヌドに基づいた単玔な暗号化キヌ生成機胜です。 圌女を支持する遞択はいく぀かの理由でなされたした。 たず、その機胜のコヌドには、アプリケヌションでよく䜿甚される機胜ファむルの読み取りおよび曞き蟌み操䜜、メモリ割り圓お、暗号化機胜、システムコヌルが含たれおいたす。 第二に、特定の数孊的装眮が含たれおいたす。 第䞉に、ナヌティリティは非垞にコンパクトですが、開発者が自分のアプリケヌションを保護するプロセスで実際に遭遇する可胜性のあるさたざたな問題を瀺すこずができたす。 最埌に、 scryptは最新の安党なキヌ生成機胜であり、実際に積極的に䜿甚されおいたす。たずえば、新しいscryptベヌスのディスク暗号化はAndroid 4.4に組み蟌たれおいたす。



コヌドの難読化



以䞋のリストに瀺されおいる機埮な関数の゜ヌスコヌドの䟋を怜蚎し、動的ラむブラリをコンパむルしたす。



#define MODIFIER (0xF00D) int __declspec(dllexport) sensitive(const int value) { int result = 0; int i; for (i = 0; i < value; i++) { result += MODIFIER; } return result; }
      
      





機密機胜の゜ヌスコヌド



IDA Proを䜿甚しお、結果のラむブラリをリバヌス゚ンゞニアリングしたす。 この図は、ロゞックず蚈算甚デヌタを䜿甚したコヌド実行の順序を瀺しおいたす。 したがっお、ハッカヌはコヌド内のMODIFIERの倀を簡単に確認しお倉曎できたす。





逆アセンブルされたコヌドの実行順序



さたざたなコヌド難読化技術は、実装の詳现を隠し、リバヌス゚ンゞニアリングを耇雑にし、コヌドの倉曎を防ぐのに圹立ちたす。 コヌドの難読化は、コヌドを同じ機胜に倉換しながら、リバヌス゚ンゞニアリングを行っおプログラムのロゞックずデヌタを理解するこずが困難なコヌドにコヌドを倉換するプロセスです。 難読化は、コヌド内の機密デヌタの盗難、その倉曎を回避し、開発者の知的財産を保護するために䜿甚されたす。



Intelタンパヌプロテクションツヌルキット



Intel Tamper Protection Toolkitは、コヌドを難読化し、Microsoft Windows *およびAndroid *で実行可胜ファむルの実行時にアプリケヌションの敎合性を怜蚌するために䜿甚される補品です。 Tamper Protection Toolkitを䜿甚しお、アプリケヌションの貎重なコヌドずデヌタを静的および動的なリバヌス゚ンゞニアリングず倉曎から保護できたす。 このツヌルで保護された実行可胜ファむルには、特別なブヌトロヌダヌや远加の゜フトりェアは䞍芁で、Intelプロセッサヌで実行できたす。

Intel Tamper Protection Toolkit Betaは、 ここからダりンロヌドできたす 。

この蚘事では、コヌドの重芁なセクションを難読化し、起こりうる攻撃から暗号化ナヌティリティを保護するために、次のIntel Tamper Protection Toolkitコンポヌネントを䜿甚したす。



難読化ツヌルは、動的ラむブラリ.dllず゚クスポヌト関数のリストを受け取りたす。 出力は、難読化された゚クスポヌト機胜を備えた動的ラむブラリです。 アドレスから開始しお、入力に送信された動的ラむブラリのコヌドが解析され、特別な内郚衚珟に倉換されたす。 ブランチ、トランゞション、およびチャレンゞも、達成可胜な堎合は、分解および倉換されたす。 コヌドを難読化するために、考慮すべき制限がいく぀かありたす。 コヌドは、メモリ、倖郚の到達䞍胜な関数呌び出し、間接遷移、グロヌバル倉数を䜿甚しお䜎レベルの䜜業を行うこずはできたせん。

この蚘事では、コヌドを難読化するためにコヌドに倉曎を加える際に発生する萜ずし穎ず、発生した問題を克服する方法に぀いお説明したす。

iprotを䜿甚しお、前のセクションで説明した動的ラむブラリを難読化したす 。

 iprot sensitive.dll sensitive -o sensitive_obf.dll
      
      





IDA Proを䜿甚しお難読化されたコヌドをリバヌス゚ンゞニアリングしおみたしょう。



 sensitive PROC NEAR jmp ?_001 ?_001: push ebp push eax call ?_002 ?_002 LABEL NEAR pop eax lea eax, [eax+0FECH] mov dword ptr [eax], 608469404 mov dword ptr [eax+4H], 2308 mov dword ptr [eax+8H], -443981824 mov dword ptr [eax+0CH], 1633409 mov dword ptr [eax+10H], -477560832 mov dword ptr [eax+14H], 15484359 mov dword ptr [eax+18H], -1929379840 mov dword ptr [eax+1CH], -1048448 <
.>
      
      





逆アセンブルされた難読化コヌド



難読化されたコヌドが元のコヌドずどのように異なるかは簡単にわかりたす。 IDA Proは、難読化されたコヌドの実行順序のスキヌムを衚瀺できず、 MODIFIER倀が消えたした。 たた、難読化されたコヌドは静的および動的な倉曎から保護されたす。



パスワヌドキヌ生成機胜



パスワヌドキヌ生成関数英語PBKDF は、ナヌザヌが入力したパスワヌドを暗号アルゎリズムで䜿甚できるキヌバむナリデヌタセットに倉換するために䜿甚されたす。 PBKDFは、アプリケヌションセキュリティの非垞に重芁なコンポヌネントです。ナヌザヌが入力したパスワヌドは、゚ントロピヌが䞍十分であるため、暗号化アルゎリズムで安党に䜿甚できないためです。 これらの機胜は、アプリケヌションを保護するために広く䜿甚されおいたす。たずえば、ディスク䞊のデヌタを暗号化/埩号化するために、PGPシステムのパスワヌドから暗号化キヌが取埗されたす。 たた、オペレヌティングシステムはこれらの機胜を䜿甚しお、ナヌザヌパスワヌド認蚌を怜蚌したす。



䞀般に、PBKDFの数匏は次のずおりです。

y = F  P 、 S 、 d 、 t 1 、...、 t n 

ここで、 yは関数によっお生成されたキヌ、 Pはパスワヌド、 Sは゜ルト、 dは生成されたキヌの長さ、 t 1 、...、 t nは、プロセッサクロック速床、関数の蚈算に必芁なRAMの量などのハヌドりェアリ゜ヌスの量によっお決定されるパラメヌタヌです。 S saltは、指定されたパスワヌドで異なるキヌを䜜成するために䜿甚されたす。 パラメヌタヌt 1 、...、 t nは、関数の蚈算に消費されるハヌドりェアリ゜ヌスを決定する圹割を果たし、蚈算を耇雑にし、ハヌドりェアレベルで䞊列化を䜿甚するブルヌトフォヌス攻撃に察する保護を远加するように構成できたす。埓来のGPU。





PBKDF䜿甚スキヌム



ナヌザヌパスワヌドを回埩するには、次の2぀の方法がありたす。

  1. 攻撃者は、リヌクの結果ずしお取埗した生成されたキヌを䜿甚しおパスワヌドを回埩したす。
  2. 攻撃者は、キヌによっお生成された暗号化たたは眲名されたデヌタを䜿甚しおパスワヌドを回埩したす。


前者の堎合、 Intel Tamper Protection Toolkitは、生成するために実行されるコヌドを非衚瀺にしお、生成されたキヌを䜿甚するこずにより、キヌの挏掩を防ぎたす。

Intel Tamper Protection Toolkitの2番目のケヌスは防止できたせんが、攻撃者がキヌの生成に䜿甚されるパラメヌタヌを安党でないものに倉曎しなかったこずを確認するのに圹立ちたす。

以䞋は、実際に䜿甚されるパスワヌド生成キヌ生成関数の䟋です。



Colin Percivalが開発した最も珟代的で安党な機胜はscryptです。 次の数匏がありたす。



y = F  P 、 S 、 d 、 N 、 r 、 p 、



ここで、 yは関数によっお生成されたキヌ、 dは生成されたキヌの長さ、 Pはナヌザヌパスワヌド、 Sは゜ルト、 p 、 r 、およびNはキヌを生成するために必芁なプロセッサ時間ずRAMの量を蚭定するためのパラメヌタヌです。 パラメヌタN 、 r 、 p 、 dの倀は開くこずができ、通垞はキヌたたは暗号化されたデヌタずずもに保存されたす。



パラメヌタヌN 、 r 、 pの倀に応じお、同じキヌの生成には、異なる量のプロセッサヌ時間ずメモリヌサむズが必芁になる堎合がありたす。 たずえば、パラメヌタヌが〜100 msおよび〜20 MBを芁求する堎合、 scrypt関数に察する通垞のGPUに察するブルヌトフォヌス攻撃は、少量のRAMを必芁ずし、GPU䞊の異なるパスワヌドの䞊列蚈算を可胜にするPBKDF2ほど効果的ではありたせん。



暗号化暗号化ナヌティリティ



Scrypt暗号化ナヌティリティは、CTRモヌドのAESアルゎリズムず、入力ファむルを操䜜するためのナヌザヌパスワヌド甚のscrypt関数によっお生成されたキヌを䜿甚したす。 実行するために必芁なパラメヌタヌず远加のパラメヌタヌが含たれおいたす。

必須は次のずおりです。



远加オプション



たずえば、コマンドでナヌティリティを実行する



scrypt enc infile -t 0.1 -M 20971520



キヌを生成するには、100msのプロセッサ時間ず20MBのRAMが必芁です。 このようなパラメヌタヌ倀は、ブルヌトフォヌス攻撃の䞊列化を耇雑にしたす。

以䞋の図は、ナヌザヌが暗号化のための入力ファむルの名前、パスワヌド、および必芁なハヌドりェアリ゜ヌスを決定するパラメヌタヌを入力した堎合のScryptナヌティリティの操䜜を衚しおいたす。

暗号化䞭にナヌティリティによっお実行される手順を説明したす。

  1. Scryptパラメヌタヌを収集しお倉換したす。 プログラムは、プロセッサヌ時間のパラメヌタヌずキヌの生成に必芁なRAMの量を遞択し、それらをscrypt関数が認識するパラメヌタヌに倉換したす。
  2. 暗号化キヌの生成。 scrypt関数は、ナヌザヌパスワヌドず前の手順で蚈算されたパラメヌタヌN 、 r 、 pを䜿甚しお64バむトのキヌを生成したす。 dk 1キヌの䞋䜍32バむトは、パラメヌタヌN 、 r 、 p 、 ゜ルト 、および暗号化されたデヌタの認蚌コヌドを蚈算するために䜿甚されたす。 したがっお、埩号化のプロセスでは、入力したパスワヌドの正確性ず暗号化されたデヌタの敎合性を確認できたす。 dk 2キヌの䞊䜍32バむトは、CTRモヌドでAESアルゎリズムを䜿甚しお入力ファむルを暗号化するために䜿甚されたす。
  3. 暗号化パラメヌタの認蚌コヌドの蚈算。 このステップで、キヌの生成に䜿甚されるパラメヌタヌN 、 r 、 pおよびsaltの認蚌認蚌コヌドが蚈算されたす。
  4. CTRモヌドの32バむトAESブロックを䜿甚したOpenSSL暗号化。 CTRモヌドで32バむトのAES暗号を䜿甚しお、 dk 2で入力メッセヌゞを暗号化したす。
  5. 暗号化されたデヌタの認蚌コヌドの蚈算。 最埌に、 dk 1を䜿甚しお敎合性を確保するために、認蚌コヌドが蚈算されおデヌタが暗号化されたす。 出力ファむルには、暗号化されたデヌタ、パラメヌタヌN 、 r 、 p 、暗号化䞭に䜿甚される゜ルト 、および暗号化されたデヌタずパラメヌタヌの敎合性を保蚌する認蚌コヌドが含たれたす。






暗号化暗号化スキヌム



考えられる脅嚁



暗号化モヌドでナヌティリティの動䜜を分析し、脅嚁モデルを決定したす。 パラメヌタN 、 r 、 p 、 saltの倀、および䞭間ステップで取埗された生成キヌは重芁なデヌタであり、リアルタむムの倉曎に察する保護が必芁です。 たずえば、デバッグモヌドでは、攻撃者はブルヌトフォヌス攻撃に察する生成されたキヌの抵抗を匱めるために、パラメヌタN 、 r 、 pの他の倀を蚭定できたす。



次の図は、ナヌザヌが暗号化されたテキストN 、 r 、 p 、 salt 、 認蚌コヌド 、およびパスワヌドを含む入力ファむルの名前を入力したずきの埩号化プロセスを瀺しおいたす 。

埩号化䞭にナヌティリティによっお実行される手順を説明したす。

  1. 暗号化蚭定パラメヌタヌ。 埩号化の入力ファむルには、暗号化されたデヌタ、認蚌コヌドhmac 1 、 hmac 2 、および暗号化䞭に䜿甚されるパラメヌタヌN 、 r 、 p 、 saltが含たれたす。 このステップで、これらのパラメヌタヌは入力ファむルから差し匕かれ、鍵生成機胜に転送されたす。
  2. 暗号化キヌの生成。 scrypt関数は、前の手順で取埗したパスワヌドずパラメヌタヌN 、 r 、 p 、 saltのキヌを生成したす。 このキヌの䞋䜍32バむトず䞊䜍32バむトは、それぞれ図dk 1ずdk 2に瀺されおいたす。
  3. Scryptパラメヌタずパスワヌドの敎合性をチェックしたす。 N 、 r 、 p 、 salt、およびpasswordの敎合性は、認蚌コヌドを䜿甚しお怜蚌されたす。 パスワヌドが正しいこずを確認するために、ナヌティリティはdk 1を䜿甚しおパラメヌタヌN 、 r 、 p 、 saltの認蚌コヌドを蚈算し、受信した倀ず倀hmac 1を比范したす。 䞀臎する堎合、パスワヌドは正しいです。
  4. 暗号化されたデヌタの敎合性を確認したす。 暗号化されたデヌタが倉曎されおいないこずを確認するために、デヌタの認蚌コヌドがdk 1を䜿甚しお蚈算され、 hmac 2の倀ず比范されたす。 䞀臎する堎合、デヌタは砎損しおいないため、次の手順で埩号化できたす。
  5. CTRモヌドのAESアルゎリズムによるOpenSSL 32バむトブロック埩号化。 最埌に、デヌタはdk 2を䜿甚しおCTRモヌドで32バむトのAESブロックアルゎリズムを䜿甚しお埩号化されたす。 出力ファむルには、埩号化されたデヌタが含たれおいたす。






暗号解読スキヌム



Windowsでのナヌティリティの移怍



この䜜業の目的は、 タンパヌプロテクションツヌルキットを䜿甚しお、Windows甚のScrypt暗号化ナヌティリティを保護するこずです。 ナヌティリティの初期バヌゞョンはLinux甚に䜜成されおいるため、最初のタスクはWindowsに移怍するこずです。

プラットフォヌム固有のコヌドは、次の条件付きディレクティブの間に配眮されたす。



 #if defined(WIN_TP) //    Windows #else //    Linux #endif // defined(WIN_TP)
      
      







WIN_TPプリプロセッサディレクティブは、Windows固有のコヌドを分離したす。 WindowsでのアセンブリにはWIN_TPを定矩する必芁がありたす。そうしないず、Linuxコヌドがアセンブリに遞択されたす。

Microsoft * Visual Studio 2013開発環境を䜿甚しお、ナヌティリティをビルドおよびデバッグしたす。 プロセス、スレッド、メモリおよびファむル管理、サヌビスむンフラストラクチャ、ナヌザヌむンタヌフェむスなど、Windows OSずLinux OSの䞀郚のオブゞェクトには違いがありたす。 ナヌティリティを移怍するずきには、これらすべおの違いを考慮する必芁がありたした。 それらに぀いお以䞋に説明したす。





Intel Tamper Protection Toolkitによるナヌティリティ保護



次に、ナヌティリティコヌドをリファクタリングしお、脅嚁モデルで定矩されたすべおの重芁なデヌタを保護したす。 このようなデヌタの保護は、 iprotツヌルを䜿甚しおコヌドを難読化するこずにより実珟されたす。これにより、セットからコンパむラヌが難読化されたす。 たた、合理性の原則に埓い、重芁なデヌタを䜜成、凊理、䜿甚する機胜のみを難読化したす。

難読化ツヌルがダむナミックラむブラリを入力ずしお受け取り、コマンドラむンで指定された保護された関数のみを含むバむナリファむルを生成するこずは既にわかっおいたす。 そのため、重芁なデヌタを操䜜するすべおの関数を動的ラむブラリ内に配眮しお、さらに難読化するようにしたす。 コマンドラむン匕数の解析、パスワヌドの読み取りなどの残りの機胜は、メむンの実行可胜ファむルに保護されないたたにしたす。



保護されたナヌティリティの新しい構造を次の図に瀺したす。 このナヌティリティは、メむンの実行可胜ファむルず、難読化されるダむナミックラむブラリの2぀の郚分に分かれおいたす。 メむンの実行可胜ファむルは、コマンドラむン匕数の解析、パスワヌドの読み取り、および入力ファむルのメモリぞのロヌドを行いたす。 , scryptenc_file , scryptdec_file , ( N , r , p , ).



, , Scrypt HMAC scrypt : N , r , p . HMAC , scrypt_ctx_enc_init , scrypt_ctx_dec_init , scryptenc_file scryptdec_file , . , . scrypt_ctx_enc_init scrypt_ctx_dec_init scrypt : , .





Scrypt



, : .

:

  1. getopt() . .
  2. / .
  3. scrypt_ctx_enc_init scrypt ( N , r , p ), maxmem , maxmemfrac maxtime , . HMAC ( -) , , scrypt . , , scrypt .
  4. , .
  5. scrypt_ctx_enc_init . scrypt , HMAC. , scrypt HMAC. , . , -, , .
  6. scryptenc_file , . scrypt ( N , r , p ), . , scrypt . . , scrypt . , , .


:

  1. getopt() .
  2. / .
  3. scrypt_ctx_dec_init , . , , scrypt .
  4. , .
  5. scrypt_ctx_dec_init . , .
  6. scryptdec_file , . scrypt ( N , r , p ), . , scrypt . , .


OpenSSL AES CTR Intel Tamper Protection Toolkit crypto library . OpenSSL , crypto library iprot . AES scryptenc_file scryptdec_file / . ( scrypt_ctx_enc_init , scrypt_ctx_dec_init , scryptenc_file scryptdec_file ) scrypt . iprot .



Tamper Protection . iprot . , : scrypt , HMAC HMAC . HMAC - . , , scrypt , , scryptenc_file scryptdec_file . iprot , .



scrypt_ctx_enc_init scrypt . buf_p scrypt_ctx_enc_init . ( null ), , . scrypt , HMAC scrypt . .



  //  :       scrypt if (buf_p == NULL) { //   scrypt    // <...> //  HMAC itp_res = itpHMACSHA256Message((unsigned char *)ctx_p, sizeof(scrypt_ctx)-sizeof(ctx_p->hmac), hmac_key, sizeof(hmac_key), ctx_p->hmac, sizeof(ctx_p->hmac)); *buf_size_p = (r << 7) * (p + (uint32_t)N) + (r << 8) + 253; }
      
      







buf_p , scrypt_ctx_enc_init . HMAC, , , . , buf_p , HMAC . , , .



 //  :    scrypt  if (buf_p != NULL) { //  HMAC itp_res = itpHMACSHA256Message( (unsigned char *)ctx_p, sizeof(scrypt_ctx)-sizeof(ctx_p->hmac), hmac_key, sizeof(hmac_key), hmac_value, sizeof(hmac_value)); if (memcmp(hmac_value, ctx_p->hmac, sizeof(hmac_value)) != 0) { return -1; } //      scrypt: // ctx_p->addrs.B0 = 
 //  HMAC itp_res = itpHMACSHA256Message( (unsigned char *)ctx_p, sizeof(scrypt_ctx)-sizeof(ctx_p->hmac), hmac_key, sizeof(hmac_key), ctx_p->hmac, sizeof(ctx_p->hmac)); }
      
      







, , : (. indirect jump ) . C , -, . - memcmp , iprot . -, memcmp , memset , memmove , . , .



, , double , . , , pickparams salsa20/8 double 32768. , .



  double opslimit; #if defined(WIN_TP) // unsigned char d_32768[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x40}; unsigned char d_32768[sizeof(double)]; d_32768[0] = 0x00; d_32768[1] = 0x00; d_32768[2] = 0x00; d_32768[3] = 0x00; d_32768[4] = 0x00; d_32768[5] = 0x00; d_32768[6] = 0xE0; d_32768[7] = 0x40; double *var_32768_p = (double *) d_32768; #endif /*     salsa20/8. */ #if defined(WIN_TP) if (opslimit < *var_32768_p) opslimit = *var_32768_p; #else if (opslimit < 32768) opslimit = 32768; #endif
      
      







16- , double , double . , double2hex 16- double .

iprot , :

 iprot scrypt-dll.dll scryptenc_file scryptdec_file scrypt_ctx_enc_init scrypt_ctx_dec_init -c 512 -d 2600 -o scrypt_obf.dll
      
      





. . , , .



 #   scrypt_ctx_enc_init PROC NEAR push ebp mov ebp, esp sub esp, 100 mov dword ptr [ebp-4H], 0 mov eax, 1 imul ecx, eax, 0 mov byte ptr [ebp+ecx-1CH], 1 mov edx, 1 shl edx, 0 mov byte ptr [ebp+edx-1CH], 2 mov eax, 1 shl eax, 1 mov byte ptr [ebp+eax-1CH], 3 mov ecx, 1 <
>
      
      





 #       scrypt_ctx_enc_init PROC NEAR mov ebp, esp sub esp, 100 mov dword ptr [ebp-4H], 0 mov eax, 1 imul ecx, eax, 0 mov byte ptr [ebp+ecx-1CH], 1 push eax pop eax lea eax, [eax+3FFFD3H] mov dword ptr [eax], 608469404 mov dword ptr [eax+4H], -124000508 mov dword ptr [eax+8H], -443981569 mov dword ptr [eax+0CH], 1633409 mov dword ptr [eax+10H], -477560832 <
>
      
      





. : . 512- 2600- . . , , . , .

, Intel Tamper Protection Toolkit , Github.



謝蟞



Scrypt .



参照資料



  1. K. Grasman. getopt_port on github
  2. C. Percival. The scrypt encryption utility
  3. C. Percival. “Stronger key derivation via sequential memory-hard functions”.
  4. C. Percival, S. Josefsson (2012-09-17). “The scrypt Password-Based Key Derivation Function”. IETF.
  5. N. Provos, D. Mazieres, J. Talan Sutton 2012 (1999). “A Future-Adaptable Password Scheme”. Proceedings of 1999 USENIX Annual Technical Conference: 81–92.
  6. W. Shawn. Freebsd sources on github


: , ,

{Roman.Kazanstev, Denis.Katerinskiy, Thaddeus.C.Letnes}@intel.com



All Articles