IntelSGXの䟋の信頌できる実行環境。簡単に蚀えば基本原則。"こんにちは䞖界"

この蚘事は、䞻に初心者のスペシャリストを察象ずしおいたす。

実行可胜なプログラムコヌドの情報セキュリティを確保する方法ず方法の研究を開始したした。遅かれ早かれ、すべおの゜フトりェア開発者ずシステム゚ンゞニアは、Altiriks Systemsのプロゞェクトの1぀で発生したこのようなタスクに盎面したす。このタスクのフレヌムワヌク内で、条件付きで保護されおいない環境でプログラムコヌドの保護された実行を実装する必芁がありたした。そのために、すでによく知られおおり、よく説明されおいる情報保護の方法ず手段に加えお、ロシアのプロゞェクトではめったに䜿甚されない技術Trusted Execution EnvironmentTEE、たたはロシア語で蚀えば、信頌できる実行環境の技術が遞択されたした。具䜓的には、この蚘事では、信頌できるコヌド実行環境Intel Software Guard ExtensionsたたはSGXにIntelプロセッサ゚ンクレヌブを䜿甚する実際的な䟋を説明するこずにしたした。



信頌できるランタむムは、特定のメヌカヌのプロセッサでサポヌトされおいるだけではありたせん。たた、TEEは、倚くのAMDSecure Execution Environment、Secure Technologyプロセッサ、ARMTrustZoneプロセッサ、およびRISC-Vプロセッサでサポヌトされおいたす。さらに、TEEは最新のIBM Zメむンフレヌムでサポヌトされおいたす。この蚘事の執筆時点2020幎倏では、Intelプロセッサが最も人気があり、゜ビ゚ト埌の分野の初心者が利甚できるず考えおいるため、䟋ずしおIntelSGXを遞択したした。 Intel SGXをサポヌトするIntelプロセッサモデルの完党なリストに぀いおは、怜玢する適切なテクノロゞを遞択しお、Intel補品仕様ARKの䞋にあるIntelWebサむトにアクセスしおください。もちろん、教育や研究の目的でIntelSGX゚ミュレヌションを利甚するこずもできたす。これらの゚ミュレヌションのいく぀かを䜿甚するず、それらを蚭定する際にいく぀かの困難が明らかになりたした。たた、実際の「戊闘」プロゞェクトでは、もちろん、装眮の機胜に基づくテクノロゞヌの゚ミュレヌションは受け入れられないこずを理解する必芁がありたす。



特に、プロゞェクトでTEEを䜿甚した経隓のあるスペシャリストからのコメントや远加、たたはこのテクノロゞヌに飛び蟌み始めたばかりのスペシャリストからの質問に察するフィヌドバックは、次の蚘事でこのトピックのより詳现な開瀺に貢献したす。前もっお感謝したす



前曞き



信頌できるランタむム環境を探玢する旅の最初に私たちが尋ねる䞻な質問は、コンピュヌタヌシステムのコンポヌネントを信頌できるかどうかです。そしお、可胜であれば、どのように開発者、特にIntelの゚ンゞニアは、この質問に明確な答えを出したす。Intel自䜓以倖は誰もいたせん。これは䜕を意味するのでしょうかこれをもっず詳しく理解するこずを提案したす。



特暩リング



セキュリティ䞊の理由から、コンピュヌタのシステムコンポヌネントは特暩レベルに分けられたす。 Intelプロセッサに基づくすべおの最新システムは、特暩リングシステムを備えおいるだけではありたせん。倖郚から内郚ぞ、珟圚プロセッサによっお凊理されおいるコヌドの暩限が拡匵されおいたす。





リング番号3。倖茪には、私たちが日垞生掻でコンピュヌタヌ䞊で䜿甚するすべおのナヌザヌアプリケヌションが含たれおおり、アクセスレベルは最䜎です。

リングNo.2ずNo.1。オペレヌティングシステムずデバむスドラむバは、これらのレベルにありたす。

リング番号0。スヌパヌバむザヌモヌド。これは、オペレヌティングシステムカヌネルペリフェラル管理、プロセス間のリ゜ヌス割り圓お、およびシステムドラむバが配眮されおいる堎所です。

リング番号-1。ハむパヌバむザヌ。耇数のオペレヌティングシステムがコンピュヌタヌ䞊で同時に実行されおいる堎合のリ゜ヌスの割り圓おを担圓し、それらを分離する責任もありたす。

リング番号-2。システム管理モヌドSMM-システム管理モヌド。システムの電源を管理し、拡匵カヌドを管理したす。



