Skip to content

Commit f0a710b

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

File tree

8 files changed

+38
-5
lines changed

8 files changed

+38
-5
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: 22 additions & 4 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,7 +463,9 @@ 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){
466+
if(mosq->protocol == mosq_p_mqtt5 && mosq->in_packet.remaining_length > db.config->packet_max_simple){
467+
return MOSQ_ERR_OVERSIZE_PACKET;
468+
}else if(mosq->in_packet.remaining_length != 2){
467469
return MOSQ_ERR_MALFORMED_PACKET;
468470
}
469471
break;
@@ -476,10 +478,26 @@ static int packet__read_single(struct mosquitto *mosq, enum mosquitto_client_sta
476478
break;
477479

478480
case CMD_DISCONNECT:
479-
if(mosq->protocol != mosq_p_mqtt5 && mosq->in_packet.remaining_length != 0){
481+
if(mosq->protocol == mosq_p_mqtt5 && mosq->in_packet.remaining_length > db.config->packet_max_simple){
482+
return MOSQ_ERR_OVERSIZE_PACKET;
483+
}else if(mosq->in_packet.remaining_length != 0){
480484
return MOSQ_ERR_MALFORMED_PACKET;
481485
}
482486
break;
487+
488+
case CMD_SUBSCRIBE:
489+
case CMD_UNSUBSCRIBE:
490+
if(mosq->protocol == mosq_p_mqtt5 && mosq->in_packet.remaining_length > db.config->packet_max_sub){
491+
return MOSQ_ERR_OVERSIZE_PACKET;
492+
}
493+
break;
494+
495+
case CMD_AUTH:
496+
if(mosq->in_packet.remaining_length > db.config->packet_max_auth){
497+
return MOSQ_ERR_OVERSIZE_PACKET;
498+
}
499+
break;
500+
483501
}
484502

485503
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)