提交 cd5e5640 编写于 作者: L LiteOS2021

feat: 支持Lms

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

Close #I4HYBG
Signed-off-by: NLiteOS2021 <dinglu@huawei.com>
Change-Id: Ic17f7d4ad1f911e92b3216a8e895a5992c0faae6
上级 8cb5b452
......@@ -30,6 +30,8 @@
libc = "musl-c"
libm = "musl-m"
LITEOS_MENUCONFIG_H = rebase_path("$root_out_dir/config.h")
config("include") {
include_dirs = [ "include" ]
}
......@@ -129,15 +131,18 @@ static_library(libc) {
"src/string/memrchr.c",
"src/string/memset.c",
"src/string/stpcpy.c",
"src/string/stpncpy.c",
"src/string/strcasecmp.c",
"src/string/strcat.c",
"src/string/strchr.c",
"src/string/strchrnul.c",
"src/string/strcmp.c",
"src/string/strcpy.c",
"src/string/strcspn.c",
"src/string/strdup.c",
"src/string/strlen.c",
"src/string/strncasecmp.c",
"src/string/strncat.c",
"src/string/strncmp.c",
"src/string/strncpy.c",
"src/string/strnlen.c",
......@@ -170,6 +175,11 @@ static_library(libc) {
"//kernel/liteos_m/utils",
]
cflags = [
"-imacros",
"$LITEOS_MENUCONFIG_H",
]
public_configs = [ ":include" ]
}
......
......@@ -102,6 +102,41 @@ char *basename();
#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
......
......@@ -2,7 +2,11 @@
#include <stdint.h>
#include <endian.h>
#ifdef LOSCFG_KERNEL_LMS
__attribute__((no_sanitize_address)) void *__memcpy(void *restrict dest, const void *restrict src, size_t n)
#else
void *memcpy(void *restrict dest, const void *restrict src, size_t n)
#endif
{
unsigned char *d = dest;
const unsigned char *s = src;
......
......@@ -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>
#include <stdint.h>
#ifdef LOSCFG_KERNEL_LMS
__attribute__((no_sanitize_address)) void *__memset(void *dest, int c, size_t n)
#else
void *memset(void *dest, int c, size_t n)
#endif
{
unsigned char *s = dest;
size_t k;
......
#include <string.h>
#include <stdint.h>
#include <limits.h>
#define ALIGN (sizeof(size_t)-1)
#define ONES ((size_t)-1/UCHAR_MAX)
#define HIGHS (ONES * (UCHAR_MAX/2+1))
#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
char *__stpncpy(char *restrict d, const char *restrict s, size_t n)
{
#ifdef __GNUC__
typedef size_t __attribute__((__may_alias__)) word;
word *wd;
const word *ws;
if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) {
for (; ((uintptr_t)s & ALIGN) && n && (*d=*s); n--, s++, d++);
if (!n || !*s) goto tail;
wd=(void *)d; ws=(const void *)s;
for (; n>=sizeof(size_t) && !HASZERO(*ws);
n-=sizeof(size_t), ws++, wd++) *wd = *ws;
d=(void *)wd; s=(const void *)ws;
}
#endif
for (; n && (*d=*s); n--, s++, d++);
tail:
memset(d, 0, n);
return d;
}
weak_alias(__stpncpy, stpncpy);
#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);
while (n && *s) n--, *d++ = *s++;
*d++ = 0;
return a;
}
#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.
先完成此消息的编辑!
想要评论请 注册