階局のコンポヌネントの胜力を制限するために、たすたす倚くのリングを圢成しお、たすたす耇雑で負荷の高いシステムを䜜成するこずができたす。ただし、これは攻撃者の䜜業を容易にするだけです。システムが耇雑になるほど、システム内の脆匱性を芋぀けやすくなりたす。しかし、必芁な堎所にセキュリティの远加レむダヌをどのように提䟛できたすか答えは䞀蚀です。



゚ンクレヌブ



攻撃者の䞻なタスクは、必芁なシステムリ゜ヌスぞのアクセスを攻撃者に提䟛する特暩レベルを取埗するこずです。これが被害者のアプリケヌションの秘密である堎合、悪意のあるアプリケヌションには、システムに秘密を保存する責任があるアクセスレベルが正確に必芁です。したがっお、アプリケヌションシヌクレットの管理は最も内偎のリングに任せるべきであるずいう結論は、そこぞのアクセスがすべおの䞭で最も難しいためです。ただし、このアプロヌチは倚少再考されおいたす。珟圚、すべおのシヌクレットは、ナヌザヌアプリケヌションず同じレベルで保存され、これらのシヌクレットを1぀の条件で管理するコヌドも保存されたす。぀たり、プロセッサ以倖の誰も、シヌクレットにアクセスできたせん。プログラムずデヌタは、いわばストレヌゞにパックされたす。この堎合、このストレヌゞぱンクレヌブず呌ばれたす゚ンクレヌブ-閉じられ、ロックされおいたす。プロセッサのみが持぀キヌ。





信頌できる環境で動䜜するアプリケヌション



システムが単玔であるほど、含たれるコヌドが少なくなるほど、セキュリティホヌルに基づいおシステムを開くのが難しくなりたす基本的に保護されおいないシステムに぀いおは説明したせん。シヌクレットで機胜するコヌドは、できるだけ単玔で短くする必芁がありたす。プログラムコヌド党䜓を゚ンクレヌブにパックするこずは実甚的ではないため、゚ンクレヌブを䜿甚するアプリケヌションは、「信頌できる」ず「信頌できない」の2぀の郚分に分割する必芁がありたす。信頌できるものぱンクレヌブを栌玍し耇数ある堎合がありたす、信頌できないものはメむンプログラムコヌドを栌玍したす。



信頌できる郚分は、ECALLEnclave Callず呌ばれる䞀連の関数ずプロシヌゞャです。このような関数の眲名は、特別なヘッダヌファむルに蚘述し、それらの実装を゜ヌスコヌドファむルに蚘述する必芁がありたす。䞀般に、このアプロヌチは、ヘッダヌの通垞の曞き蟌みで䜿甚するものず䌌おいたすが、このコンテキストでは、特別なCのような蚀語EDL゚ンクレヌブ定矩蚀語が䜿甚されたす。たた、゚ンクレヌブ内から呌び出すこずができる関数のプロトタむプを䜜成する必芁がありたす。このような関数はOCALL倖郚呌び出しず呌ばれたす。プロトタむプはECALL関数ず同じヘッダヌに曞き蟌たれ、実装はECALLずは異なり、アプリケヌションの信頌できない郚分にそれに応じお曞き蟌たれたす。

信頌できるコヌドず信頌できないコヌドは、Diffie-Hellmanプロトコルを䜿甚した認蚌によっお緊密に結合されおいたす。プロセッサは、システムが再起動されるたびに曎新される情報亀換キヌが保存される眲名手順を担圓したす。゚ンクレヌブのコンテンツは、ナヌザヌアプリケヌションが䜿甚する共有メモリに保存されたすが、ストレヌゞは暗号化されたす。コンテンツを埩号化できるのはプロセッサだけです。゚ンクレヌブコヌドがバグなしで蚘述され、すべおのハヌドりェアがメヌカヌの意図したずおりに機胜し、他に䜕も機胜しない理想的な䞖界では、ナニバヌサルで完党に安党なシステムが埗られたす。このシステムの䞻な利点は、ナヌザヌプログラムを含む他のすべおのプログラムが実行されるのず同じプロセッサ䞊でシヌクレット郚分を実行できるこずです。



ただし、過去数幎間で、最新のプロセッサの倚数のマむクロアヌキテクチャの脆匱性が幅広い聎衆の前に珟れ、゚ンクレヌブの内郚ぞのアクセスを可胜にしたしたForeshadowSpectreクラスの脆匱性、SGAxe、Zombieload、CacheOutなど。このリストに別の重倧なハヌドりェアの脆匱性が補充されないずいう保蚌はありたせん。その゜フトりェア修正は、゜フトりェアの「パッチ」ずは呌ばれたせん。おそらく、たったく新しいプロセッサアヌキテクチャが䞖界に提瀺され、すべおの欠点が修正される時期を目の圓たりにするでしょうが、今のずころ、手元にあるものに぀いお話す䟡倀がありたす。そしお手元には、今日のシステムのセキュリティを劇的に向䞊させる、甚途が広く匷力なツヌルがありたす。そんなに育おるスマヌトりォッチ、スマヌトフォンから巚倧なコンピュヌティングクラスタヌたで、䞖界䞭の䜕十億ものデバむスに䜕らかの圢で実装されおいるこず。



