[论文解读] A Simple and Intuitive Algorithm for Preventing Directory Traversal Attacks
本文提出了一种轻量级的基于栈的算法 $sanitize$,通过安全地规范化用户提供的路径字符串来防止目录遍历攻击。该算法结合了路径字符串规范化与白名单机制,形式化证明正确,设计直观,跨平台,且可通过符号执行轻松验证,为Web应用程序中的路径遍历漏洞提供了强大而实用的防护。
With web applications becoming a preferred method of presenting graphical user interfaces to users, software vulnerabilities affecting web applications are becoming more and more prevalent and devastating. Some of these vulnerabilities, such as directory traversal attacks, have varying defense mechanisms and mitigations that can be difficult to understand, analyze, and test. Gaps in the testing of these directory traversal defense mechanisms can lead to vulnerabilities that allow attackers to read sensitive data from files or even execute malicious code. This paper presents an analysis of some currently used directory traversal attack defenses and presents a new, stack-based algorithm to help prevent these attacks by safely canonicalizing user-supplied path strings. The goal of this algorithm is to be small, easy to test, cross-platform compatible, and above all, intuitive. We provide a proof of correctness and verification strategies using symbolic execution for the algorithm. We hope that the algorithm is simple and effective enough to help move developers towards a unified defense against directory traversal attacks.
研究动机与目标
- 为应对Web应用程序中日益普遍的目录遍历漏洞,尽管此类漏洞占2017年披露漏洞的22%,但常被忽视。
- 通过设计统一、轻量的解决方案,克服现有缓解措施的局限性,如内存安全问题、语义不一致性和缺乏可移植性。
- 提供一种简单、自包含的算法,易于在不同编程语言和平台中实现、验证和扩展。
- 通过符号执行实现形式化正确性证明,并支持自动化验证,增强开发者对安全部署的信心。
提出的方法
- 该算法采用基于栈的方法处理路径组件,以受控方式解析相对路径段如 "." 和 ".."。
- 通过遍历每个路径组件并维护有效目录路径的栈,对用户提供的路径字符串进行规范化,确保仅生成安全的绝对路径。
- 通过将输出限制在预定义的允许路径集合内,实现白名单机制,防止访问敏感或未授权的目录。
- 避免依赖底层文件系统或操作系统特定的路径解析机制,确保跨平台一致性与可移植性。
- 使用符号执行对算法进行形式化验证,支持在多样化输入场景下自动化测试与正确性验证。
- 实现设计简洁自包含,无需外部库或系统调用,可轻松适配具备内置栈或容器支持的语言。
实验结果
研究问题
- RQ1如何在保持安全、跨平台的同时,使目录遍历防御机制既简单又可形式化验证?
- RQ2基于栈的规范化算法在正确性、安全性及实现简便性方面是否优于现有方法?
- RQ3将规范化与白名单结合,在不引入新漏洞的前提下,能在多大程度上提升安全性?
- RQ4符号执行在验证路径净化算法正确性方面的有效性如何?
- RQ5轻量级、直观的算法是否能降低现实世界Web应用开发中的实现错误风险?
主要发现
- $sanitize$ 算法通过基于栈的方法安全解析路径组件,成功防止了目录遍历攻击,确保仅生成有效、绝对路径。
- 通过符号执行的形式化验证确认,该算法对长度不超过12个字符的所有输入均正确,验证时间适合集成到开发工作流中。
- 该算法具有跨平台特性,不依赖操作系统特定的路径解析机制,避免了不同操作系统间的不一致性。
- 尽管未完全模拟文件系统行为,但结合白名单机制后,该算法仍保持安全,能正确解析如 "../../" 和 "./" 等路径,其行为与预期访问控制一致。
- 该算法易于扩展——例如支持通配符或在路径前添加Web应用程序根目录——且不损害安全性或简洁性。
- 与依赖字符串操作或文件系统调用的方法相比,该方法减少了攻击面,同时缓解了低级实现中与内存安全相关的风险。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。