【Bug已解决】Filesystem file search rejects valid path segments containing double dots
【Bug已解决】Filesystem file search rejects valid path segments containing double dots一、现象长什么样某文件系统的文件搜索工具比如 agent 用来在目录里找文件的FileSystem工具带一个防路径穿越path traversal的保护拒绝任何包含..的路径防止用户/模型读到上级目录。但这个保护过激了——它把路径里出现..子串一律拒绝连合法的、非穿越的..用法也挡掉了以..开头的隐藏文件如..bashrc少见但合法、..hidden。文件名中间含连续两点如report..final.md、a..b.txt、v1..2用户用..当分隔符。某些工具把..用于相对上移以外语义比如版本或命名约定。结果用户明明要搜一个就叫report..final.md的文件工具直接ValueError: path traversal detected拒绝明明没有穿越意图。过度防御变成了功能缺陷。二、背景路径穿越防护的标准写法是解析路径后检查是否有段等于..即os.path.normpath之后是否跳出 base。但偷懒的实现直接做字符串检查if .. in path: raise ValueError(path traversal detected).. in path会匹配任何包含连续两点的字符串包括report..final.md。真正该防的是..作为路径段被/包围或位于段首而不是..作为子串。合法文件名里..完全可能出现Unix 允许文件名包含几乎任何字符除了/和 NUL。所以含..即拒绝是错误的启发式。三、根因根因是把子串包含当成路径段穿越子串匹配误判.. in path命中所有连续两点不论其是否构成路径段。未做路径归一化再判段正确做法是用os.path.normpath/PurePosixPath解析再检查每个段是否等于..或解析后是否仍在 base 内。混淆文件名里的..与目录里的..前者是普通字符后者才是穿越。本质用字符串启发式替代了正确的路径语义解析把合法的命名字符当成了攻击特征。四、最小可运行复现下面缩略逻辑复现误拒def bad_safe(path): if .. in path: # 错误子串匹配 raise ValueError(path traversal detected) return path for p in [report..final.md, ../etc/passwd, a..b.txt]: try: print(p, -, bad_safe(p)) except ValueError as e: print(p, - REJECTED:, e) # report..final.md - REJECTED (合法却被拒) # ../etc/passwd - REJECTED (正确拒绝) # a..b.txt - REJECTED (合法却被拒)修复用路径归一化只在段等于 .. 且导致越界时拒绝。from pathlib import Path def good_safe(path, base): resolved (base / path).resolve() base_resolved Path(base).resolve() if base_resolved not in resolved.parents and resolved ! base_resolved: raise ValueError(path escapes base) return resolved五、解决方案第一层最小直接修复最小修法放弃子串检查改为路径解析后判断是否仍在 base 之内..只有当它真的导致跳出 base 时才拒绝文件名里的..不受影响。from pathlib import Path def is_safe_under(path: str, base: str) - bool: base_r Path(base).resolve() target (base_r / path).resolve() return base_r in target.parents or target base_r def search_file(path, base): if not is_safe_under(path, base): raise ValueError(path escapes base directory) # 继续搜索 ...这一层让report..final.md正常通过../etc/passwd正确拒绝。六、解决方案第二层结构化改进把路径穿越判定规则固化成策略对象作为单一事实来源明确按段解析而非子串。from dataclasses import dataclass from pathlib import Path from typing import List dataclass(frozenTrue) class LangChainFilesystemSearchPolicy: 文件系统搜索路径安全策略的单一事实来源。 forbid_substring_double_dot: bool False # 必须为 False否则误拒 resolve_and_contain: bool True allow_dotfiles: bool True def is_safe(self, path: str, base: str) - bool: if self.forbid_substring_double_dot: raise AssertionError(substring .. check causes false rejects) base_r Path(base).resolve() target (base_r / path).resolve() return self.resolve_and_contain and ( base_r in target.parents or target base_r ) def validate(self) - None: if self.forbid_substring_double_dot: raise AssertionError(must use segment-based check, not substring)搜索工具用policy.is_safe安全性由解析后是否越界决定而非文件名长什么样。七、解决方案第三层断言 / CI 守护用 pytest 锁死正确判定import pytest from pathlib import Path from policy import LangChainFilesystemSearchPolicy as P def test_legal_double_dot_allowed(tmp_path): p P() (tmp_path / report..final.md).write_text(x) assert p.is_safe(report..final.md, str(tmp_path)) is True def test_traversal_rejected(tmp_path): p P() assert p.is_safe(../etc/passwd, str(tmp_path)) is False def test_no_substring_check(): with pytest.raises(AssertionError): P(forbid_substring_double_dotTrue).validate() def test_dotfile_allowed(tmp_path): p P() (tmp_path / ..hidden).write_text(x) assert p.is_safe(..hidden, str(tmp_path)) is TrueCI 加一条FileSystem搜索单测必须覆盖文件名含..的合法用例断言不被拒并覆盖真实穿越用例断言被拒。八、排查清单搜report..final.md被拒→ 搜索用了.. in path子串检查误判。文件名里的..是否合法→ Unix 文件名可含..非穿越。是否做了路径归一化→ 用Path.resolve()再判断是否越界 base。真穿越../是否被拒→ 归一化后段为..且越界应拒。CI 是否禁止子串检查→ 扫描.. in路径校验。隐藏文件..x是否放行→ 应放行合法命名。九、小结文件系统文件搜索把路径里出现..子串一律拒绝误伤了文件名中合法含..的情况如report..final.md、隐藏文件..hidden过度防御变成功能缺陷。根因是用字符串子串匹配替代了正确的路径语义解析。第一层改为路径归一化后判断是否越界 base第二层用LangChainFilesystemSearchPolicy把判定规则固化成单一事实来源并禁止子串检查第三层用 pytest 守护合法..文件名被放行、真实穿越被拒。路径安全的通用原则按解析后的路径段判断是否越界而非按文件名长相做字符串启发式。

