Skip to content

Commit

Permalink
[release/3.x] Cherry pick: Move ring buffer bound check early (#4514) (
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions[bot] authored Nov 11, 2022
1 parent 8c85b17 commit 5697c11
Showing 1 changed file with 16 additions and 29 deletions.
45 changes: 16 additions & 29 deletions src/enclave/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,22 @@ extern "C"
auto writer_factory = std::make_unique<oversized::WriterFactory>(
*basic_writer_factory, ec.writer_config);

// Check that ringbuffer memory ranges are entirely outside of the enclave
if (
!ccf::pal::is_outside_enclave(
ec.from_enclave_buffer_start, ec.from_enclave_buffer_size) ||
!ccf::pal::is_outside_enclave(
ec.to_enclave_buffer_start, ec.to_enclave_buffer_size) ||
!ccf::pal::is_outside_enclave(
ec.to_enclave_buffer_offsets, sizeof(ringbuffer::Offsets)) ||
!ccf::pal::is_outside_enclave(
ec.from_enclave_buffer_offsets, sizeof(ringbuffer::Offsets)))
{
return CreateNodeStatus::MemoryNotOutsideEnclave;
}

// Note: because logger uses ringbuffer, logger can only be initialised once
// ringbuffer memory has been verified
auto new_logger = std::make_unique<ccf::RingbufferLogger>(
writer_factory->create_writer_to_outside());
auto ringbuffer_logger = new_logger.get();
Expand Down Expand Up @@ -164,35 +180,6 @@ extern "C"
ccf::host_time_us =
static_cast<decltype(ccf::host_time_us)>(time_location);

// Check that ringbuffer memory ranges are entirely outside of the enclave
if (!ccf::pal::is_outside_enclave(
ec.to_enclave_buffer_start, ec.to_enclave_buffer_size))
{
LOG_FAIL_FMT("Memory outside enclave: to_enclave buffer start");
return CreateNodeStatus::MemoryNotOutsideEnclave;
}

if (!ccf::pal::is_outside_enclave(
ec.from_enclave_buffer_start, ec.from_enclave_buffer_size))
{
LOG_FAIL_FMT("Memory outside enclave: from_enclave buffer start");
return CreateNodeStatus::MemoryNotOutsideEnclave;
}

if (!ccf::pal::is_outside_enclave(
ec.to_enclave_buffer_offsets, sizeof(ringbuffer::Offsets)))
{
LOG_FAIL_FMT("Memory outside enclave: to_enclave buffer offset");
return CreateNodeStatus::MemoryNotOutsideEnclave;
}

if (!ccf::pal::is_outside_enclave(
ec.from_enclave_buffer_offsets, sizeof(ringbuffer::Offsets)))
{
LOG_FAIL_FMT("Memory outside enclave: from_enclave buffer offset");
return CreateNodeStatus::MemoryNotOutsideEnclave;
}

ccf::pal::speculation_barrier();
}

Expand Down

0 comments on commit 5697c11

Please sign in to comment.