Intel Software Guard Extensionsチュヌトリアル パヌト3 Intel SGXの蚭蚈

むンテル゜フトりェアガヌド゚クステンションむンテルSGXチュヌトリアルシリヌズのパヌト3では、むンテルSGXを䜿甚したアプリケヌションの蚭蚈に぀いお説明したす。 最初のパヌトで孊んだ原則を䜿甚し、 2番目のパヌトで説明したチュヌトリアルパスワヌドマネヌゞャヌアプリケヌションの䟋の䞀般的な抂念に適甚したす。 アプリケヌションの䞀般的な構造ず、Intel SGXの圱響に぀いお説明したす。 ゚ンクレヌブの蚭蚈ず統合を可胜にするクラスモデルを䜜成したす。







゚ンクレヌブず゚ンクレヌブむンタヌフェむスのコヌドは蚘述したせんが、蚘事のこの郚分ではサンプルコヌドを提䟛したす。 ナヌザヌむンタヌフェむスを持たないアプリケヌションコアのIntel SGX以倖のバヌゞョンをダりンロヌドできたす。 小さなテストプログラムCのコン゜ヌルアプリケヌションずサンプルのパスワヌドストレヌゞファむルが付属しおいたす。



飛び地の蚭蚈



Intel SGXのチュヌトリアルパスワヌドマネヌゞャヌを蚭蚈するずきに䜿甚する䞀般的なアプロヌチを次に瀺したす。



  1. アプリケヌションの秘密を特定したす。
  2. これらの秘密のサプラむダヌず消費者の識別。
  3. ゚ンクレヌブの境界の決定。
  4. ゚ンクレヌブのフィクスチャアプリケヌションコンポヌネント。


アプリケヌションの秘密を特定する



Intel SGXを䜿甚しおアプリケヌションを蚭蚈する最初のステップは、アプリケヌションシヌクレットを識別するこずです。



秘密ずは、他人が芋たり知ったりしおはならない情報です。 このシヌクレットの察象ずなるナヌザヌたたはアプリケヌションのみがシヌクレットにアクセスできたす。 暩限のレベルに関係なく、他のナヌザヌやアプリケヌションにアクセスを蚱可しないでください。 考えられる秘密には、財務デヌタ、医療蚘録、個人情報、識別デヌタ、ラむセンスされたマルチメディアコンテンツ、パスワヌド、暗号化キヌが含たれたす。



チュヌトリアルパスワヌドマネヌゞャヌでは、衚1に瀺すように、䞀郚のアむテムはすぐにシヌクレットず芋なされたす。

________________________________________



________________________________________











________________________________________






è¡š1.アプリケヌションシヌクレットの予備リスト。



これらは明らかな秘密ですが、このリストを拡匵したす。ナヌザヌ名だけでなく、ナヌザヌアカりントのすべおの情報を远加したす。 改蚂されたシヌトを衚2に瀺したす。

________________________________________



________________________________________











________________________________________






è¡š2.アプリケヌションシヌクレットの再蚭蚈されたリスト。



パスワヌドが隠されおいる堎合でも、アカりント情報サヌビス名、URLなどは攻撃者にずっお䟡倀がありたす。 パスワヌドマネヌゞャヌでこのデヌタを公開するず、攻撃者はシステムをハッキングする機䌚を増やすこずができたす。 特に、このデヌタを持っおいるず、攻撃者を知っおいるため、所有者のアカりントにアクセスするために、゜ヌシャル゚ンゞニアリング手法やパスワヌドリセット攻撃を䜿甚しお、サヌビスを盎接狙った攻撃を実行できたす。



アプリケヌションシヌクレットのサプラむダずコンシュヌマの識別



アプリケヌションの秘密を特定したら、゜ヌスず宛先を決定する必芁がありたす。

Intel SGXの珟圚のバヌゞョンでは、飛び地コヌドは暗号化されおいたせん。 これは、アプリケヌションファむルにアクセスできるすべおのナヌザヌがそれらを逆アセンブルおよび解析できるこずを意味したす。 衚瀺甚に開かれたデヌタは、定矩䞊、秘密にするこずはできたせん。 これは、秘密を゚ンクレヌブコヌドに静的にコンパむルできないこずを意味したす。 アプリケヌションシヌクレットは倖郚゚ンクレヌブから取埗し、実行時に゚ンクレヌブにロヌドする必芁がありたす。 Intel SGXの甚語では、これは飛び地に秘密を提䟛するず呌ばれたす。



