tcell_agent 0.2.19 → 0.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE_libinjection +32 -0
  3. data/Rakefile +14 -1
  4. data/ext/libinjection/extconf.rb +3 -0
  5. data/ext/libinjection/libinjection.h +65 -0
  6. data/ext/libinjection/libinjection_html5.c +847 -0
  7. data/ext/libinjection/libinjection_html5.h +54 -0
  8. data/ext/libinjection/libinjection_sqli.c +2317 -0
  9. data/ext/libinjection/libinjection_sqli.h +295 -0
  10. data/ext/libinjection/libinjection_sqli_data.h +9004 -0
  11. data/ext/libinjection/libinjection_wrap.c +3525 -0
  12. data/ext/libinjection/libinjection_xss.c +531 -0
  13. data/ext/libinjection/libinjection_xss.h +21 -0
  14. data/lib/tcell_agent/configuration.rb +0 -48
  15. data/lib/tcell_agent/logger.rb +1 -0
  16. data/lib/tcell_agent/policies/appsensor/database_sensor.rb +8 -20
  17. data/lib/tcell_agent/policies/appsensor/injection_sensor.rb +30 -46
  18. data/lib/tcell_agent/policies/appsensor/login_sensor.rb +1 -4
  19. data/lib/tcell_agent/policies/appsensor/misc_sensor.rb +8 -22
  20. data/lib/tcell_agent/policies/appsensor/payloads_policy.rb +143 -0
  21. data/lib/tcell_agent/policies/appsensor/response_codes_sensor.rb +3 -1
  22. data/lib/tcell_agent/policies/appsensor/sensor.rb +21 -2
  23. data/lib/tcell_agent/policies/appsensor/size_sensor.rb +3 -1
  24. data/lib/tcell_agent/policies/appsensor/sqli_sensor.rb +9 -0
  25. data/lib/tcell_agent/policies/appsensor/user_agent_sensor.rb +1 -5
  26. data/lib/tcell_agent/policies/appsensor/xss_sensor.rb +9 -1
  27. data/lib/tcell_agent/policies/appsensor_policy.rb +40 -19
  28. data/lib/tcell_agent/policies/http_redirect_policy.rb +12 -2
  29. data/lib/tcell_agent/rails/csrf_exception.rb +1 -1
  30. data/lib/tcell_agent/rails/dlp.rb +98 -76
  31. data/lib/tcell_agent/rails/middleware/global_middleware.rb +1 -2
  32. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +2 -2
  33. data/lib/tcell_agent/rails/on_start.rb +53 -20
  34. data/lib/tcell_agent/sensor_events/appsensor_event.rb +12 -19
  35. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +7 -2
  36. data/lib/tcell_agent/sensor_events/sensor.rb +10 -11
  37. data/lib/tcell_agent/sensor_events/server_agent.rb +17 -12
  38. data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +148 -139
  39. data/lib/tcell_agent/utils/params.rb +24 -21
  40. data/lib/tcell_agent/version.rb +1 -1
  41. data/spec/lib/tcell_agent/configuration_spec.rb +0 -179
  42. data/spec/lib/tcell_agent/policies/appsensor/database_sensor_spec.rb +6 -4
  43. data/spec/lib/tcell_agent/policies/appsensor/misc_sensor_spec.rb +31 -22
  44. data/spec/lib/tcell_agent/policies/appsensor/payloads_policy_apply_spec.rb +466 -0
  45. data/spec/lib/tcell_agent/policies/appsensor/payloads_policy_from_json_spec.rb +890 -0
  46. data/spec/lib/tcell_agent/policies/appsensor/payloads_policy_log_spec.rb +484 -0
  47. data/spec/lib/tcell_agent/policies/appsensor/request_size_sensor_spec.rb +4 -3
  48. data/spec/lib/tcell_agent/policies/appsensor/response_codes_sensor_spec.rb +4 -4
  49. data/spec/lib/tcell_agent/policies/appsensor/response_size_sensor_spec.rb +1 -1
  50. data/spec/lib/tcell_agent/policies/appsensor/sqli_sensor_spec.rb +85 -0
  51. data/spec/lib/tcell_agent/policies/appsensor/user_agent_sensor_spec.rb +36 -16
  52. data/spec/lib/tcell_agent/policies/appsensor/xss_sensor_spec.rb +188 -312
  53. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +61 -0
  54. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +18 -11
  55. data/spec/lib/tcell_agent/rails/middleware/redirect_middleware_spec.rb +14 -15
  56. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +1 -1
  57. data/spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb +6 -5
  58. data/spec/lib/tcell_agent/utils/params_spec.rb +28 -108
  59. data/tcell_agent.gemspec +21 -1
  60. metadata +37 -4
