Max OS 0.3
Loading...
Searching...
No Matches
kasan.cpp
Go to the documentation of this file.
1
9#include <runtime/kasan.h>
10#include <common/logger.h>
11
12using namespace MaxOS;
13using namespace MaxOS::runtime;
14
15KASanHandler::KASanHandler() = default;
16
17KASanHandler::~KASanHandler() = default;
18
27void KASanHandler::handle(bool write, uintptr_t address, size_t size, void* rip) {
28 ASSERT(false, "KASAN ERROR: %s of size %zu at address 0x%lx from RIP 0x%p", write ? "WRITE" : "READ", size, address, rip);
29}
30
37
44void KASanHandler::poison_stack(uintptr_t address, size_t size) {
45
46}
47
54void KASanHandler::unpoison_stack(uintptr_t address, size_t size) {
55
56}
57
63extern "C" void __asan_load1_noabort(uintptr_t address) {
64 KASanHandler::handle(false, address, 1, __builtin_return_address(0));
65}
66
72extern "C" void __asan_load2_noabort(uintptr_t address) {
73 KASanHandler::handle(false, address, 2, __builtin_return_address(0));
74}
75
81extern "C" void __asan_load4_noabort(uintptr_t address) {
82 KASanHandler::handle(false, address, 4, __builtin_return_address(0));
83}
84
90extern "C" void __asan_load8_noabort(uintptr_t address) {
91 KASanHandler::handle(false, address, 8, __builtin_return_address(0));
92}
93
99extern "C" void __asan_load16_noabort(uintptr_t address) {
100 KASanHandler::handle(false, address, 16, __builtin_return_address(0));
101}
102
109extern "C" void __asan_loadN_noabort(uintptr_t address, size_t size) {
110 KASanHandler::handle(false, address, size, __builtin_return_address(0));
111}
112
118extern "C" void __asan_store1_noabort(uintptr_t address) {
119 KASanHandler::handle(true, address, 1, __builtin_return_address(0));
120}
121
127extern "C" void __asan_store2_noabort(uintptr_t address) {
128 KASanHandler::handle(true, address, 2, __builtin_return_address(0));
129}
130
136extern "C" void __asan_store4_noabort(uintptr_t address) {
137 KASanHandler::handle(true, address, 4, __builtin_return_address(0));
138}
139
145extern "C" void __asan_store8_noabort(uintptr_t address) {
146 KASanHandler::handle(true, address, 8, __builtin_return_address(0));
147}
148
154extern "C" void __asan_store16_noabort(uintptr_t address) {
155 KASanHandler::handle(true, address, 16, __builtin_return_address(0));
156}
157
164extern "C" void __asan_storeN_noabort(uintptr_t address, size_t size) {
165 KASanHandler::handle(false, address, size, __builtin_return_address(0));
166}
167
171extern "C" void __asan_handle_no_return() {
172 ASSERT(false, "KASAN ERROR: Function marked 'noreturn' has returned");
173}
174
181extern "C" void __asan_alloca_poison(uintptr_t address, size_t size) {
182 //TODO: Implement stack poisoning
183 ASSERT(false, "KASAN ERROR: Stack poisoning not implemented for address 0x%lx of size %zu", address, size);
184}
185
192extern "C" void __asan_alloca_unpoison(void* stack_top, void* stack_bottom) {
193 //TODO: Implement stack unpoisoning
194 ASSERT(false, "KASAN ERROR: Stack unpoisoning not implemented for range 0x%p - 0x%p", stack_bottom, stack_top);
195}
196
203extern "C" void __asan_set_shadow_00(void* pointer, size_t size) {
204
205 // Clear the memory to mark it as unpoisoned
206 for(int i = 0; i < size; ++i)
207 ((int8_t*)pointer)[i] = 0;
208
209}
210
217extern "C" void __asan_set_shadow_f8(void *pointer, size_t size){
218
219 // Fill the memory to mark it as poisoned
220 for(int i = 0; i < size; ++i)
221 ((int8_t*)pointer)[i] = 0xF8;
222
223}
224
230extern "C" void __asan_before_dynamic_init(const void *module_name) {
231 // Nothing to do
232}
233
239 extern "C" void __asan_after_dynamic_init(const void *module_name) {
240 // Nothing to do
241 }
static void unpoison_stack(uintptr_t address, size_t size)
Marks a region of stack memory as unpoisoned (accessible)
Definition kasan.cpp:54
static void handle(bool write, uintptr_t address, size_t size, void *rip)
Handles a KASan error by panicking and printing the details.
Definition kasan.cpp:27
static void poison_stack(uintptr_t address, size_t size)
Marks a region of stack memory as poisoned (inaccessible)
Definition kasan.cpp:44
static void initialize()
Initializes the KASan handler by setting up the shadow memory.
Definition kasan.cpp:34
void __asan_load4_noabort(uintptr_t address)
Triggered when a memory load access violation of 4 bytes is detected.
Definition kasan.cpp:81
void __asan_load16_noabort(uintptr_t address)
Triggered when a memory load access violation of 16 bytes is detected.
Definition kasan.cpp:99
void __asan_store4_noabort(uintptr_t address)
Triggered when a memory store access violation of 4 bytes is detected.
Definition kasan.cpp:136
void __asan_handle_no_return()
Triggered when a function that is expected to not return does return.
Definition kasan.cpp:171
void __asan_set_shadow_00(void *pointer, size_t size)
Unpoisons a region of memory, marking it as accessible.
Definition kasan.cpp:203
void __asan_alloca_unpoison(void *stack_top, void *stack_bottom)
Unpoisons a region of stack memory allocated with alloca.
Definition kasan.cpp:192
void __asan_load2_noabort(uintptr_t address)
Triggered when a memory load access violation of 2 bytes is detected.
Definition kasan.cpp:72
void __asan_loadN_noabort(uintptr_t address, size_t size)
Triggered when a memory load access violation of arbitrary size is detected.
Definition kasan.cpp:109
void __asan_set_shadow_f8(void *pointer, size_t size)
Poisons a region of memory, marking it as inaccessible.
Definition kasan.cpp:217
void __asan_load8_noabort(uintptr_t address)
Triggered when a memory load access violation of 8 bytes is detected.
Definition kasan.cpp:90
void __asan_after_dynamic_init(const void *module_name)
Called after dynamic initialization of a module.
Definition kasan.cpp:239
void __asan_alloca_poison(uintptr_t address, size_t size)
Poisons a region of stack memory allocated with alloca.
Definition kasan.cpp:181
void __asan_storeN_noabort(uintptr_t address, size_t size)
Triggered when a memory store access violation of arbitrary size is detected.
Definition kasan.cpp:164
void __asan_store2_noabort(uintptr_t address)
Triggered when a memory store access violation of 2 bytes is detected.
Definition kasan.cpp:127
void __asan_store8_noabort(uintptr_t address)
Triggered when a memory store access violation of 8 bytes is detected.
Definition kasan.cpp:145
void __asan_before_dynamic_init(const void *module_name)
Called before dynamic initialization of a module.
Definition kasan.cpp:230
void __asan_store16_noabort(uintptr_t address)
Triggered when a memory store access violation of 16 bytes is detected.
Definition kasan.cpp:154
void __asan_load1_noabort(uintptr_t address)
Triggered when a memory load access violation of 1 byte is detected.
Definition kasan.cpp:63
void __asan_store1_noabort(uintptr_t address)
Triggered when a memory store access violation of 1 byte is detected.
Definition kasan.cpp:118
Defines structures and a handler for Kernel Address Sanitizer (KASan) runtime errors.
Defines a Logger class for logging messages with different severity levels to multiple output streams...
#define ASSERT(condition, format,...)
If the specified condition is not met then the kernel will crash with the specified message.
Definition logger.h:100