output/json: Include fileinfo in alerts

This commit adds fileinfo to alerts when `metadata` is configured.
pull/5110/head
Jeff Lucovsky 6 years ago committed by Victor Julien
parent cc99f95ecd
commit ff92745851

@ -565,6 +565,31 @@ static int AlertJson(ThreadVars *tv, JsonAlertLogThread *aft, const Packet *p)
} }
} }
/* including fileinfo data is configured by the metadata setting */
if (json_output_ctx->flags & LOG_JSON_RULE_METADATA) {
FileContainer *ffc = AppLayerParserGetFiles(p->flow,
p->flowflags & FLOW_PKT_TOSERVER ? STREAM_TOSERVER:STREAM_TOCLIENT);
if (ffc != NULL) {
File *file = ffc->head;
bool isopen = false;
while (file) {
if (pa->tx_id == file->txid) {
if (!isopen) {
isopen = true;
jb_open_array(jb, "fileinfo");
}
jb_start_object(jb);
EveFileInfo(jb, file, file->flags & FILE_STORED);
jb_close(jb);
}
file = file->next;
}
if (isopen) {
jb_close(jb);
}
}
}
if (p->flow) { if (p->flow) {
EveAddAppProto(p->flow, jb); EveAddAppProto(p->flow, jb);
if (json_output_ctx->flags & LOG_JSON_FLOW) { if (json_output_ctx->flags & LOG_JSON_FLOW) {

@ -174,7 +174,9 @@ JsonBuilder *JsonBuildFileInfoRecord(const Packet *p, const File *ff,
jb_set_string(js, "app_proto", AppProtoToString(p->flow->alproto)); jb_set_string(js, "app_proto", AppProtoToString(p->flow->alproto));
JsonFileInfo(js, ff, stored); jb_open_object(js, "fileinfo");
EveFileInfo(js, ff, stored);
jb_close(js);
/* xff header */ /* xff header */
if (have_xff_ip && xff_cfg->flags & XFF_EXTRADATA) { if (have_xff_ip && xff_cfg->flags & XFF_EXTRADATA) {

@ -152,30 +152,27 @@ json_t *JsonAddStringN(const char *string, size_t size)
return SCJsonString(tmpbuf); return SCJsonString(tmpbuf);
} }
void JsonFileInfo(JsonBuilder *js, const File *ff, const bool stored) void EveFileInfo(JsonBuilder *jb, const File *ff, const bool stored)
{ {
/* Open the fileinfo object. */
jb_open_object(js, "fileinfo");
size_t filename_size = ff->name_len * 2 + 1; size_t filename_size = ff->name_len * 2 + 1;
char filename_string[filename_size]; char filename_string[filename_size];
BytesToStringBuffer(ff->name, ff->name_len, filename_string, filename_size); BytesToStringBuffer(ff->name, ff->name_len, filename_string, filename_size);
jb_set_string(js, "filename", filename_string); jb_set_string(jb, "filename", filename_string);
jb_open_array(js, "sid"); jb_open_array(jb, "sid");
for (uint32_t i = 0; ff->sid != NULL && i < ff->sid_cnt; i++) { for (uint32_t i = 0; ff->sid != NULL && i < ff->sid_cnt; i++) {
jb_append_uint(js, ff->sid[i]); jb_append_uint(jb, ff->sid[i]);
} }
jb_close(js); jb_close(jb);
#ifdef HAVE_MAGIC #ifdef HAVE_MAGIC
if (ff->magic) if (ff->magic)
jb_set_string(js, "magic", (char *)ff->magic); jb_set_string(jb, "magic", (char *)ff->magic);
#endif #endif
jb_set_bool(js, "gaps", ff->flags & FILE_HAS_GAPS); jb_set_bool(jb, "gaps", ff->flags & FILE_HAS_GAPS);
switch (ff->state) { switch (ff->state) {
case FILE_STATE_CLOSED: case FILE_STATE_CLOSED:
jb_set_string(js, "state", "CLOSED"); JB_SET_STRING(jb, "state", "CLOSED");
#ifdef HAVE_NSS #ifdef HAVE_NSS
if (ff->flags & FILE_MD5) { if (ff->flags & FILE_MD5) {
size_t x; size_t x;
@ -184,7 +181,7 @@ void JsonFileInfo(JsonBuilder *js, const File *ff, const bool stored)
for (i = 0, x = 0; x < sizeof(ff->md5); x++) { for (i = 0, x = 0; x < sizeof(ff->md5); x++) {
i += snprintf(&str[i], 255-i, "%02x", ff->md5[x]); i += snprintf(&str[i], 255-i, "%02x", ff->md5[x]);
} }
jb_set_string(js, "md5", str); jb_set_string(jb, "md5", str);
} }
if (ff->flags & FILE_SHA1) { if (ff->flags & FILE_SHA1) {
size_t x; size_t x;
@ -193,18 +190,18 @@ void JsonFileInfo(JsonBuilder *js, const File *ff, const bool stored)
for (i = 0, x = 0; x < sizeof(ff->sha1); x++) { for (i = 0, x = 0; x < sizeof(ff->sha1); x++) {
i += snprintf(&str[i], 255-i, "%02x", ff->sha1[x]); i += snprintf(&str[i], 255-i, "%02x", ff->sha1[x]);
} }
jb_set_string(js, "sha1", str); jb_set_string(jb, "sha1", str);
} }
#endif #endif
break; break;
case FILE_STATE_TRUNCATED: case FILE_STATE_TRUNCATED:
JB_SET_STRING(js, "state", "TRUNCATED"); JB_SET_STRING(jb, "state", "TRUNCATED");
break; break;
case FILE_STATE_ERROR: case FILE_STATE_ERROR:
JB_SET_STRING(js, "state", "ERROR"); JB_SET_STRING(jb, "state", "ERROR");
break; break;
default: default:
JB_SET_STRING(js, "state", "UNKNOWN"); JB_SET_STRING(jb, "state", "UNKNOWN");
break; break;
} }
@ -216,26 +213,23 @@ void JsonFileInfo(JsonBuilder *js, const File *ff, const bool stored)
for (i = 0, x = 0; x < sizeof(ff->sha256); x++) { for (i = 0, x = 0; x < sizeof(ff->sha256); x++) {
i += snprintf(&str[i], 255-i, "%02x", ff->sha256[x]); i += snprintf(&str[i], 255-i, "%02x", ff->sha256[x]);
} }
jb_set_string(js, "sha256", str); jb_set_string(jb, "sha256", str);
} }
#endif #endif
if (stored) { if (stored) {
jb_set_bool(js, "stored", true); JB_SET_TRUE(jb, "stored");
jb_set_uint(js, "file_id", ff->file_store_id); jb_set_uint(jb, "file_id", ff->file_store_id);
} else { } else {
jb_set_bool(js, "stored", false); JB_SET_FALSE(jb, "stored");
} }
jb_set_uint(js, "size", FileTrackedSize(ff)); jb_set_uint(jb, "size", FileTrackedSize(ff));
if (ff->end > 0) { if (ff->end > 0) {
jb_set_uint(js, "start", ff->start); jb_set_uint(jb, "start", ff->start);
jb_set_uint(js, "end", ff->end); jb_set_uint(jb, "end", ff->end);
} }
jb_set_uint(js, "tx_id", ff->txid); jb_set_uint(jb, "tx_id", ff->txid);
/* Close fileinfo object */
jb_close(js);
} }
static void JsonAddPacketvars(const Packet *p, json_t *js_vars) static void JsonAddPacketvars(const Packet *p, json_t *js_vars)

@ -72,7 +72,7 @@ int OutputJSONMemBufferCallback(const char *str, size_t size, void *data);
void CreateJSONFlowId(json_t *js, const Flow *f); void CreateJSONFlowId(json_t *js, const Flow *f);
void CreateEveFlowId(JsonBuilder *js, const Flow *f); void CreateEveFlowId(JsonBuilder *js, const Flow *f);
void JsonTcpFlags(uint8_t flags, json_t *js); void JsonTcpFlags(uint8_t flags, json_t *js);
void JsonFileInfo(JsonBuilder *js, const File *file, const bool stored); void EveFileInfo(JsonBuilder *js, const File *file, const bool stored);
void EveTcpFlags(uint8_t flags, JsonBuilder *js); void EveTcpFlags(uint8_t flags, JsonBuilder *js);
void JsonPacket(const Packet *p, json_t *js, unsigned long max_length); void JsonPacket(const Packet *p, json_t *js, unsigned long max_length);
void EvePacket(const Packet *p, JsonBuilder *js, unsigned long max_length); void EvePacket(const Packet *p, JsonBuilder *js, unsigned long max_length);

Loading…
Cancel
Save