Skip to content

Commit e9e3e62

Browse files
committed
Add initial size limits for non-PUBLISH packets
1 parent 6675f79 commit e9e3e62

File tree

8 files changed

+48
-7
lines changed

8 files changed

+48
-7
lines changed

fuzzing/broker/broker_fuzz_handle_auth.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
1616
Roger Light - initial implementation and documentation.
1717
*/
1818

19+
#define kMaxInputLength 100000
1920
#include "fuzz_packet_read_base.h"
2021

2122
extern "C" int fuzz_packet_read_init(struct mosquitto *context)

fuzzing/broker/broker_fuzz_handle_connect.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
1616
Roger Light - initial implementation and documentation.
1717
*/
1818

19+
#define kMaxInputLength 100000
1920
#include "fuzz_packet_read_base.h"
2021

2122
extern "C" int fuzz_basic_auth(int event, void *event_data, void *userdata)

fuzzing/broker/broker_fuzz_handle_subscribe.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
1616
Roger Light - initial implementation and documentation.
1717
*/
1818

19+
#define kMaxInputLength 100000
1920
#include "fuzz_packet_read_base.h"
2021

2122
extern "C" int fuzz_acl_check(int event, void *event_data, void *userdata)

fuzzing/broker/broker_fuzz_handle_unsubscribe.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
1616
Roger Light - initial implementation and documentation.
1717
*/
1818

19+
#define kMaxInputLength 100000
1920
#include "fuzz_packet_read_base.h"
2021

2122
extern "C" int fuzz_acl_check(int event, void *event_data, void *userdata)

fuzzing/broker/fuzz_packet_read_base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ extern "C" {
2828
#include "read_handle.h"
2929

3030
#define kMinInputLength 3
31-
#define kMaxInputLength 268435455U
31+
#ifndef kMaxInputLength
32+
# define kMaxInputLength 268435455U
33+
#endif
3234

3335
int fuzz_packet_read_base(const uint8_t *data, size_t size, int (*packet_func)(struct mosquitto *));
3436
int fuzz_packet_read_init(struct mosquitto *context);

lib/packet_mosq.c

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,8 +453,8 @@ static int packet__read_single(struct mosquitto *mosq, enum mosquitto_client_sta
453453
#ifdef WITH_BROKER
454454
switch(mosq->in_packet.command & 0xF0){
455455
case CMD_CONNECT:
456-
if(mosq->in_packet.remaining_length > 100000){ /* Arbitrary limit, make configurable */
457-
return MOSQ_ERR_MALFORMED_PACKET;
456+
if(mosq->in_packet.remaining_length > db.config->packet_max_connect){
457+
return MOSQ_ERR_OVERSIZE_PACKET;
458458
}
459459
break;
460460

@@ -463,8 +463,14 @@ static int packet__read_single(struct mosquitto *mosq, enum mosquitto_client_sta
463463
case CMD_PUBREL:
464464
case CMD_PUBCOMP:
465465
case CMD_UNSUBACK:
466-
if(mosq->protocol != mosq_p_mqtt5 && mosq->in_packet.remaining_length != 2){
467-
return MOSQ_ERR_MALFORMED_PACKET;
466+
if(mosq->protocol == mosq_p_mqtt5){
467+
if(mosq->in_packet.remaining_length > db.config->packet_max_simple){
468+
return MOSQ_ERR_OVERSIZE_PACKET;
469+
}
470+
}else{
471+
if(mosq->in_packet.remaining_length != 2){
472+
return MOSQ_ERR_MALFORMED_PACKET;
473+
}
468474
}
469475
break;
470476

@@ -476,10 +482,30 @@ static int packet__read_single(struct mosquitto *mosq, enum mosquitto_client_sta
476482
break;
477483

478484
case CMD_DISCONNECT:
479-
if(mosq->protocol != mosq_p_mqtt5 && mosq->in_packet.remaining_length != 0){
480-
return MOSQ_ERR_MALFORMED_PACKET;
485+
if(mosq->protocol == mosq_p_mqtt5){
486+
if(mosq->in_packet.remaining_length > db.config->packet_max_simple){
487+
return MOSQ_ERR_OVERSIZE_PACKET;
488+
}
489+
}else{
490+
if(mosq->in_packet.remaining_length != 0){
491+
return MOSQ_ERR_MALFORMED_PACKET;
492+
}
493+
}
494+
break;
495+
496+
case CMD_SUBSCRIBE:
497+
case CMD_UNSUBSCRIBE:
498+
if(mosq->protocol == mosq_p_mqtt5 && mosq->in_packet.remaining_length > db.config->packet_max_sub){
499+
return MOSQ_ERR_OVERSIZE_PACKET;
481500
}
482501
break;
502+
503+
case CMD_AUTH:
504+
if(mosq->in_packet.remaining_length > db.config->packet_max_auth){
505+
return MOSQ_ERR_OVERSIZE_PACKET;
506+
}
507+
break;
508+
483509
}
484510

485511
if(db.config->max_packet_size > 0 && mosq->in_packet.remaining_length+1 > db.config->max_packet_size){

src/conf.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,11 @@ static void config__init_reload(struct mosquitto__config *config)
343343
config->sys_interval = 10;
344344
config->upgrade_outgoing_qos = false;
345345
config->packet_buffer_size = 4096;
346+
347+
config->packet_max_auth = 100000;
348+
config->packet_max_connect = 100000;
349+
config->packet_max_sub = 100000;
350+
config->packet_max_simple = 10000;
346351
}
347352

348353

src/mosquitto_broker_internal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,10 @@ struct mosquitto__config {
352352
uint16_t max_inflight_messages;
353353
uint16_t max_keepalive;
354354
uint8_t max_qos;
355+
uint32_t packet_max_connect;
356+
uint32_t packet_max_simple;
357+
uint32_t packet_max_sub;
358+
uint32_t packet_max_auth;
355359
bool persistence;
356360
char *persistence_location;
357361
char *persistence_file;

0 commit comments

Comments
 (0)