tcell_agent 0.2.12 → 0.2.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tcell_agent.rb +2 -2
  3. data/lib/tcell_agent/agent/policy_manager.rb +1 -1
  4. data/lib/tcell_agent/api.rb +2 -2
  5. data/lib/tcell_agent/appsensor/rules/appsensor_rule_manager.rb +46 -0
  6. data/lib/tcell_agent/appsensor/rules/appsensor_rule_set.rb +67 -0
  7. data/lib/tcell_agent/appsensor/rules/baserules.json +153 -0
  8. data/lib/tcell_agent/configuration.rb +7 -1
  9. data/lib/tcell_agent/instrumentation.rb +3 -0
  10. data/lib/tcell_agent/logger.rb +25 -3
  11. data/lib/tcell_agent/policies/appsensor/cmdi_sensor.rb +19 -0
  12. data/lib/tcell_agent/policies/appsensor/fpt_sensor.rb +19 -0
  13. data/lib/tcell_agent/policies/appsensor/injection_sensor.rb +136 -0
  14. data/lib/tcell_agent/policies/appsensor/login_sensor.rb +42 -0
  15. data/lib/tcell_agent/policies/appsensor/nullbyte_sensor.rb +22 -0
  16. data/lib/tcell_agent/policies/appsensor/request_size_sensor.rb +21 -0
  17. data/lib/tcell_agent/policies/appsensor/response_codes_sensor.rb +58 -0
  18. data/lib/tcell_agent/policies/appsensor/response_size_sensor.rb +21 -0
  19. data/lib/tcell_agent/policies/appsensor/retr_sensor.rb +18 -0
  20. data/lib/tcell_agent/policies/appsensor/sensor.rb +28 -0
  21. data/lib/tcell_agent/policies/appsensor/size_sensor.rb +43 -0
  22. data/lib/tcell_agent/policies/appsensor/sqli_sensor.rb +25 -0
  23. data/lib/tcell_agent/policies/appsensor/xss_sensor.rb +26 -0
  24. data/lib/tcell_agent/policies/appsensor_policy.rb +198 -67
  25. data/lib/tcell_agent/policies/clickjacking_policy.rb +1 -1
  26. data/lib/tcell_agent/policies/content_security_policy.rb +1 -1
  27. data/lib/tcell_agent/policies/dataloss_policy.rb +1 -1
  28. data/lib/tcell_agent/policies/honeytokens_policy.rb +1 -1
  29. data/lib/tcell_agent/policies/http_redirect_policy.rb +1 -1
  30. data/lib/tcell_agent/policies/http_tx_policy.rb +1 -1
  31. data/lib/tcell_agent/policies/login_fraud_policy.rb +1 -1
  32. data/lib/tcell_agent/policies/secure_headers_policy.rb +1 -1
  33. data/lib/tcell_agent/rails.rb +0 -1
  34. data/lib/tcell_agent/rails/auth/devise.rb +0 -1
  35. data/lib/tcell_agent/rails/dlp.rb +58 -13
  36. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +0 -1
  37. data/lib/tcell_agent/rails/middleware/context_middleware.rb +0 -1
  38. data/lib/tcell_agent/rails/middleware/global_middleware.rb +0 -1
  39. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +6 -34
  40. data/lib/tcell_agent/sensor_events/appsensor_event.rb +59 -0
  41. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +95 -0
  42. data/lib/tcell_agent/servers/rails_server.rb +18 -9
  43. data/lib/tcell_agent/utils/params.rb +40 -0
  44. data/lib/tcell_agent/version.rb +1 -1
  45. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_manager_spec.rb +39 -0
  46. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_set_spec.rb +152 -0
  47. data/spec/lib/tcell_agent/instrumentation_spec.rb +4 -4
  48. data/spec/lib/tcell_agent/policies/appsensor/cmdi_sensor_spec.rb +128 -0
  49. data/spec/lib/tcell_agent/policies/appsensor/fpt_sensor_spec.rb +128 -0
  50. data/spec/lib/tcell_agent/policies/appsensor/login_sensor_spec.rb +104 -0
  51. data/spec/lib/tcell_agent/policies/appsensor/nullbyte_sensor_spec.rb +132 -0
  52. data/spec/lib/tcell_agent/policies/appsensor/request_size_sensor_spec.rb +164 -0
  53. data/spec/lib/tcell_agent/policies/appsensor/response_codes_sensor_spec.rb +194 -0
  54. data/spec/lib/tcell_agent/policies/appsensor/response_size_sensor_spec.rb +157 -0
  55. data/spec/lib/tcell_agent/policies/appsensor/retr_sensor_spec.rb +128 -0
  56. data/spec/lib/tcell_agent/policies/appsensor/sqli_sensor_spec.rb +151 -0
  57. data/spec/lib/tcell_agent/policies/appsensor/xss_sensor_spec.rb +652 -0
  58. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +461 -28
  59. data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +4 -4
  60. data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +6 -6
  61. data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +10 -10
  62. data/spec/lib/tcell_agent/policies/honeytokens_policy_spec.rb +1 -1
  63. data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +1 -1
  64. data/spec/lib/tcell_agent/policies/http_tx_policy_spec.rb +1 -1
  65. data/spec/lib/tcell_agent/policies/login_policy_spec.rb +2 -2
  66. data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +4 -4
  67. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +67 -7
  68. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +80 -0
  69. data/spec/lib/tcell_agent/utils/params_spec.rb +119 -0
  70. data/spec/support/resources/baserules.json +155 -0
  71. metadata +51 -12
  72. data/lib/tcell_agent/appsensor.rb +0 -42
  73. data/lib/tcell_agent/appsensor/cmdi.rb +0 -32
  74. data/lib/tcell_agent/appsensor/path_traversal.rb +0 -33
  75. data/lib/tcell_agent/appsensor/sqli.rb +0 -55
  76. data/lib/tcell_agent/appsensor/xss.rb +0 -40
  77. data/lib/tcell_agent/sensor_events/app_sensor.rb +0 -302
  78. data/spec/lib/tcell_agent/appsensor_spec.rb +0 -65
  79. data/spec/lib/tcell_agent/sensor_events/tcell_app_sensor_event_processor_spec.rb +0 -289
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7b8f5683724f8a43b2d1a495c1a201c542e2c97
4
- data.tar.gz: cdcae5ac8de0675be484c75d6f84140325819021
3
+ metadata.gz: e5ccc67c1c1611e9a2824184b1b89693dc6d0c95
4
+ data.tar.gz: 7722062a8bd1a12cda449ce20645ec11fbf024cf
5
5
  SHA512:
