CVE-2025-68146filelock是一款Python平台无关的文件锁库。在3.20.1之前的版本中,存在一处时序检查-使用时(TOCTOU)竞态条件漏洞,允许本地攻击者通过符号链接攻击破坏或截断任意用户文件。该漏洞影响Unix、Linux、macOS和Windows系统上的所有filelock用户。攻击者利用filelock在检查文件是否存在与使用O_TRUNC打开文件之间的时间窗口,在检查完成后、打开操作前插入指向目标文件的符号链接,从而导致os.open()跟随符号链接并截断目标文件。此漏洞还会级联影响依赖filelock的其他第三方库。攻击需要本地文件系统访问权限以及创建符号链接的能力(在Unix系统为标准用户权限,Windows 10+需要开发者模式)。当锁文件路径可预测时,1-3次尝试即可成功利用。
漏洞根因在于filelock库在创建锁文件时的非原子操作序列。具体而言,UnixFileLock和WindowsFileLock实现在执行os.open()时先通过os.path.exists()检查目标路径是否已存在文件,然后才调用os.open(path, O_CREAT | O_RDWR | O_TRUNC)创建或打开锁文件。这两个操作之间存在明确的时间间隙。攻击者可以在此间隙中完成以下操作:(1) 删除或移动合法锁文件;(2) 在相同路径创建指向任意目标文件的符号链接。当os.open()执行时,O_TRUNC标志会导致目标文件被截断为零字节,从而造成数据破坏。由于文件锁通常用于保护关键配置文件(如数据库配置、凭据文件、应用状态文件等),此漏洞可被利用造成拒绝服务或数据丢失。漏洞影响filelock 3.0.0至3.20.0版本。修复方案通过在打开文件时使用O_NOFOLLOW标志防止跟随符号链接,或采用原子文件创建操作(如O_EXCL)消除竞态窗口。