Squashed commit of the following:
commit
70455188e2954b95107457eefe85937439c271b5
Author: Tom Peters <thopeter@cisco.com>
Date: Mon Jul 10 12:26:42 2017 -0400
http_inspect: specific alert added 119:95 for Content-Encoding chunked.
http_inspect: alert 119:96 added for unsolicited 206 response.
file_api: memory leak fixed
if (file->reserve_file(captured) == FILE_CAPTURE_SUCCESS)
captured->store_file_async();
+ else
+ delete captured;
}
return (signature_lookup(flow, (FileInfo*)file));
INF_JS_OBFUSCATION_EXCD,
INF_JS_EXCESS_WS,
INF_MIXED_ENCODINGS,
- INF_RSP_WO_REQ,
+ INF_RESPONSE_WO_REQUEST,
INF_SWF_ZLIB_FAILURE,
INF_SWF_LZMA_FAILURE,
INF_PDF_DEFL_FAILURE,
INF_CTE_HEADER,
INF_ILLEGAL_TRAILER,
INF_REPEATED_HEADER,
+ INF_CONTENT_ENCODING_CHUNKED,
+ INF_206_WITHOUT_RANGE,
INF__MAX_VALUE
};
// Content codings
enum Contentcoding { CONTENTCODE__OTHER=1, CONTENTCODE_GZIP, CONTENTCODE_DEFLATE,
CONTENTCODE_COMPRESS, CONTENTCODE_EXI, CONTENTCODE_PACK200_GZIP, CONTENTCODE_X_GZIP,
- CONTENTCODE_X_COMPRESS, CONTENTCODE_IDENTITY };
+ CONTENTCODE_X_COMPRESS, CONTENTCODE_IDENTITY, CONTENTCODE_CHUNKED };
enum EventSid
{
EVENT_CTE_HEADER,
EVENT_ILLEGAL_TRAILER,
EVENT_REPEATED_HEADER,
+ EVENT_CONTENT_ENCODING_CHUNKED,
+ EVENT_206_WITHOUT_RANGE,
EVENT__MAX_VALUE
};
break;
case CONTENTCODE_IDENTITY:
break;
+ case CONTENTCODE_CHUNKED:
+ add_infraction(INF_CONTENT_ENCODING_CHUNKED);
+ create_event(EVENT_CONTENT_ENCODING_CHUNKED);
+ break;
case CONTENTCODE__OTHER:
add_infraction(INF_UNKNOWN_ENCODING);
create_event(EVENT_UNKNOWN_ENCODING);
if (flow->is_pdu_inorder(SSN_DIR_FROM_SERVER))
{
// HTTP response without a request. Possible ssh tunneling
- add_infraction(INF_RSP_WO_REQ);
+ add_infraction(INF_RESPONSE_WO_REQUEST);
create_event(EVENT_RESPONSE_WO_REQUEST);
}
}
+
+ if (status_code_num == 206)
+ {
+ // Verify that 206 Partial Content is in response to a Range request. Unsolicited 206
+ // responses indicate content is being fragmented for no good reason.
+ HttpMsgHeader* const req_header = transaction->get_header(SRC_CLIENT);
+ if ((req_header != nullptr) && (req_header->get_header_count(HEAD_RANGE) == 0))
+ {
+ add_infraction(INF_206_WITHOUT_RANGE);
+ create_event(EVENT_206_WITHOUT_RANGE);
+ }
+ }
}
void HttpMsgStatus::update_flow()
{ CONTENTCODE_X_GZIP, "x-gzip" },
{ CONTENTCODE_X_COMPRESS, "x-compress" },
{ CONTENTCODE_IDENTITY, "identity" },
+ { CONTENTCODE_CHUNKED, "chunked" },
{ 0, nullptr }
};
{ EVENT_ILLEGAL_TRAILER, "illegal field in chunked message trailers" },
{ EVENT_REPEATED_HEADER, "header field inappropriately appears twice or has two "
"values" },
+ { EVENT_CONTENT_ENCODING_CHUNKED, "invalid value chunked in Content-Encoding header" },
+ { EVENT_206_WITHOUT_RANGE, "206 response sent to a request without a Range header" },
{ 0, nullptr }
};
const unsigned amount = convert_num_octets(command_value + strlen("fileread"),
command_length - strlen("fileread"));
assert((amount > 0) && (amount <= MAX_OCTETS));
- int new_octet;
for (unsigned k=0; k < amount; k++)
{
- new_octet = getc(include_file);
+ const int new_octet = getc(include_file);
assert(new_octet != EOF);
msg_buf[end_offset++] = new_octet;
}
}
}
-void HttpUri::check_oversize_dir(Field uri_field)
+void HttpUri::check_oversize_dir(Field& uri_field)
{
int32_t total_length = 0;
const uint8_t* last_dir = nullptr;
void parse_authority();
void parse_abs_path();
- void check_oversize_dir(Field);
+ void check_oversize_dir(Field&);
};
#endif
CHECK(norm_decimal_integer(Field(2, (const uint8_t*)"-27")) == STAT_PROBLEMATIC);
CHECK(norm_decimal_integer(Field(6, (const uint8_t*)"27,382")) == 27);
CHECK(norm_decimal_integer(Field(3, (const uint8_t*)",27")) == STAT_PROBLEMATIC);
- CHECK(norm_decimal_integer(Field(3, (const uint8_t*)",27")) == STAT_PROBLEMATIC);
CHECK(norm_decimal_integer(Field(6, (const uint8_t*)"00000=")) == STAT_PROBLEMATIC);
CHECK(norm_decimal_integer(Field(6, (const uint8_t*)"32.578")) == STAT_PROBLEMATIC);
CHECK(norm_decimal_integer(Field(18, (const uint8_t*)"123456789012345678")) ==