前几天看到pgAdmin发布了新漏洞,《CVE-2024-3116 – Remote Code Execution Vulnerability in pgAdmin - PostgreSQL Tools (<=8.4): Detailed Analysis Report》。看了这个漏洞利用的过程,我总感觉有所不对,我也在『代码审计』知识星球里发表了相关疑问。随后,我研究了一下这个漏洞的来龙去脉,简单写下这篇短文。
CVE-2022-4223:pgAdmin <= 6.16 未授权命令执行漏洞
最新的CVE-2024-3116漏洞,其利用到了/misc/validate_binary_path
这个API。这个API出现问题不是第一次了,最远的追溯到几年前CVE-2022-4223这个未授权命令执行漏洞。
CVE-2022-4223是一个非常简单的漏洞,我甚至觉得有可能是一个后门。
pgAdmin支持在后台设置psql、pg_dump、pg_restore等PostgreSQL数据库工具所在的基础路径,在保存设置前,用户可以执行validate_binary_path
这个API来检查路径是否合法。
检查的过程就是,用户传入路径,然后pgAdmin分别给这些路径拼接上“psql”、“pg_dump”等可执行文件名,并执行psql --version
命令。如果返回结果是正常,则说明文件存在,用户路径合法;如果返回结果出错,则说明文件不存在,用户传入的路径不合法。
validate_binary_path
API代码如下:
可见,这里用户传入的utility_path
拼接上可执行文件名后,直接拼接进subprocess.getoutput()
方法执行。这是一个非常简单的命令注入漏洞。
而且这个API没有增加@login_required
修饰器,任意用户均可调用