剖析 VigorConnect 漏洞:一段发现与纠错之旅
本文揭示了 VigorConnect 中的一个任意文件读取漏洞,攻击者可借此访问敏感文件。该问题源于文件处理方法中不当的输入验证。
引言
本文研究了 VigorConnect 中发现的一个任意文件读取漏洞,该软件是 DrayTek 推出的 VigorAP 和 VigorSwitch 管理服务器,旨在自动执行固件更新、配置备份等任务。通过分析该应用的反编译代码,尤其是文件操作的处理逻辑,我们演示了如何利用该漏洞访问敏感文件。我们已确认这一问题,并定位到了导致该缺陷的代码。
漏洞的初步发现
该任意文件读取漏洞是通过多个允许未授权文件读取操作的端点发现的。这些端点表明,文件路径和用户输入的处理方式并不安全:
/ACSServer/DownloadFileServlet?table_action=Save&show_file_name=../../../../../../windows/win.ini&type=uploadfile&path=anything
/ACSServer/DownloadFileServlet?table_action=Save&show_file_name=../../../../../../etc/passwd&type=uploadfile&path=anything
这些看似无害的 URL 实际上是强大的万能钥匙,可以打开整个服务器上敏感系统文件的访问权限。
在这一部分,我们从官方链接下载了 VigorConnect/v1.5.2 的二进制文件,并按照这份安装指南中的步骤将其安装在本地机器上。
安装 VigorConnect 需要 sudo 权限。这种提升的权限使该软件能够与系统级文件和资源交互。因此,我们通过访问 /etc/passwd 和 windows/win.ini 等敏感文件确认了这个任意文件读取漏洞。
代码分析
为了揭示该漏洞的真实本质,我们穿越了一座由代码和假设组成的迷宫。起初一个简单直接的假设,后来演变成一场复杂的探索,也提醒我们:在调查严重漏洞时,彻底的分析至关重要。
根本原因分析:FileServerController 中的漏洞
首先,使用 binwalk 对二进制文件进行了逆向:
binwalk -e <binary>
本次研究中使用的 VigorConnect 固件为 VigorConnectLinuxSetup_1.5.2。在继续调查之前,我们已在该版本中确认了 CVE-2021-20123。

在解包出的内容中发现了若干二进制文件,我们重点关注的是 VigorConnect 二进制文件。

查看 VigorConnect 二进制文件的反汇编代码时,罪魁祸首乍看之下似乎很明显:Beego Web 框架中的 SaveToFile 方法。该方法负责保存上传的文件,看起来缺少适当的输入验证:
func (c *Controller) SaveToFile(fromfile, tofile string) error {
file, _, err := c.Ctx.Request.FormFile(fromfile)
if err != nil {
return err
}
defer file.Close()
f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
return err
}
defer f.Close()
io.Copy(f, file)
return nil
}
由于缺少对 tofile 路径进行清理的检查,这看起来是一个允许目录遍历攻击的教科书式漏洞案例。这是一个很有说服力的理论,许多安全研究人员可能都会忍不住就此下结论。然而,在网络安全领域,通往真相的道路往往比我们预想的更加曲折。
一种挥之不去的怀疑让我们觉得事情可能另有隐情,于是我们决定深入挖掘。这一决定促使我们采用更传统的调试技术,也为一个将推翻我们最初假设的发现埋下了伏笔。我们借助强大的 GNU Debugger(GDB)展开了更彻底的调查,过程有条不紊:
- 使用
VigorConnect二进制文件启动 GDB:gdb ./VigorConnect - 以调试模式运行程序:
r -d &

触发该任意文件读取漏洞后,我们开始在多个函数上设置断点,直到其中一个被触发:os.OpenFile
- 我们在
os.OpenFile函数上设置断点:br os.OpenFile,并检查函数参数:info args

使用 Ghidra 打开二进制文件并应用其全部分析器后,获取了 os.OpenFile 的反汇编代码:

