aikido-zen 1.0.2-aarch64-linux

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 (125) hide show
  1. checksums.yaml +7 -0
  2. data/.aikido +6 -0
  3. data/.ruby-version +1 -0
  4. data/.simplecov +32 -0
  5. data/.standard.yml +3 -0
  6. data/LICENSE +674 -0
  7. data/README.md +148 -0
  8. data/Rakefile +67 -0
  9. data/benchmarks/README.md +22 -0
  10. data/benchmarks/rails7.1_benchmark.js +1 -0
  11. data/benchmarks/rails7.1_sql_injection.js +102 -0
  12. data/docs/banner.svg +202 -0
  13. data/docs/config.md +133 -0
  14. data/docs/proxy.md +10 -0
  15. data/docs/rails.md +112 -0
  16. data/docs/troubleshooting.md +62 -0
  17. data/lib/aikido/zen/actor.rb +146 -0
  18. data/lib/aikido/zen/agent/heartbeats_manager.rb +66 -0
  19. data/lib/aikido/zen/agent.rb +181 -0
  20. data/lib/aikido/zen/api_client.rb +145 -0
  21. data/lib/aikido/zen/attack.rb +217 -0
  22. data/lib/aikido/zen/attack_wave/helpers.rb +457 -0
  23. data/lib/aikido/zen/attack_wave.rb +88 -0
  24. data/lib/aikido/zen/background_worker.rb +52 -0
  25. data/lib/aikido/zen/cache.rb +91 -0
  26. data/lib/aikido/zen/capped_collections.rb +86 -0
  27. data/lib/aikido/zen/collector/event.rb +238 -0
  28. data/lib/aikido/zen/collector/hosts.rb +30 -0
  29. data/lib/aikido/zen/collector/routes.rb +71 -0
  30. data/lib/aikido/zen/collector/sink_stats.rb +95 -0
  31. data/lib/aikido/zen/collector/stats.rb +122 -0
  32. data/lib/aikido/zen/collector/users.rb +32 -0
  33. data/lib/aikido/zen/collector.rb +223 -0
  34. data/lib/aikido/zen/config.rb +312 -0
  35. data/lib/aikido/zen/context/rack_request.rb +27 -0
  36. data/lib/aikido/zen/context/rails_request.rb +47 -0
  37. data/lib/aikido/zen/context.rb +145 -0
  38. data/lib/aikido/zen/detached_agent/agent.rb +79 -0
  39. data/lib/aikido/zen/detached_agent/front_object.rb +41 -0
  40. data/lib/aikido/zen/detached_agent/server.rb +78 -0
  41. data/lib/aikido/zen/detached_agent.rb +2 -0
  42. data/lib/aikido/zen/errors.rb +107 -0
  43. data/lib/aikido/zen/event.rb +116 -0
  44. data/lib/aikido/zen/helpers.rb +24 -0
  45. data/lib/aikido/zen/internals.rb +123 -0
  46. data/lib/aikido/zen/libzen-v0.1.48-aarch64-linux.so +0 -0
  47. data/lib/aikido/zen/middleware/allowed_address_checker.rb +26 -0
  48. data/lib/aikido/zen/middleware/attack_wave_protector.rb +46 -0
  49. data/lib/aikido/zen/middleware/context_setter.rb +26 -0
  50. data/lib/aikido/zen/middleware/fork_detector.rb +23 -0
  51. data/lib/aikido/zen/middleware/middleware.rb +11 -0
  52. data/lib/aikido/zen/middleware/rack_throttler.rb +50 -0
  53. data/lib/aikido/zen/middleware/request_tracker.rb +197 -0
  54. data/lib/aikido/zen/outbound_connection.rb +62 -0
  55. data/lib/aikido/zen/outbound_connection_monitor.rb +23 -0
  56. data/lib/aikido/zen/package.rb +22 -0
  57. data/lib/aikido/zen/payload.rb +50 -0
  58. data/lib/aikido/zen/rails_engine.rb +53 -0
  59. data/lib/aikido/zen/rate_limiter/breaker.rb +61 -0
  60. data/lib/aikido/zen/rate_limiter/bucket.rb +76 -0
  61. data/lib/aikido/zen/rate_limiter/result.rb +31 -0
  62. data/lib/aikido/zen/rate_limiter.rb +50 -0
  63. data/lib/aikido/zen/request/heuristic_router.rb +115 -0
  64. data/lib/aikido/zen/request/rails_router.rb +92 -0
  65. data/lib/aikido/zen/request/schema/auth_discovery.rb +86 -0
  66. data/lib/aikido/zen/request/schema/auth_schemas.rb +54 -0
  67. data/lib/aikido/zen/request/schema/builder.rb +121 -0
  68. data/lib/aikido/zen/request/schema/definition.rb +107 -0
  69. data/lib/aikido/zen/request/schema/empty_schema.rb +28 -0
  70. data/lib/aikido/zen/request/schema.rb +87 -0
  71. data/lib/aikido/zen/request.rb +88 -0
  72. data/lib/aikido/zen/route.rb +96 -0
  73. data/lib/aikido/zen/runtime_settings/endpoints.rb +78 -0
  74. data/lib/aikido/zen/runtime_settings/ip_set.rb +36 -0
  75. data/lib/aikido/zen/runtime_settings/protection_settings.rb +62 -0
  76. data/lib/aikido/zen/runtime_settings/rate_limit_settings.rb +47 -0
  77. data/lib/aikido/zen/runtime_settings.rb +66 -0
  78. data/lib/aikido/zen/scan.rb +75 -0
  79. data/lib/aikido/zen/scanners/path_traversal/helpers.rb +68 -0
  80. data/lib/aikido/zen/scanners/path_traversal_scanner.rb +64 -0
  81. data/lib/aikido/zen/scanners/shell_injection/helpers.rb +159 -0
  82. data/lib/aikido/zen/scanners/shell_injection_scanner.rb +65 -0
  83. data/lib/aikido/zen/scanners/sql_injection_scanner.rb +94 -0
  84. data/lib/aikido/zen/scanners/ssrf/dns_lookups.rb +27 -0
  85. data/lib/aikido/zen/scanners/ssrf/private_ip_checker.rb +97 -0
  86. data/lib/aikido/zen/scanners/ssrf_scanner.rb +266 -0
  87. data/lib/aikido/zen/scanners/stored_ssrf_scanner.rb +55 -0
  88. data/lib/aikido/zen/scanners.rb +7 -0
  89. data/lib/aikido/zen/sink.rb +118 -0
  90. data/lib/aikido/zen/sinks/action_controller.rb +85 -0
  91. data/lib/aikido/zen/sinks/async_http.rb +80 -0
  92. data/lib/aikido/zen/sinks/curb.rb +113 -0
  93. data/lib/aikido/zen/sinks/em_http.rb +83 -0
  94. data/lib/aikido/zen/sinks/excon.rb +118 -0
  95. data/lib/aikido/zen/sinks/file.rb +153 -0
  96. data/lib/aikido/zen/sinks/http.rb +93 -0
  97. data/lib/aikido/zen/sinks/httpclient.rb +95 -0
  98. data/lib/aikido/zen/sinks/httpx.rb +78 -0
  99. data/lib/aikido/zen/sinks/kernel.rb +33 -0
  100. data/lib/aikido/zen/sinks/mysql2.rb +31 -0
  101. data/lib/aikido/zen/sinks/net_http.rb +101 -0
  102. data/lib/aikido/zen/sinks/patron.rb +103 -0
  103. data/lib/aikido/zen/sinks/pg.rb +72 -0
  104. data/lib/aikido/zen/sinks/resolv.rb +62 -0
  105. data/lib/aikido/zen/sinks/socket.rb +85 -0
  106. data/lib/aikido/zen/sinks/sqlite3.rb +46 -0
  107. data/lib/aikido/zen/sinks/trilogy.rb +31 -0
  108. data/lib/aikido/zen/sinks/typhoeus.rb +78 -0
  109. data/lib/aikido/zen/sinks.rb +36 -0
  110. data/lib/aikido/zen/sinks_dsl.rb +250 -0
  111. data/lib/aikido/zen/synchronizable.rb +24 -0
  112. data/lib/aikido/zen/system_info.rb +80 -0
  113. data/lib/aikido/zen/version.rb +10 -0
  114. data/lib/aikido/zen/worker.rb +87 -0
  115. data/lib/aikido/zen.rb +303 -0
  116. data/lib/aikido-zen.rb +3 -0
  117. data/placeholder/.gitignore +4 -0
  118. data/placeholder/README.md +11 -0
  119. data/placeholder/Rakefile +75 -0
  120. data/placeholder/lib/placeholder.rb.template +3 -0
  121. data/placeholder/placeholder.gemspec.template +20 -0
  122. data/tasklib/bench.rake +94 -0
  123. data/tasklib/libzen.rake +133 -0
  124. data/tasklib/wrk.rb +88 -0
  125. metadata +214 -0