6
- metadata.gz: e62d02980c09b9c29807c264678fb6709aa6958db4fa45db676a45fdaf8f61f724671e0474e8826d048365c57fd4e5d244d106cc2bc33053cbf0c2bb4bd54946
7
- data.tar.gz: dd27ffe58a391b514f6e052daf818b433caab75513971da6a0b3c28272dc708ddde1314b0f01268ca5881e7a11991e70d8c63dbaffc9d1cbbbea2eebae35dae7
6
+ metadata.gz: 11be4d4e2e569c6edbcf737944410aa9c9c7f90e12e585e90026ca539330f3debe7667bcd5db02ee4f402528d92166089f225579d5dd075320118b6f481b15c5
7
+ data.tar.gz: ed0b1023516c6122b585774908acf5dbb13243619b3c1822ff55e4701616716f1d33acae60a2d5eee7dbdc416f21eb11792caa3ba59214f6d533ac1dc2038ac7
data/lib/tcell_agent.rb CHANGED
@@ -5,6 +5,8 @@ require 'tcell_agent/configuration'
5
5
 
6
6
  require 'tcell_agent/agent'
7
7
 
8
+ require 'tcell_agent/appsensor/rules/appsensor_rule_manager'
9
+
8
10
  require 'tcell_agent/policies/content_security_policy'
9
11
  require 'tcell_agent/policies/http_tx_policy'
10
12
  require 'tcell_agent/policies/http_redirect_policy'
@@ -15,9 +17,7 @@ require 'tcell_agent/policies/appsensor_policy'
15
17
  require 'tcell_agent/policies/login_fraud_policy'
16
18
  require 'tcell_agent/policies/dataloss_policy'
17
19
 
