You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已使用绝对路径仍遭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给出的建议:

  1. 尽可能由应用控制库,并使用绝对路径加载。
  2. 若编译时未知路径(如跨平台应用),需在运行时基于已知值构造绝对路径。

告警原因

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:24:13