WIP address matching stuff

remotes/origin/master-1.0.x
Victor Julien 17 years ago
parent 84588f4216
commit 7aada782a4

@ -40,6 +40,7 @@ detect-msg.c detect-msg.h \
detect-flow.c detect-flow.h \
detect-dsize.c detect-dsize.h \
detect-address.c detect-address.h \
detect-address2.c detect-address2.h \
util-mpm-trie.c util-mpm-trie.h \
util-mpm.c util-mpm.h \
util-binsearch.c util-binsearch.h \

@ -66,14 +66,14 @@ am_vips_OBJECTS = vips-vips.$(OBJEXT) vips-config.$(OBJEXT) \
vips-detect-threshold.$(OBJEXT) vips-detect-metadata.$(OBJEXT) \
vips-detect-msg.$(OBJEXT) vips-detect-flow.$(OBJEXT) \
vips-detect-dsize.$(OBJEXT) vips-detect-address.$(OBJEXT) \
vips-util-mpm-trie.$(OBJEXT) vips-util-mpm.$(OBJEXT) \
vips-util-binsearch.$(OBJEXT) vips-util-mpm-wumanber.$(OBJEXT) \
vips-util-cidr.$(OBJEXT) vips-util-unittest.$(OBJEXT) \
vips-tm-modules.$(OBJEXT) vips-tm-queues.$(OBJEXT) \
vips-tm-queuehandlers.$(OBJEXT) vips-tm-threads.$(OBJEXT) \
vips-tmqh-simple.$(OBJEXT) vips-tmqh-nfq.$(OBJEXT) \
vips-tmqh-packetpool.$(OBJEXT) vips-alert-fastlog.$(OBJEXT) \
vips-alert-unified-log.$(OBJEXT) \
vips-detect-address2.$(OBJEXT) vips-util-mpm-trie.$(OBJEXT) \
vips-util-mpm.$(OBJEXT) vips-util-binsearch.$(OBJEXT) \
vips-util-mpm-wumanber.$(OBJEXT) vips-util-cidr.$(OBJEXT) \
vips-util-unittest.$(OBJEXT) vips-tm-modules.$(OBJEXT) \
vips-tm-queues.$(OBJEXT) vips-tm-queuehandlers.$(OBJEXT) \
vips-tm-threads.$(OBJEXT) vips-tmqh-simple.$(OBJEXT) \
vips-tmqh-nfq.$(OBJEXT) vips-tmqh-packetpool.$(OBJEXT) \
vips-alert-fastlog.$(OBJEXT) vips-alert-unified-log.$(OBJEXT) \
vips-alert-unified-alert.$(OBJEXT)
vips_OBJECTS = $(am_vips_OBJECTS)
vips_DEPENDENCIES =
@ -246,6 +246,7 @@ detect-msg.c detect-msg.h \
detect-flow.c detect-flow.h \
detect-dsize.c detect-dsize.h \
detect-address.c detect-address.h \
detect-address2.c detect-address2.h \
util-mpm-trie.c util-mpm-trie.h \
util-mpm.c util-mpm.h \
util-binsearch.c util-binsearch.h \
@ -354,6 +355,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vips-decode-tcp.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vips-decode.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vips-detect-address.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vips-detect-address2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vips-detect-classtype.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vips-detect-content.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vips-detect-depth.Po@am__quote@
@ -995,6 +997,20 @@ vips-detect-address.obj: detect-address.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vips_CFLAGS) $(CFLAGS) -c -o vips-detect-address.obj `if test -f 'detect-address.c'; then $(CYGPATH_W) 'detect-address.c'; else $(CYGPATH_W) '$(srcdir)/detect-address.c'; fi`
vips-detect-address2.o: detect-address2.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vips_CFLAGS) $(CFLAGS) -MT vips-detect-address2.o -MD -MP -MF $(DEPDIR)/vips-detect-address2.Tpo -c -o vips-detect-address2.o `test -f 'detect-address2.c' || echo '$(srcdir)/'`detect-address2.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/vips-detect-address2.Tpo $(DEPDIR)/vips-detect-address2.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='detect-address2.c' object='vips-detect-address2.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vips_CFLAGS) $(CFLAGS) -c -o vips-detect-address2.o `test -f 'detect-address2.c' || echo '$(srcdir)/'`detect-address2.c
vips-detect-address2.obj: detect-address2.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vips_CFLAGS) $(CFLAGS) -MT vips-detect-address2.obj -MD -MP -MF $(DEPDIR)/vips-detect-address2.Tpo -c -o vips-detect-address2.obj `if test -f 'detect-address2.c'; then $(CYGPATH_W) 'detect-address2.c'; else $(CYGPATH_W) '$(srcdir)/detect-address2.c'; fi`
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/vips-detect-address2.Tpo $(DEPDIR)/vips-detect-address2.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='detect-address2.c' object='vips-detect-address2.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vips_CFLAGS) $(CFLAGS) -c -o vips-detect-address2.obj `if test -f 'detect-address2.c'; then $(CYGPATH_W) 'detect-address2.c'; else $(CYGPATH_W) '$(srcdir)/detect-address2.c'; fi`
vips-util-mpm-trie.o: util-mpm-trie.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vips_CFLAGS) $(CFLAGS) -MT vips-util-mpm-trie.o -MD -MP -MF $(DEPDIR)/vips-util-mpm-trie.Tpo -c -o vips-util-mpm-trie.o `test -f 'util-mpm-trie.c' || echo '$(srcdir)/'`util-mpm-trie.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/vips-util-mpm-trie.Tpo $(DEPDIR)/vips-util-mpm-trie.Po

