提交 5a9d9ad2 编写于 作者: L LiteOS2021

feat: L0~L1 支持Lms

1.【需求描述】:
   支持内核态和用户态堆内存非法访问检测,包括:越界访问、double free、释放后使用;支持libc常用高频函数内存检测;支持安全函数内存检测;读写检测可配可裁剪。
2.【方案描述】:
   L0 ~ L1:
   (1).影子内存映射与标记
   (2).编译器使能-fsanitize=kernel-address 自动插桩检测点
   (3).实时校验影子内存的合法性;
   (4).错误访问打印回溯栈

Close #I4HYAV
Signed-off-by: NLiteOS2021 <dinglu@huawei.com>
Change-Id: I2bbbe3f6351ee69ae36688e504a6d59d2d910f13
上级 8cb5b452
......@@ -98,6 +98,41 @@ char *basename(const char *);
#endif
#endif
#ifdef LOSCFG_KERNEL_LMS
void *__memset (void *, int, size_t);
void *__memcpy (void *__restrict, const void *__restrict, size_t);
void *__memmove (void *, const void *, size_t);
char *__strcat (char *__restrict, const char *__restrict);
char *__strncat (char *__restrict, const char *__restrict, size_t);
char *__strcpy (char *__restrict, const char *__restrict);
char *__strncpy (char *__restrict, const char *__restrict, size_t);
#if defined(__has_feature) /* clang */
#if !__has_feature(address_sanitizer)
#define memset(s, c, n) __memset(s, c, n)
#define memcpy(dst, src, len) __memcpy(dst, src, len)
#define memmove(dst, src, len) __memmove(dst, src, len)
#define strcat(dst, src) __strcat(dst, src)
#define strcpy(dst, src) __strcpy(dst, src)
#define strncat(dst, src, n) __strncat(dst, src, n)
#define strncpy(dst, src, n) __strncpy(dst, src, n)
#endif
#else /* gcc */
#if !defined(__SANITIZE_ADDRESS__)
#define memset(s, c, n) __memset(s, c, n)
#define memcpy(dst, src, len) __memcpy(dst, src, len)
#define memmove(dst, src, len) __memmove(dst, src, len)
#define strcat(dst, src) __strcat(dst, src)
#define strcpy(dst, src) __strcpy(dst, src)
#define strncat(dst, src, n) __strncat(dst, src, n)
#define strncpy(dst, src, n) __strncpy(dst, src, n)
#endif
#endif /* __has_feature */
#endif /* LOSCFG_KERNEL_LMS */
#ifdef __cplusplus
}
#endif
......
......@@ -6,7 +6,11 @@ typedef __attribute__((__may_alias__)) size_t WT;
#define WS (sizeof(WT))
#endif
#ifdef LOSCFG_KERNEL_LMS
__attribute__((no_sanitize_address)) void *__memmove(void *dest, const void *src, size_t n)
#else
void *memmove(void *dest, const void *src, size_t n)
#endif
{
char *d = dest;
const char *s = src;
......
#include <string.h>
#ifdef LOSCFG_KERNEL_LMS
__attribute__((no_sanitize_address)) char *__strcat(char *restrict dest, const char *restrict src)
#else
char *strcat(char *restrict dest, const char *restrict src)
#endif
{
strcpy(dest + strlen(dest), src);
return dest;
......
#include <string.h>
#ifdef LOSCFG_KERNEL_LMS
__attribute__((no_sanitize_address)) char *__strcpy(char *restrict dest, const char *restrict src)
#else
char *strcpy(char *restrict dest, const char *restrict src)
#endif
{
__stpcpy(dest, src);
return dest;
......
#include <string.h>
#ifdef LOSCFG_KERNEL_LMS
__attribute__((no_sanitize_address)) char *__strncat(char *restrict d, const char *restrict s, size_t n)
#else
char *strncat(char *restrict d, const char *restrict s, size_t n)
#endif
{
char *a = d;
d += strlen(d);
......
#include <string.h>
#ifdef LOSCFG_KERNEL_LMS
__attribute__((no_sanitize_address)) char *__strncpy(char *restrict d, const char *restrict s, size_t n)
#else
char *strncpy(char *restrict d, const char *restrict s, size_t n)
#endif
{
__stpncpy(d, s, n);
return d;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册