已使用绝对路径仍遭Fortify报过程控制问题求解决方案
Fortify 过程控制告警问题排查与解决
问题背景
我在处理Fortify报告的过程控制问题时遇到困惑:Fortify提示filename.c中的load()函数调用dlopen()未指定绝对路径,存在加载恶意库的风险,但我在调用该函数时已经传入了绝对路径。
我的代码示例:
void* load(char* name) { void* handle; handle = dlopen(name, RTLD_LAZY | RTLD_GLOBAL); return(handle); } void somefunc() { void *login_module_handle = load("/home/myuser/load_this_shared_lib.so"); }
Fortify给出的建议:
- 尽可能由应用控制库,并使用绝对路径加载。
- 若编译时未知路径(如跨平台应用),需在运行时基于已知值构造绝对路径。
告警原因
Fortify的数据流分析核心关注函数本身的安全性,而非单一调用点的参数。你的load()函数接收一个未做校验的char* name参数,Fortify会判定该函数存在被传入相对路径、恶意路径的潜在风险——哪怕当前调用用了绝对路径,后续其他调用仍可能传入不安全路径,因此触发告警。
解决建议
方案1:在load()内部强制校验绝对路径
修改函数,先验证传入路径是否为Unix/Linux标准的绝对路径(以/开头),不符合则拒绝加载:
#include <string.h> #include <stdio.h> void* load(char* name) { void* handle = NULL; // 校验路径合法性 if (name == NULL || name[0] != '/') { fprintf(stderr, "Error: Only absolute paths are allowed for library loading\n"); return NULL; } handle = dlopen(name, RTLD_LAZY | RTLD_GLOBAL); return handle; }
方案2:将load()改为固定路径专用函数
如果加载的库路径固定,直接在函数内部硬编码绝对路径,避免接收外部参数:
void* load_login_module() { void* handle; handle = dlopen("/home/myuser/load_this_shared_lib.so", RTLD_LAZY | RTLD_GLOBAL); return handle; } void somefunc() { void *login_module_handle = load_login_module(); }
方案3:运行时基于安全根目录构造绝对路径
若需动态生成路径,基于应用可控的安全根目录拼接,同时防范路径遍历攻击:
#include <stdlib.h> #include <string.h> void* load_safe(const char* lib_name) { void* handle = NULL; const char* SAFE_ROOT = "/home/myuser/"; // 不可被用户修改的安全根目录 char* full_path = malloc(strlen(SAFE_ROOT) + strlen(lib_name) + 1); if (full_path == NULL) return NULL; strcpy(full_path, SAFE_ROOT); strcat(full_path, lib_name); // 额外校验:防止传入包含".."的路径遍历攻击 if (strstr(full_path, "..") != NULL) { free(full_path); return NULL; } handle = dlopen(full_path, RTLD_LAZY | RTLD_GLOBAL); free(full_path); return handle; }
方案4:标记误报(临时措施,不推荐)
若能确认所有load()调用点均使用安全绝对路径,可在Fortify中标记该告警为误报或添加自定义规则排除,但此方法会降低检测覆盖率,仅建议在充分验证风险后使用。
内容的提问来源于stack exchange,提问作者RandomGuy
相关产品推荐
相关产品推荐