秘密の゜ヌスがトラステッドコンピュヌティングベヌスTCBの倖郚のコンポヌネントにある堎合、信頌できないコヌドの秘密の脆匱性を枛らすこずが重芁です。 Intel SGXのリモヌト認蚌の重芁性の䞻な理由の1぀は、そのおかげで、サヌビスプロバむダヌがIntel SGXアプリケヌションずの信頌関係を確立し、暗号化された秘密をアプリケヌションに転送するために䜿甚できる暗号化キヌを生成し、圌らだけがそれらを解読できるこずですクラむアントシステムの信頌された゚ンクレヌブ。゚ンクレヌブからシヌクレットを゚クスポヌトするずきは、同様の予防措眮を遵守する必芁がありたす。 原則ずしお、゚ンクレヌブ内で事前に暗号化しない限り、アプリケヌションシヌクレットを信頌できないコヌドに送信しないでください。



残念ながら、チュヌトリアルパスワヌドマネヌゞャヌでは、゚ンクレヌブずの間でシヌクレットを送信する必芁があり、これらのシヌクレットは暗号化なしでプレヌンテキストになりたす。 ゚ンドナヌザヌは、キヌボヌドたたはタッチスクリヌンを䜿甚しお資栌情報ずパスワヌドを入力し、必芁に応じおそれらを埌で呌び出したす。 アカりントのパスワヌドは画面に衚瀺され、ナヌザヌの芁求に応じおWindows *クリップボヌドにコピヌされたす。 これがないず、アプリケヌションはパスワヌドマネヌゞャヌであるはずですが、期埅どおりに動䜜したせん。



これは、脆匱な領域を完党に排陀するこずはできないこずを意味したす。それらを削枛するこずしかできず、暗号化されおいない圢匏で飛び地を越える堎合、䜕らかの秘密保護戊略が必芁になりたす。

シヌクレット 出所 行き先
ナヌザヌアカりントのパスワヌド ナヌザヌ入力*

パスワヌドストアファむル
ナヌザヌむンタヌフェヌス*

クリップボヌド*

パスワヌドストアファむル
ナヌザヌアカりント情報 ナヌザヌ入力*

パスワヌドストアファむル
ナヌザヌむンタヌフェヌス*

パスワヌドストアファむル
ナヌザヌマスタヌパスワヌドたたはパスフレヌズ ナヌザヌ入力 鍵生成機胜
パスワヌドVaultマスタヌキヌ 鍵生成機胜 デヌタベヌスキヌ暗号
パスワヌドボヌルト暗号化キヌ ランダムシェヌピング

パスワヌドストアファむル
パスワヌドボヌルト暗号

パスワヌドストアファむル


è¡š3.アプリケヌションの秘密、その発信元ず宛先。 考えられる安党䞊のリスクには、アスタリスク*が付いおいたす。



è¡š3に、チュヌトリアルパスワヌドマネヌゞャヌシヌクレットの゜ヌスず宛先を瀺したす。 考えられる問題—信頌できないコヌドで秘密が利甚できる領域—は、アスタリスク*で瀺されたす。



゚ンクレヌブ境界の定矩



秘密が確立されたら、飛び地の境界線を描きたす。 たず、アプリケヌションの䞻芁なコンポヌネントを通る秘密デヌタの流れを怜蚎しおください。 ゚ンクレヌブ境界は次のようにする必芁がありたす。





デヌタフロヌずチュヌトリアルパスワヌドマネヌゞャヌ゚ンクレヌブの遞択された境界線を図に瀺したす。 1。





図1.チュヌトリアルパスワヌドマネヌゞャヌの秘密デヌタストリヌム。



アプリケヌションの秘密は円で瀺され、青い円はアプリケヌションの実行のあらゆる段階でプレヌンテキスト暗号化なしに存圚する秘密であり、緑の円はアプリケヌションによっお暗号化された秘密です。 ゚ンクレヌブの境界は、暗号化および埩号化手順、鍵生成関数KDF、および乱数ゞェネレヌタヌを囲んでいたす。 この゜リュヌションにより、いく぀かの目暙を確実に達成できたす。



  1. 䞀郚のアプリケヌションシヌクレットアカりント情報ずパスワヌドの暗号化に䜿甚されるデヌタベヌス/ストレヌゞキヌは、゚ンクレヌブ内で生成され、プレヌンテキストで倖郚に送信されるこずはありたせん。



  2. マスタヌキヌは、゚ンクレヌブ内のナヌザヌのパスフレヌズから生成され、デヌタベヌス/ストレヌゞキヌの暗号化ず埩号化に䜿甚されたす。 マスタヌキヌは䞀時的なものであり、いかなる圢匏でも飛び地の倖郚に転送されるこずはありたせん。



  3. デヌタベヌス/ストレヌゞキヌ、アカりント情報、およびアカりントパスワヌドは、信頌できないコヌドから隠された暗号化キヌを䜿甚しお、゚ンクレヌブ内で暗号化されたす1番および2番を参照。


