当前位置: 首页 > news >正文

不可信的搜索路径(CWE-426)

漏洞描述:程序使用关键资源时(如动态链接库、执行文件、配置文件等)没有明确的指定资源的路径,而是依赖操作系统去搜索资源,这种行为可能被攻击者利用,通过在搜索优先级较高的目录放置不良资源,进而劫持程序的执行流程。

漏洞风险:攻击者可以在搜索优先级更高的文件夹中放入相同名称的资源,程序会使用攻击者控制的资源。包括:

  1. 资源劫持:攻击者可在高优先级目录中放置同名的恶意文件,程序执行时会优先加载攻击者提供的文件,而非预期的系统或可信文件。
  2. 权限提升:如果程序以高权限运行,而恶意文件存放在可写目录中,攻击者可能借助该漏洞执行恶意代码,以更高权限控制系统。
  3. 系统稳定性影响:程序加载了非预期的文件,可能导致崩溃、数据损坏或异常行为。

修复或规避建议:使用关键资源时指定资源所在的路径。包括:

  1. 显式指定资源路径:在加载关键资源(如 DLL、可执行文件、配置文件)时,使用绝对路径或受控路径,避免依赖默认搜索路径。
  2. 限制可执行文件搜索路径:使用环境变量 PATH 控制搜索顺序,并确保程序不会在不受信任的目录中查找关键资源。
  3. 最小化可写目录权限:确保应用程序的可执行目录不可由普通用户或低权限进程修改,防止攻击者放置恶意文件。
  4. 代码审计与检测:使用静态分析工具或代码审查机制,检测程序是否存在不可信的搜索路径问题。
  5. 使用库加载安全机制(适用于 Windows):
    • 使用 SetDllDirectory(NULL) 禁用当前工作目录的搜索。
    • 使用 LoadLibraryEx 并指定 LOAD_LIBRARY_SEARCH_SYSTEM32 以确保仅从系统目录加载 DLL。
    • 在 Linux 上,可使用 LD_LIBRARY_PATH 进行控制,并避免在 .(当前目录)等不安全路径中查找库文件。

1:不规范用法

public class Example{

       private String command;  //本例中command = "dir.exe E:\\data"

       public void exampleFun(void) {  

              //攻击者可在搜索优先级更高的文件夹中放入和dir.exe网名的恶意程序导致command的内容无法正确执行

             

              Runtime.getRuntime().exec(command);

              //其它语句

    }

}

该漏洞类型与C/C++中的不可信的搜索路径相同,都是攻击者在搜索优先级更高的文件夹下放置名称为dir.exe的文件,则程序执行中,则替换了系统中的dir命令。通过阅读字节码了解到没有设定路径,则攻击者就可以构造同名的可执行程序,让程序去执行,控制程序的执行行为,存在风险。

示例2:不规范用法(Windows下不安全加载)

#include <stdlib.h>

int main() {

    system("dir");

    return 0;

}

题分析

  • system("dir") 依赖操作系统的 PATH 变量进行可执行文件搜索。
  • 攻击者可以在 PATH 变量优先搜索的目录(如当前目录)放置一个恶意的 dir.exe,使程序执行恶意代码。

示例3:不规范用法(Linux下不安全的加载)

#include <dlfcn.h>

int main() {

    void* handle = dlopen("libexample.so", RTLD_LAZY);

    if (!handle) {

        return -1;

    }

    return 0;

}

dlopen("libexample.so", RTLD_LAZY) 可能会在 LD_LIBRARY_PATH 指定的路径或当前目录中查找 libexample.so,存在被攻击者劫持的风险。

示例4:规范用法之一(Windows下用法之1

public class Example{

       private String command;  //本例中command = "dir.exe E:\\data"

       public void exampleFun(void) {  

              //PATH是存放操作系统中dir.exe命令所在完整路径的常量,本例中PATH="C:\\WINDOWS\\system32";

              String cmd = PATH +command;  //使用完整路径确保command的内容能正确执行

              Runtime.getRuntime().exec(cmd);

              //其它语句

    }

}

限定了路径,使攻击者不会轻易能够进入到服务器的系统路径去放置同名的可执行程序。攻击难度加大。

示例5:规范用法(Windows下用法之2

#include <stdlib.h>

int main() {

    system("C:\\Windows\\System32\\dir.exe");

    return 0;

}

显式指定 dir.exe 所在的绝对路径,确保程序只执行系统提供的命令。

示例6:规范用法(Windows下用法之3

#include <windows.h>

int main() {

    STARTUPINFO si = { sizeof(si) };

    PROCESS_INFORMATION pi;

    if (CreateProcess("C:\\Windows\\System32\\cmd.exe", "/c dir", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {

        WaitForSingleObject(pi.hProcess, INFINITE);

        CloseHandle(pi.hProcess);

        CloseHandle(pi.hThread);

    }

    return 0;

}

使用 CreateProcess 直接指定 cmd.exe 的路径,防止执行路径被劫持。

示例7:规范用法(Linux下)

#include <dlfcn.h>

int main() {

    void* handle = dlopen("/usr/lib/libexample.so", RTLD_LAZY);

    if (!handle) {

        return -1;

    }

    return 0;

}

通过绝对路径加载动态库,防止从不受信任的目录加载恶意库文件

总结

  • 不要依赖默认的搜索路径,始终指定绝对路径或受控路径。
  • 最小化可写权限,确保攻击者无法修改或放置恶意文件。
  • 使用安全 API(如 CreateProcess 替代 system,LoadLibraryEx 指定安全路径)。
  • 代码审计和检测,定期扫描代码中的不可信搜索路径风险。

这样可以有效防止不可信搜索路径漏洞,提高系统安全性。

http://www.lryc.cn/news/531759.html

相关文章:

  • Linux——基础命令
  • 利用TensorFlow.js实现浏览器端机器学习:一个全面指南
  • 利用HTML和css技术编写学校官网页面
  • SpringSecurity密码编码器:使用BCrypt算法加密、自定义密码编码器
  • 笔记:新能源汽车零部件功率级测试怎么进行?
  • ES6中的map和原生的对象有什么区别?
  • 2502vim,vim文本对象中文文档
  • spring security与gateway结合进行网关鉴权和授权
  • LabVIEW在电机自动化生产线中的实时数据采集与生产过程监控
  • log4j2日志配置文件
  • 用Deepseek做EXCLE文件对比
  • Tailwind CSS v4.0 升级与 Astro 5.2 项目迁移记录
  • TongSearch3.0.4.0安装和使用指引(by lqw)
  • 低代码产品表单渲染架构
  • windows 剪切板的写入、读取,包括图片,文本内容
  • Matplotlib 高级图表绘制与交互式可视化(mpld3)
  • (9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,
  • 专业学习|通过案例了解蒙特卡罗模拟实操步骤与含义
  • 云端智慧:创业公司如何以全球视野选择最佳平台,实现业务新高度
  • 【工具变量】中国省级八批自由贸易试验区设立及自贸区设立数据(2024-2009年)
  • 猫眼Java开发面试题及参考答案(上)
  • WSL2中安装的ubuntu开启与关闭探讨
  • Linux抢占式内核:技术演进与源码解析
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.28 NumPy+Matplotlib:科学可视化的核心引擎
  • C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】
  • 【深度学习入门_机器学习理论】朴素贝叶斯(NaiveBayes)
  • docker pull Error response from daemon问题
  • javaEE-8.JVM(八股文系列)
  • 25.02.04 《CLR via C#》 笔记 13
  • git 项目的更新