OpenPLC-v3 中存在一个路径注入漏洞,原因是程序未对从命令行传入的文件路径参数进行任何有效性检查。攻击者可通过构造恶意路径读取任意可读文件,造成信息泄露风险。
输入验证不当(路径注入)
信息泄露(任意文件读取)
由 glue_generator.cpp 编译生成的二进制程序存在任意文件读取漏洞,原因是对用户提供的文件路径验证不足。
攻击者在执行程序时可将任意文件指定为输入参数(例如 /etc/passwd)。随后应用程序逐行读取该文件,解析内容,并直接将解析后的数据通过 cout 输出到控制台,同时未对以下内容进行任何验证:
因此,攻击者能够读取运行进程权限可访问的任何文件,导致敏感信息泄露。
攻击者能够执行存在漏洞的二进制程序。
运行用户账户对目标文件具有读取权限。
成功利用可能泄露敏感系统信息,包括但不限于:
这些信息可能有助于进一步的权限提升或横向移动。
在 glue_generator.cpp 中,程序使用了两个字符串数组 varName 和 varType 来处理解析后的文件内容,并将其输出到命令行。
解析过程中,程序期望特定的行格式:
(<varType>,<varName>,
具体来说:
( 与第一个 , 之间的内容赋值给 varType;
第一个与第二个 , 之间的内容赋值给 varName。
未对源文件路径或解析数据的合法性进行任何验证。
步骤 1:创建测试文件
创建名为 test.txt 的文件,内容如下:
(aaaaaaaa,123,
步骤 2:执行存在漏洞的程序
运行以下命令:
./glue_generator ./test.txt whatever.cpp
程序将解析内容并将提取的值输出到控制台。
步骤 3:任意文件读取
如果攻击者可以修改或控制某个敏感文件(例如 /etc/passwd),使其包含符合要求格式的数据:
(aaaaaaaa,123,
则存在漏洞的程序会解析并输出文件中的相应内容。
对于敏感文件,任何匹配以下模式的行都可能被泄露:
(<content1>,<content2>,
泄露的信息量取决于:
该漏洞由以下原因造成:
缺乏对用户可控文件路径的验证。
对任意文件应用了不安全的解析逻辑。
未经授权检查直接将解析内容输出到控制台。
未对可访问的文件位置施加限制。
为缓解该漏洞: