aikido-zen 1.0.2.beta.9-x86_64-mingw-64 → 1.0.2-x86_64-mingw-64

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/docs/config.md +9 -1
  4. data/docs/troubleshooting.md +62 -0
  5. data/lib/aikido/zen/agent.rb +2 -2
  6. data/lib/aikido/zen/attack.rb +8 -6
  7. data/lib/aikido/zen/attack_wave/helpers.rb +457 -0
  8. data/lib/aikido/zen/attack_wave.rb +88 -0
  9. data/lib/aikido/zen/cache.rb +91 -0
  10. data/lib/aikido/zen/capped_collections.rb +22 -4
  11. data/lib/aikido/zen/collector/event.rb +29 -0
  12. data/lib/aikido/zen/collector/hosts.rb +16 -1
  13. data/lib/aikido/zen/collector/stats.rb +17 -3
  14. data/lib/aikido/zen/collector/users.rb +2 -2
  15. data/lib/aikido/zen/collector.rb +14 -0
  16. data/lib/aikido/zen/config.rb +35 -6
  17. data/lib/aikido/zen/context/rack_request.rb +3 -0
  18. data/lib/aikido/zen/context/rails_request.rb +3 -0
  19. data/lib/aikido/zen/context.rb +35 -3
  20. data/lib/aikido/zen/event.rb +47 -2
  21. data/lib/aikido/zen/helpers.rb +24 -0
  22. data/lib/aikido/zen/middleware/{check_allowed_addresses.rb → allowed_address_checker.rb} +1 -1
  23. data/lib/aikido/zen/middleware/attack_wave_protector.rb +46 -0
  24. data/lib/aikido/zen/middleware/{set_context.rb → context_setter.rb} +1 -1
  25. data/lib/aikido/zen/middleware/rack_throttler.rb +3 -1
  26. data/lib/aikido/zen/middleware/request_tracker.rb +8 -3
  27. data/lib/aikido/zen/outbound_connection.rb +11 -1
  28. data/lib/aikido/zen/rails_engine.rb +3 -2
  29. data/lib/aikido/zen/request/rails_router.rb +17 -2
  30. data/lib/aikido/zen/request.rb +2 -36
  31. data/lib/aikido/zen/route.rb +50 -0
  32. data/lib/aikido/zen/runtime_settings/endpoints.rb +37 -8
  33. data/lib/aikido/zen/runtime_settings.rb +5 -4
  34. data/lib/aikido/zen/scanners/path_traversal_scanner.rb +3 -2
  35. data/lib/aikido/zen/scanners/shell_injection_scanner.rb +3 -2
  36. data/lib/aikido/zen/scanners/sql_injection_scanner.rb +3 -2
  37. data/lib/aikido/zen/scanners/ssrf_scanner.rb +2 -1
  38. data/lib/aikido/zen/scanners/stored_ssrf_scanner.rb +5 -1
  39. data/lib/aikido/zen/sinks/action_controller.rb +3 -1
  40. data/lib/aikido/zen/sinks/file.rb +34 -32
  41. data/lib/aikido/zen/sinks/socket.rb +7 -0
  42. data/lib/aikido/zen/system_info.rb +1 -5
  43. data/lib/aikido/zen/version.rb +1 -1
  44. data/lib/aikido/zen.rb +55 -6
  45. data/tasklib/bench.rake +1 -1
  46. metadata +10 -4
data/lib/aikido/zen.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "zen/helpers"
3
4
  require_relative "zen/version"
4
5
  require_relative "zen/errors"
5
6
  require_relative "zen/actor"
@@ -13,13 +14,15 @@ require_relative "zen/context"
13
14
  require_relative "zen/detached_agent"
14
15
  require_relative "zen/middleware/middleware"
15
16
  require_relative "zen/middleware/fork_detector"
16
- require_relative "zen/middleware/set_context"
17
- require_relative "zen/middleware/check_allowed_addresses"
17
+ require_relative "zen/middleware/context_setter"
18
+ require_relative "zen/middleware/allowed_address_checker"
19
+ require_relative "zen/middleware/attack_wave_protector"
18
20
  require_relative "zen/middleware/request_tracker"
19
21
  require_relative "zen/outbound_connection"
20
22
  require_relative "zen/outbound_connection_monitor"
21
23
  require_relative "zen/runtime_settings"
22
24
  require_relative "zen/rate_limiter"
25
+ require_relative "zen/attack_wave"
23
26
  require_relative "zen/scanners"
24
27
 
25
28
  module Aikido
@@ -77,6 +80,16 @@ module Aikido
77
80
  @runtime_settings = settings
78
81
  end
79
82
 
83
+ # @return [Boolean] whether the Aikido agent is currently blocking requests.
84
+ # Blocking mode is configured at startup and can be controlled through the
85
+ # Aikido dashboard at runtime.
86
+ def self.blocking_mode?
87
+ blocking_mode = runtime_settings.blocking_mode
88
+ return blocking_mode unless blocking_mode.nil?
89
+
90
+ config.blocking_mode
91
+ end
92
+
80
93
  # Gets information about the current system configuration, which is sent to
81
94
  # the server along with any events.
82
95
  def self.system_info
@@ -89,10 +102,6 @@ module Aikido
89
102
  @collector ||= Collector.new
90
103
  end
91
104
 
92
- def self.detached_agent
93
- @detached_agent ||= DetachedAgent::Agent.new
94
- end
95
-
96
105
  # Gets the current context object that holds all information about the
