Skip to content

Commit 0f7fa40

Browse files
authored
MONGOCRYPT-906 limit KMS length (#1163)
1 parent 5151603 commit 0f7fa40

5 files changed

Lines changed: 66 additions & 0 deletions

File tree

kms-message/src/kms_kmip_response_parser.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ kms_kmip_response_parser_feed (kms_kmip_response_parser_t *parser,
9191
const uint8_t *buf,
9292
uint32_t len)
9393
{
94+
// As a precaution, limit the maximum size KMS response:
95+
if (len > KMS_PARSER_MAX_RESPONSE_LEN || parser->buf->len > KMS_PARSER_MAX_RESPONSE_LEN - len) {
96+
KMS_ERROR (parser, "KMS response too large");
97+
return false;
98+
}
99+
94100
kms_request_str_append_chars (parser->buf, (char *) buf, len);
95101
parser->bytes_fed += len;
96102

kms-message/src/kms_message/kms_response_parser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
extern "C" {
2929
#endif
3030

31+
#define KMS_PARSER_MAX_RESPONSE_LEN 16 * 1024 * 1024 /* 16 MiB */
32+
3133
typedef struct _kms_response_parser_t kms_response_parser_t;
3234

3335
KMS_MSG_EXPORT (kms_response_parser_t *)

kms-message/src/kms_response_parser.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,12 @@ kms_response_parser_feed (kms_response_parser_t *parser,
280280
return kms_kmip_response_parser_feed (parser->kmip, buf, len);
281281
}
282282

283+
// As a precaution, limit the maximum size KMS response:
284+
if (len > KMS_PARSER_MAX_RESPONSE_LEN || raw->len > KMS_PARSER_MAX_RESPONSE_LEN - len) {
285+
KMS_ERROR (parser, "KMS response too large");
286+
return false;
287+
}
288+
283289
curr = (int) raw->len;
284290
kms_request_str_append_chars (raw, (char *) buf, len);
285291
/* process the new data appended. */

kms-message/test/test_kms_kmip_response_parser.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,53 @@ kms_kmip_response_parser_notenough_test (void)
199199
kms_response_parser_destroy (parser);
200200
free (data);
201201
}
202+
203+
204+
void kms_response_parser_response_too_big_test (void); // -Wmissing-prototypes: for testing only.
205+
void
206+
kms_response_parser_response_too_big_test (void)
207+
{
208+
uint8_t *data = (uint8_t*) malloc(KMS_PARSER_MAX_RESPONSE_LEN); // 16 MiB
209+
memset(data, 0, KMS_PARSER_MAX_RESPONSE_LEN);
210+
211+
// Test HTTP parser:
212+
{
213+
kms_response_parser_t *parser = kms_response_parser_new ();
214+
215+
// Feed max length:
216+
{
217+
bool ok = kms_response_parser_feed (parser, data, KMS_PARSER_MAX_RESPONSE_LEN);
218+
ASSERT (ok);
219+
}
220+
221+
// Feed one more byte:
222+
{
223+
bool ok = kms_response_parser_feed (parser, data, 1);
224+
ASSERT_PARSER_ERROR (parser, "KMS response too large");
225+
ASSERT (!ok);
226+
}
227+
228+
kms_response_parser_destroy (parser);
229+
}
230+
231+
// Test KMIP parser:
232+
{
233+
kms_response_parser_t *parser = kms_kmip_response_parser_new (NULL);
234+
235+
// Feed max length:
236+
{
237+
bool ok = kms_response_parser_feed (parser, data, KMS_PARSER_MAX_RESPONSE_LEN);
238+
ASSERT (ok);
239+
}
240+
241+
// Feed one more byte:
242+
{
243+
bool ok = kms_response_parser_feed (parser, data, 1);
244+
ASSERT_PARSER_ERROR (parser, "KMS response too large");
245+
ASSERT (!ok);
246+
}
247+
248+
kms_response_parser_destroy (parser);
249+
}
250+
free (data);
251+
}

kms-message/test/test_kms_request.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,6 +1230,7 @@ extern void kms_kmip_response_get_secretdata_notfound_test (void);
12301230
extern void kms_kmip_response_parser_reuse_test (void);
12311231
extern void kms_kmip_response_parser_excess_test (void);
12321232
extern void kms_kmip_response_parser_notenough_test (void);
1233+
extern void kms_response_parser_response_too_big_test (void);
12331234

12341235
int
12351236
main (int argc, char *argv[])
@@ -1296,6 +1297,7 @@ main (int argc, char *argv[])
12961297
RUN_TEST (kms_kmip_response_parser_reuse_test);
12971298
RUN_TEST (kms_kmip_response_parser_excess_test);
12981299
RUN_TEST (kms_kmip_response_parser_notenough_test);
1300+
RUN_TEST (kms_response_parser_response_too_big_test);
12991301
RUN_TEST (test_request_newlines);
13001302
RUN_TEST (test_kms_util);
13011303

0 commit comments

Comments
 (0)