18
- require 'tcell_agent/sensor_events/app_sensor'
19
20
  require 'tcell_agent/sensor_events/dlp'
20
- require 'tcell_agent/appsensor'
21
21
  require 'tcell_agent/sensor_events/util/sanitizer_utilities'
22
22
  require 'tcell_agent/sensor_events/util/redirect_utils'
23
23
 
@@ -100,7 +100,7 @@ module TCellAgent
100
100
 
101
101
  TCellAgent::PolicyTypes::ClassMap.each do | policy_type, policy_class |
102
102
  if (policy_jsons.key?(policy_type))
103
- new_policy = policy_class.fromJson(policy_jsons[policy_type])
103
+ new_policy = policy_class.from_json(policy_jsons[policy_type])
104
104
  if new_policy
105
105
  @lock.synchronize do
106
106
  @policies[policy_type] = new_policy
@@ -81,8 +81,8 @@ module TCellAgent
81
81
  TCellAgent.logger.debug("tCell.io SendEvents API Request: " + full_url)
82
82
  request_headers = {
83
83
  :Authorization => 'Bearer ' + TCellAgent.configuration.api_key,
84
- :content_type => :json,
85
- :accept => :json,
84
+ :content_type => "application/json",
85
+ :accept => "application/json",
86
86
  }
87
87
  begin
88
88
  request_headers[:TCellAgent] = "RubyAgent " + TCellAgent::VERSION
