Skip to content

Commit 70e1535

Browse files
committed
Linux 2.17.1 Open Source Gold Release
Along with the latest processor microcode address CVE-2022-21233. - Modified the Edger8r to generate code with mitigations for the associated issue. - Modified the API memcpy and memcpy_s to have mitigations for the associated issue. Signed-off-by: Li, Xun <xun.li@intel.com>
1 parent 15098e7 commit 70e1535

File tree

4 files changed

+142
-61
lines changed

4 files changed

+142
-61
lines changed

common/inc/internal/se_version.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,21 @@
3131
#ifndef _SE_VERSION_H_
3232
#define _SE_VERSION_H_
3333

34-
#define STRFILEVER "2.17.100.3"
34+
#define STRFILEVER "2.17.101.1"
3535
#define SGX_MAJOR_VERSION 2
3636
#define SGX_MINOR_VERSION 17
37-
#define SGX_REVISION_VERSION 100
37+
#define SGX_REVISION_VERSION 101
3838
#define MAKE_VERSION_UINT(major,minor,rev) (((uint64_t)major)<<32 | ((uint64_t)minor) << 16 | rev)
3939
#define VERSION_UINT MAKE_VERSION_UINT(SGX_MAJOR_VERSION, SGX_MINOR_VERSION, SGX_REVISION_VERSION)
4040

4141
#define COPYRIGHT "Copyright (C) 2022 Intel Corporation"
4242

43-
#define UAE_SERVICE_VERSION "2.3.215.3"
44-
#define URTS_VERSION "1.1.119.3"
45-
#define ENCLAVE_COMMON_VERSION "1.1.122.3"
46-
#define LAUNCH_VERSION "1.0.117.3"
47-
#define EPID_VERSION "1.0.117.3"
48-
#define QUOTE_EX_VERSION "1.1.117.3"
43+
#define UAE_SERVICE_VERSION "2.3.216.1"
44+
#define URTS_VERSION "1.1.120.1"
45+
#define ENCLAVE_COMMON_VERSION "1.1.123.1"
46+
#define LAUNCH_VERSION "1.0.118.1"
47+
#define EPID_VERSION "1.0.118.1"
48+
#define QUOTE_EX_VERSION "1.1.118.1"
4949

5050
#define PCE_VERSION "1.17.100.2"
5151
#define LE_VERSION "1.17.100.2"

common/inc/tlibc/string.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ __BEGIN_DECLS
6060

6161
void * _TLIBC_CDECL_ memchr(const void *, int, size_t);
6262
int _TLIBC_CDECL_ memcmp(const void *, const void *, size_t);
63+
void * _TLIBC_CDECL_ memcpy_nochecks(void *, const void *, size_t);
6364
void * _TLIBC_CDECL_ memcpy(void *, const void *, size_t);
6465
void * _TLIBC_CDECL_ memcpy_verw(void *, const void *, size_t);
6566
void * _TLIBC_CDECL_ memmove(void *, const void *, size_t);

sdk/edger8r/linux/CodeGen.ml

Lines changed: 58 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,13 @@ let retval_declr = { Ast.identifier = retval_name; Ast.array_dims = []; }
211211
let eid_name = "eid"
212212
let ms_ptr_name = "pms"
213213
let ms_struct_val = "ms"
214+
let ms_in_struct_val = "__in_ms"
214215
let mk_ms_member_name (pname: string) = "ms_" ^ pname
215216
let mk_ms_struct_name (fname: string) = "ms_" ^ fname ^ "_t"
216217
let ms_retval_name = mk_ms_member_name retval_name
217218
let mk_tbridge_name (fname: string) = "sgx_" ^ fname
218219
let mk_parm_accessor name = sprintf "%s->%s" ms_struct_val (mk_ms_member_name name)
220+
let mk_in_parm_accessor name = sprintf "%s.%s" ms_in_struct_val (mk_ms_member_name name)
219221
let mk_tmp_var name = "_tmp_" ^ name
220222
let mk_tmp_var2 name1 name2 = "_tmp_" ^ name1 ^ "_" ^ name2
221223
let mk_len_var name = "_len_" ^ name
@@ -242,14 +244,6 @@ extern \"C\" {\n\
242244
(* Header footer *)
243245
let header_footer = "\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif\n"
244246

