CVE-2025-62511yt-grabber-tui是一款基于C++开发的终端用户界面(TUI)应用程序,主要用于下载YouTube内容。该项目在GitHub上开源,版本1.0中存在一个Time-of-Check to Time-of-Use(TOCTOU)竞争条件漏洞(对应CWE-367)。该漏洞源于应用程序在创建默认配置文件config.json时,在检查文件是否存在和实际写入文件之间存在时间窗口,攻击者可以利用这个时间窗口通过符号链接(symlink)进行攻击。具体而言,当应用程序首次启动时,会检查~/.config/yt-grabber-tui/config.json(Linux)或当前工作目录下的config.json(Windows)是否存在。如果文件不存在,应用程序会创建并写入默认配置。然而,在文件存在性检查(boost::filesystem::exists)和文件写入(boost::property_tree::write_json)之间存在一个可被利用的时间差。拥有该配置目录写权限的本地攻击者可以在这个时间窗口内创建符号链接,使得写入操作跟随符号链接指向攻击者选择的任意文件,从而实现任意文件覆盖。该漏洞的CVSS 3.1评分为6.3,属于中等严重等级。虽然攻击需要本地访问和低权限,但成功利用后可以以应用程序进程的权限覆盖任意文件,可能导致应用程序或用户数据损坏。如果应用程序以提升的权限运行,攻击甚至可能扩展到系统文件的损坏。该漏洞已在版本1.0.1中修复,修复方式为使用原子操作或安全的文件创建方式(如O_CREAT|O_EXCL)来避免竞争条件。
yt-grabber-tui版本1.0中的漏洞存在于Settings.hpp文件的load_json_settings函数中。该函数首先使用boost::filesystem::exists检查config.json文件是否存在,如果文件不存在,则调用create_json_settings函数使用boost::property_tree::write_json写入默认JSON配置。这个过程存在典型的TOCTOU竞争条件:
1. **检查阶段(Time-of-Check)**:应用程序调用boost::filesystem::exists(config_path)检查config.json是否存在。此时config.json确实不存在。
2. **竞争窗口**:在exists检查返回false之后,write_json调用之前,存在一个微小但可利用的时间窗口。
3. **攻击者介入**:拥有配置目录写权限的本地攻击者利用这个时间窗口,在配置目录中创建一个指向敏感文件的符号链接(例如~/.config/yt-grabber-tui/config.json -> /home/user/.bashrc或/etc/passwd)。
4. **使用阶段(Time-of-Use)**:应用程序调用write_json写入配置文件,但此时由于符号链接的存在,写入操作会跟随符号链接,将JSON配置内容写入到攻击者指定的敏感文件中。
利用条件:
- 攻击者需要对配置目录有写权限(~/.config/yt-grabber-tui/在Linux上,或当前工作目录在Windows上)
- 需要应用程序进程以足够权限运行,以便覆盖目标文件
- 需要在正确的时间窗口内完成符号链接创建
利用方式:攻击者可以编写一个持续监控配置目录的脚本,在检测到应用程序启动时迅速创建符号链接。重复运行应用程序可以增加攻击成功的概率。成功利用后,攻击者可以覆盖用户的关键配置文件(如.bashrc、.ssh/authorized_keys等),如果应用程序以root权限运行,甚至可以覆盖系统关键文件。