@@ -0,0 +1,46 @@
1
+ require 'tcell_agent/appsensor/rules/appsensor_rule_set'
2
+
3
+ module TCellAgent
4
+
5
+ class AppSensorRuleManager
6
+
7
+ attr_accessor :rule_info
8
+
9
+ def initialize(filename=nil)
10
+ @rule_info = {}
11
+
12
+ load_rules_file(filename) if filename
13
+ end
14
+
15
+ def load_default_rules_file
16
+ filename = File.join(File.dirname(__FILE__), "baserules.json")
17
+ load_rules_file(filename)
18
+ end
19
+
20
+ def load_rules_file(filename)
21
+ @rule_info = {}
22
+
23
+ if File.file?(filename)
24
+ rules_from_file = YAML.load(File.open(filename).read)
25
+ rule_types = rules_from_file.fetch("sensors", {})
26
+
27
+ rule_types.each do |sensor_name, sensor_config|
28
+ rule_set = AppSensorRuleSet.new()
29
+ rule_set.set_safe_pattern_from_string(sensor_config.fetch("safe_pattern", nil))
30
+
31
+ sensor_config.fetch("patterns", []).each do |pattern_config|
32
+ rule_set.add_pattern_from_dict(pattern_config)
33
+ end
34
+
35
+ @rule_info[sensor_name] = rule_set
36
+ end
37
+ end
38
+ end
39
+
40
+ def get_ruleset_for(rule_type)
41
+ @rule_info.fetch(rule_type, nil)
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,67 @@
1
+ module TCellAgent
2
+
3
+ class AppSensorRulePattern
4
+ attr_accessor :pattern_id, :pattern_regex, :enabled
5
+ def initialize(pattern_id, pattern_regex, enabled)
6
+ @pattern_id = pattern_id
7
+ @pattern_regex = pattern_regex
8
+ @enabled = enabled
9
+ end
10
+ end
11
+
12
+ class AppSensorRuleSet
13
+ attr_accessor :safe_pattern, :patterns
14
+
15
+ def initialize()
16
+ @safe_pattern = nil
17
+ @patterns = []
18
+ end
19
+
20
+ def check_violation(param_name, param_value, active_pattern_ids, v1_compatability_enabled)
21
+ return nil if param_value.nil? || (@safe_pattern && param_value.match(@safe_pattern))
22
+
23
+ @patterns.each do |pattern|
24
+ next if pattern.nil? || pattern.enabled == false
25
+
26
+ if v1_compatability_enabled || active_pattern_ids.fetch(pattern.pattern_id, false)
27
+ pattern_result = param_value.match(pattern.pattern_regex)
28
+
29
+ if pattern_result
30
+ return {"param" => param_name, "value" => param_value, "pattern" => pattern.pattern_id}
31
+ end
32
+ end
33
+ end
34
+
35
+ return nil
36
+ rescue
37
+ return nil
38
+ end
39
+
40
+ def add_pattern_from_dict(rule_dict)
41
+ return unless rule_dict
42
+
43
+ pattern_id = rule_dict.fetch("id", nil)
44
+ pattern = rule_dict.fetch("ruby", nil)
45
+ if pattern == nil
46
+ pattern = rule_dict.fetch("common", nil)
47
+ elsif pattern == "disabled"
48
+ return
49
+ end
50
+
51
+ return if pattern_id == nil or pattern == nil
52
+
53
+ pattern_regex = Regexp.new(pattern)
54
+ enabled = rule_dict.fetch("enabled", true)
55
+
56
+ rule_pattern = AppSensorRulePattern.new(pattern_id, pattern_regex, enabled)
57
+ @patterns.push(rule_pattern)
58
+ end
59
+
60
+ def set_safe_pattern_from_string(safe_pattern_str)
61
+ if safe_pattern_str != nil
62
+ @safe_pattern = Regexp.new(safe_pattern_str)
63
+ end
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,153 @@
1
+ {
2
+ "version":"20160322",
3
+ "sensors":{
4
+ "xss":{
5
+ "patterns":[
6
+ {
7
+ "title":"Basic Injection",
8
+ "sophistication":1,
9
+ "common": "(?:<(script|iframe|embed|frame|frameset|object|img|applet|body|html|style|layer|link|ilayer|meta|bgsound))",
10
+ "id": "1"
11
+ },
12
+ {
13
+ "title":"Alert or Event XSS",
14
+ "sophistication":2,
15
+ "common": "(?:(alert|on\\w+|function\\s+\\w+)\\s*\\(\\s*(['+\\d\\w](,?\\s*['+\\d\\w]*)*)*\\s*\\))",
16
+ "id": "2"
17
+ },
18
+ {
19
+ "title":"Tag Breaks",
20
+ "sophistication":2,
21
+ "common": "(?:\\\"[^\\\"]*[^-]?>)|(?:[^\\w\\s]\\s*\\/>)|(?:>\\\")",
22
+ "id": "3"
23
+ },
24
+ {
25
+ "title":"Attribute Breaks",
26
+ "sophistication":3,
27
+ "common": "(?:\\\"+.*[<=]\\s*\\\"[^\\\"]+\\\")|(?:\\\"\\s*\\w+\\s*=)|(?:>\\w=\\/)|(?:#.+\\)[\\\"\\s]*>)|(?:\\\"\\s*(?:src|style|on\\w+)\\s*=\\s*\\\")|(?:[^\\\"]?\\\"[,;\\s]+\\w*[\\[\\(])(?:^>[\\w\\s]*<\\/?\\w{2,}>)",
28
+ "id": "4"
29
+ },
30
+ {
31
+ "title":"Basic Obfuscation",
32
+ "sophistication":3,
33
+ "common": "(?:[\\\".]script\\s*\\()|(?:\\$\\$?\\s*\\(\\s*[\\w\\\"])|(?:\\/[\\w\\s]+\\/\\.)|(?:=\\s*\\/\\w+\\/\\s*\\.)|(?:(?:this|window|top|parent|frames|self|content)\\[\\s*[(,\\\"]*\\s*[\\w\\$])|(?:,\\s*new\\s+\\w+\\s*[,;)])",
34
+ "id": "5"
35
+ },
36
+ {
37
+ "title":"Common Concatenation",
38
+ "sophistication":3,
39
+ "common": "(?:=\\s*\\w+\\s*\\+\\s*\\\")|(?:\\+=\\s*\\(\\s\\\")|(?:!+\\s*[\\d.,]+\\w?\\d*\\s*\\?)|(?:=\\s*\\[s*\\])|(?:\\\"\\s*\\+\\s*\\\")|(?:[^\\s]\\[\\s*\\d+\\s*\\]\\s*[;+])|(?:\\\"\\s*[&|]+\\s*\\\")|(?:\\/\\s*\\?\\s*\\\")|(?:\\/\\s*\\)\\s*\\[)|(?:\\d\\?.+:\\d)|(?:\\]\\s*\\[\\W*\\w)|(?:[^\\s]\\s*=\\s*\\/)",
40
+ "id": "6"
41
+ },
42
+ {
43
+ "title":"IFrame Tag Injection",
44
+ "sophistication":1,
45
+ "common": "<iframe.*",
46
+ "id": "7"
47
+ }
48
+ ]
49
+ },
50
+ "cmdi":{
51
+ "safe_pattern":"^[a-zA-Z0-9_\\s\\r\\n\\t]*$",
52
+ "patterns":[
53
+ {
54
+ "title":"Common Remote Attempts",
55
+ "sophistication":2,
56
+ "id":"1",
57
+ "common":"(?:[\\;\\|\\`]\\W*?\\bcc|\\b(wget|curl))\\b|\\/cc(?:[\\'\\\"\\|\\;\\`\\-\\s]|$)",
58
+ "ruby":"(?i:(?:[\\;\\|\\`]\\W*?\\bcc|\\b(wget|curl))\\b|\\/cc(?:[\\'\\\"\\|\\;\\`\\-\\s]|$))"
59
+ },
60
+ {
61
+ "title":"Common Command Attempts",
62
+ "sophistication":1,
63
+ "id":"2",
64
+ "common":"(?:\\b(?:(?:n(?:et(?:\\b\\W+?\\blocalgroup|\\.exe)|(?:map|c)\\.exe)|t(?:racer(?:oute|t)|elnet\\.exe|clsh8?|ftp)|(?:w(?:guest|sh)|rcmd|ftp)\\.exe|echo\\b\\W*?\\by+)\\b|c(?:md(?:(?:\\.exe|32)\\b|\\b\\W*?\\\\\\/c)|d(?:\\b\\W*?[\\\\\\/]|\\W*?\\.\\.)|hmod.{0,40}?\\+.{0,3}x))|[\\;\\|\\`]\\W*?\\b(?:(?:c(?:h(?:grp|mod|own|sh)|md|pp)|p(?:asswd|ython|erl|ing|s)|n(?:asm|map|c)|f(?:inger|tp)|(?:kil|mai)l|(?:xte)?rm|ls(?:of)?|telnet|uname|echo|id)\\b|g(?:\\+\\+|cc\\b)))"
65
+ }
66
+ ]
67
+ },
68
+ "sqli":{
69
+ "safe_pattern":"^[a-zA-Z0-9_\\s\\r\\n\\t]*$",
70
+ "patterns":[
71
+ {
72
+ "title":"Common Encoding Obfuscations",
73
+ "sophistication":3,
74
+ "common": "(?:(?:\\d[\\\"'`\u00b4\u2019\u2018]\\s+[\\\"'`\u00b4\u2019\u2018]\\s+\\d)|(?:^admin\\s*?[\\\"'`\u00b4\u2019\u2018]|(\\/\\*)+[\\\"'`\u00b4\u2019\u2018]+\\s?(?:--|#|\\/\\*|{)?)|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?\\b(x?or|div|like|between|and)\\b\\s*?[+<>=(),-]\\s*?[\\d\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?[^\\w\\s]?=\\s*?[\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\W*?[+=]+\\W*?[\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?[!=|][\\d\\s!=+-]+.*?[\\\"'`\u00b4\u2019\u2018(].*?$)|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?[!=|][\\d\\s!=]+.*?\\d+$)|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?like\\W+[\\w\\\"'`\u00b4\u2019\u2018(])|(?:\\sis\\s*?0\\W)|(?:where\\s[\\s\\w\\.,-]+\\s=)|(?:[\\\"'`\u00b4\u2019\u2018][<>~]+[\\\"'`\u00b4\u2019\u2018]))",
75
+ "id": "1"
76
+ },
77
+ {
78
+ "title":"Common Probes/Executions",
79
+ "sophistication":1,
80
+ "common": "\\b(?:having)\\b\\s+(\\d{1,10}|'[^=]{1,10}')\\s*?[=<>]|(?:\\bexecute(\\s{1,5}[\\w\\.$]{1,5}\\s{0,3})?\\()|\\bhaving\\b ?(?:\\d{1,10}|[\\'\\\"][^=]{1,10}[\\'\\\"]) ?[=<>]+|(?:\\bcreate\\s+?table.{0,20}?\\()|(?:\\blike\\W*?char\\W*?\\()|(?:(?:(select(.*?)case|from(.*?)limit|order\\sby)))|exists\\s(\\sselect|select\\Sif(null)?\\s\\(|select\\Stop|select\\Sconcat|system\\s\\(|\\b(?:having)\\b\\s+(\\d{1,10})|'[^=]{1,10}')",
81
+ "id": "2"
82
+ },
83
+ {
84
+ "title":"Comment Injection",
85
+ "sophistication":1,
86
+ "common": "([';]--|--[\\s\\r\\n\\v\\f]|(?:--[^-]*?-)|([^\\-&])#.*?[\\s\\r\\n\\v\\f]|;?\\\\x00)",
87
+ "id": "3"
88
+ },
89
+ {
90
+ "title":"Extraction Attempts 1",
91
+ "sophistication":1,
92
+ "common": "(?:(?:@.+=\\s*?\\(\\s*?select)|(?:\\d+\\s*?(x?or|div|like|between|and)\\s*?\\d+\\s*?[\\-+])|(?:\\/\\w+;?\\s+(?:having|and|x?or|div|like|between|and|select)\\W)|(?:\\d\\s+group\\s+by.+\\()|(?:(?:;|#|--)\\s*?(?:drop|alter))|(?:(?:;|#|--)\\s*?(?:update|insert)\\s*?\\w{2,})|(?:[^\\w]SET\\s*?@\\w+)|(?:(?:n?and|x?x?or|div|like|between|and|not |\\|\\||\\&\\&)[\\s(]+\\w+[\\s)]*?[!=+]+[\\s\\d]*?[\\\"'`\u00b4\u2019\u2018=()]))",
93
+ "id": "4"
94
+ },
95
+ {
96
+ "title":"Extraction Attempts 2",
97
+ "sophistication":2,
98
+ "pattern": "(?:(?:in\\s*?\\(+\\s*?select)|(?:(?:n?and|x?x?or|div|like|between|and|not |\\|\\||\\&\\&)\\s+[\\s\\w+]+(?:regexp\\s*?\\(|sounds\\s+like\\s*?[\\\"'`\u00b4\u2019\u2018]|[=\\d]+x))|([\\\"'`\u00b4\u2019\u2018]\\s*?\\d\\s*?(?:--|#))|(?:[\\\"'`\u00b4\u2019\u2018][\\%&<>^=]+\\d\\s*?(=|x?or|div|like|between|and))|(?:[\\\"'`\u00b4\u2019\u2018]\\W+[\\w+-]+\\s*?=\\s*?\\d\\W+[\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?is\\s*?\\d.+[\\\"'`\u00b4\u2019\u2018]?\\w)|(?:[\\\"'`\u00b4\u2019\u2018]\\|?[\\w-]{3,}[^\\w\\s.,]+[\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?is\\s*?[\\d.]+\\s*?\\W.*?[\\\"'`\u00b4\u2019\u2018]))",
99
+ "id": "5"
100
+ },
101
+ {
102
+ "title":"Extraction Attempts 3",
103
+ "sophistication":3,
104
+ "pattern": "(?:(?:\\d[\\\"'`\u00b4\u2019\u2018]\\s+[\\\"'`\u00b4\u2019\u2018]\\s+\\d)|(?:^admin\\s*?[\\\"'`\u00b4\u2019\u2018]|(\\/\\*)+[\\\"'`\u00b4\u2019\u2018]+\\s?(?:--|#|\\/\\*|{)?)|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?\\b(x?or|div|like|between|and)\\b\\s*?[+<>=(),-]\\s*?[\\d\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?[^\\w\\s]?=\\s*?[\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\W*?[+=]+\\W*?[\\\"'`\u00b4\u2019\u2018])|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?[!=|][\\d\\s!=+-]+.*?[\\\"'`\u00b4\u2019\u2018(].*?$)|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?[!=|][\\d\\s!=]+.*?\\d+$)|(?:[\\\"'`\u00b4\u2019\u2018]\\s*?like\\W+[\\w\\\"'`\u00b4\u2019\u2018(])|(?:\\sis\\s*?0\\W)|(?:where\\s[\\s\\w\\.,-]+\\s=)|(?:[\\\"'`\u00b4\u2019\u2018][<>~]+[\\\"'`\u00b4\u2019\u2018]))",
105
+ "id": "6"
106
+ }
107
+ ]
108
+ },
109
+ "fpt":{
110
+ "patterns":[
111
+ {
112
+ "title":"Windows Probing",
113
+ "sophistication":1,
114
+ "common": "(?:(?:\\/|\\\\)?\\.+(\\/|\\\\)(?:\\.+)?)|(?:\\w+\\.exe\\??\\s)|(?:;\\s*\\w+\\s*\\/[\\w*-]+\\/)|(?:\\d\\.\\dx\\|)|(?:%(?:c0\\.|af\\.|5c\\.))|(?:\\/(?:%2e){2})",
115
+ "ruby": "(?:(?:\\/|\\\\)?\\.+(\\/|\\\\)(?:\\.*))|(?:\\w+\\.exe\\??\\s)|(?:;\\s*\\w+\\s*\\/[\\w*-]+\\/)|(?:\\d\\.\\dx\\|)|(?:%(?:c0\\.|af\\.|5c\\.))|(?:\\/(?:%2e){2})",
116
+ "id": "1"
117
+ },
118
+ {
119
+ "title":"Unix Probing",
120
+ "sophistication":1,
121
+ "common": "(?:%c0%ae\\/)|(?:(?:\\/|\\\\)(home|conf|usr|etc|proc|opt|s?bin|local|dev|tmp|kern|[br]oot|sys|system|windows|winnt|program|%[a-z_-]{3,}%)(?:\\/|\\\\))|(?:(?:\\/|\\\\)inetpub|localstart\\.asp|boot\\.ini)",
122
+ "id": "2"
123
+ },
124
+ {
125
+ "title":"Attempt for /etc/passwd",
126
+ "sophistication":1,
127
+ "common": "(?:etc\\/\\W*passwd)",
128
+ "id": "3"
129
+ }
130
+ ]
131
+ },
132
+ "nullbyte":{
133
+ "patterns":[
134
+ {
135
+ "title":"Any Null Byte",
136
+ "sophistication":1,
137
+ "id":"1",
138
+ "common":"\\0"
139
+ }
140
+ ]
141
+ },
142
+ "retr":{
143
+ "patterns":[
144
+ {
145
+ "title":"Any Line-Break Character",
146
+ "sophistication":1,
147
+ "id":"1",
148
+ "common":"(\\n|\\r)"
149
+ }
150
+ ]
151
+ }
152
+ }
153
+ }
@@ -38,7 +38,9 @@ module TCellAgent
38
38
  :whitelist_present,