245-
(* NO_HARDEN_EXT_WRITES Macro *)
246-
let mk_no_harden_macro = sprintf "\n#ifdef NO_HARDEN_EXT_WRITES\n%s\n#else\n%s\n#endif /* NO_HARDEN_EXT_WRITES */\n"
247-
248-
(* NO_HARDEN_EXT_WRITES Macro *)
249-
let memcpy_macro = mk_no_harden_macro
250-
"#define MEMCPY_S memcpy_s\n#define MEMSET memset"
251-
"#define MEMCPY_S memcpy_verw_s\n#define MEMSET memset_verw"
252-
253247
(* Little functions for generating file names. *)
254248
let get_uheader_short_name (file_shortnm: string) = file_shortnm ^ "_u.h"
255249
let get_uheader_name (file_shortnm: string) =
@@ -738,7 +732,7 @@ let gen_theader_preemble (guard: string) (inclist: string) =
738732
#include <wchar.h>\n\
739733
#include <stddef.h>\n\
740734
#include \"sgx_edger8r.h\" /* for sgx_ocall etc. */\n\n" in
741-
grd_hdr ^ inc_exp ^ inclist ^ "\n" ^ common_macros ^ memcpy_macro
735+
grd_hdr ^ inc_exp ^ inclist ^ "\n" ^ common_macros
742736

743737
(* Generate trusted header for enclave *)
744738
let gen_trusted_header (ec: enclave_content) =
@@ -761,7 +755,7 @@ let gen_trusted_header (ec: enclave_content) =
761755
close_out out_chan
762756

763757
(* It generates function invocation expression. *)
764-
let mk_parm_name_raw (pt: Ast.parameter_type) (declr: Ast.declarator) =
758+
let mk_parm_name_raw (pt: Ast.parameter_type) (declr: Ast.declarator) (tbridge: bool)=
765759
let cast_expr =
766760
let tystr = get_param_tystr pt in
767761
if Ast.is_array declr && List.length declr.Ast.array_dims > 1
@@ -770,31 +764,29 @@ let mk_parm_name_raw (pt: Ast.parameter_type) (declr: Ast.declarator) =
770764
sprintf "(%s (*)%s)" tystr dims
771765
else ""
772766
in
773-
cast_expr ^ mk_parm_accessor declr.Ast.identifier
767+
cast_expr ^ (if tbridge then mk_in_parm_accessor else mk_parm_accessor) declr.Ast.identifier
774768

