tcell_agent 0.2.19 → 0.2.21

Sign up to get free protection for your applications and to get access to all the features.
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