Intel SGX - Enclave内で使用不可能なC標準関数一覧
以前参考文献[1]のページに載っていた、Enclave内で使用できないC標準関数一覧を手元に残しておいたものをそのまま掲載します。
本記事の執筆時点で[1]が消滅したのが割と前なので情報が古い可能性はありますが、SGXのOSを信頼していないという性質上、あまり大きく変わってはいないはずです。
| ヘッダ名 | SGXSDKに含まれるか | 非対応マクロ | 非対応関数 |
|---|---|---|---|
| complex.h | Yes | Intelコンパイラ16.0使用時のみ使用可 | Intelコンパイラ16.0使用時のみ使用可 |
| inttypes.h | Yes |
SCNdN, SCNiN, SCNoN, SCNuN, SCNxN, SCNdLEASTN, SCNiLEASTN, SCNoLEASTN, SCNuLEASTN, SCNxLEASTN, SCNdFASTN, SCNiFASTN, SCNoFASTN, SCNuFASTN, SCNxFASTN, SCNdMAX, SCNiMAX, SCNoMAX, SCNuMAX, SCNxMAX, SCNdPTR, SCNiPTR, SCNoPTR, SCNuPTR, SCNxPTR
|
wcstoimax(), wcstoumax()
|
| locale.h | No |
LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME, struct lconv
|
setlocale(), localeconv()
|
| signal.h | No |
sig_atomic_t, SIG_DFL, SIG_ERR, SIG_IGN, SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM
|
signal(), raise()
|
| stdatomic.h | Yes |
ATOMIC_<TYPE>_LOCK_FREE, atomic_<datatype>
|
kill_dependency(), atomic_fetch_and(), atomic_fetch_and_explicit(), atomic_thread_fence(), atomic_signal_fence()
|
| stdio.h | Yes |
FILE, fpos_t, _IOFBF, _IOLBF, _IONBF, FILENAME_MAX, FOPEN_MAX, L_tmpnam, SEEK_CUR, SEEK_END, SEEK_SET, TMP_MAX, stderr, stdin, stdout
|
remove(), rename(), tmpfile(), tmpnam(), fclose(), fflush(), fopen(), fopen_s(), freopen(), freopen_s(), setbuf(), setvbuf(), fprintf(), fprintf_s(), fscanf(), fscanf_s(), printf(), scanf(), scan_s(), snprintf_s(), sprintf(), sprintf_s(), sscanf(), sscanf_s(), vfprintf(), vfprintf_s(), vfscanf(), vfscanf_s(), vprintf(), vprintf_s(), vscanf(), vscanf_s(), vsnprintf_s(), vsprintf(), vsprintf_s(), vsscanf(), vsscanf_s(), fgetc(), fgets(), fputc(), fputs(), getc(), getchar(), gets(), gets_s(), putc(), putchar(), puts(), ungetc(), fread(), fwrite(), fgetpos(), fseek(), fsetpos(), ftell(), rewind(), clearerr(), feof(), ferror(), perror()
|
| stdlib.h | Yes | なし |
rand(), srand(), atexit(), exit(), _Exit(), quick_exit(), at_quick_exit(), getenv(), getenv_s(), system(), bsearch_s(), qsort_s(), mblen(), mbtowc(), wctomb(), wctomb_s(), mbstowcs(), mbstowcs_s(), wcstombs(), wcstombs_s()
|
| string.h | Yes | なし |
memcpy_s(), memmove_s(), strcpy(), strcpy_s(), strncpy_s(), strcat(), strcat_s(), strstr()(*), strtok_s(), strerror_s(), strerrorlen_s(), strlen_s()
|
| threads.h | No |
thrd_t, thrd_success, thrd_timeout, thrd_busy, thrd_nomem, thrd_error, thrd_start_t, mtx_t, mtx_plain mtx_recursive, mtx_timed, cnd_t, tss_t, TSS_DTOR_ITERATIONS, tss_dtor_t
|
thrd_create(), thrd_equal(), thrd_current(), thrd_sleep(), thrd_yield(), thrd_exit(), thrd_detach(), thrd_join(), mtx_init(), mtx_lock(), mtx_timedlock(), mtx_trylock(), mtx_unlock(), mxm_destroy(), call_once(), cnd_init(), cnd_signal(), cnd_broadcast(), cnd_wait(), cnd_timedwait(), cnd_destroy(), tss_create(), tss_get(), tss_set(), tss_delete()
|
| time.h | Yes | timespec |
clock(), mktime(), time(), asctime_s(), ctime(), ctime_s(), gmtime(), gtime_s(), localtime(), localtime_s()
|
| uchar.h | Yes |
__STDC_UTF_16__, __STDC_UTF_32__
|
mbrtoc16() , c16rtomb(), mbrtoc32(), c32rtomb()
|
| wchar.h | Yes | なし |
fwprintf(), fwscanf(), swscanf(), vfwprintf(), vfwscanf(), vswscanf(), vwprintf(), vwscanf(), wprintf(), wscanf(), fgetwc(), fgetws(), fputwc(), fputws(), fwide(), getwc(), getwchar(), putwc(), putwchar(), ungetwc(), wcstod(), wcstof(), wcstold(), wcstol(), wcstoll(), wcstoul(), wcstoull(), wcscpy(), wcscpy_s(), wcsncpy_s(), wmemcpy_s(), wmemmove_s(), wcscat(), wcscat_s(), wcsncat_s(), wcstok_s(), wcsnlen_s(), wcsftime(), wctob(), mbsinit(), mbrlen(), mbrtowc(), wcrtomb(), wcrtomb_s(), mbsrtowcs(), mbsrtowcs_s(), wcsrtombs(), wcsrtombs_s()
|
| wctype.h | Yes | なし |
iswalnum(), iswalpha(), iswblank(), iswcntrl(), iswdigit(), iswgraph(), iswlower(), iswprint(), iswpunct(), iswspace(), iswupper(), iswxdigit(), wctype(), towlower(), towupper(), towctrans(), wctrans()
|
-
フォーマット文字列攻撃を回避するため、
%n指定子の利用は即時のランタイムエラーを引き起こします。 -
strstr()はTrusted-C(Enclave用に安全性を向上させたCライブラリ)独自仕様のものを利用可能です。標準Cのものはchar strstr(const char*, const char*)ですが、Trusted-Cのものはconst char* strstr (const char*, const char*)となっています。
memset関数について
標準Cのmemset関数の他に、Trusted-C独自のmemset_s関数が利用可能です。memset関数は秘密情報を含まない場合の初期化やクリア、memset_s関数は秘密情報を含む場合の(特に)クリアに用いるべきです。memset関数はコンパイラの最適化の段階で安全でない挙動を取る場合があるため、秘密情報を扱う場合はmemset_s関数を使うべきでしょう。ただし、memset_s関数はパフォーマンスの最適化がmemset関数に比べ不十分であるため、使用は必要最低限に留めるべきです。
参考
[1]Intel® Software Guard Extensions SDK - Unsupported C Standard Functions (リンク無効)