CVE-2021-44354,CVE-2021-44355, CVE-2021-44356, CVE-2021-44357, CVE-2021-44358, CVE-2021-44359, CVE-2021-44360, CVE-2021-44361, CVE-2021-44362, CVE-2021-44363, CVE-2021-44364, CVE-2021-44365, CVE-2021-44366, CVE-2021-44367, CVE-2021-44368, CVE-2021-44369, CVE-2021-44370, CVE-2021-44371, CVE-2021-44372, CVE-2021-44373, CVE-2021-44374, CVE-2021-44375, CVE-2021-44376, CVE-2021-44377, CVE-2021-44378, CVE-2021-44379, CVE-2021-44380, CVE-2021-44381, CVE-2021-44382, CVE-2021-44383, CVE-2021-44384, CVE-2021-44385, CVE-2021-44386, CVE-2021-44387, CVE-2021-44388, CVE-2021-44389, CVE-2021-44390, CVE-2021-44391, CVE-2021-44392, CVE-2021-44393, CVE-2021-44394, CVE-2021-44395, CVE-2021-44396, CVE-2021-44397, CVE-2021-44398, CVE-2021-44399, CVE-2021-44400,CVE-2021-44401, CVE-2021-44402,CVE-2021-44403,CVE-2021-44404,CVE-2021-44405, CVE-2021-44406, CVE-2021-44407, CVE-2021-44408, CVE-2021-44409, CVE-2021-44410, CVE-2021-44411, CVE-2021-44412, CVE-2021-44413, CVE-2021-44414, CVE-2021-44415, CVE-2021-44416, CVE-2021-44417, CVE-2021-44418, CVE-2021-44419
Multiple denial of service vulnerabilities exist in the cgiserver.cgi JSON command parser functionality of reolink RLC-410W v3.0.0.136_20121102. A specially-crafted HTTP request can lead to a reboot. An attacker can send an HTTP request to trigger this vulnerability.
reolink RLC-410W v3.0.0.136_20121102
RLC-410W - https://reolink.com/us/product/rlc-410w/
8.6 - CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:N/A:H
CWE-20 - Improper Input Validation
The reolink RLC-410W is a WiFi security camera. The camera includes motion detection functionalities and various methods to save the recordings.
The RLC-410W offers different APIs for different levels of authentication. One of these APIs has the purpose of rebooting the device; this API should be executed by administrator users only.
A specially-crafted HTTP request can lead to kill the cgiserver.cgi
process and a consequentially to the reboot of the device, without the required permission.
The cgiserver.cgi
manages the API requests, parsing the commands and parameters provided. One way to issue commands and parameters is by providing those in a JSON array in the body. A body with commands looks like the following:
[
{
"cmd": <COMMAND NAME 1>,
"action": <ACTION NUMBER 1>,
"param":{
<COMMAND PARAMETERS 1>
}
},
...
{
"cmd": <COMMAND NAME n>,
"action": <ACTION NUMBER n>,
"param":{
<COMMAND PARAMETERS n>
}
},
]
All the JSON elements inside a JSON object are going to be accessed using the subscription operator:
int __thiscall Json::Value::operator[](Value *this,char *key)
{
[...]
puVar4 = &_mips_gp0_value;
if (this->type == null) {
Value(aVStack64,7);
operator=(this,aVStack64);
~Value(aVStack64);
}
else {
if (this->type != object) {
/* WARNING: Subroutine does not return */
__assert(s_type__==_nullValue_||_type__==_o_004e3084,
"/home/mdq/new_svn/test/ipc/trunk/opensource/libjson/src/json_value.cpp",0x401); [1]
}
}
[...]
}
If the JSON element is neither of the type null
or object
, the program will assert. If this happens, the cgiserver.cgi
process will not able to send its heartbeat. Eventually the entire device will be rebooted.
Each one of the provided commands is parsed by the body_request_to_command
:
undefined body_request_to_command(cgi_request *req,cgi_cmd *cgi_cmd,Value *json_element)
{
[...]
pVVar3 = (Value *)Json::Value::operator[](json_element,"cmd"); [2]
[...]
}
In [2]
the json_element
represents one of the elements of the array that contains the commands.
Instead, each param
object is parsed individually for each API. But the code that passes the param
JSON object, as argument for the function, is the same for all the APIs. The API-specific param
parser is called in the cgi_param_parse
function:
int cgi_param_parse(cgi_cmd *cgi_cmd,cgi_session *session)
{
[...]
Json::Reader::Reader(json_reader);
Json::Value::Value(&body_as_json,0);
pcVar1 = cgi_cmd->associated_request;
if (pcVar1->is_commands_in_body == 0) {
API_command = cgi_cmd->command_ID;
CHECK_PERMISSIONS:
iVar3 = check_channel_if_command_require_it(API_command,cgi_cmd->query_string[channel]);
if (iVar3 == 0) {
AVar4 = cgi_check_ability(cgi_cmd->command_ID,session,cgi_cmd->query_string[channel]); [3]
dVar5 = 0;
if (AVar4 == ~not exist) goto LAB_0043ca18;
}
else {
AVar4 = check err;
}
}
else {
if (pcVar1->CONTENT_LENGTH == 0) {
API_command = cgi_cmd->command_ID;
goto CHECK_PERMISSIONS;
}
std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string
((char *)body_data_as_string,(allocator *)pcVar1->body_data);
is_valid_json = Json::Reader::parse(json_reader,body_data_as_string,&body_as_json,true);
std::basic_string<char,std::char_traits<char>,std::allocator<char>>::~basic_string
((basic_string<char,std::char_traits<char>,std::allocator<char>> *)body_data_as_string
);
if (is_valid_json != 0) {
command_struct = (command_struct *)get_command_struct_by_id(cgi_cmd->command_ID);
j2s_function = command_struct->j2s;
pVVar2 = (Value *)Json::Value::operator[](&body_as_json,cgi_cmd->idx_in_array_command);
pVVar2 = (Value *)Json::Value::operator[](pVVar2,"param"); [4]
dVar5 = (*j2s_function)(pVVar2,cgi_cmd); [5]
if (dVar5 != 0) goto LAB_0043ca18;
API_command = cgi_cmd->command_ID;
goto CHECK_PERMISSIONS;
}
[...]
}
At [4]
the param
element is taken and passed at [5]
to the API-specific JSON parser that will parse the parameters. After the parsing, at [3]
, it is checked that the user who requested the API has the correct permission for performing it.
Both the code at [2]
and the code called to parse the param
JSON element at [5]
assume that the JSON passed are JSON objects, but this is not always the case. For example with:
curl --request POST \
--data "[{\"cmd\": \"<CMD_NAME>\",\"action\": 0,\"param\": \"\"}]" \
http://<CAMERA_IP>/cgi-bin/api.cgi\?cmd\=<CMD_NAME>&token\=<SESSION_TOKEN>
Based on the CMD_NAME
, this request could crash the device, because at [5]
the param
JSON element is taken and passed to the CMD_NAME
API-specific parameters parser. In various APIs, that requires param
. The parser code will assume, erroneously, that the JSON element of param
is an object, accessing it with the subscription operator, leading to the assert at [1]
.
Note that, while most of this requires a logged-in user, it’s possible to use TALOS-2021-1420 to perform these API calls without authentication.
The body_request_to_command
function will expect JSON objects as elements of the JSON array. If the following request’s body is provided:
[
""
]
The cgiserver.cgi
will reach the assert at [1]
and consequently the reboot of the camera. Note that, this issue does not require a logged-in user.
The SetMdAlarm
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetMdAlarm",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetAudioAlarm
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetAudioAlarm",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetAlarm
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetAlarm",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetRec
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetRec",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetCrop
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetCrop",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetNorm
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetNorm",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The Set3G
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "Set3G",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetCloudSchedule
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetCloudSchedule",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetPush
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetPush",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetWifi
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetWifi",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetDevName
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetDevName",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetP2p
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetP2p",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetUpnp
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetUpnp",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetNetPort
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetNetPort",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetNtp
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetNtp",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetFtp
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetFtp",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetEmail
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetEmail",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetLocalLink
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetLocalLink",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetAutoFocus
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetAutoFocus",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetMask
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetMask",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetOsd
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetOsd",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetIsp
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetIsp",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetImage
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetImage",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetEnc
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetEnc",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetAutoMaint
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetAutoMaint",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetTime
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetTime",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetPowerLed
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetPowerLed",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetIrLights
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetIrLights",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetAutoUpgrade
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetAutoUpgrade",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetPtzTattern
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetPtzTattern",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetPtzSerial
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetPtzSerial",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetPtzPatrol
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetPtzPatrol",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The SetPtzPreset
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "SetPtzPreset",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The Login
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "Login",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetAbility
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetAbility",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The Format
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "Format",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetEnc
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetEnc",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetImage
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetImage",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetIsp
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetIsp",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetOsd
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetOsd",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetMask
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetMask",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The Preview
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "Preview",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The rtmp=start
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "rtmp=start",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The rtmp=stop
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "rtmp=stop",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetPtzPreset
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetPtzPreset",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetPtzPatrol
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetPtzPatrol",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The PtzCtrl
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "PtzCtrl",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetPtzSerial
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetPtzSerial",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetPtzTattern
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetPtzTattern",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetZoomFocus
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetZoomFocus",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The StartZoomFocus
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "StartZoomFocus",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetAutoFocus
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetAutoFocus",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The TestEmail
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "TestEmail",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The TestFtp
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "TestFtp",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The TestWifi
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "TestWifi",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The UpgradePrepare
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "UpgradePrepare",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The Search
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "Search",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetRec
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetRec",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The AddUser
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "AddUser",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The DelUser
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "DelUser",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The ModifyUser
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "ModifyUser",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The Disconnect
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "Disconnect",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetAlarm
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetAlarm",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetMdState
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetMdState",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
The GetMdAlarm
’s JSON param
parser will assume that the param
JSON element is an object, accessing it using subscription operator. If the following request’s body is provided:
[
{
"cmd": "GetMdAlarm",
"action": 0,
"param": ""
}
]
The cgiserver.cgi
will reach the assert at [1]
and consequently reboot the camera.
2021-12-06 - Vendor Disclosure
2022-01-19 - Vendor Patched
2022-01-26 - Public Release
Discovered by Francesco Benvenuto of Cisco Talos.