97
106
  # current request.
98
107
  #
@@ -118,6 +127,18 @@ module Aikido
118
127
  collector.track_request
119
128
  end
120
129
 
130
+ # Track statistics about an attack wave the app is handling.
131
+ #
132
+ # @param attack_wave [Aikido::Zen::Events::AttackWave]
133
+ # @return [void]
134
+ def self.track_attack_wave(attack_wave)
135
+ collector.track_attack_wave(being_blocked: false)
136
+ end
137
+
138
+ # Track statistics about a route that the app has discovered.
139
+ #
140
+ # @param request [Aikido::Zen::Request]
141
+ # @return [void]
121
142
  def self.track_discovered_route(request)
122
143
  collector.track_route(request)
123
144
  end
@@ -173,6 +194,11 @@ module Aikido
173
194
  collector.middleware_installed!
174
195
  end
175
196
 
197
+ # @return [Aikido::Zen::AttackWave::Detector] the attack wave detector.
198
+ def self.attack_wave_detector
199
+ @attack_wave_detector ||= AttackWave::Detector.new
200
+ end
201
+
176
202
  # @!visibility private
177
203
  # Load all sources.
178
204
  #
@@ -210,6 +236,10 @@ module Aikido
210
236
  @agent ||= Agent.start
211
237
  end
212
238
 
239
+ def self.detached_agent
240
+ @detached_agent ||= DetachedAgent::Agent.new
241
+ end
242
+
213
243
  def self.detached_agent_server
214
244
  @detached_agent_server ||= DetachedAgent::Server.start
215
245
  end
@@ -250,5 +280,24 @@ module Aikido
250
280
  @detached_agent&.handle_fork
251
281
  end
252
282
  end
283
+
284
+ # @!visibility private
285
+ # Returns the stack trace trimmed to where execution last entered Zen.
286
+ #
287
+ # @return [String]
288
+ def self.clean_stack_trace
289
+ stack_trace = caller_locations
290
+
291
+ spec = Gem.loaded_specs["aikido-zen"]
292
+
293
+ # Only trim stack frames from .../lib/aikido/zen/ in the aikido-zen gem,
294
+ # so calls in sample apps are preserved.
295
+ lib_path_start = File.expand_path(File.join(spec.full_gem_path, "lib", "aikido", "zen")) + File::SEPARATOR
296
+
297
+ index = stack_trace.index { |frame| !File.expand_path(frame.path).start_with?(lib_path_start) }
298
+ stack_trace = stack_trace[index..] if index
299
+
300
+ stack_trace.map(&:to_s).join("\n")
301
+ end
253
302
  end
254
303
  end
data/tasklib/bench.rake CHANGED
@@ -87,7 +87,7 @@ Pathname.glob("sample_apps/*").select(&:directory?).each do |dir|
87
87
  end
88
88
 
89
89
  task :boot_unprotected_app do
90
- boot_server(dir, port: PORT_UNPROTECTED, env: {"AIKIDO_DISABLED" => "true"})
90
+ boot_server(dir, port: PORT_UNPROTECTED, env: {"AIKIDO_DISABLE" => "true"})
91
91
  end
92
92
  end
93
93
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aikido-zen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2.beta.9
4
+ version: 1.0.2
5
5
  platform: x86_64-mingw-64
6
6
  authors:
7
7
  - Aikido Security
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-10-28 00:00:00.000000000 Z
11
+ date: 2025-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -77,6 +77,7 @@ files:
77
77
  - docs/config.md
78
78
  - docs/proxy.md
79
79
  - docs/rails.md
80
+ - docs/troubleshooting.md
80
81
  - lib/aikido-zen.rb
81
82
  - lib/aikido/zen.rb
82
83
  - lib/aikido/zen/actor.rb
@@ -84,7 +85,10 @@ files:
84
85
  - lib/aikido/zen/agent/heartbeats_manager.rb
85
86
  - lib/aikido/zen/api_client.rb
86
87
  - lib/aikido/zen/attack.rb
88
+ - lib/aikido/zen/attack_wave.rb
89
+ - lib/aikido/zen/attack_wave/helpers.rb
87
90
  - lib/aikido/zen/background_worker.rb
91
+ - lib/aikido/zen/cache.rb
88
92
  - lib/aikido/zen/capped_collections.rb
89
93
  - lib/aikido/zen/collector.rb
90
94
  - lib/aikido/zen/collector/event.rb
@@ -103,14 +107,16 @@ files:
103
107
  - lib/aikido/zen/detached_agent/server.rb
104
108
  - lib/aikido/zen/errors.rb
105
109
  - lib/aikido/zen/event.rb
110
+ - lib/aikido/zen/helpers.rb
106
111
  - lib/aikido/zen/internals.rb
107
112
  - lib/aikido/zen/libzen-v0.1.48-x86_64-mingw-64.dll
108
- - lib/aikido/zen/middleware/check_allowed_addresses.rb
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
109
116
  - lib/aikido/zen/middleware/fork_detector.rb
110
117
  - lib/aikido/zen/middleware/middleware.rb
111
118
  - lib/aikido/zen/middleware/rack_throttler.rb
112
119
  - lib/aikido/zen/middleware/request_tracker.rb
113
- - lib/aikido/zen/middleware/set_context.rb
114
120
  - lib/aikido/zen/outbound_connection.rb
115
121
  - lib/aikido/zen/outbound_connection_monitor.rb
116
122
  - lib/aikido/zen/package.rb