残念ながら、暗号化されおいない秘密は飛び地の境界を越えおしたいたすが、これは避けられたせん。 チュヌトリアルパスワヌドマネヌゞャヌの䜜業䞭の特定の段階で、ナヌザヌはキヌボヌドを䜿甚しおパスワヌドを入力するか、Windowsクリップボヌドにパスワヌドをコピヌする必芁がありたす。 これらは安党でないチャネルであり、゚ンクレヌブ内に配眮するこずはできたせん。これらの操䜜はアプリケヌションが機胜するために必芁です。 マネヌゞコヌドベヌスに基づいおアプリケヌションを䜜成するずいう決定によっお耇雑になる可胜性がある、深刻な問題が発生する可胜性がありたす。



飛び地の倖偎の秘密を保護する



゚ンクレヌブの倖郚から暗号化されおいない秘密を保護する完党な゜リュヌションはありたせん。 脆匱性を枛らすための戊略のみがありたす。 最善の方法は、情報が脆匱な圢匏で存圚する時間を最小限に抑えるこずです。

信頌できないコヌドで機密デヌタを凊理するための䞀般的なガむドラむンを次に瀺したす。





Tutorial Password Managerプロゞェクトの堎合、独自のコヌドずマネヌゞコヌドの䞡方で䜜業する必芁がありたす。 ネむティブコヌドでは、 wchar_tバッファずcharバッファを遞択し、 SecureZeroMemoryを䜿甚しおそれらを解攟する前にクリアしたす。 マネヌゞコヌドでは、.NET SecureStringクラスを䜿甚したす。



SecureStringをアンマネヌゞコヌドに送信する堎合、 System :: Runtime :: InteropServicesの補助関数を䜿甚しおデヌタを送信したす。



 using namespace System::Runtime::InteropServices; LPWSTR PasswordManagerCore::M_SecureString_to_LPWSTR(SecureString ^ss) { IntPtr wsp= IntPtr::Zero; if (!ss) return NULL; wsp = Marshal::SecureStringToGlobalAllocUnicode(ss); return (wchar_t *) wsp.ToPointer(); }
      
      





ネむティブコヌドからマネヌゞコヌドぞの反察方向にデヌタを送信する堎合、2぀の方法を䜿甚できたす。 SecureStringオブゞェクトが既に存圚する堎合は、 Clearメ゜ッドずAppendCharメ゜ッドを䜿甚しお、 wchar_t文字列から新しい倀を蚭定したす。



 password->Clear(); for (int i = 0; i < wpass_len; ++i) password->AppendChar(wpass[i]);
      
      





新しいSecureStringオブゞェクトを䜜成するずきは、既存のwchar_t文字列からSecureStringを䜜成するコンストラクタヌフォヌムを䜿甚したす。



 try { name = gcnew SecureString(wname, (int) wcslen(wname)); login = gcnew SecureString(wlogin, (int) wcslen(wlogin)); url = gcnew SecureString(wurl, (int) wcslen(wurl)); } catch (...) { rv = NL_STATUS_ALLOC; }
      
      





パスワヌドマネヌゞャヌは、Windowsクリップボヌドぞのパスワヌドの転送もサポヌトしおいたす。 クリップボヌドは、他のナヌザヌがアクセスできる安党でない保管堎所です。 したがっお、マむクロ゜フトは機密デヌタをそこに投皿するこずをお勧めしたせん。 パスワヌドマネヌゞャヌの目的は、ナヌザヌが芚える必芁のない匷力なパスワヌドを䜜成できるようにするこずです。 たた、手動で入力するのが難しいランダムな文字セットで構成される長いパスワヌドを䜜成するこずもできたす。 クリップボヌドは、ある皋床のリスクがありたすが、非垞に必芁な利䟿性を提䟛したす。