@ -1,6 +1,8 @@
/* Address part of the detection engine.
*
* Copyright 2008 Victor Julien */
* Copyright (c) 2008 Victor Julien
*
* TODO move this out of the detection plugin structure */
#include "decode.h"
#include "detect.h"
@ -26,6 +28,27 @@ typedef struct DetectAddressData_ {
u_int32_t mask[4];
} DetectAddressData;
typedef struct DetectAddressGroup_ {
/* address data for this group */
DetectAddressData *ad;
/* XXX ptr to rules, or PortGroup or whatever */
/* double linked list */
struct DetectAddressGroup_ *prev;
struct DetectAddressGroup_ *next;
} DetectAddressGroup;
/* list head */
static DetectAddressGroup *head = NULL;
/* prototypes */
DetectAddressData *DetectAddressParse(char *);
void DetectAddressDataPrint(DetectAddressData *);
/* a is ... than b */
enum {
ADDRESS_ER = -1, /* error e.g. compare ipv4 and ipv6 */
@ -36,6 +59,138 @@ enum {
ADDRESS_GT, /* bigger [bbb] [aaa] */
};
DetectAddressGroup *DetectAddressGroupInit(void) {
DetectAddressGroup *ag = malloc(sizeof(DetectAddressGroup));
if (ag == NULL) {
return NULL;
}
memset(ag,0,sizeof(DetectAddressGroup));
return ag;
}
void DetectAddressGroupFree(DetectAddressGroup *ag) {
if (ag != NULL) {
if (ag->ad != NULL) {
DetectAddressFree(ag->ad);
}
free(ag);
}
}
void DetectAddressGroupCleanupList (void) {
if (head == NULL)
return;
DetectAddressGroup *cur, *next;
for (cur = head; cur != NULL; ) {
next = cur->next;
DetectAddressGroupFree(cur);
cur = next;
}
head = NULL;
}
int DetectAddressGroupSetup(char *s) {
DetectAddressGroup *ag = NULL, *cur = NULL, *next = NULL, *prev = NULL;
DetectAddressData *ad = NULL;
int r = 0;
/* parse the address */
ad = DetectAddressParse(s);
if (ad == NULL) {
goto error;
}
/* see if it already exists or overlaps with existing ag's */
if (head != NULL) {
for (cur = head; cur != NULL; cur = cur->next) {
r = AddressCmp(ad, cur->ad);
if (r == ADDRESS_ER) {
goto error;
}
/* if so, handle that */
if (r == ADDRESS_EQ) {
/* exact overlap/match, we don't need to do a thing
*/
return 0;
} else if (r == ADDRESS_ES) {
/* we are within another ad, now it gets interesting
* we need to cut up the 'cur' ad.
*
* we can be like this:
* [[ababa]aaa]
* [aa[bbb]aaa]
* [aaa[ababa]]
*
* XXX */
printf ("overlapped!\n");
DetectAddressDataPrint(ad);
DetectAddressDataPrint(cur->ad);
} else if (r == ADDRESS_EB) {
/* we fully overlap and extend 'cur'
* we need to add the none overlapping part(s)
* and we need to see if we overlap other parts too
* XXX */
printf("overlapping!\n");
} else if (r == ADDRESS_LT) {
/* see if we need to insert the ag anywhere */
ag = DetectAddressGroupInit();
if (ag == NULL) {
goto error;
}
ag->ad = ad;
/* put in the list */
ag->prev = cur->prev;
ag->next = cur;
cur->prev = ag;
/* update head if required */
if (head == cur) {
head = ag;
}
return 0;
} else if (r == ADDRESS_GT) {
/* only add it now if we are bigger than the last
* group. Otherwise we'll handle it later. */
if (cur->next == NULL) {
/* append */
ag = DetectAddressGroupInit();
if (ag == NULL) {
goto error;
}
ag->ad = ad;
/* put in the list */
ag->prev = cur;
cur->next = ag;
} else {
}
}
}
} else {
head = ag = DetectAddressGroupInit();
if (ag == NULL) {
goto error;
}
ag->ad = ad;
}
return 0;
error:
/* cleanup */
return -1;
}
int AddressCmpIPv4(DetectAddressData *a, DetectAddressData *b) {
u_int32_t net_a, net_b, brd_a, brd_b;
@ -420,6 +575,25 @@ int DetectAddressMatch (DetectAddressData *dd, Address *a) {
return 0;
}
void DetectAddressDataPrint(DetectAddressData *ad) {
if (ad == NULL)
return;
if (ad->family == AF_INET) {
struct in_addr in;
char s[16];
memcpy(&in, &ad->ip[0], sizeof(in));
inet_ntop(AF_INET, &in, s, sizeof(s));
printf("%s/", s);
memcpy(&in, &ad->mask[0], sizeof(in));
inet_ntop(AF_INET, &in, s, sizeof(s));
printf("%s\n", s);
} else if (ad->family == AF_INET6) {
}
}
/* TESTS */
@ -1448,6 +1622,131 @@ int AddressTestIPv6Ge04 (void) {
return result;
}
int AddressTestAddressGroupSetup01 (void) {
int result = 0;
int r = DetectAddressGroupSetup("1.2.3.4");
if (r == 0) {
result = 1;
}
DetectAddressGroupCleanupList();
return result;
}
int AddressTestAddressGroupSetup02 (void) {
int result = 0;
int r = DetectAddressGroupSetup("1.2.3.4");
if (r == 0 && head != NULL) {
result = 1;
}
DetectAddressGroupCleanupList();
return result;
}
int AddressTestAddressGroupSetup03 (void) {
int result = 0;
int r = DetectAddressGroupSetup("1.2.3.4");
if (r == 0 && head != NULL) {
DetectAddressGroup *prev_head = head;
r = DetectAddressGroupSetup("1.2.3.3");
if (r == 0 && head != prev_head && head != NULL && head->next == prev_head) {
result = 1;
}
}
DetectAddressGroupCleanupList();
return result;
}
int AddressTestAddressGroupSetup04 (void) {
int result = 0;
int r = DetectAddressGroupSetup("1.2.3.4");
if (r == 0 && head != NULL) {
DetectAddressGroup *prev_head = head;
r = DetectAddressGroupSetup("1.2.3.3");
if (r == 0 && head != prev_head && head != NULL && head->next == prev_head) {
prev_head = head;
r = DetectAddressGroupSetup("1.2.3.2");
if (r == 0 && head != prev_head && head != NULL && head->next == prev_head) {
result = 1;
}
}
}
DetectAddressGroupCleanupList();
return result;
}
int AddressTestAddressGroupSetup05 (void) {
int result = 0;
int r = DetectAddressGroupSetup("1.2.3.2");
if (r == 0 && head != NULL) {
DetectAddressGroup *prev_head = head;
r = DetectAddressGroupSetup("1.2.3.3");
if (r == 0 && head == prev_head && head != NULL && head->next != prev_head) {
prev_head = head;
r = DetectAddressGroupSetup("1.2.3.4");
if (r == 0 && head == prev_head && head != NULL && head->next != prev_head) {
result = 1;
}
}
}
DetectAddressGroupCleanupList();
return result;
}
int AddressTestAddressGroupSetup06 (void) {
int result = 0;
int r = DetectAddressGroupSetup("1.2.3.2");
if (r == 0 && head != NULL) {
DetectAddressGroup *prev_head = head;
r = DetectAddressGroupSetup("1.2.3.2");
if (r == 0 && head == prev_head && head != NULL && head->next == NULL) {
result = 1;
}
}
DetectAddressGroupCleanupList();
return result;
}
int AddressTestAddressGroupSetup07 (void) {
int result = 0;
int r = DetectAddressGroupSetup("10.0.0.0/8");
if (r == 0 && head != NULL) {
r = DetectAddressGroupSetup("10.10.10.10");
if (r == 0 && head != NULL && head->next != NULL && head->next->next != NULL) {
result = 1;
}
}
DetectAddressGroupCleanupList();
return result;
}
int AddressTestAddressGroupSetup08 (void) {
int result = 0;
int r = DetectAddressGroupSetup("10.10.10.10");
if (r == 0 && head != NULL) {
r = DetectAddressGroupSetup("10.0.0.0/8");
if (r == 0 && head != NULL && head->next != NULL && head->next->next != NULL) {
result = 1;
}
}
DetectAddressGroupCleanupList();
return result;
}
void DetectAddressTests(void) {
UtRegisterTest("AddressTestParse01", AddressTestParse01, 1);
UtRegisterTest("AddressTestParse02", AddressTestParse02, 1);
@ -1516,6 +1815,15 @@ void DetectAddressTests(void) {
UtRegisterTest("AddressTestIPv6Ge02", AddressTestIPv6Ge02, 1);
UtRegisterTest("AddressTestIPv6Ge03", AddressTestIPv6Ge03, 1);
UtRegisterTest("AddressTestIPv6Ge04", AddressTestIPv6Ge04, 1);
UtRegisterTest("AddressTestAddressGroupSetup01", AddressTestAddressGroupSetup01, 1);
UtRegisterTest("AddressTestAddressGroupSetup02", AddressTestAddressGroupSetup02, 1);
UtRegisterTest("AddressTestAddressGroupSetup03", AddressTestAddressGroupSetup03, 1);
UtRegisterTest("AddressTestAddressGroupSetup04", AddressTestAddressGroupSetup04, 1);
UtRegisterTest("AddressTestAddressGroupSetup05", AddressTestAddressGroupSetup05, 1);
UtRegisterTest("AddressTestAddressGroupSetup06", AddressTestAddressGroupSetup06, 1);
UtRegisterTest("AddressTestAddressGroupSetup07", AddressTestAddressGroupSetup07, 1);
UtRegisterTest("AddressTestAddressGroupSetup08", AddressTestAddressGroupSetup08, 1);
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,8 @@
#ifndef __DETECT_ADDRESS2_H__
#define __DETECT_ADDRESS2_H__
/* prototypes */
void DetectAddress2Register (void);
#endif /* __DETECT_ADDRESS2_H__ */

@ -8,6 +8,7 @@
#include "flow.h"
#include "detect-address.h"
#include "detect-address2.h"
#include "detect-content.h"
#include "detect-uricontent.h"
#include "detect-pcre.h"
@ -702,6 +703,7 @@ void SigTableSetup(void) {
DetectDsizeRegister();
DetectFlowvarRegister();
DetectAddressRegister();
DetectAddress2Register();
/* register the tests */
u_int8_t i = 0;

@ -85,6 +85,7 @@ enum {
DETECT_DSIZE,
DETECT_FLOWVAR,
DETECT_ADDRESS,
DETECT_ADDRESS2,
/* make sure this stays last */
DETECT_TBLSIZE,

Loading…
Cancel
Save