data/tasklib/wrk.rb ADDED
@@ -0,0 +1,88 @@
1
+ require "open3"
2
+ require "time"
3
+
4
+ NUMBER_OF_THREADS = ENV.fetch("BENCHMARK_NUMBER_OF_THREADS") { 12 }.to_s
5
+ CONNECTIONS = ENV.fetch("BENCHMARK_WRK_CONNECTIONS") { 400 }
6
+
7
+ def generate_wrk_command_for_url(url)
8
+ # Define the command with wrk included
9
+ "wrk --threads #{NUMBER_OF_THREADS} --connections #{CONNECTIONS} --duration 15s --timeout 5s --latency #{url}"
10
+ end
11
+
12
+ def cold_start(url)
13
+ 10.times do
14
+ _, err, status = Open3.capture3("curl #{url}")
15
+
16
+ if status != 0
17
+ puts err
18
+ exit(-1)
19
+ end
20
+ end
21
+ end
22
+
23
+ def extract_requests_and_latency_tuple(out, err, status)
24
+ if status == 0
25
+ # Extracting requests/sec
26
+ requests_sec_match = out.match(/Requests\/sec:\s+([\d.]+)/)
27
+ requests_sec = requests_sec_match[1].to_f if requests_sec_match
28
+
29
+ # Extracting latency
30
+ latency_match = out.match(/Latency\s+([\d.]+)(ms|s)/)
31
+ latency = latency_match[1].to_f if latency_match
32
+ latency_unit = latency_match[2] if latency_match
33
+
34
+ if latency_unit == "s"
35
+ latency *= 1000
36
+ end
37
+
38
+ {requests_sec: requests_sec, latency: latency}
39
+ else
40
+ puts "Error occurred running benchmark command:"
41
+ puts err.strip
42
+ exit(1)
43
+ end
44
+ end
45
+
46
+ def run_benchmark(route_no_zen:, route_zen:, description:, throughput_decrease_limit_perc:, latency_increase_limit_ms:)
47
+ # Cold start
48
+ cold_start(route_no_zen)
49
+ cold_start(route_zen)
50
+
51
+ out, err, status = Open3.capture3(generate_wrk_command_for_url(route_zen))
52
+ puts <<~MSG
53
+ WRK OUTPUT
54
+ ================
55
+ FIREWALL ENABLED:
56
+ #{out}
57
+ ----------------
58
+ MSG
59
+ result_zen_enabled = extract_requests_and_latency_tuple(out, err, status)
60
+
61
+ out, err, status = Open3.capture3(generate_wrk_command_for_url(route_no_zen))
62
+ puts <<~MSG
63
+ FIREWALL DISABLED:
64
+ #{out}
65
+ ================
66
+ MSG
67
+ result_zen_disabled = extract_requests_and_latency_tuple(out, err, status)
68
+
69
+ # Check if the command was successful
70
+ if result_zen_enabled && result_zen_disabled
71
+ # Print the output, which should be the Requests/sec value
72
+ puts "[ZEN ENABLED ] Requests/sec: #{result_zen_enabled[:requests_sec]} | Latency in ms: #{result_zen_enabled[:latency]}"
73
+ puts "[ZEN DISABLED] Requests/sec: #{result_zen_disabled[:requests_sec]} | Latency in ms: #{result_zen_disabled[:latency]}"
74
+
75
+ latency_increase_ms = (result_zen_enabled[:latency] - result_zen_disabled[:latency]).round(2)
76
+ puts "-> Delta in ms: #{latency_increase_ms}ms after running load test on #{description}"
77
+
78
+ throughput_decrease_perc = ((result_zen_disabled[:requests_sec] - result_zen_enabled[:requests_sec]) / result_zen_disabled[:requests_sec] * 100).round
79
+ puts "-> #{throughput_decrease_perc}% decrease in throughput after running load test on #{description}\n"
80
+
81
+ if latency_increase_ms >= latency_increase_limit_ms
82
+ exit(1)
83
+ end
84
+ if throughput_decrease_perc >= throughput_decrease_limit_perc
85
+ exit(1)
86
+ end
87
+ end
88
+ end
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aikido-zen
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.2
5
+ platform: aarch64-linux
6
+ authors:
7
+ - Aikido Security
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-12-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ force_ruby_platform: false
28
+ - !ruby/object:Gem::Dependency
29
+ name: rack
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ force_ruby_platform: false
43
+ - !ruby/object:Gem::Dependency
44
+ name: ffi
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ force_ruby_platform: false
58
+ description: Zen by Aikido is an embedded Web Application Firewall that autonomously
59
+ protects Ruby apps against common and critical attacks.
60
+ email:
61
+ - dev-admin@aikido.dev
62
+ executables: []
63
+ extensions: []
64
+ extra_rdoc_files: []
65
+ files:
66
+ - ".aikido"
67
+ - ".ruby-version"
68
+ - ".simplecov"
69
+ - ".standard.yml"
70
+ - LICENSE
71
+ - README.md
72
+ - Rakefile
73
+ - benchmarks/README.md
74
+ - benchmarks/rails7.1_benchmark.js
75
+ - benchmarks/rails7.1_sql_injection.js
76
+ - docs/banner.svg
77
+ - docs/config.md
78
+ - docs/proxy.md
79
+ - docs/rails.md
80
+ - docs/troubleshooting.md
81
+ - lib/aikido-zen.rb
82
+ - lib/aikido/zen.rb
83
+ - lib/aikido/zen/actor.rb
84
+ - lib/aikido/zen/agent.rb
85
+ - lib/aikido/zen/agent/heartbeats_manager.rb
86
+ - lib/aikido/zen/api_client.rb
87
+ - lib/aikido/zen/attack.rb
88
+ - lib/aikido/zen/attack_wave.rb
89
+ - lib/aikido/zen/attack_wave/helpers.rb
90
+ - lib/aikido/zen/background_worker.rb
91
+ - lib/aikido/zen/cache.rb
92
+ - lib/aikido/zen/capped_collections.rb
93
+ - lib/aikido/zen/collector.rb
94
+ - lib/aikido/zen/collector/event.rb
95
+ - lib/aikido/zen/collector/hosts.rb
96
+ - lib/aikido/zen/collector/routes.rb
97
+ - lib/aikido/zen/collector/sink_stats.rb
98
+ - lib/aikido/zen/collector/stats.rb
99
+ - lib/aikido/zen/collector/users.rb
100
+ - lib/aikido/zen/config.rb
101
+ - lib/aikido/zen/context.rb
102
+ - lib/aikido/zen/context/rack_request.rb
103
+ - lib/aikido/zen/context/rails_request.rb
104
+ - lib/aikido/zen/detached_agent.rb
105
+ - lib/aikido/zen/detached_agent/agent.rb
106
+ - lib/aikido/zen/detached_agent/front_object.rb
107
+ - lib/aikido/zen/detached_agent/server.rb
108
+ - lib/aikido/zen/errors.rb
109
+ - lib/aikido/zen/event.rb
110
+ - lib/aikido/zen/helpers.rb
111
+ - lib/aikido/zen/internals.rb
112
+ - lib/aikido/zen/libzen-v0.1.48-aarch64-linux.so
113
+ - lib/aikido/zen/middleware/allowed_address_checker.rb
114
+ - lib/aikido/zen/middleware/attack_wave_protector.rb
115
+ - lib/aikido/zen/middleware/context_setter.rb
116
+ - lib/aikido/zen/middleware/fork_detector.rb
117
+ - lib/aikido/zen/middleware/middleware.rb
118
+ - lib/aikido/zen/middleware/rack_throttler.rb
119
+ - lib/aikido/zen/middleware/request_tracker.rb
120
+ - lib/aikido/zen/outbound_connection.rb
121
+ - lib/aikido/zen/outbound_connection_monitor.rb
122
+ - lib/aikido/zen/package.rb
123
+ - lib/aikido/zen/payload.rb
124
+ - lib/aikido/zen/rails_engine.rb
125
+ - lib/aikido/zen/rate_limiter.rb
126
+ - lib/aikido/zen/rate_limiter/breaker.rb
127
+ - lib/aikido/zen/rate_limiter/bucket.rb
128
+ - lib/aikido/zen/rate_limiter/result.rb
129
+ - lib/aikido/zen/request.rb
130
+ - lib/aikido/zen/request/heuristic_router.rb
131
+ - lib/aikido/zen/request/rails_router.rb
132
+ - lib/aikido/zen/request/schema.rb
133
+ - lib/aikido/zen/request/schema/auth_discovery.rb
134
+ - lib/aikido/zen/request/schema/auth_schemas.rb
135
+ - lib/aikido/zen/request/schema/builder.rb
136
+ - lib/aikido/zen/request/schema/definition.rb
137
+ - lib/aikido/zen/request/schema/empty_schema.rb
138
+ - lib/aikido/zen/route.rb
139
+ - lib/aikido/zen/runtime_settings.rb
140
+ - lib/aikido/zen/runtime_settings/endpoints.rb
141
+ - lib/aikido/zen/runtime_settings/ip_set.rb
142
+ - lib/aikido/zen/runtime_settings/protection_settings.rb
143
+ - lib/aikido/zen/runtime_settings/rate_limit_settings.rb
144
+ - lib/aikido/zen/scan.rb
145
+ - lib/aikido/zen/scanners.rb
146
+ - lib/aikido/zen/scanners/path_traversal/helpers.rb
147
+ - lib/aikido/zen/scanners/path_traversal_scanner.rb
148
+ - lib/aikido/zen/scanners/shell_injection/helpers.rb
149
+ - lib/aikido/zen/scanners/shell_injection_scanner.rb
150
+ - lib/aikido/zen/scanners/sql_injection_scanner.rb
151
+ - lib/aikido/zen/scanners/ssrf/dns_lookups.rb
152
+ - lib/aikido/zen/scanners/ssrf/private_ip_checker.rb
153
+ - lib/aikido/zen/scanners/ssrf_scanner.rb
154
+ - lib/aikido/zen/scanners/stored_ssrf_scanner.rb
155
+ - lib/aikido/zen/sink.rb
156
+ - lib/aikido/zen/sinks.rb
157
+ - lib/aikido/zen/sinks/action_controller.rb
158
+ - lib/aikido/zen/sinks/async_http.rb
159
+ - lib/aikido/zen/sinks/curb.rb
160
+ - lib/aikido/zen/sinks/em_http.rb
161
+ - lib/aikido/zen/sinks/excon.rb
162
+ - lib/aikido/zen/sinks/file.rb
163
+ - lib/aikido/zen/sinks/http.rb
164
+ - lib/aikido/zen/sinks/httpclient.rb
165
+ - lib/aikido/zen/sinks/httpx.rb
166
+ - lib/aikido/zen/sinks/kernel.rb
167
+ - lib/aikido/zen/sinks/mysql2.rb
168
+ - lib/aikido/zen/sinks/net_http.rb
169
+ - lib/aikido/zen/sinks/patron.rb
170
+ - lib/aikido/zen/sinks/pg.rb
171
+ - lib/aikido/zen/sinks/resolv.rb
172
+ - lib/aikido/zen/sinks/socket.rb
173
+ - lib/aikido/zen/sinks/sqlite3.rb
174
+ - lib/aikido/zen/sinks/trilogy.rb
175
+ - lib/aikido/zen/sinks/typhoeus.rb
176
+ - lib/aikido/zen/sinks_dsl.rb
177
+ - lib/aikido/zen/synchronizable.rb
178
+ - lib/aikido/zen/system_info.rb
179
+ - lib/aikido/zen/version.rb
180
+ - lib/aikido/zen/worker.rb
181
+ - placeholder/.gitignore
182
+ - placeholder/README.md
183
+ - placeholder/Rakefile
184
+ - placeholder/lib/placeholder.rb.template
185
+ - placeholder/placeholder.gemspec.template
186
+ - tasklib/bench.rake
187
+ - tasklib/libzen.rake
188
+ - tasklib/wrk.rb
189
+ homepage: https://aikido.dev/zen
190
+ licenses:
191
+ - AGPL-3.0-or-later
192
+ metadata:
193
+ homepage_uri: https://aikido.dev/zen
194
+ source_code_uri: https://github.com/aikidosec/firewall-ruby
195
+ post_install_message:
196
+ rdoc_options: []
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '2.7'
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubygems_version: 3.5.22
211
+ signing_key:
212
+ specification_version: 4
213
+ summary: Embedded Web Application Firewall.
214
+ test_files: []