@@ -0,0 +1,531 @@
1
+
2
+ #include "libinjection.h"
3
+ #include "libinjection_xss.h"
4
+ #include "libinjection_html5.h"
5
+
6
+ #include <assert.h>
7
+ #include <stdio.h>
8
+
9
+ typedef enum attribute {
10
+ TYPE_NONE
11
+ , TYPE_BLACK /* ban always */
12
+ , TYPE_ATTR_URL /* attribute value takes a URL-like object */
13
+ , TYPE_STYLE
14
+ , TYPE_ATTR_INDIRECT /* attribute *name* is given in *value* */
15
+ } attribute_t;
16
+
17
+
18
+ static attribute_t is_black_attr(const char* s, size_t len);
19
+ static int is_black_tag(const char* s, size_t len);
20
+ static int is_black_url(const char* s, size_t len);
21
+ static int cstrcasecmp_with_null(const char *a, const char *b, size_t n);
22
+ static int html_decode_char_at(const char* src, size_t len, size_t* consumed);
23
+ static int htmlencode_startswith(const char* prefix, const char *src, size_t n);
24
+
25
+
26
+ typedef struct stringtype {
27
+ const char* name;
28
+ attribute_t atype;
29
+ } stringtype_t;
30
+
31
+
32
+ static const int gsHexDecodeMap[256] = {
33
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
34
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
35
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
36
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
37
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 256, 256,
38
+ 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256,
39
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
40
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
41
+ 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, 256,
42
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
43
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
44
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
45
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
46
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
47
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
48
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
49
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
50
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
51
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
52
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
53
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
54
+ 256, 256, 256, 256
55
+ };
56
+
57
+ static int html_decode_char_at(const char* src, size_t len, size_t* consumed)
58
+ {
59
+ int val = 0;
60
+ size_t i;
61
+ int ch;
62
+
63
+ if (len == 0 || src == NULL) {
64
+ *consumed = 0;
65
+ return -1;
66
+ }
67
+
68
+ *consumed = 1;
69
+ if (*src != '&' || len < 2) {
70
+ return (unsigned char)(*src);
71
+ }
72
+
73
+
74
+ if (*(src+1) != '#') {
75
+ /* normally this would be for named entities
76
+ * but for this case we don't actually care
77
+ */
78
+ return '&';
79
+ }
80
+
81
+ if (*(src+2) == 'x' || *(src+2) == 'X') {
82
+ ch = (unsigned char) (*(src+3));
83
+ ch = gsHexDecodeMap[ch];
84
+ if (ch == 256) {
85
+ /* degenerate case '&#[?]' */
86
+ return '&';
87
+ }
88
+ val = ch;
89
+ i = 4;
90
+ while (i < len) {
91
+ ch = (unsigned char) src[i];
92
+ if (ch == ';') {
93
+ *consumed = i + 1;
94
+ return val;
95
+ }
96
+ ch = gsHexDecodeMap[ch];
97
+ if (ch == 256) {
98
+ *consumed = i;
99
+ return val;
100
+ }
101
+ val = (val * 16) + ch;
102
+ if (val > 0x1000FF) {
103
+ return '&';
104
+ }
105
+ ++i;
106
+ }
107
+ *consumed = i;
108
+ return val;
109
+ } else {
110
+ i = 2;
111
+ ch = (unsigned char) src[i];
112
+ if (ch < '0' || ch > '9') {
113
+ return '&';
114
+ }
115
+ val = ch - '0';
116
+ i += 1;
117
+ while (i < len) {
118
+ ch = (unsigned char) src[i];
119
+ if (ch == ';') {
120
+ *consumed = i + 1;
121
+ return val;
122
+ }
123
+ if (ch < '0' || ch > '9') {
124
+ *consumed = i;
125
+ return val;
126
+ }
127
+ val = (val * 10) + (ch - '0');
128
+ if (val > 0x1000FF) {
129
+ return '&';
130
+ }
131
+ ++i;
132
+ }
133
+ *consumed = i;
134
+ return val;
135
+ }
136
+ }
137
+
138
+
139
+ /*
140
+ * view-source:
141
+ * data:
142
+ * javascript:
143
+ */
144
+ static stringtype_t BLACKATTR[] = {
145
+ { "ACTION", TYPE_ATTR_URL } /* form */
146
+ , { "ATTRIBUTENAME", TYPE_ATTR_INDIRECT } /* SVG allow indirection of attribute names */
147
+ , { "BY", TYPE_ATTR_URL } /* SVG */
148
+ , { "BACKGROUND", TYPE_ATTR_URL } /* IE6, O11 */
149
+ , { "DATAFORMATAS", TYPE_BLACK } /* IE */
150
+ , { "DATASRC", TYPE_BLACK } /* IE */
151
+ , { "DYNSRC", TYPE_ATTR_URL } /* Obsolete img attribute */
152
+ , { "FILTER", TYPE_STYLE } /* Opera, SVG inline style */
153
+ , { "FORMACTION", TYPE_ATTR_URL } /* HTML 5 */
154
+ , { "FOLDER", TYPE_ATTR_URL } /* Only on A tags, IE-only */
155
+ , { "FROM", TYPE_ATTR_URL } /* SVG */
156
+ , { "HANDLER", TYPE_ATTR_URL } /* SVG Tiny, Opera */
157
+ , { "HREF", TYPE_ATTR_URL }
158
+ , { "LOWSRC", TYPE_ATTR_URL } /* Obsolete img attribute */
159
+ , { "POSTER", TYPE_ATTR_URL } /* Opera 10,11 */
160
+ , { "SRC", TYPE_ATTR_URL }
161
+ , { "STYLE", TYPE_STYLE }
162
+ , { "TO", TYPE_ATTR_URL } /* SVG */
163
+ , { "VALUES", TYPE_ATTR_URL } /* SVG */
164
+ , { "XLINK:HREF", TYPE_ATTR_URL }
165
+ , { NULL, TYPE_NONE }
166
+ };
167
+
168
+ /* xmlns */
169
+ /* `xml-stylesheet` > <eval>, <if expr=> */
170
+
171
+ /*
172
+ static const char* BLACKATTR[] = {
173
+ "ATTRIBUTENAME",
174
+ "BACKGROUND",
175
+ "DATAFORMATAS",
176
+ "HREF",
177
+ "SCROLL",
178
+ "SRC",
179
+ "STYLE",
180
+ "SRCDOC",
181
+ NULL
182
+ };
183
+ */
184
+
185
+ static const char* BLACKTAG[] = {
186
+ "APPLET"
187
+ /* , "AUDIO" */
188
+ , "BASE"
189
+ , "COMMENT" /* IE http://html5sec.org/#38 */
190
+ , "EMBED"
191
+ /* , "FORM" */
192
+ , "FRAME"
193
+ , "FRAMESET"
194
+ , "HANDLER" /* Opera SVG, effectively a script tag */
195
+ , "IFRAME"
196
+ , "IMPORT"
197
+ , "ISINDEX"
198
+ , "LINK"
199
+ , "LISTENER"
200
+ /* , "MARQUEE" */
201
+ , "META"
202
+ , "NOSCRIPT"
203
+ , "OBJECT"
204
+ , "SCRIPT"
205
+ , "STYLE"
206
+ /* , "VIDEO" */
207
+ , "VMLFRAME"
208
+ , "XML"
209
+ , "XSS"
210
+ , NULL
211
+ };
212
+
213
+
214
+ static int cstrcasecmp_with_null(const char *a, const char *b, size_t n)
215
+ {
216
+ char ca;
217
+ char cb;
218
+ /* printf("Comparing to %s %.*s\n", a, (int)n, b); */
219
+ while (n-- > 0) {
220
+ cb = *b++;
221
+ if (cb == '\0') continue;
222
+
223
+ ca = *a++;
224
+
225
+ if (cb >= 'a' && cb <= 'z') {
226
+ cb -= 0x20;
227
+ }
228
+ /* printf("Comparing %c vs %c with %d left\n", ca, cb, (int)n); */
229
+ if (ca != cb) {
230
+ return 1;
231
+ }
232
+ }
233
+
234
+ if (*a == 0) {
235
+ /* printf(" MATCH \n"); */
236
+ return 0;
237
+ } else {
238
+ return 1;
239
+ }
240
+ }
241
+
242
+ /*
243
+ * Does an HTML encoded binary string (const char*, length) start with
244
+ * a all uppercase c-string (null terminated), case insensitive!
245
+ *
246
+ * also ignore any embedded nulls in the HTML string!
247
+ *
248
+ * return 1 if match / starts with
249
+ * return 0 if not
250
+ */
251
+ static int htmlencode_startswith(const char *a, const char *b, size_t n)
252
+ {
253
+ size_t consumed;
254
+ int cb;
255
+ int first = 1;
256
+ /* printf("Comparing %s with %.*s\n", a,(int)n,b); */
257
+ while (n > 0) {
258
+ if (*a == 0) {
259
+ /* printf("Match EOL!\n"); */
260
+ return 1;
261
+ }
262
+ cb = html_decode_char_at(b, n, &consumed);
263
+ b += consumed;
264
+ n -= consumed;
265
+
266
+ if (first && cb <= 32) {
267
+ /* ignore all leading whitespace and control characters */
268
+ continue;
269
+ }
270
+ first = 0;
271
+
272
+ if (cb == 0) {
273
+ /* always ignore null characters in user input */
274
+ continue;
275
+ }
276
+
277
+ if (cb == 10) {
278
+ /* always ignore vertical tab characters in user input */
279
+ /* who allows this?? */
280
+ continue;
281
+ }
282
+
283
+ if (cb >= 'a' && cb <= 'z') {
284
+ /* upcase */
285
+ cb -= 0x20;
286
+ }
287
+
288
+ if (*a != (char) cb) {
289
+ /* printf(" %c != %c\n", *a, cb); */
290
+ /* mismatch */
291
+ return 0;
292
+ }
293
+ a++;
294
+ }
295
+
296
+ return (*a == 0) ? 1 : 0;
297
+ }
298
+
299
+ static int is_black_tag(const char* s, size_t len)
300
+ {
301
+ const char** black;
302
+
303
+ if (len < 3) {
304
+ return 0;
305
+ }
306
+
307
+ black = BLACKTAG;
308
+ while (*black != NULL) {
309
+ if (cstrcasecmp_with_null(*black, s, len) == 0) {
310
+ /* printf("Got black tag %s\n", *black); */
311
+ return 1;
312
+ }
313
+ black += 1;
314
+ }
315
+
316
+ /* anything SVG related */
317
+ if ((s[0] == 's' || s[0] == 'S') &&
318
+ (s[1] == 'v' || s[1] == 'V') &&
319
+ (s[2] == 'g' || s[2] == 'G')) {
320
+ /* printf("Got SVG tag \n"); */
321
+ return 1;
322
+ }
323
+
324
+ /* Anything XSL(t) related */
325
+ if ((s[0] == 'x' || s[0] == 'X') &&
326
+ (s[1] == 's' || s[1] == 'S') &&
327
+ (s[2] == 'l' || s[2] == 'L')) {
328
+ /* printf("Got XSL tag\n"); */
329
+ return 1;
330
+ }
331
+
332
+ return 0;
333
+ }
334
+
335
+ static attribute_t is_black_attr(const char* s, size_t len)
336
+ {
337
+ stringtype_t* black;
338
+
339
+ if (len < 2) {
340
+ return TYPE_NONE;
341
+ }
342
+
343
+ /* JavaScript on.* */
344
+ if ((s[0] == 'o' || s[0] == 'O') && (s[1] == 'n' || s[1] == 'N')) {
345
+ /* printf("Got JavaScript on- attribute name\n"); */
346
+ return TYPE_BLACK;
347
+ }
348
+
349
+
350
+ if (len >= 5) {
351
+ /* XMLNS can be used to create arbitrary tags */
352
+ if (cstrcasecmp_with_null("XMLNS", s, 5) == 0 || cstrcasecmp_with_null("XLINK", s, 5) == 0) {
353
+ /* printf("Got XMLNS and XLINK tags\n"); */
354
+ return TYPE_BLACK;
355
+ }
356
+ }
357
+
358
+ black = BLACKATTR;
359
+ while (black->name != NULL) {
360
+ if (cstrcasecmp_with_null(black->name, s, len) == 0) {
361
+ /* printf("Got banned attribute name %s\n", black->name); */
362
+ return black->atype;
363
+ }
364
+ black += 1;
365
+ }
366
+
367
+ return TYPE_NONE;
368
+ }
369
+
370
+ static int is_black_url(const char* s, size_t len)
371
+ {
372
+
373
+ static const char* data_url = "DATA";
374
+ static const char* viewsource_url = "VIEW-SOURCE";
375
+
376
+ /* obsolete but interesting signal */
377
+ static const char* vbscript_url = "VBSCRIPT";
378
+
379
+ /* covers JAVA, JAVASCRIPT, + colon */
380
+ static const char* javascript_url = "JAVA";
381
+
382
+ /* skip whitespace */
383
+ while (len > 0 && (*s <= 32 || *s >= 127)) {
384
+ /*
385
+ * HEY: this is a signed character.
386
+ * We are intentionally skipping high-bit characters too
387
+ * since they are not ASCII, and Opera sometimes uses UTF-8 whitespace.
388
+ *
389
+ * Also in EUC-JP some of the high bytes are just ignored.
390
+ */
391
+ ++s;
392
+ --len;
393
+ }
394
+
395
+ if (htmlencode_startswith(data_url, s, len)) {
396
+ return 1;
397
+ }
398
+
399
+ if (htmlencode_startswith(viewsource_url, s, len)) {
400
+ return 1;
401
+ }
402
+
403
+ if (htmlencode_startswith(javascript_url, s, len)) {
404
+ return 1;
405
+ }
406
+
407
+ if (htmlencode_startswith(vbscript_url, s, len)) {
408
+ return 1;
409
+ }
410
+ return 0;
411
+ }
412
+
413
+ int libinjection_is_xss(const char* s, size_t len, int flags)
414
+ {
415
+ h5_state_t h5;
416
+ attribute_t attr = TYPE_NONE;
417
+
418
+ libinjection_h5_init(&h5, s, len, (enum html5_flags) flags);
419
+ while (libinjection_h5_next(&h5)) {
420
+ if (h5.token_type != ATTR_VALUE) {
421
+ attr = TYPE_NONE;
422
+ }
423
+
424
+ if (h5.token_type == DOCTYPE) {
425
+ return 1;
426
+ } else if (h5.token_type == TAG_NAME_OPEN) {
427
+ if (is_black_tag(h5.token_start, h5.token_len)) {
428
+ return 1;
429
+ }
430
+ } else if (h5.token_type == ATTR_NAME) {
431
+ attr = is_black_attr(h5.token_start, h5.token_len);
432
+ } else if (h5.token_type == ATTR_VALUE) {
433
+ /*
434
+ * IE6,7,8 parsing works a bit differently so
435
+ * a whole <script> or other black tag might be hiding
436
+ * inside an attribute value under HTML 5 parsing
437
+ * See http://html5sec.org/#102
438
+ * to avoid doing a full reparse of the value, just
439
+ * look for "<". This probably need adjusting to
440
+ * handle escaped characters
441
+ */
442
+ /*
443
+ if (memchr(h5.token_start, '<', h5.token_len) != NULL) {
444
+ return 1;
445
+ }
446
+ */
447
+
448
+ switch (attr) {
449
+ case TYPE_NONE:
450
+ break;
451
+ case TYPE_BLACK:
452
+ return 1;
453
+ case TYPE_ATTR_URL:
454
+ if (is_black_url(h5.token_start, h5.token_len)) {
455
+ return 1;
456
+ }
457
+ break;
458
+ case TYPE_STYLE:
459
+ return 1;
460
+ case TYPE_ATTR_INDIRECT:
461
+ /* an attribute name is specified in a _value_ */
462
+ if (is_black_attr(h5.token_start, h5.token_len)) {
463
+ return 1;
464
+ }
465
+ break;
466
+ /*
467
+ default:
468
+ assert(0);
469
+ */
470
+ }
471
+ attr = TYPE_NONE;
472
+ } else if (h5.token_type == TAG_COMMENT) {
473
+ /* IE uses a "`" as a tag ending char */
474
+ if (memchr(h5.token_start, '`', h5.token_len) != NULL) {
475
+ return 1;
476
+ }
477
+
478
+ /* IE conditional comment */
479
+ if (h5.token_len > 3) {
480
+ if (h5.token_start[0] == '[' &&
481
+ (h5.token_start[1] == 'i' || h5.token_start[1] == 'I') &&
482
+ (h5.token_start[2] == 'f' || h5.token_start[2] == 'F')) {
483
+ return 1;
484
+ }
485
+ if ((h5.token_start[0] == 'x' || h5.token_start[0] == 'X') &&
486
+ (h5.token_start[1] == 'm' || h5.token_start[1] == 'M') &&
487
+ (h5.token_start[2] == 'l' || h5.token_start[2] == 'L')) {
488
+ return 1;
489
+ }
490
+ }
491
+
492
+ if (h5.token_len > 5) {
493
+ /* IE <?import pseudo-tag */
494
+ if (cstrcasecmp_with_null("IMPORT", h5.token_start, 6) == 0) {
495
+ return 1;
496
+ }
497
+
498
+ /* XML Entity definition */
499
+ if (cstrcasecmp_with_null("ENTITY", h5.token_start, 6) == 0) {
500
+ return 1;
501
+ }
502
+ }
503
+ }
504
+ }
505
+ return 0;
506
+ }
507
+
508
+
509
+ /*
510
+ * wrapper
511
+ */
512
+ int libinjection_xss(const char* s, size_t len)
513
+ {
514
+ if (libinjection_is_xss(s, len, DATA_STATE)) {
515
+ return 1;
516
+ }
517
+ if (libinjection_is_xss(s, len, VALUE_NO_QUOTE)) {
518
+ return 1;
519
+ }
520
+ if (libinjection_is_xss(s, len, VALUE_SINGLE_QUOTE)) {
521
+ return 1;
522
+ }
523
+ if (libinjection_is_xss(s, len, VALUE_DOUBLE_QUOTE)) {
524
+ return 1;
525
+ }
526
+ if (libinjection_is_xss(s, len, VALUE_BACK_QUOTE)) {
527
+ return 1;
528
+ }
529
+
530
+ return 0;
531
+ }
@@ -0,0 +1,21 @@
1
+ #ifndef LIBINJECTION_XSS
2
+ #define LIBINJECTION_XSS
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ /**
9
+ * HEY THIS ISN'T DONE
10
+ */
11
+
12
+ /* pull in size_t */
13
+
14
+ #include <string.h>
15
+
16
+ int libinjection_is_xss(const char* s, size_t len, int flags);
17
+
18
+ #ifdef __cplusplus
19
+ }
20
+ #endif
21
+ #endif
@@ -32,9 +32,6 @@ module TCellAgent
32
32
  :js_agent_url,