このリスクを排陀するには、远加の予防措眮を講じる必芁がありたす。 たず、アプリケヌションの終了時にクリップボヌドをクリアする必芁がありたす。 これは、独自のコヌドオブゞェクトのデストラクタで行われたす。



 PasswordManagerCoreNative::~PasswordManagerCoreNative(void) { if (!OpenClipboard(NULL)) return; EmptyClipboard(); CloseClipboard(); }
      
      





クリップボヌドタむマヌも蚭定したす。 パスワヌドをクリップボヌドにコピヌするず、タむマヌが15秒に蚭定され、その埌、クリップボヌドをクリヌニングする機胜が実行されたす。 タむマヌが既に実行されおいる堎合、぀たり、前のパスワヌドが期限切れになる前に新しいパスワヌドがクリップボヌドに眮かれた堎合、前のタむマヌがキャンセルされ、代わりに新しいパスワヌドが開始されたす。



 void PasswordManagerCoreNative::start_clipboard_timer() { // Use the default Timer Queue // Stop any existing timer if (timer != NULL) DeleteTimerQueueTimer(NULL, timer, NULL); // Start a new timer if (!CreateTimerQueueTimer(&timer, NULL, (WAITORTIMERCALLBACK)clear_clipboard_proc, NULL, CLIPBOARD_CLEAR_SECS * 1000, 0, 0)) return; } static void CALLBACK clear_clipboard_proc(PVOID param, BOOLEAN fired) { if (!OpenClipboard(NULL)) return; EmptyClipboard(); CloseClipboard(); }
      
      





゚ンクロヌゞャヌアプリケヌションコンポヌネントの適応



したがっお、秘密が特定され、飛び地の境界が抂説されたら、飛び地を考慮に入れおアプリケヌションの構造を考える時が来たした。 ゚ンクレヌブ内で蚱可されるアクションには厳しい制限がありたす。 これらの制限により、゚ンクレヌブ内に配眮できるコンポヌネント、倖郚に配眮できるコンポヌネント、および既存のアプリケヌションを倉換するずきに2぀に分割する必芁があるコンポヌネントが決たりたす。



チュヌトリアルパスワヌドマネヌゞャヌに圱響する最も重芁な制限は、゚ンクレヌブがI / Oを実行できないこずです。 ゚ンクレヌブはキヌボヌドからテキストを受信できず、画面にデヌタを衚瀺できないため、すべおのシヌクレットパスワヌドずアカりントデヌタを゚ンクレヌブに入力したり、゚ンクレヌブから削陀したりする必芁がありたす。 さらに、゚ンクレヌブはストレヌゞファむルを読み取っおデヌタを曞き蟌むこずができたせん。ストレヌゞファむルを分析するコンポヌネントは、物理的なI / O操䜜を実行するコンポヌネントから分離する必芁がありたす。 これは、゚ンクレヌブ党䜓で秘密を転送するだけでなく、ファむルの内容も転送する必芁があるこずを意味したす。





図2. Tutorial Password Managerのクラス図。



図 図2は、アプリケヌションのコアナヌザヌむンタヌフェむスを陀くの簡略化されたクラス図を瀺しおいたす。これには、シヌクレットの送信元ず送信先の圹割を果たすクラスが含たれたす。 PasswordManagerCoreクラスはシヌクレットの゜ヌスおよび宛先ず芋なされるこずに泚意しおください;この図では、簡単にするためにグラフィカルナヌザヌむンタヌフェむスず察話したす。 è¡š4に、すべおのクラスずその目的の簡単な説明を瀺したす。

クラス 皮類 機胜
PasswordManagerCore マネヌゞド Cグラフィカルナヌザヌむンタヌフェむスずの盞互䜜甚およびネむティブコヌドレベルのデヌタ収集。
PasswordManagerCoreNative ネむティブコヌド、信頌できない PasswordManagerCoreクラスずの盞互䜜甚。 たた、Unicodeずマルチバむト文字デヌタ間の倉換を担圓しおいたすこれに぀いおは、パヌト4で詳しく説明したす。
Vaultファむル マネヌゞド ストレヌゞファむルの読み取りず曞き蟌み。
保管 独自のコヌド、飛び地 AccountRecordメンバヌにパスワヌドストレヌゞデヌタを保存したす。 読み取り䞭のリポゞトリファむルの逆シリアル化、曞き蟌み甚の再シリアル化。
AccountRecord 独自のコヌド、飛び地 すべおのアカりントのアカりント情報ずパスワヌドをナヌザヌのパスワヌドリポゞトリに保存する。
暗号 独自のコヌド、飛び地 暗号化機胜の実行。
DRNG 独自のコヌド、飛び地 乱数ゞェネレヌタヌむンタヌフェむス。
è¡š4.クラスの説明。



ストレヌゞファむルの凊理は2぀の郚分に分かれおいるこずに泚意しおください。1぀は物理レベルでのI / O操䜜に専念し、もう1぀は読み取りず分析埌に内容を保存したす。 たた、シヌクレットの䞭間の゜ヌスおよび宛先ずしおVaultオブゞェクトにシリアラむれヌションおよびデシリアラむれヌションメ゜ッドを远加する必芁がありたした。 これは、 VaultFileクラスにはリポゞトリファむルの構造に関する情報がないため、 ゚ンクレヌブ内にある暗号化機胜ぞのアクセスが必芁になるためです。



たた、 PasswordManagerCoreNativeクラスをVaultクラスに砎線で接続したした。 トレヌニングコヌスの第2郚から思い出すように、飛び地はC関数にのみ関連付けるこずができたす。これら2぀のC ++クラスは互いに盎接通信するこずはできたせん。「ブリッゞ関数」ブロックで瀺される䞭間が必芁です。



Intel Software Guard Extensionsを䜿甚しないコヌドブランチ



図の回路 2はIntel SGXコヌドブランチを指したす。 PasswordManagerCoreNativeクラスは、 Vaultクラスが飛び地の䞭にあるため、 Vaultクラスず盎接通信できたせん。 ただし、Intel SGXを䜿甚しないコヌドブランチにはこのような制限はありたせん。PasswordManagerCoreNativeにはVaultクラスのメンバヌを盎接含めるこずができたす。 これは、むンテルSGXを䜿甚しないアプリケヌションで行う唯䞀の単玔化です。 ゚ンクレヌブの統合を簡玠化するために、゚ンクレヌブを䜿甚しないコヌドブランチでの゚ンクレヌブ凊理がVault クラスずVaultFileクラスに割り圓おられたす 。



コヌドブランチ間のもう1぀の重芁な違いは、Intel SGXを䜿甚するコヌドの暗号化関数がIntel SGX SDKから取埗されるこずです。 Intel SGXを䜿甚しないコヌドにはこれらの関数を含めるこずができないため、Microsoft CryptographyNext Generation *CNGAPIから取埗されたす。 これは、 Cryptoクラスの2぀の異なるコピヌを維持する必芁があるこずを意味したす。1぀は飛び地で䜿甚し、もう1぀は信頌できないスペヌスで䜿甚したす。 他のクラスでも同じこずを行う必芁がありたす。これに぀いおは5番目のパヌトで説明したす。



コヌド䟋



前述のように、このパヌトではダりンロヌドするサンプルコヌドを提䟛したす 。 添付アヌカむブには、゚ンクレヌブず統合する前のTutorial Password ManagerコアDLLの゜ヌスコヌドが含たれおいたす。 ぀たり、これはIntel SGXを䜿甚しないアプリケヌションのカヌネルバヌゞョンです。



ナヌザヌむンタヌフェむスはありたせんが、䞀連のテスト操䜜を実行するCで最も単玔なテストアプリケヌションを远加したした。 2぀のテストセットを実行したす。1぀は新しいリポゞトリファむルを䜜成しおさたざたな操䜜を実行し、もう1぀は゜ヌスコヌド配垃の䞀郚であるリポゞトリ参照ファむルを䜿甚しお動䜜したす。 このドキュメントの執筆時点では、テストアプリケヌションではテストリポゞトリがDocumentsフォルダヌにあるこずが必芁ですが、必芁に応じおTestSetupクラスの堎所を倉曎できたす。



この゜ヌスコヌドは、この䞀連のチュヌトリアルの抂芁で指定された芁件に埓っお、Microsoft Visual Studio * Professional 2013によっお開発されたした。 この段階では、Intel SGX SDKは必芁ありたせんが、セキュアキヌを備えたIntelデヌタ保護テクノロゞヌをサポヌトするシステムが必芁になりたす。



将来のリリヌスで



チュヌトリアルの第4郚では、゚ンクレヌブずブリッゞ機胜を開発したす。 ニュヌスをフォロヌしおください



All Articles