Почему в анклаве SGX строковый аргумент должен использоваться с атрибутом [in]

Используя OCALL, я хочу получить копию строки C, которая динамически создается в ненадежной памяти, в мой анклав. Таким образом, я должен использовать атрибут [out, string].

Однако я не могу этого сделать, потому что мне также нужно добавить атрибут [in]. Проблема в том, что я действительно не знаю размер строки, и я не хочу накладных расходов (которые идут с [in]) из-за ненужного копирования строки из анклава в ненадежную память каждый раз, когда я делаю OCALL.

Мой 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]?

Есть ли способ избежать этих накладных расходов по соображениям производительности?


person yerzhan7    schedule 06.08.2017    source источник
comment
В руководстве разработчика сказано, что string и wstring нельзя использовать только с out. Возможно, вы можете заставить свой OCALL использовать ECALL для отправки данных в анклав, что-то вроде: ocall_get_string() allow ecall_to_pass_string([in, string] char *str). В руководстве это написано на странице 59 под заголовком Предоставление доступа к ECALLs.   -  person Daniel    schedule 02.03.2018


Ответы (2)


Думаю, одним из решений было бы передать указатель на char* с атрибутом [out] и длиной:

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

А затем вручную скопируйте строку C из ненадежной памяти в доверенную, используя memcpy().

Внутри анклава:

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;
person yerzhan7    schedule 06.08.2017
comment
кажется очень плохой практикой. вы доверяете ненадежной длине и ненадежному указателю. что, если злоумышленник передаст вам указатель на ваши собственные секреты внутри анклава? - person Tal; 23.08.2017
comment
@Tal, согласен, но я могу позвонить sgx_is_outside_enclave(), чтобы проверить, находится ли моя строка строго за пределами анклава, верно? - person yerzhan7; 23.08.2017
comment
Не изобретайте велосипед, решите, что вам нужно: производительность или безопасность. - person Tal; 23.08.2017
comment
Я просто хочу [out, string] и не понимаю, почему я должен включать еще и in. - person yerzhan7; 23.08.2017

Возможно, вам стоит попробовать это:

void ocall_get_string([out, size=sz] char* str, size_t sz);

size=sz означает размер str, который будет автоматически скопирован обратно в Enclave. Если вы не укажете размер, то обратно в Enclave будет скопирован только один символ.

person JasVixBan    schedule 28.09.2018