33
33
  :raise_exceptions,
34
34
  :allow_unencrypted_appfirewall_payloads,
35
- :blacklisted_params,
36
- :whitelisted_params,
37
- :whitelist_present,
38
35
  :config_filename,
39
36
  :agent_log_dir,
40
37
  :max_data_ex_db_records_per_request,
@@ -141,8 +138,6 @@ module TCellAgent
141
138
  end
142
139
 
143
140
  @uuid = SecureRandom.uuid
144
-
145
- load_app_sensor_restrictions
146
141
  end
147
142
 
148
143
  def cache_filename_with_app_id
@@ -271,49 +266,6 @@ module TCellAgent
271
266
  end # filename exist
272
267
  end #def read
273
268
 
274
- def load_app_sensor_restrictions
275
- payloads_config_filename = ENV["TCELL_AGENT_PAYLOADS_CONFIG"] || "config/tcell_agent_payloads.config"
276
-
277
- @blacklisted_params = {
278
- "token" => true,
279
- "client_secret" => true,
280
- "password" => true,
281
- "passwd" => true,
282
- "refresh_token" => true,
283
- "pf.pass" => true,
284
- "user.password" => true
285
- }
286
- @whitelisted_params = {}
287
- @whitelist_present = false
288
-
289
- if File.file?(payloads_config_filename)
290
- begin
291
- payloads_config = YAML.load(File.open(payloads_config_filename).read)
292
- if payloads_config.has_key?("blacklisted")
293
- @blacklisted_params = {}
294
- payloads_config["blacklisted"].each do |param_name|
295
- @blacklisted_params[param_name.downcase] = true
296
- end
297
- end
298
- if payloads_config.has_key?("whitelisted")
299
- @whitelist_present = true
300
- payloads_config["whitelisted"].each do |param_name|
301
- @whitelisted_params[param_name.downcase] = true
302
- end
303
- end
304
-
305
- rescue Exception => e
306
- @allow_unencrypted_appfirewall_payloads = false
307
-
308
- puts " ********* ********* ********* **********"
309
- puts "* tCell.io *"
310
- puts "* Could not load payloads config file *"
311
- puts " ********* ********* ********* **********"
312
- puts e
313
- end
314
- end
315
- end
316
-
317
269
  def log_filename
