Adding buffer overflow mitigation example for cheriot
- buffer overflow when strlen is used for copying a larger string to a smaller buffer results in an exception
Bypass-Presubmit-Reason: Quick submit for CES
Change-Id: I61145df383bc5c08a849c6f685a119b1fd6b5d33
diff --git a/sw/device/cheriot/buffer_overflow/buffer_overflow.cc b/sw/device/cheriot/buffer_overflow/buffer_overflow.cc
new file mode 100644
index 0000000..70a0b8e
--- /dev/null
+++ b/sw/device/cheriot/buffer_overflow/buffer_overflow.cc
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <compartment.h>
+#include <fail-simulator-on-error.h>
+
+#include <debug.hh>
+
+using Debug = ConditionalDebug<true, "Buffer overflow compartment">;
+
+void local_function(const char* inp) {
+ char b1[5] = "AAAA";
+ char b2[5] = "BBBB";
+ Debug::log(b1);
+ Debug::log(b2);
+ for (int i = 0; inp[i] != '\0' /*&& i < sizeof(b1)*/; i++) {
+ b1[i] = inp[i];
+ }
+ Debug::log(b1);
+ Debug::log(b2);
+}
+
+void __cheri_compartment("buffer_overflow") entry() {
+ local_function("PPPPQQQQR");
+}
diff --git a/sw/device/cheriot/buffer_overflow/xmake.lua b/sw/device/cheriot/buffer_overflow/xmake.lua
new file mode 100644
index 0000000..bd8b6ab
--- /dev/null
+++ b/sw/device/cheriot/buffer_overflow/xmake.lua
@@ -0,0 +1,56 @@
+--
+-- Copyright 2023 Google LLC
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+set_project("CHERIoT buffer overflow avoidance demo")
+
+local shodan_dir = os.getenv("ROOTDIR")
+if shodan_dir == nil or shodan_dir == '' then
+ raise("ROOTDIR not set")
+end
+
+local sdkdir = path.join(shodan_dir, "sw/cheriot-rtos/sdk")
+includes(sdkdir)
+set_toolchains("cheriot-clang")
+
+option("board")
+ set_default("sail")
+
+-- Support libraries
+includes(path.join(sdkdir, "lib"))
+includes(path.join(sdkdir, "lib/freestanding"))
+
+-- Application.
+compartment("buffer_overflow")
+ add_files("buffer_overflow.cc")
+ add_deps("debug")
+ add_defines("CHERIOT_NO_AMBIENT_MALLOC")
+
+-- Firmware image.
+firmware("buffer_overflow-firmware")
+ add_deps("buffer_overflow")
+ add_deps("freestanding")
+ on_load(function(target)
+ target:values_set("board", "$(board)")
+ local threads = {
+ {
+ compartment = "buffer_overflow",
+ priority = 1,
+ entry_point = "entry",
+ stack_size = 0x1000, -- 4KB
+ trusted_stack_frames = 1
+ },
+ }
+ target:values_set("threads", threads, {expand = false})
+ end)