39
39
  :config_filename,
40
40
  :agent_log_dir,
41
- :max_data_ex_db_records_per_request
41
+ :max_data_ex_db_records_per_request,
42
+ :log_appfirewall_events,
43
+ :appfirewall_payloads_log_filename
42
44
 
43
45
  attr_accessor :disable_all,
44
46
  :enabled,
@@ -104,6 +106,7 @@ module TCellAgent
104
106
  @cache_filename = File.join(@agent_home_dir, "cache", "tcell_agent.cache")
105
107
  @log_filename = File.join(@agent_log_dir, "tcell_agent.log")
106
108
 
109
+
107
110
  # Because ENV can override this one
108
111
  env_unencrypted_firewall =
109
112
  if (ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"] != nil)
@@ -113,6 +116,9 @@ module TCellAgent
113
116
  @allow_unencrypted_appsensor_payloads = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"])
114
117
  end
115
118
 
119
+ @log_appfirewall_events = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS_LOGGING"])
120
+ @appfirewall_payloads_log_filename = File.join(@agent_log_dir, "tcell_agent_payloads.log")
121
+
116
122
  @tcell_api_url ||= "https://api.tcell.io/api/v1"
117
123
  @tcell_input_url ||= "https://input.tcell.io/api/v1"
118
124
  @js_agent_api_base_url ||= nil
@@ -5,6 +5,7 @@ require 'tcell_agent/logger'
5
5
  require 'tcell_agent/configuration'
6
6
  require 'tcell_agent/version'
7
7
  require 'date'
8
+ require 'cgi'
8
9
 
9
10
  module TCellAgent
10
11
  module Instrumentation
@@ -126,6 +127,7 @@ module TCellAgent
126
127
  session_id_actions.action_id
127
128
  ).for_framework(TCellAgent::SensorEvents::DlpEvent::FRAMEWORK_VARIABLE_SESSION_ID)
