Path Manipulation 路径操作

本文深入探讨了PathManipulation漏洞的原理,展示了攻击者如何利用此类漏洞访问或修改受保护的文件,通过具体代码示例说明了在不同平台下(如Web应用、Android应用)的漏洞实现方式,并提出了防范措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Abstract:
攻击者可以控制 AttachmentController.java 中第 205 行的 File() 文件系统路径参数,借此访问或修改其他受保护的文件。
Explanation:
当满足以下两个条件时,就会产生 path manipulation 错误:
1. 攻击者可以指定某一文件系统操作中所使用的路径。
2. 攻击者可以通过指定特定资源来获取某种权限,而这种权限在一般情况下是不可能获得的。
例如,在某一程序中,攻击者可以获得特定的权限,以重写指定的文件或是在其控制的配置环境下运行程序。
在这种情况下,攻击者可以指定通过 AttachmentController.java 中第 155 行的 getParameter() 进入程序的值,这一数值可以通过 AttachmentController.java 中第 205 行的 File() 访问文件系统资源。
例 1: 下面的代码使用来自于 HTTP 请求的输入来创建一个文件名。程序员没有考虑到攻击者可能使用像“../../tomcat/conf/server.xml”一样的文件名,从而导致应用程序删除它自己的配置文件。
String rName = request.getParameter("reportName");
File rFile = new File("/usr/local/apfr/reports/" + rName);
...
rFile.delete();
例 2: 下面的代码使用来自于配置文件的输入来决定打开哪个文件,并返回给用户。如果程序在一定的权限下运行,且恶意用户能够篡改配置文件,那么他们可以通过程序读取系统中以 .txt 扩展名结尾的所有文件。
fis = new FileInputStream(cfg.getProperty("sub")+".txt");
amt = fis.read(arr);
out.println(arr);
有些人认为在移动世界中,典型的漏洞(如 path manipulation)是无意义的 -- 为什么用户要攻击自己?但是,谨记移动平台的本质是从各种来源下载并在相同设备上运行的应用程序。恶意软件在银行应用程序附近运行的可能性很高,它们会强制扩展移动应用程序的攻击面(包括跨进程通信)。
例 3:以下代码将例 1 改编为适用于 Android 平台。
...
        String rName = this.getIntent().getExtras().getString("reportName");         File rFile = getBaseContext().getFileStreamPath(rName);
...
        rFile.delete();
...
Instance ID: 4EA59B14A6FC04D779BE37727BD5543F
Priority Metadata Values:
            IMPACT: 3.0
            LIKELIHOOD: 3.2
Legacy Priority Metadata Values:
            SEVERITY: 3.0
            CONFIDENCE: 5.0