318
270
  @agent_log_dir ||= File.join(@agent_home_dir, "logs")
319
271
  File.join(@agent_log_dir, "tcell_agent.log")
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'logger'
4
4
  require 'tcell_agent/configuration'
5
+ require 'tcell_agent/utils/io'
5
6
 
6
7
  module TCellAgent
7
8
 
@@ -1,7 +1,9 @@
1
+ require 'tcell_agent/policies/appsensor/sensor'
2
+
1
3
  module TCellAgent
2
4
  module Policies
3
5
 
4
- class DatabaseSensor
6
+ class DatabaseSensor < Sensor
5
7
 
6
8
  DP_CODE="dbmaxrows"
7
9
 
@@ -29,25 +31,11 @@ module TCellAgent
29
31
 
30
32
  return if @excluded_route_ids.fetch(tcell_data.route_id, false)
31
33
 
32
- send_event(tcell_data, number_of_records) if number_of_records > @max_rows
33
- end
34
-
35
- def send_event(tcell_data, number_of_records)
36
- event = TCellAgent::SensorEvents::TCellAppSensorEvent.new(
37
- tcell_data.uri,
38
- DP_CODE,
39
- tcell_data.request_method,
40
- tcell_data.ip_address,
41
- nil,
42
- tcell_data.route_id,
43
- {"rows" => number_of_records},
44
- tcell_data.transaction_id,
45
- tcell_data.session_id,
46
- tcell_data.user_id,
47
- nil
48
- )
49
-
50
- TCellAgent.send_event(event)
34
+ if number_of_records > @max_rows
35
+ param = nil
36
+ meta = { "rows" => number_of_records }
37
+ send_event_from_tcell_data(tcell_data, DP_CODE, param, meta)
38
+ end
51
39
  end
52
40
 
53
41
  def to_s