相关新闻

猫抓浏览器资源嗅探插件上手指南:把网页里的视频和图片一次捞干净

猫抓浏览器资源嗅探插件上手指南:把网页里的视频和图片一次捞干净

猫抓浏览器资源嗅探插件上手指南:把网页里的视频和图片一次捞干净 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 周四晚上十点&#x…

2026/8/18 9:22:48 阅读更多 →
基于LLM与智能体架构的自动化安全警报调查系统设计与实践

基于LLM与智能体架构的自动化安全警报调查系统设计与实践

1. 项目概述:当安全警报遇上智能体 每天,安全运营中心(SOC)的屏幕上都会滚动着成千上万条安全警报。从防火墙的端口扫描告警,到入侵检测系统(如Suricata)标记的可疑网络流量,再到服务…

2026/8/18 9:21:47 阅读更多 →
AI工程插件开发实战:从环境配置到CAD/SolidWorks集成

AI工程插件开发实战:从环境配置到CAD/SolidWorks集成

1. 先搞清楚“AI做工程插件”到底在解决什么问题 如果你在找“AI做工程插件”的学习路线,大概率是遇到了这几个实际问题: 想用AI提升CAD、SolidWorks这类专业软件的效率,但不知道从哪开始;网上资料太零散,配置环境就卡…

2026/8/18 9:21:47 阅读更多 →

最新新闻

HarmonyOS 7.0 / API 26 FaceAR 预览帧节流:识别和渲染如何避免互相抢帧

HarmonyOS 7.0 / API 26 FaceAR 预览帧节流:识别和渲染如何避免互相抢帧

先看问题为什么会发生 这篇只抓一个点:FaceAR 预览帧节流。我不按概念顺序铺开,而是按项目里最容易出问题的路径来拆:先复现坏写法,再补上边界判断,最后用日志和状态验证结果。 FaceAR 页面最容易把识别、渲染和 UI 动…

2026/8/18 10:29:20 阅读更多 →
HarmonyOS 7.0 / API 26 隔空投送失败归因:发现、传输和权限三段日志怎么留

HarmonyOS 7.0 / API 26 隔空投送失败归因:发现、传输和权限三段日志怎么留

先看问题为什么会发生 这篇只抓一个点:隔空投送失败归因。我不按概念顺序铺开,而是按项目里最容易出问题的路径来拆:先复现坏写法,再补上边界判断,最后用日志和状态验证结果。 隔空投送失败时,用户只看到失…

2026/8/18 10:29:20 阅读更多 →
HarmonyOS 7.0 / API 26 碰一碰分享回执:近场触发后如何确认对方真的接收

HarmonyOS 7.0 / API 26 碰一碰分享回执:近场触发后如何确认对方真的接收

先看问题为什么会发生 这篇只抓一个点:碰一碰分享回执闭环。我不按概念顺序铺开,而是按项目里最容易出问题的路径来拆:先复现坏写法,再补上边界判断,最后用日志和状态验证结果。 近场分享看起来很短,实际上…

2026/8/18 10:29:20 阅读更多 →
开会 2 小时,他 10 分钟甩出带责任人的纪要:同事偷偷用了这 3 步

开会 2 小时,他 10 分钟甩出带责任人的纪要:同事偷偷用了这 3 步

周五下午 4 点,同事小张从一场 3 小时的复盘会出来,10 分钟后,一份带着责任人、截止日期的纪要就甩进了群里。我问他是不是偷偷请了助理,他反手甩给我一句话:“腾讯会议把录音转写免费了,剩下的,是技巧。” 今天不堆工具,只讲一件事:怎么让 AI 从"复读机"变成"会…

2026/8/18 10:29:20 阅读更多 →
如何解读汽车配置表:从名爵6看配置背后的产品策略与购车决策

如何解读汽车配置表:从名爵6看配置背后的产品策略与购车决策

1. 从一则配置信息说起:我们到底在关注什么?4月27日,2019款名爵6的配置信息公布了。这看起来只是一条普通的汽车行业资讯,但如果你像我一样,在汽车媒体和用户社区里泡了十几年,你就会发现,每一次…

2026/8/18 10:29:20 阅读更多 →
30分钟让Zotero看懂中文文献:Jasminum茉莉花插件完整上手实测

30分钟让Zotero看懂中文文献:Jasminum茉莉花插件完整上手实测

30分钟让Zotero看懂中文文献:Jasminum茉莉花插件完整上手实测 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum Jasminu…

2026/8/18 10:28:19 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →