This is an automated email from the ASF dual-hosted git repository.

rduan pushed a commit to branch v2.0.0-preview
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave-sgx-sdk.git


The following commit(s) were added to refs/heads/v2.0.0-preview by this push:
     new 73062c51 Fixed dereferencing pointers in untrusted memory
73062c51 is described below

commit 73062c511265492d7bd915fed916e60b6687a770
Author: volcano <[email protected]>
AuthorDate: Fri Apr 11 15:58:45 2025 +0800

    Fixed dereferencing pointers in untrusted memory
---
 sgx_trts/src/enclave/init.rs | 35 ++++++++++++++++++++---------------
 1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/sgx_trts/src/enclave/init.rs b/sgx_trts/src/enclave/init.rs
index 1e61526d..c2f27e5a 100644
--- a/sgx_trts/src/enclave/init.rs
+++ b/sgx_trts/src/enclave/init.rs
@@ -107,13 +107,21 @@ pub fn ctors() -> SgxResult {
 }
 
 pub fn global_init(tcs: &mut Tcs, raw: *mut InitInfoHeader, tidx: usize) -> 
SgxResult {
-    let mut header = NonNull::new(raw).ok_or(SgxStatus::Unexpected)?;
-    let header = unsafe { header.as_mut() };
-    ensure!(header.is_host_range(), SgxStatus::Unexpected);
+    let u_header = NonNull::new(raw)
+        .map(|h| unsafe { h.as_ref() })
+        .ok_or(SgxStatus::Unexpected)?;
+    ensure!(u_header.is_host_range(), SgxStatus::Unexpected);
     lfence();
 
+    // copy to trusted memory.
+    let header = *u_header;
     ensure!(header.check(), SgxStatus::Unexpected);
-    ensure!(header.as_ref().is_host_range(), SgxStatus::Unexpected);
+    lfence();
+
+    let u_bytes = u_header
+        .as_bytes(header.info_size)
+        .ok_or(SgxStatus::Unexpected)?;
+    ensure!(u_bytes.is_host_range(), SgxStatus::Unexpected);
     lfence();
 
     ensure!(state::get_state() == State::InitDone, SgxStatus::Unexpected);
@@ -128,7 +136,8 @@ pub fn global_init(tcs: &mut Tcs, raw: *mut InitInfoHeader, 
tidx: usize) -> SgxR
     let env_len = header.env_len;
     let args_len = header.args_len;
 
-    let bytes: Vec<u8> = header.as_mut().into();
+    // copy to trusted memory.
+    let bytes: Vec<u8> = u_bytes.into();
 
     unsafe {
         extern "C" {
@@ -176,18 +185,14 @@ impl InitInfoHeader {
             false
         }
     }
-}
-
-unsafe impl ContiguousMemory for InitInfoHeader {}
 
-impl AsRef<[u8]> for InitInfoHeader {
-    fn as_ref(&self) -> &[u8] {
-        unsafe { slice::from_raw_parts(self as *const _ as *const u8, 
self.info_size) }
+    fn as_ptr(&self) -> *const InitInfoHeader {
+        self
     }
-}
 
-impl AsMut<[u8]> for InitInfoHeader {
-    fn as_mut(&mut self) -> &mut [u8] {
-        unsafe { slice::from_raw_parts_mut(self as *mut _ as *mut u8, 
self.info_size) }
+    fn as_bytes(&self, len: usize) -> Option<&[u8]> {
+        (self.info_size == len).then(|| unsafe { 
slice::from_raw_parts(self.as_ptr().cast(), len) })
     }
 }
+
+unsafe impl ContiguousMemory for InitInfoHeader {}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to