Remediation Effort: 3.0

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Recommendations:
防止 path manipulation 的最佳方法是采用一些间接手段:例如创建一份合法资源名的列表,并且规定用户只能选择其中的文件名。通过这种方法,用户就不能直接由自己来指定资源的名称了。
但在某些情况下,这种方法并不可行,因为这样一份合法资源名的列表过于庞大、难以跟踪。因此,程序员通常在这种情况下采用黑名单的办法。在输入之前,黑名单会有选择地拒绝或避免潜在的危险字符。但是,任何这样一份黑名单都不可能是完整的,而且将随着时间的推移而过时。更好的方法是创建一份白名单,允许其中的字符出现在资源名称中,且只接受完全由这些被认可的字符组成的输入。
Tips:
1. 如果程序正在执行输入验证,那么您就应确信此验证正确无误,并使用 HPE Security Fortify Custom Rules Editor(HPE Security Fortify 自定义规则编辑器)为该验证例程创建清理规则。
2. 执行有效的黑名单是一件非常困难的事情。如果验证逻辑依赖于黑名单,那么有必要对这种逻辑进行质疑。鉴于不同类型的输入编码以及各种元字符集在不同的操作系统、数据库或其他资源中可能有不同的含义,确定随着需求的不断变化,黑名单能否方便、正确、完整地进行更新。
3. 许多现代 Web 框架都提供对用户输入执行验证的机制。其中包括 Struts 和 Spring MVC。为了突出显示未经验证的输入源,HPE Security Fortify 安全编码规则包会降低 HPE Security Fortify Static Code Analyzer(HPE Security Fortify 静态代码分析器)报告的问题被利用的可能性,并在使用框架验证机制时提供相应的依据,以动态重新调整问题优先级。我们将这种功能称之为上下文敏感排序。为了进一步帮助 HPE Security Fortify 用户执行审计过程,HPE Security Fortify 软件安全研究团队提供了数据验证项目模板,该模板会根据应用于输入源的验证机制,将问题分组到多个文件夹中。
References:
[1] G. Hoglund, G. McGraw, Exploiting Software, Addison-Wesley, 2004
[4] Standards Mapping - Common Weakness Enumeration, CWE ID 22, CWE ID 73
[5] Standards Mapping - FIPS200, SI
[6] Standards Mapping - NIST Special Publication 800-53 Revision 4, SI-10 Information Input Validation (P1)
[7] Standards Mapping - OWASP Mobile Top 10 Risks 2014, M8 Security Decisions Via Untrusted Inputs
[8] Standards Mapping - OWASP Top 10 2004, A1 Unvalidated Input
[9] Standards Mapping - OWASP Top 10 2007, A4 Insecure Direct Object Reference
[10] Standards Mapping - OWASP Top 10 2010, A4 Insecure Direct Object References
[11] Standards Mapping - OWASP Top 10 2013, A4 Insecure Direct Object References
[12] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1, Requirement 6.5.1
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2, Requirement 6.3.1.1, Requirement 6.5.4
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0, Requirement 6.5.8
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0, Requirement 6.5.8
[16] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1, Requirement 6.5.8
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2, Requirement 6.5.8
[18] Standards Mapping - SANS Top 25 2009, Risky Resource Management - CWE ID 426
[19] Standards Mapping - SANS Top 25 2010, Risky Resource Management - CWE ID 022
[20] Standards Mapping - SANS Top 25 2011, Risky Resource Management - CWE ID 022
[21] Standards Mapping - Security Technical Implementation Guide Version 3.1, APP3510 CAT I, APP3600 CAT II
[22] Standards Mapping - Security Technical Implementation Guide Version 3.10, APP3510 CAT I, APP3600 CAT II
[23] Standards Mapping - Security Technical Implementation Guide Version 3.4, APP3510 CAT I, APP3600 CAT II
[24] Standards Mapping - Security Technical Implementation Guide Version 3.5, APP3510 CAT I, APP3600 CAT II
[25] Standards Mapping - Security Technical Implementation Guide Version 3.6, APP3510 CAT I, APP3600 CAT II
[26] Standards Mapping - Security Technical Implementation Guide Version 3.7, APP3510 CAT I, APP3600 CAT II
[27] Standards Mapping - Security Technical Implementation Guide Version 3.9, APP3510 CAT I, APP3600 CAT II
[28] Standards Mapping - Security Technical Implementation Guide Version 4.1, APSC-DV-002560 CAT I
[29] Standards Mapping - Web Application Security Consortium 24 + 2, Path Traversal
[30] Standards Mapping - Web Application Security Consortium Version 2.00, Path Traversal (WASC-33)
<think>首先,用户的问题是关于解决Fortify报告中的Path Manipulation漏洞。用户问:"我想解决Fortify报告中的Path Manipulation漏洞 请问Fortify Path Manipulation 漏洞修复方法"。根据系统指令,我需要用中文回答,结构清晰,逐步解决问题。 回顾引用内容: - 引用[1]:解释了Path Manipulation漏洞,通过代码操作文件时,如果不检查路径,可能导致安全隐患。 - 引用[2]:给出了黑客请求的例子,如http://localhost:8080/pathManipulation/download?fileName=../../../../../etc/passwd,建议修复方案。 - 引用[3]:讨论了规范化文件路径的方法,包括移除多余斜杠、处理相对路径、解析.和..等。 - 引用[4]:提到修复方案,如使用FileInputStream时处理路径。 关键点:Path Manipulation漏洞发生在当用户输入用于文件操作时,没有验证路径,可能导致访问修改系统敏感文件。 修复方法的核心: 1. **输入验证**:验证用户提供的路径是否合法。 2. **路径规范化**:使用库函数规范化路径,移除潜在危险部分。 3. **白名单黑名单**:限制允许的路径。 4. **使用安全API**:如Java中的FilenameUtils.normalize等。 我的回答需要结构化: - 先解释漏洞是什么。 - 然后给出修复步骤。 - 最后生成相关问题。 系统指令要求: - 内数学表达式用$...$,但这里可能不需要数学公式。 - 独立公式用$$...$$,但同样可能不适用。 - LaTeX语法正确。 - 使用中文。 - 生成相关问题。 - 在引用段落末尾添加引用标识。 - 回答结构清晰,真实可靠。 生成相关问题:在回答后,添加"§§相关问题§§"部分,列出几个相关问题。 回答结构: 1. **介绍Path Manipulation漏洞**:简要解释。 2. **修复方法**:分步骤说明。 - 输入验证 - 路径规范化 - 使用白名单 - 示例代码 3. **总结** 4. **相关问题** 添加引用:在相关地方添加引用标识。例如,提到漏洞解释时加[^1],修复方案时加[^2][^3][^4]。 最终输出格式: - 回答部分。 - §§相关问题§§ - 相关问题列表。</think>### Fortify Path Manipulation 漏洞修复方法 Path Manipulation路径篡改)漏洞是一种常见的安全风险,发生在应用程序使用用户输入(如文件名路径)直接进文件操作时(例如读取、写入删除文件)。攻击者可能通过注入恶意路径(如`../../../../../etc/passwd`)访问破坏系统敏感文件,导致数据泄露系统崩溃[^1][^2]。Fortify 静态分析工具报告此漏洞时,表明代码中存在未经验证的文件路径处理。以下我将逐步介绍修复方法,确保修复过程可靠且易于实施。 #### 步骤 1: 理解漏洞原理 - **漏洞原因**:当用户输入直接用于文件操作函数(如Java的`FileInputStream`.NET的`File.Delete`)时,未对路径验证规范化,攻击者可构造相对路径(如`..`)跳出安全目录。 - **风险示例**:黑客请求如 `http://localhost:8080/download?fileName=../../../../../etc/passwd`,可能读取系统密码文件[^2]。 - **关键点**:修复的核心是 **输入验证** 和 **路径规范化**,防止路径遍历攻击。 #### 步骤 2: 实施修复方案 修复Path Manipulation漏洞主要包括三个核心策略:输入验证、路径规范化、和安全API使用。以下是具体方法: 1. **输入验证(白名单/黑名单过滤)** - **原理**:限制用户输入的路径只允许合法字符目录,避免特殊字符(如`..``/`)被注入。 - **方法**: - **白名单**:定义允许的字符集(如字母、数字、连字符),拒绝其他输入。例如,在Java中: ```java if (!fileName.matches("[a-zA-Z0-9-]+\\.[a-z]+")) { throw new IllegalArgumentException("Invalid file name"); } ``` - **黑名单**:过滤已知危险字符(如`../`),但白名单更安全,因为黑名单可能遗漏新攻击向量[^1][^4]。 - **优点**:简单高效,适用于文件名路径参数。 2. **路径规范化** - **原理**:将用户输入路径转换为绝对路径,移除冗余部分(如多余斜杠`.`/`..`),确保路径在安全目录内。 - **方法**: - 使用库函数规范化路径: - **Java**:利用`FilenameUtils.normalize`(来自Apache Commons IO): ```java String safePath = FilenameUtils.normalize(userInputPath); File file = new File(safePath); ``` `normalize` 函数会自动处理: - 移除连续斜杠(如`//` 变为 `/`)。 - 解析`.`(当前目录)和`..`(上级目录)。 - 返回绝对路径[^3]。 - **.NET**:使用`Path.GetFullPath`: ```csharp string safePath = Path.GetFullPath(Path.Combine("safeBaseDir", userInputPath)); ``` - **关键注意**:规范化后,需检查路径是否在预期目录内(如应用根目录),避免路径“逃逸”: ```java File baseDir = new File("/safe/app/dir"); File resolvedFile = new File(baseDir, safePath); if (!resolvedFile.getCanonicalPath().startsWith(baseDir.getCanonicalPath())) { throw new SecurityException("Path traversal attempt detected"); } ``` 3. **使用安全API和编码实践** - **避免直接使用用户输入**:不要将用户输入直接传递给文件操作函数。先存储到临时变量并验证。 - **示例修复代码**(基于引用[4]的案例): - **漏洞代码**: ```java fis = new FileInputStream(cfg.getProperty("sub") + ".txt"); // 直接使用配置输入 ``` - **修复后代码**: ```java String userInput = cfg.getProperty("sub"); if (userInput == null || !userInput.matches("[a-z0-9]+")) { throw new IllegalArgumentException("Invalid input"); } String safePath = FilenameUtils.normalize("baseDir/" + userInput + ".txt"); File downLoadFile = new File(safePath); fis = new FileInputStream(downLoadFile); ``` - **其他语言**:在Python中,使用`os.path.abspath`和`os.path.normpath`;在C#中,结合`Path.Combine`和验证。 #### 步骤 3: 测试和验证 - **测试方法**: - 单元测试:模拟恶意输入(如`../../etc/passwd`),确保抛出异常返回错误。 - Fortify 重新扫描:修复后运Fortify,确认漏洞已解决。 - 渗透测试:使用工具(如OWASP ZAP)测试路径遍历攻击。 - **最佳实践**: - 最小权限原则:运应用的账户应仅有必要文件访问权限。 - 日志监控:记录所有文件操作,便于审计异常为[^3][^4]。 #### 总结 修复Path Manipulation漏洞的关键是 **严格输入验证 + 路径规范化**。优先使用白名单和库函数(如`FilenameUtils.normalize`),能有效防御攻击。修复后,Fortify报告应不再显示此漏洞。如果您的代码环境复杂,建议参考Fortify官方文档安全框架(如OWASP Top 10)以增强防御[^1][^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值