128
129
  )
130
+
129
131
  end
130
132
  end
131
133
  end
@@ -133,6 +135,7 @@ module TCellAgent
133
135
  replace_filters = (context_filters.select {|context_filter| context_filter.rule.body_redact == true })
134
136
  event_filters = (context_filters.select {|context_filter| (context_filter.rule.body_redact != true && context_filter.rule.body_event == true) })
135
137
  send_flag = TCellData.filterx(body, event_filters.length > 0, replace_filters.length > 0, term)
138
+ send_flag = send_flag || TCellData.filterx(body, event_filters.length > 0, replace_filters.length > 0, CGI.escapeHTML(term))
136
139
  if send_flag
137
140
  (replace_filters + event_filters).each { |filter|
138
141
  base_event = TCellAgent::SensorEvents::DlpEvent.new(
@@ -23,8 +23,30 @@ module TCellAgent
23
23
  return Logger::ERROR
24
24
  end
25
25
 
26
+ def self.appfirewall_payloads_logger
27
+ if defined?(@paylods_logger) && @logger_pid == Process.pid
28
+ return @payloads_logger
29
+ end
30
+
31
+ if TCellAgent.configuration.log_appfirewall_events
32
+ FileUtils.mkdir_p TCellAgent.configuration.agent_log_dir
33
+ @payloads_logger = Logger.new(TCellAgent.configuration.appfirewall_payloads_log_filename, 9, 5242880)
34
+ @payloads_logger.level = Logger::INFO
35
+ @payloads_logger.formatter = proc do |severity, datetime, progname, msg|
36
+ date_format = datetime.strftime("%Y-%m-%dT%H:%M:%S.%L%:z")
37
+ "#{date_format} - #{msg}\n"
38
+ end
39
+
40
+ return @payloads_logger
41
+ end
42
+
43
+ logger = Logger.new(TCellAgent.configuration.appfirewall_payloads_log_filename)
44
+ logger.level = Logger::ERROR
45
+ return logger
46
+ end
47
+
26
48
  def self.logger
27
- if defined?(@logger) and @logger_pid == Process.pid
49
+ if defined?(@logger) && @logger_pid == Process.pid
28
50
  return @logger
29
51
  end
30
52
 
@@ -40,8 +62,8 @@ module TCellAgent
40
62
  @logger.level = level
41
63
  @logger.formatter = proc do |severity, datetime, progname, msg|
42
64
  # ISO 8601 format
43
- date_format = datetime.strftime("%Y-%m-%d %H:%M:%S,%L%z")
44
- "[#{date_format}] [#{TCellAgent::VERSION}] #{severity}[#{@logger_pid}]: #{msg}\n"
65
+ date_format = datetime.strftime("%Y-%m-%dT%H:%M:%S.%L%:z")
66
+ "#{date_format} - [#{TCellAgent::VERSION}] - #{severity}[#{@logger_pid}]: #{msg}\n"
45
67
  end
46
68
 
47
69
  return @logger
@@ -0,0 +1,19 @@
1
+ require 'tcell_agent/policies/appsensor/injection_sensor'
2
+
3
+
4
+ module TCellAgent
5
+ module Policies
6
+
7
+ class CmdiSensor < InjectionSensor
8
+
9
+ def initialize(policy_json=nil)
10
+ super(
11
+ "cmdi",
12
+ policy_json
13
+ )
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'tcell_agent/policies/appsensor/injection_sensor'
2
+
3
+
4
+ module TCellAgent
5
+ module Policies
6
+
7
+ class FptSensor < InjectionSensor
8
+
9
+ def initialize(policy_json=nil)
10
+ super(
11
+ "fpt",
12
+ policy_json
13
+ )
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end