该函数看起来是一个底层的文件打开操作。如果没有受到适当限制,或者被上层函数以未经清理的输入调用,它就可能被利用。
- 回溯调用栈:
bt 20

我们的分析揭示了以下要点:
- 被访问的存在漏洞的文件路径为
/usr/local/VigorConnect/FileRoot/tftp./../../../../../etc/passwd。


这是 Beego Web 框架中 BeegoOutput 结构体的 Download 方法,负责提供文件下载。
GDB 的输出确认,该函数是以一个存在漏洞的文件路径被调用的:/FileRoot/tftp./../../../../../etc/passwd
该路径利用目录遍历(../)访问位于预期目录之外的 /etc/passwd 文件。
反编译后的函数中看不到任何明确的路径验证或清理。它直接使用传入的文件路径调用 os.Stat,并最终调用 net/http.ServeFile。
- 该路径由
FileServerController的Get方法处理。

现在,我们根据反汇编代码深入分析该方法的作用:
该方法使用 Beego 框架的 GetString 函数从传入的 HTTP 请求中获取查询参数,例如要下载的文件名或路径:
github.com/astaxie/beego.(*Controller).GetString
((github.com/astaxie/beego.Controller *)self_00,key,
*([]string *)((long)register0x00000020 + -0x208),~r2_01);
这些查询参数被直接用于确定要提供哪个文件。关键在于,这些输入没有经过严格的输入验证或清理,使攻击者能够注入目录遍历序列(例如 ../../../../../)来访问预期目录之外的文件。
随后,该方法会处理不同类型的请求,包括 ConfigDownload 和 uploadfile,两者都涉及向客户端提供文件:
if (*plVar2 != 0x696664616f6c7075) {
return;
}
if (*(short *)(plVar2 + 1) != 0x656c) {
return;
}
在文件下载的情况下,该方法使用用户提供的输入构造文件路径,然后将其传递给 BeegoOutput.Download 函数。由于没有输入验证,攻击者可以操纵该路径,使其指向敏感的系统文件。
该漏洞的影响远不止于技术层面的好奇心。落入恶意行为者手中,这一缺陷可能导致敏感配置文件遭到未授权访问、用户凭据泄露,甚至可能成为更严重系统入侵的跳板。例如:
- 数据库凭据:
app.conf文件显示VigorConnect使用 SQLite 数据库(DbType = sqlite3)。攻击者可能访问位于sqlite/VigorConnect.db的数据库文件,从而暴露所有存储的数据。 - HTTPS 证书:配置中指定了
HTTPSCertFile和HTTPSKeyFile的文件路径。访问这些文件可能破坏整个系统的 SSL/TLS 安全性。 - CLI 凭据:
CliUser和CliPassword字段如果已填写,可能让攻击者直接获得系统的命令行访问权限。 - 日志文件:在
AcsLog设置为file且启用了AcsLogSrc的情况下,攻击者可以访问包含敏感运行数据甚至用户活动的日志文件。 - InfluxDB 的配置:
InfluxDB文件夹的存在表明VigorConnect使用 InfluxDB,很可能用于存储时间序列数据。该文件夹中的influxdb.conf文件可能包含数据库凭据和连接信息。
这些示例说明了如何利用该漏洞深入访问 VigorConnect 系统,不仅可能危及管理服务器本身,还可能危及所有已连接的网络设备。
结论
我们的分析不仅确认了 VigorConnect 中存在一个严重的任意文件读取漏洞,也有力地提醒我们:网络安全需要时刻保持警惕。这一缺陷凸显了严格代码审查、最小权限原则以及在软件设计中贯彻纵深防御的重要性。随着我们越来越依赖 VigorConnect 这样的集中式管理系统,安全社区必须始终保持警觉,随时准备发现并应对潜伏在数字基础设施中的下一个隐藏威胁。
标签:
security