添加跳过CFI检查的机制

This commit is contained in:
liankong
2025-03-30 16:14:23 +08:00
parent f990bda4e5
commit 315df33bd6
4 changed files with 119 additions and 4 deletions

View File

@@ -175,10 +175,10 @@ struct kpm_module {
unsigned int size; /* 总大小 */
unsigned int text_size;
unsigned int ro_size;
int (*init)(const char *args, const char *event, void *__user reserved) __nocfi;
void (*exit)(void *__user reserved) __nocfi;
int (*ctl0)(const char *ctl_args, char *__user out_msg, int outlen) __nocfi;
int (*ctl1)(void *a1, void *a2, void *a3) __nocfi;
int (*init)(const char *args, const char *event, void *__user reserved);
void (*exit)(void *__user reserved);
int (*ctl0)(const char *ctl_args, char *__user out_msg, int outlen);
int (*ctl1)(void *a1, void *a2, void *a3);
struct {
const char *base;
const char *name;
@@ -937,6 +937,7 @@ static int kpm_setup_load_info(struct kpm_load_info *info)
* KPM 模块加载主流程
*----------------------------------------------------------*/
/* 注意:接口名称改为 kpm_load_module避免与内核原有 load_module 冲突 */
__nocfi
long kpm_load_module(const void *data, int len, const char *args,
const char *event, void *__user reserved)
{
@@ -1025,6 +1026,7 @@ out:
}
/* 卸载模块接口,改名为 sukisu_kpm_unload_module */
__nocfi
long sukisu_kpm_unload_module(const char *name, void *__user reserved)
{
long rc = 0;
@@ -1098,6 +1100,36 @@ free_data:
return rc;
}
/*--------------------- 地址过滤逻辑 ---------------------*/
/**
* is_allow_address - 自定义地址放行规则
* @addr: 目标函数地址
*
* 返回值: true 放行 | false 拦截
*/
bool kpm_is_allow_address(unsigned long addr)
{
struct kpm_module *pos;
bool allow = false;
spin_lock(&kpm_module_lock);
list_for_each_entry(pos, &kpm_module_list, list) {
unsigned long start_address = (unsigned long) pos->start;
unsigned long end_address = start_address + pos->size;
/* 规则1地址在KPM允许范围内 */
if (addr >= allow_start && addr <= allow_end) {
allow = true;
break;
}
}
spin_unlock(&kpm_module_lock);
// TODO: 增加Hook跳板放行机制
return allow;
}
/*-----------------------------------------------------------
* 模块管理查询接口
*----------------------------------------------------------*/