2017-08-06 5 views
1

OCALLを使用して、信頼できないメモリにダイナミックに作成されたC文字列を自分のエンクレーブにコピーしたいとします。したがって、[out, string]属性を使用する必要があります。SGXエンクレーブ文字列引数を[in]属性と併用する必要がある

しかし、私は[in]属性も追加する必要があるので、これを行うことはできません。問題は、実際には文字列のサイズがわからず、OCALLを作成するたびに、エンクレーブから信頼できないメモリへの不要な文字列のコピーからのオーバヘッド([in])が欲しくないということです。

私のEDLファイル:

enclave { 
    trusted { 
     public void ecall_open(void); 
    }; 
    untrusted { 
     void ocall_get_string([out, string] char* str); 
    }; 
}; 

error: string/wstring/sizefunc should be used with an 'in' attribute

なぜ[in]属性を追加する必要がありますか?

パフォーマンス上の理由から、このオーバーヘッドを避ける方法はありますか?

void ocall_get_string([out] char** str, [out] size_t* length);

し、手動でmemcpy()を使用して信頼されていないメモリから信頼されるにCの文字列をコピーします。

+0

開発者のマニュアルでは、 "STRING'と' wstring'が が '単体out'で使用することはできません'" と述べています。おそらく、自分自身でECALLを使ってデータをエンクレーブに送信することができます: 'ocall_get_string()ecall_to_pass_string([in、string] char * str)'。このマニュアルでは、* ECALLsへのアクセス許可*というタイトルで書かれています。 – Daniel

答えて

0

私が推測する、1つの解決策は、[out]属性と長さでchar*へのポインタを渡すことであろう。飛び地インサイド

char* untrusted_str; // pointer to string in untrusted memory that we would get form OCALL 
size_t length; // length of string 

ocall_get_string(&untrusted_str, &length); 

char *trusted_str = new char[length]; // pointer to string in trusted memory 
memcpy(trusted_str, untrusted_str, length); 

// delete it later 
delete[] trusted_str; 
+0

は非常に悪い習慣のようです。信頼できない長さと信頼できないポインタを信頼します。攻撃者があなたの秘密のポインタをあなたの領土内に渡す場合はどうなりますか? – Tal

+0

@ Tal、同意しますが、文字列が厳密にエンクレーブの外にあるかどうかをチェックするために 'sgx_is_outside_enclave()'を呼び出すことはできますか? – yerzhan7

+0

ホイールを改造しないで、パフォーマンスやセキュリティを求めたいものを決めます。 – Tal

関連する問題