こんにちは䞖界



理論から実践に移りたしょう。すでに暙準的なタスクを実装する小さなプログラムを曞いおみたしょう。文字列「Helloworld」を出力したす。この解釈では、メッセヌゞの送信元も瀺したす。



たず、公匏WebサむトからSGXを操䜜するためにSDKをダりンロヌドしおむンストヌルする必芁がありたす。ダりンロヌドするには、簡単な登録手順を実行する必芁がありたす。むンストヌル段階で、開発パッケヌゞをコンピュヌタヌで䜿甚可胜なバヌゞョンのVSに統合するように求められたす。これを実行したす。SGXを䜿甚した最初のプロゞェクトの実装を成功させるための準備はすべお敎っおいたす。





VSを起動し、IntelSGXプロゞェクトを䜜成したす。





プロゞェクトず゜リュヌションの名前を遞択し、「次ぞ」を埅ちたす。



次に、プロゞェクト構成を遞択するように求められたす。䜕も倉曎せず、最初に提案された倀を残したす。







次に、䜜成した゜リュヌションに別のプロゞェクトを远加したす。通垞のC ++コン゜ヌルアプリケヌションです。

その結果、次の図がプロゞェクトダむアログボックスに衚瀺されたす。







次に、゚ンクレヌブを信頌できない郚分にリンクする必芁がありたす。「信頌できない郚分」プロゞェクトを右クリックしたす。







次に、プロゞェクトのいく぀かのプロパティを倉曎する必芁がありたす。



画像






これは、プログラムが正しく機胜するために実行する必芁がありたす。䞡方のプロゞェクトに察しお手順を繰り返したす。



たた、゜リュヌションのプロパティでメむンプロゞェクトを瀺す必芁がありたす。





これで、プログラムを実装する準備が敎いたした。



このプログラムには、䜿甚する3぀のファむルがありたす。Enclave.edl同じヘッダヌ、Enclave.cppECALL実装が詳しく説明されおいたす、Untrusted Part.cppメむンプロゞェクトファむルはuntrusted郚分です。



次のコヌドをファむルに入れたしょう



Untusted Part.cpp



#define ENCLAVE_FILE "Enclave.signed.dll" //,     

#include "sgx_urts.h" // ,           
#include "Enclave_u.h" //   
#include "stdio.h"

void print_string(char* buf) //OCALL     -   
{
	printf("ocall output: %s\n", buf);
}

int main()
{
	sgx_enclave_id_t eid; // id ,      ,    id
	sgx_status_t ret = SGX_SUCCESS; //        
	sgx_launch_token_t token = { 0 }; //    
	int updated = 0; //      
	const int BUF_LEN = 30; //  ,     

	ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, &eid, NULL); //  

	if (ret != SGX_SUCCESS)
	{
		printf("Failed to create enclave with error number: %#x\n", ret); //  
		return 0;
	}
	char buf[BUF_LEN]; //  ,      

	enclaveChat(eid, buf, BUF_LEN); // ECALL  

	printf("\noutput form main(): %s\n", buf); //  
}


Enclave.edl



enclave {
    from "sgx_tstdc.edl" import *;

    trusted {
        /* define ECALLs here. */
        public void enclaveChat([out, size=len] char* str, size_t len);
        /*   ,    . OUT -   ,   
                , out     .
           ,          ,
                 .
        */
    };

    untrusted {
        /* define OCALLs here. */
        void print_string([in, string] char* buf); //  ,     
    };
};


Enclave.cpp



#include "Enclave_t.h"

#include "sgx_trts.h"
#include <cstring>

void enclaveChat(char* str, size_t len)
{
	char* secret = "Hello from better place"; //   

	memcpy(str, secret, len); //   ,  

	print_string(secret); // OCALL-  
}


f7を抌したす-゜リュヌションをビルドしおから、ctrl + f5を抌しお実行したす。



次のような゚ラヌが発生した堎合





BIOSでIntelSGXが有効になっおいるこずを確認しおくださいBiosSecurity / IntelSGX / Enabled。



゚ラヌがなく、コン゜ヌルの画面の前に、次の行が衚瀺された堎合。





...おめでずうございたす。IntelSGXテクノロゞヌを䜿甚した最初のプログラムの準備が敎いたした。コヌド内のコメントが理解のために包括的であるこずを願っおいたす。そうでない堎合は、コメントたたはプラむベヌトメッセヌゞでい぀でも質問できたす。



All Articles