775769
(* We passed foreign array `foo_array_t foo' as `&foo[0]', thus we
776770
* need to get back `foo' by '* array_ptr' where
777771
* array_ptr = &foo[0]
778772
*)
779773
let add_foreign_array_ptrref
780-
(f: Ast.parameter_type -> Ast.declarator -> string)
781-
(pt: Ast.parameter_type)
782-
(declr: Ast.declarator) =
783-
let arg = f pt declr in
774+
(arg: string)
775+
(pt: Ast.parameter_type) =
784776
if is_foreign_array pt
785777
then sprintf "(%s != NULL) ? (*%s) : NULL" arg arg
786778
else arg
787779

788780
let mk_parm_name_ubridge (pt: Ast.parameter_type) (declr: Ast.declarator) =
789-
add_foreign_array_ptrref mk_parm_name_raw pt declr
781+
add_foreign_array_ptrref (mk_parm_name_raw pt declr false) pt
790782

791783
let mk_parm_name_ext (pt: Ast.parameter_type) (declr: Ast.declarator) =
792784
let name = declr.Ast.identifier in
793785
match pt with
794-
Ast.PTVal _ -> mk_parm_name_raw pt declr
786+
Ast.PTVal _ -> mk_parm_name_raw pt declr true
795787
| Ast.PTPtr (_, attr) ->
796788
match attr.Ast.pa_direction with
797-
| Ast.PtrNoDirection -> mk_parm_name_raw pt declr
789+
| Ast.PtrNoDirection -> mk_parm_name_raw pt declr true
798790
| _ -> mk_in_var name
799791

800792
let gen_func_invoking (fd: Ast.func_decl)
@@ -968,7 +960,7 @@ let gen_ptr_size (ty: Ast.atype) (pattr: Ast.ptr_attr) (name: string) (get_parm:
968960
else
969961
(* genrerate ms_parm_len only for ecall with string/wstring in _t.c.*)
970962
if (pattr.Ast.pa_isstr || pattr.Ast.pa_iswstr) && parm_name <> name then
971-
sprintf "%s_len " (mk_parm_accessor name)
963+
sprintf "%s_len " (mk_in_parm_accessor name)
972964
else
973965
(* genrerate strlen(param)/wcslen(param) only for ocall with string/wstring in _t.c.*)
974966
if pattr.Ast.pa_isstr then
@@ -1407,7 +1399,7 @@ let gen_struct_ptr_direction_post (param_direction: Ast.ptr_direction) (struct_t
14071399
"\t\tstatus = SGX_ERROR_INVALID_PARAMETER;";
14081400
"\t\tbreak;";
14091401
"\t}";
1410-
sprintf "\tif (MEMCPY_S(%s, %s, %s, %s)) {" in_ptr_name in_len_ptr_var in_struct_member out_len_ptr_var;
1402+
sprintf "\tif (memcpy_verw_s(%s, %s, %s, %s)) {" in_ptr_name in_len_ptr_var in_struct_member out_len_ptr_var;
14111403
sprintf "\t\tstatus = SGX_ERROR_UNEXPECTED;";
14121404
"\t\tbreak;";
14131405
"\t}";
@@ -1449,7 +1441,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
14491441
"\t{";
14501442
sprintf "\t\t%s[%s - 1] = '\\0';" in_ptr_name len_var;
14511443
sprintf "\t\t%s = strlen(%s) + 1;" len_var in_ptr_name;
1452-
sprintf "\t\tif (MEMCPY_S((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
1444+
sprintf "\t\tif (memcpy_verw_s((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
14531445
"\t\t\tstatus = SGX_ERROR_UNEXPECTED;";
14541446
"\t\t\tgoto err;";
14551447
"\t\t}";
@@ -1463,7 +1455,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
14631455
"\t{";
14641456
sprintf "\t\t%s[(%s - sizeof(wchar_t))/sizeof(wchar_t)] = (wchar_t)0;" in_ptr_name len_var;
14651457
sprintf "\t\t%s = (wcslen(%s) + 1) * sizeof(wchar_t);" len_var in_ptr_name;
1466-
sprintf "\t\tif (MEMCPY_S((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
1458+
sprintf "\t\tif (memcpy_verw_s((void*)%s, %s, %s, %s)) {" (mk_tmp_var name) len_var in_ptr_name len_var;
14671459
"\t\t\tstatus = SGX_ERROR_UNEXPECTED;";
14681460
"\t\t\tgoto err;";
14691461
"\t\t}";
@@ -1474,7 +1466,7 @@ let gen_parm_ptr_direction_post (plist: Ast.pdecl list) =
14741466
else
14751467
let code_template = [
14761468
sprintf "\tif (%s) {" in_ptr_name;
1477-
sprintf "%s\t\tif (MEMCPY_S(%s, %s, %s, %s)) {" struct_deep_copy_post (mk_tmp_var name) len_var in_ptr_name len_var;
1469+
sprintf "%s\t\tif (memcpy_verw_s(%s, %s, %s, %s)) {" struct_deep_copy_post (mk_tmp_var name) len_var in_ptr_name len_var;
14781470
"\t\t\tstatus = SGX_ERROR_UNEXPECTED;";
14791471
"\t\t\tgoto err;";
14801472
"\t\t}";
@@ -1547,7 +1539,7 @@ let gen_tmp_size (pattr: Ast.ptr_attr) (plist: Ast.pdecl list) =
15471539
else
15481540
let param_tystr = find_param_type s plist in
15491541
let tmp_var = mk_tmp_var s in
1550-
let parm_str = mk_parm_accessor s in
1542+
let parm_str = mk_in_parm_accessor s in
15511543
Hashtbl.add param_cache s true;
15521544
sprintf "\t%s %s = %s;\n" param_tystr tmp_var parm_str
15531545
in
@@ -1602,7 +1594,7 @@ let tbridge_mk_parm_name_ext (pt: Ast.parameter_type) (declr: Ast.declarator) =
16021594
else mk_parm_name_ext pt declr
16031595

16041596
let mk_parm_name_tbridge (pt: Ast.parameter_type) (declr: Ast.declarator) =
1605-
add_foreign_array_ptrref tbridge_mk_parm_name_ext pt declr
1597+
add_foreign_array_ptrref (tbridge_mk_parm_name_ext pt declr) pt
16061598

16071599
(* Generate local variables required for the trusted bridge. *)
16081600
let gen_tbridge_local_vars (plist: Ast.pdecl list) =
@@ -1612,7 +1604,7 @@ let gen_tbridge_local_vars (plist: Ast.pdecl list) =
16121604
let ty = Ast.get_param_atype pt in
16131605
let tmp_var =
16141606
(* Save a copy of pointer in case it might be modified in the marshaling structure. *)
1615-
sprintf "\t%s%s %s = %s;\n" qual (Ast.get_tystr ty) (mk_tmp_var name) (mk_parm_accessor name)
1607+
sprintf "\t%s%s %s = %s;\n" qual (Ast.get_tystr ty) (mk_tmp_var name) (mk_in_parm_accessor name)
16161608
in
16171609
let len_var =
16181610
if not attr.Ast.pa_chkptr then ""
@@ -1637,7 +1629,7 @@ let gen_tbridge_local_vars (plist: Ast.pdecl list) =
16371629
let gen_local_var_for_foreign_array (ty: Ast.atype) (attr: Ast.ptr_attr) (name: string) =
16381630
let tystr = Ast.get_tystr ty in
16391631
let tmp_var =
1640-
sprintf "\t%s* %s = %s;\n" tystr (mk_tmp_var name) (mk_parm_accessor name)
1632+
sprintf "\t%s* %s = %s;\n" tystr (mk_tmp_var name) (mk_in_parm_accessor name)
16411633
in
16421634
let len_var = sprintf "\tsize_t %s = sizeof(%s);\n" (mk_len_var name) tystr
16431635
in
@@ -1681,13 +1673,28 @@ let gen_func_tbridge (fd: Ast.func_decl) (dummy_var: string) =
16811673
ms_struct_val
16821674
ms_struct_name
16831675
ms_ptr_name in
1676+
let declare_ms = sprintf "%s %s;"
1677+
ms_struct_name
1678+
ms_in_struct_val in
1679+
let copy_ms =
1680+
let code_template =[
1681+
sprintf "if (memcpy_s(&%s, sizeof(%s), %s, sizeof(%s))) {"
1682+
ms_in_struct_val
1683+
ms_struct_name
1684+
ms_struct_val
1685+
ms_struct_name;
1686+
"\treturn SGX_ERROR_UNEXPECTED;";
1687+
"}";
1688+
]
1689+
in
1690+
List.fold_left (fun acc s -> acc ^ "\t" ^ s ^ "\n") "" code_template in
16841691

16851692
let invoke_func = gen_func_invoking fd mk_parm_name_tbridge in
16861693

16871694
let update_retval =
16881695
let code_template =[
16891696
sprintf "%s = %s"(mk_in_var retval_name) invoke_func;
1690-
sprintf "if (MEMCPY_S(&%s, sizeof(%s), &%s, sizeof(%s))) {"
1697+
sprintf "if (memcpy_verw_s(&%s, sizeof(%s), &%s, sizeof(%s))) {"
16911698
(mk_parm_accessor retval_name)
16921699
(mk_parm_accessor retval_name)
16931700
(mk_in_var retval_name)
@@ -1705,10 +1712,12 @@ let gen_func_tbridge (fd: Ast.func_decl) (dummy_var: string) =
17051712
in
17061713
sprintf "%s%s%s\t%s\n\t%s\n%s" func_open local_vars dummy_var check_pms invoke_func func_close
17071714
else
1708-
sprintf "%s%s\t%s\n%s\n%s%s\n%s%s%s\n%s\n%s%s"
1715+
sprintf "%s%s\t%s\n\t%s\n%s%s\n%s%s\n%s%s%s\n%s\n%s%s"
17091716
func_open
17101717
(mk_check_pms fd.Ast.fname)
17111718
declare_ms_ptr
1719+
declare_ms
1720+
copy_ms
17121721
local_vars
17131722
(gen_check_tbridge_length_overflow fd.Ast.plist)
17141723
(gen_check_tbridge_ptr_parms fd.Ast.plist)
@@ -1726,7 +1735,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
17261735
let parm_accessor = mk_parm_accessor name in
17271736
let sgx_ocfree_fn = get_sgx_fname SGX_OCFREE is_ocall_switchless in
17281737
let copy_ms_val_filed = [
1729-
sprintf "\tif (MEMCPY_S(&%s, sizeof(%s), &%s, sizeof(%s))) {"
1738+
sprintf "\tif (memcpy_verw_s(&%s, sizeof(%s), &%s, sizeof(%s))) {"
17301739
parm_accessor
17311740
parm_accessor
17321741
name
@@ -1786,7 +1795,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
17861795
in
17871796
let post =
17881797
let code_template =[
1789-
sprintf "\tif (MEMCPY_S((void *)((size_t)__tmp + sizeof(__local_%s) * i), sizeof(__local_%s), &__local_%s, sizeof(__local_%s))) {" name name name name;
1798+
sprintf "\tif (memcpy_verw_s((void *)((size_t)__tmp + sizeof(__local_%s) * i), sizeof(__local_%s), &__local_%s, sizeof(__local_%s))) {" name name name name;
17901799
sprintf "\t\t%s();" sgx_ocfree_fn;
17911800
"\t\treturn SGX_ERROR_UNEXPECTED;";
17921801
"\t}";
@@ -1801,7 +1810,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
18011810
let non_deep_copy_out =
18021811
let code_template =
18031812
[
1804-
sprintf "if (MEMCPY_S(__tmp, ocalloc_size, %s, %s)) {" name len_var;
1813+
sprintf "if (memcpy_verw_s(__tmp, ocalloc_size, %s, %s)) {" name len_var;
18051814
sprintf "\t\t%s();" sgx_ocfree_fn;
18061815
"\t\treturn SGX_ERROR_UNEXPECTED;";
18071816
"\t}";
@@ -1811,7 +1820,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
18111820
if deep_copy_out = "" then non_deep_copy_out else deep_copy_out
18121821
in
18131822
let assign_tmp_to_ptr = [
1814-
sprintf "\tif (MEMCPY_S(&%s, sizeof(%s), &__tmp, sizeof(%s))) {"
1823+
sprintf "\tif (memcpy_verw_s(&%s, sizeof(%s), &__tmp, sizeof(%s))) {"
18151824
parm_accessor
18161825
tystr
18171826
tystr;
@@ -1830,7 +1839,7 @@ let tproxy_fill_ms_field (pd: Ast.pdecl) (is_ocall_switchless: bool) =
18301839
]
18311840
@ check_size @
18321841
[
1833-
sprintf "\tMEMSET(__tmp_%s, 0, %s);" name len_var;
1842+
sprintf "\tmemset_verw(__tmp_%s, 0, %s);" name len_var;
18341843
sprintf "\t__tmp = (void *)((size_t)__tmp + %s);" len_var;
18351844
sprintf "\tocalloc_size -= %s;" len_var;
18361845
"} else {";
@@ -1887,8 +1896,8 @@ let tproxy_fill_structure(pd: Ast.pdecl) (is_ocall_switchless: bool)=
18871896
[
18881897
sprintf "%s = %s;" len_member_name (gen_struct_ptr_size ty attr name para_struct);
18891898
sprintf "\tif (%s != NULL && %s != 0) {" para_struct_member len_member_name;
1890-
sprintf "\t\tif (MEMCPY_S(__tmp, %s, %s, %s) ||" len_member_name para_struct_member len_member_name;
1891-
sprintf "\t\t\tMEMCPY_S(&%s, sizeof(%s), &__tmp, sizeof(%s))) {" in_struct_member (Ast.get_tystr ty) (Ast.get_tystr ty);
1899+
sprintf "\t\tif (memcpy_verw_s(__tmp, %s, %s, %s) ||" len_member_name para_struct_member len_member_name;
1900+
sprintf "\t\t\tmemcpy_verw_s(&%s, sizeof(%s), &__tmp, sizeof(%s))) {" in_struct_member (Ast.get_tystr ty) (Ast.get_tystr ty);
18921901
sprintf "\t\t\t%s();" sgx_ocfree_fn;
18931902
"\t\t\treturn SGX_ERROR_UNEXPECTED;";
18941903
"\t\t}";
@@ -2224,7 +2233,12 @@ let gen_func_tproxy (ufunc: Ast.untrusted_func) (idx: int) =
22242233
Ast.PTVal _ -> acc
22252234
| Ast.PTPtr(ty, attr) -> acc ^ copy_memory ty attr declr) "" plist in
22262235

2227-
let set_errno = if propagate_errno then "\t\terrno = ms->ocall_errno;\n" else "" in
2236+
let set_errno = if propagate_errno then sprintf "%s\n%s\n%s\n%s\n"
2237+
"\t\tif (memcpy_s((void*)&errno, sizeof(errno), &ms->ocall_errno, sizeof(ms->ocall_errno))) {"
2238+
(sprintf "\t\t\t%s();" sgx_ocfree_fn)
2239+
"\t\t\treturn SGX_ERROR_UNEXPECTED;"
2240+
"\t\t}"
2241+
else "" in
22282242
let func_close = sprintf "%s%s%s\n%s%s\n"
22292243
(handle_out_ptr fd.Ast.plist)
22302244
set_errno
@@ -2234,8 +2248,13 @@ let gen_func_tproxy (ufunc: Ast.untrusted_func) (idx: int) =
22342248
let sgx_ocall_fn = get_sgx_fname SGX_OCALL ufunc.Ast.uf_is_switchless in
22352249
let ocall_null = sprintf "\tstatus = %s(%d, NULL);\n" sgx_ocall_fn idx in
22362250
let ocall_with_ms = sprintf "\tstatus = %s(%d, %s);\n" sgx_ocall_fn idx ms_struct_val in
2237-
let update_retval = sprintf "\t\tif (%s) *%s = %s;"
2238-
retval_name retval_name (mk_parm_accessor retval_name) in
2251+
let update_retval = sprintf "%s\n%s\n%s\n%s\n%s\n%s"
2252+
(sprintf "\t\tif (%s) {" retval_name)
2253+
(sprintf "\t\t\tif (memcpy_s((void*)%s, sizeof(*%s), &%s, sizeof(%s))) {" retval_name retval_name (mk_parm_accessor retval_name) (mk_parm_accessor retval_name))
2254+
(sprintf "\t\t\t\t%s();" sgx_ocfree_fn)
2255+
"\t\t\t\treturn SGX_ERROR_UNEXPECTED;"
2256+
"\t\t\t}"
2257+
"\t\t}" in
22392258
let func_body = ref [] in
22402259
if (is_naked_func fd) && (propagate_errno = false) then
22412260
sprintf "%s%s%s%s" func_open local_vars ocall_null "\n\treturn status;\n}"

0 commit comments

Comments
 (0)