Branch data Line data Source code
1 : : // $Id: RuleCondition.cc 6008 2008-07-23 00:24:22Z vern $
2 : :
3 : : #include "config.h"
4 : :
5 : : #include "RuleCondition.h"
6 : : #include "TCP.h"
7 : : #include "Scope.h"
8 : :
9 : 0 : static inline bool is_established(const TCP_Endpoint* e)
10 : : {
11 : : // We more or less follow Snort here: an established session
12 : : // is one for which the initial handshake has succeded (but we
13 : : // add partial connections). The connection tear-down is part
14 : : // of the connection.
15 : : return e->state != TCP_ENDPOINT_INACTIVE &&
16 : : e->state != TCP_ENDPOINT_SYN_SENT &&
17 [ # # ][ # # ]: 0 : e->state != TCP_ENDPOINT_SYN_ACK_SENT;
[ # # ]
18 : : }
19 : :
20 : : bool RuleConditionTCPState::DoMatch(Rule* rule, RuleEndpointState* state,
21 : 0 : const u_char* data, int len)
22 : : {
23 : 0 : Analyzer* root = state->GetAnalyzer()->Conn()->GetRootAnalyzer();
24 : :
25 [ # # # # ]: 0 : if ( ! root || root->GetTag() != AnalyzerTag::TCP )
[ # # ]
26 : 0 : return false;
27 : :
28 : 0 : TCP_Analyzer* ta = static_cast<TCP_Analyzer*>(root);
29 : :
30 [ # # ]: 0 : if ( tcpstates & STATE_STATELESS )
31 : 0 : return true;
32 : :
33 [ # # ][ # # ]: 0 : if ( (tcpstates & STATE_ORIG) && ! state->IsOrig() )
[ # # ]
34 : 0 : return false;
35 : :
36 [ # # ][ # # ]: 0 : if ( (tcpstates & STATE_RESP) && state->IsOrig() )
[ # # ]
37 : 0 : return false;
38 : :
39 [ # # ][ # # ]: 0 : if ( (tcpstates & STATE_ESTABLISHED ) &&
[ # # ][ # # ]
40 : : ! (is_established(ta->Orig()) &&
41 : : is_established(ta->Resp())))
42 : 0 : return false;
43 : :
44 : 0 : return true;
45 : : }
46 : :
47 : 0 : void RuleConditionTCPState::PrintDebug()
48 : : {
49 : 0 : fprintf(stderr, " RuleConditionTCPState: 0x%x\n", tcpstates);
50 : 0 : }
51 : :
52 : 0 : void RuleConditionIPOptions::PrintDebug()
53 : : {
54 : 0 : fprintf(stderr, " RuleConditionIPOptions: 0x%x\n", options);
55 : 0 : }
56 : :
57 : : bool RuleConditionIPOptions::DoMatch(Rule* rule, RuleEndpointState* state,
58 : 0 : const u_char* data, int len)
59 : : {
60 : : // FIXME: Not implemented yet
61 : 0 : return false;
62 : : }
63 : :
64 : 0 : void RuleConditionSameIP::PrintDebug()
65 : : {
66 : 0 : fprintf(stderr, " RuleConditionSameIP\n");
67 : 0 : }
68 : :
69 : : bool RuleConditionSameIP::DoMatch(Rule* rule, RuleEndpointState* state,
70 : 0 : const u_char* data, int len)
71 : : {
72 : : return state->GetAnalyzer()->Conn()->OrigAddr() ==
73 : 0 : state->GetAnalyzer()->Conn()->RespAddr();
74 : : }
75 : :
76 : 0 : void RuleConditionPayloadSize::PrintDebug()
77 : : {
78 : 0 : fprintf(stderr, " RuleConditionPayloadSize %d\n", val);
79 : 0 : }
80 : :
81 : : bool RuleConditionPayloadSize::DoMatch(Rule* rule, RuleEndpointState* state,
82 : 0 : const u_char* data, int len)
83 : : {
84 : : #ifdef MATCHER_PRINT_DEBUG
85 : : fprintf(stderr, "%.06f PayloadSize check: val = %d, payload_size = %d\n",
86 : : network_time, val, state->PayloadSize());
87 : : #endif
88 : :
89 [ # # ]: 0 : if ( state->PayloadSize() < 0 )
90 : : // The size has not been set yet, i.e. we're matching
91 : : // on the pure rules now.
92 : 0 : return false;
93 : :
94 : 0 : uint32 payload_size = uint32(state->PayloadSize());
95 : :
96 [ # # # # # : 0 : switch ( comp ) {
# # ]
97 : : case RULE_EQ:
98 : 0 : return payload_size == val;
99 : :
100 : : case RULE_NE:
101 : 0 : return payload_size != val;
102 : :
103 : : case RULE_LT:
104 : 0 : return payload_size < val;
105 : :
106 : : case RULE_GT:
107 : 0 : return payload_size > val;
108 : :
109 : : case RULE_LE:
110 : 0 : return payload_size <= val;
111 : :
112 : : case RULE_GE:
113 : 0 : return payload_size >= val;
114 : :
115 : : default:
116 : 0 : internal_error("unknown comparision type");
117 : : }
118 : :
119 : : // Should not be reached
120 : : return false;
121 : : }
122 : :
123 : 0 : RuleConditionEval::RuleConditionEval(const char* func)
124 : : {
125 : 0 : id = global_scope()->Lookup(func);
126 [ # # # # ]: 0 : if ( ! id )
127 : : {
128 : 0 : rules_error("unknown identifier", func);
129 : 0 : return;
130 : : }
131 : 0 : }
132 : :
133 : : bool RuleConditionEval::DoMatch(Rule* rule, RuleEndpointState* state,
134 : 0 : const u_char* data, int len)
135 : : {
136 [ # # ]: 0 : if ( ! id->HasVal() )
137 : : {
138 : 0 : run_time("undefined value");
139 : 0 : return false;
140 : : }
141 : :
142 [ # # ]: 0 : if ( id->Type()->Tag() != TYPE_FUNC )
143 : 0 : return id->ID_Val()->AsBool();
144 : :
145 : : // Call function with a signature_state value as argument.
146 : 0 : val_list args;
147 : 0 : args.append(rule_matcher->BuildRuleStateValue(rule, state));
148 : :
149 [ # # ]: 0 : if ( data )
150 : 0 : args.append(new StringVal(len, (const char*) data));
151 : : else
152 : 0 : args.append(new StringVal(""));
153 : :
154 : 0 : Val* val = id->ID_Val()->AsFunc()->Call(&args);
155 : 0 : bool result = val->AsBool();
156 : 0 : Unref(val);
157 : :
158 : 0 : return result;
159 : : }
160 : :
161 : 0 : void RuleConditionEval::PrintDebug()
162 : : {
163 : 0 : fprintf(stderr, " RuleConditionEval: %s\n", id->Name());
164 [ + - ][ + - ]: 6 : }
165 : 3 :
|