aikido-zen 1.0.0.pre.beta.1-arm64-darwin → 1.0.1.beta.3-arm64-darwin
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.
- checksums.yaml +4 -4
- data/.aikido +6 -0
- data/README.md +67 -83
- data/lib/aikido/zen/api_client.rb +6 -3
- data/lib/aikido/zen/config.rb +11 -2
- data/lib/aikido/zen/context/rails_request.rb +3 -1
- data/lib/aikido/zen/context.rb +4 -0
- data/lib/aikido/zen/internals.rb +48 -13
- data/lib/aikido/zen/libzen-v0.1.39-arm64-darwin.dylib +0 -0
- data/lib/aikido/zen/middleware/request_tracker.rb +6 -4
- data/lib/aikido/zen/rails_engine.rb +5 -9
- data/lib/aikido/zen/request/heuristic_router.rb +6 -0
- data/lib/aikido/zen/request/rails_router.rb +5 -0
- data/lib/aikido/zen/sink.rb +5 -0
- data/lib/aikido/zen/sinks/async_http.rb +35 -16
- data/lib/aikido/zen/sinks/curb.rb +52 -26
- data/lib/aikido/zen/sinks/em_http.rb +39 -25
- data/lib/aikido/zen/sinks/excon.rb +63 -45
- data/lib/aikido/zen/sinks/file.rb +67 -71
- data/lib/aikido/zen/sinks/http.rb +38 -19
- data/lib/aikido/zen/sinks/httpclient.rb +51 -22
- data/lib/aikido/zen/sinks/httpx.rb +37 -18
- data/lib/aikido/zen/sinks/kernel.rb +18 -57
- data/lib/aikido/zen/sinks/mysql2.rb +19 -7
- data/lib/aikido/zen/sinks/net_http.rb +37 -19
- data/lib/aikido/zen/sinks/patron.rb +41 -24
- data/lib/aikido/zen/sinks/pg.rb +50 -27
- data/lib/aikido/zen/sinks/resolv.rb +37 -16
- data/lib/aikido/zen/sinks/socket.rb +33 -17
- data/lib/aikido/zen/sinks/sqlite3.rb +31 -12
- data/lib/aikido/zen/sinks/trilogy.rb +19 -7
- data/lib/aikido/zen/sinks.rb +29 -20
- data/lib/aikido/zen/sinks_dsl.rb +226 -0
- data/lib/aikido/zen/version.rb +2 -2
- data/lib/aikido/zen.rb +42 -1
- data/placeholder/.gitignore +4 -0
- data/placeholder/README.md +11 -0
- data/placeholder/Rakefile +75 -0
- data/placeholder/lib/placeholder.rb.template +3 -0
- data/placeholder/placeholder.gemspec.template +20 -0
- data/tasklib/libzen.rake +70 -66
- metadata +17 -13
- data/CHANGELOG.md +0 -25
- data/lib/aikido/zen/libzen-v0.1.37.aarch64.dylib +0 -0
- data/lib/aikido.rb +0 -3
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rake"
|
4
|
+
require "rake/clean"
|
5
|
+
require "rubygems/package"
|
6
|
+
require "fileutils"
|
7
|
+
|
8
|
+
GEM_NAMES = %w[aikido]
|
9
|
+
|
10
|
+
# Clean up created files
|
11
|
+
CLEAN.include("LICENSE")
|
12
|
+
CLEAN.include(*GEM_NAMES.map { |name| "#{name}.gemspec" })
|
13
|
+
CLEAN.include(*GEM_NAMES.map { |name| "lib/#{name}.rb" })
|
14
|
+
CLOBBER.include(*GEM_NAMES.map { |name| "#{name}-*.gem" })
|
15
|
+
|
16
|
+
namespace :build do
|
17
|
+
GEM_NAMES.each do |gem_name|
|
18
|
+
file "LICENSE" => ["../LICENSE"] do
|
19
|
+
FileUtils.cp("../LICENSE", "LICENSE")
|
20
|
+
puts "Copied LICENSE"
|
21
|
+
end
|
22
|
+
|
23
|
+
entry_point_path = "lib/#{gem_name}.rb"
|
24
|
+
|
25
|
+
# Generate the entry point file from template if needed
|
26
|
+
file entry_point_path => ["lib/placeholder.rb.template"] do
|
27
|
+
template = File.read("lib/placeholder.rb.template")
|
28
|
+
content = template.gsub("@GEM_NAME", gem_name)
|
29
|
+
File.write(entry_point_path, content)
|
30
|
+
puts "Generated #{entry_point_path}"
|
31
|
+
end
|
32
|
+
|
33
|
+
gemspec_path = "#{gem_name}.gemspec"
|
34
|
+
|
35
|
+
# Generate gemspec file from template if needed
|
36
|
+
file gemspec_path => ["placeholder.gemspec.template"] do
|
37
|
+
template = File.read("placeholder.gemspec.template")
|
38
|
+
content = template.gsub("@GEM_NAME", gem_name)
|
39
|
+
File.write(gemspec_path, content)
|
40
|
+
puts "Generated #{gemspec_path}"
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Build the #{gem_name} gem"
|
44
|
+
task gem_name => [entry_point_path, gemspec_path, "LICENSE"] do
|
45
|
+
gemspec = Gem::Specification.load(gemspec_path)
|
46
|
+
raise "Failed to load gemspec: #{gemspec_path}" unless gemspec
|
47
|
+
|
48
|
+
gem_path = Gem::Package.build(gemspec)
|
49
|
+
puts "Built #{gem_path}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Build all gems"
|
54
|
+
task all: GEM_NAMES.map { |gem_name| "build:#{gem_name}" }
|
55
|
+
end
|
56
|
+
|
57
|
+
namespace :release do
|
58
|
+
GEM_NAMES.each do |gem_name|
|
59
|
+
gemspec_path = "#{gem_name}.gemspec"
|
60
|
+
|
61
|
+
desc "Build and publish the #{gem_name} to RubyGems"
|
62
|
+
task gem_name => ["build:#{gem_name}"] do
|
63
|
+
gemspec = Gem::Specification.load(gemspec_path)
|
64
|
+
raise "Failed to load gemspec: #{gemspec_path}" unless gemspec
|
65
|
+
|
66
|
+
gem_path = "#{gemspec.name}-#{gemspec.version}.gem"
|
67
|
+
|
68
|
+
puts "Publishing #{gem_path} to RubyGem..."
|
69
|
+
sh "gem push #{gem_path}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "Build and publish all gems to RubyGems"
|
74
|
+
task all: GEM_NAMES.map { |gem_name| "release:#{gem_name}" }
|
75
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "@GEM_NAME"
|
5
|
+
spec.version = "0.0.2"
|
6
|
+
spec.authors = ["Aikido Security"]
|
7
|
+
spec.email = ["dev-admin@aikido.dev"]
|
8
|
+
spec.summary = "Security placeholder for 'aikido-zen'."
|
9
|
+
spec.description = "This gem has been published by Aikido Security to help prevent supply chain attacks. It is not intended for direct use. Please use 'aikido-zen' instead."
|
10
|
+
spec.homepage = "https://aikido.dev/zen"
|
11
|
+
spec.license = "AGPL-3.0-or-later"
|
12
|
+
|
13
|
+
spec.required_ruby_version = ">= 2.3"
|
14
|
+
|
15
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
16
|
+
spec.metadata["source_code_uri"] = "https://github.com/aikidosec/firewall-ruby"
|
17
|
+
|
18
|
+
spec.files = ["lib/@GEM_NAME.rb", "README.md", "LICENSE"]
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
end
|
data/tasklib/libzen.rake
CHANGED
@@ -1,23 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "ffi"
|
3
4
|
require "open-uri"
|
4
5
|
require "rubygems/package_task"
|
5
6
|
|
6
7
|
require_relative "../lib/aikido/zen/version"
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
puts "Downloading #{path}"
|
11
|
-
File.open(path, "wb") { |file| FileUtils.copy_stream(URI(url).open("rb"), file) }
|
12
|
-
end
|
13
|
-
|
14
|
-
def verify
|
15
|
-
expected = URI(url + ".sha256sum").read.split(/\s+/).first
|
16
|
-
actual = Digest::SHA256.file(path).to_s
|
9
|
+
class LibZen
|
10
|
+
attr_reader :platform, :suffix, :artifact
|
17
11
|
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
def initialize(platform_suffix, artifact = nil)
|
13
|
+
platform, suffix = platform_suffix.split(".", 2)
|
14
|
+
@platform = Gem::Platform.new(platform)
|
15
|
+
@suffix = suffix
|
16
|
+
@artifact = artifact
|
21
17
|
end
|
22
18
|
|
23
19
|
def version
|
@@ -25,79 +21,90 @@ LibZenDL = Struct.new(:os, :arch, :artifact) do
|
|
25
21
|
end
|
26
22
|
|
27
23
|
def path
|
28
|
-
|
24
|
+
"lib/aikido/zen/libzen-#{version}-#{platform}.#{suffix}"
|
29
25
|
end
|
30
26
|
|
31
|
-
def
|
32
|
-
|
33
|
-
"pkg/#{gemspec.name}-#{gemspec.version}#{platform}.gem"
|
27
|
+
def url
|
28
|
+
File.join("https://github.com/AikidoSec/zen-internals/releases/download", version, artifact)
|
34
29
|
end
|
35
30
|
|
36
|
-
def
|
37
|
-
|
31
|
+
def gemspec(source = Bundler.load_gemspec("aikido-zen.gemspec"))
|
32
|
+
return @spec if defined?(@spec)
|
33
|
+
|
34
|
+
@spec = source.dup
|
35
|
+
@spec.platform = platform
|
36
|
+
@spec.files << path
|
37
|
+
@spec
|
38
38
|
end
|
39
39
|
|
40
|
-
def
|
41
|
-
"
|
40
|
+
def gem_path
|
41
|
+
"pkg/#{gemspec.name}-#{gemspec.version}-#{gemspec.platform}.gem"
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
45
|
-
|
46
|
-
when :darwin then "dylib"
|
47
|
-
when :linux then "so"
|
48
|
-
when :windows then "dll"
|
49
|
-
end
|
44
|
+
def resolvable?
|
45
|
+
downloadable? || File.exist?(path)
|
50
46
|
end
|
51
47
|
|
52
|
-
def
|
53
|
-
|
48
|
+
def downloadable?
|
49
|
+
!artifact.nil?
|
54
50
|
end
|
55
51
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
Gem::Platform.new("#{platform}-#{gem_os}")
|
52
|
+
def download
|
53
|
+
puts "Downloading #{path}"
|
54
|
+
File.open(path, "wb") { |file| FileUtils.copy_stream(URI(url).open("rb"), file) }
|
60
55
|
end
|
61
56
|
|
62
|
-
def
|
63
|
-
|
57
|
+
def verify
|
58
|
+
expected = URI(url + ".sha256sum").read.split(/\s+/).first
|
59
|
+
actual = Digest::SHA256.file(path).to_s
|
64
60
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
@spec
|
61
|
+
if expected != actual
|
62
|
+
abort "Checksum verification failed for #{path}: expected #{expected}, but got #{actual}"
|
63
|
+
end
|
69
64
|
end
|
70
65
|
|
71
66
|
def namespace
|
72
|
-
|
67
|
+
platform.to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
def pkg_dir
|
71
|
+
File.dirname(gem_path)
|
73
72
|
end
|
74
73
|
end
|
75
74
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
75
|
+
LIBZENS = [
|
76
|
+
LibZen.new("arm64-darwin.dylib", "libzen_internals_aarch64-apple-darwin.dylib"),
|
77
|
+
LibZen.new("arm64-linux.so", "libzen_internals_aarch64-unknown-linux-gnu.so"),
|
78
|
+
LibZen.new("arm64-linux-musl.so", "libzen_internals_aarch64-unknown-linux-musl.so"),
|
79
|
+
LibZen.new("x86_64-darwin.dylib", "libzen_internals_x86_64-apple-darwin.dylib"),
|
80
|
+
LibZen.new("x86_64-linux.so", "libzen_internals_x86_64-unknown-linux-gnu.so"),
|
81
|
+
LibZen.new("x86_64-linux-musl.so", "libzen_internals_x86_64-unknown-linux-musl.so"),
|
82
|
+
LibZen.new("x86_64-mingw64.dll", "libzen_internals_x86_64-pc-windows-gnu.dll"),
|
83
|
+
# Not officially supported, but used during testing:
|
84
|
+
LibZen.new("x86_64-freebsd.so"),
|
85
|
+
LibZen.new("x86_64-solaris.so")
|
86
|
+
].filter(&:resolvable?)
|
87
|
+
|
83
88
|
namespace :libzen do
|
84
|
-
|
85
|
-
desc "Download libzen for #{lib.
|
89
|
+
LIBZENS.each do |lib|
|
90
|
+
desc "Download libzen for #{lib.platform} if necessary"
|
86
91
|
task(lib.namespace => lib.path)
|
87
92
|
|
88
|
-
|
89
|
-
lib.
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
+
if lib.downloadable?
|
94
|
+
file(lib.path) do
|
95
|
+
lib.download
|
96
|
+
lib.verify
|
97
|
+
end
|
98
|
+
CLEAN.include(lib.path)
|
99
|
+
end
|
93
100
|
|
94
101
|
directory lib.pkg_dir
|
95
102
|
CLOBBER.include(lib.pkg_dir)
|
96
103
|
|
97
|
-
file(lib.gem_path => [lib.path, lib.pkg_dir])
|
104
|
+
file(lib.gem_path => [lib.path, lib.pkg_dir]) do
|
98
105
|
path = Gem::Package.build(lib.gemspec)
|
99
106
|
mv path, lib.pkg_dir
|
100
|
-
|
107
|
+
end
|
101
108
|
CLOBBER.include(lib.pkg_dir)
|
102
109
|
|
103
110
|
task "#{lib.namespace}:release" => [lib.gem_path, "release:guard_clean"] do
|
@@ -105,24 +112,21 @@ namespace :libzen do
|
|
105
112
|
end
|
106
113
|
end
|
107
114
|
|
108
|
-
desc "Build all the native gems
|
109
|
-
task gems:
|
115
|
+
desc "Build all the native gems"
|
116
|
+
task gems: LIBZENS.map(&:gem_path)
|
110
117
|
|
111
118
|
desc "Push all the native gems to RubyGems"
|
112
|
-
task release:
|
119
|
+
task release: LIBZENS.map { |lib| "#{lib.namespace}:release" }
|
113
120
|
|
114
121
|
desc "Download the libzen pre-built library for all platforms"
|
115
|
-
task "download:all" =>
|
122
|
+
task "download:all" => LIBZENS.map(&:path)
|
116
123
|
|
117
124
|
desc "Downloads the libzen library for the current platform"
|
118
125
|
task "download:current" do
|
119
|
-
|
120
|
-
|
121
|
-
when /darwin/ then :darwin
|
122
|
-
when /mingw|cygwin|mswin/ then :windows
|
123
|
-
else :linux
|
124
|
-
end
|
126
|
+
platform = Gem::Platform.local.dup
|
127
|
+
platform.version = nil unless Rake::Task.task_defined?("libzen:#{platform}")
|
125
128
|
|
126
|
-
|
129
|
+
# Invoke the most specific task
|
130
|
+
Rake::Task["libzen:#{platform}"].invoke
|
127
131
|
end
|
128
132
|
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.
|
4
|
+
version: 1.0.1.beta.3
|
5
5
|
platform: arm64-darwin
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Aikido Security
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-06
|
11
|
+
date: 2025-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -55,17 +55,18 @@ dependencies:
|
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '0'
|
57
57
|
force_ruby_platform: false
|
58
|
-
description:
|
58
|
+
description: Zen by Aikido is an embedded Web Application Firewall that autonomously
|
59
|
+
protects Ruby apps against common and critical attacks.
|
59
60
|
email:
|
60
|
-
-
|
61
|
+
- dev-admin@aikido.dev
|
61
62
|
executables: []
|
62
63
|
extensions: []
|
63
64
|
extra_rdoc_files: []
|
64
65
|
files:
|
66
|
+
- ".aikido"
|
65
67
|
- ".ruby-version"
|
66
68
|
- ".simplecov"
|
67
69
|
- ".standard.yml"
|
68
|
-
- CHANGELOG.md
|
69
70
|
- LICENSE
|
70
71
|
- README.md
|
71
72
|
- Rakefile
|
@@ -75,7 +76,6 @@ files:
|
|
75
76
|
- docs/config.md
|
76
77
|
- docs/rails.md
|
77
78
|
- lib/aikido-zen.rb
|
78
|
-
- lib/aikido.rb
|
79
79
|
- lib/aikido/zen.rb
|
80
80
|
- lib/aikido/zen/actor.rb
|
81
81
|
- lib/aikido/zen/agent.rb
|
@@ -101,7 +101,7 @@ files:
|
|
101
101
|
- lib/aikido/zen/errors.rb
|
102
102
|
- lib/aikido/zen/event.rb
|
103
103
|
- lib/aikido/zen/internals.rb
|
104
|
-
- lib/aikido/zen/libzen-v0.1.
|
104
|
+
- lib/aikido/zen/libzen-v0.1.39-arm64-darwin.dylib
|
105
105
|
- lib/aikido/zen/middleware/check_allowed_addresses.rb
|
106
106
|
- lib/aikido/zen/middleware/middleware.rb
|
107
107
|
- lib/aikido/zen/middleware/rack_throttler.rb
|
@@ -163,20 +163,25 @@ files:
|
|
163
163
|
- lib/aikido/zen/sinks/sqlite3.rb
|
164
164
|
- lib/aikido/zen/sinks/trilogy.rb
|
165
165
|
- lib/aikido/zen/sinks/typhoeus.rb
|
166
|
+
- lib/aikido/zen/sinks_dsl.rb
|
166
167
|
- lib/aikido/zen/synchronizable.rb
|
167
168
|
- lib/aikido/zen/system_info.rb
|
168
169
|
- lib/aikido/zen/version.rb
|
169
170
|
- lib/aikido/zen/worker.rb
|
171
|
+
- placeholder/.gitignore
|
172
|
+
- placeholder/README.md
|
173
|
+
- placeholder/Rakefile
|
174
|
+
- placeholder/lib/placeholder.rb.template
|
175
|
+
- placeholder/placeholder.gemspec.template
|
170
176
|
- tasklib/bench.rake
|
171
177
|
- tasklib/libzen.rake
|
172
178
|
- tasklib/wrk.rb
|
173
|
-
homepage: https://aikido.dev
|
179
|
+
homepage: https://aikido.dev/zen
|
174
180
|
licenses:
|
175
181
|
- AGPL-3.0-or-later
|
176
182
|
metadata:
|
177
|
-
homepage_uri: https://aikido.dev
|
183
|
+
homepage_uri: https://aikido.dev/zen
|
178
184
|
source_code_uri: https://github.com/aikidosec/firewall-ruby
|
179
|
-
changelog_uri: https://github.com/aikidosec/firewall-ruby/blob/main/CHANGELOG.md
|
180
185
|
post_install_message:
|
181
186
|
rdoc_options: []
|
182
187
|
require_paths:
|
@@ -195,6 +200,5 @@ requirements: []
|
|
195
200
|
rubygems_version: 3.5.22
|
196
201
|
signing_key:
|
197
202
|
specification_version: 4
|
198
|
-
summary: Embedded Web Application Firewall
|
199
|
-
common and critical attacks.
|
203
|
+
summary: Embedded Web Application Firewall.
|
200
204
|
test_files: []
|
data/CHANGELOG.md
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# Changelog
|
2
|
-
|
3
|
-
## [Unreleased]
|
4
|
-
|
5
|
-
### Fixed
|
6
|
-
|
7
|
-
- Avoid an infinite loop when checking for SSRFs in a circular redirects loop.
|
8
|
-
|
9
|
-
## 0.1.1
|
10
|
-
|
11
|
-
### Fixed
|
12
|
-
|
13
|
-
- Avoid an error when sending the initial heartbeat if the Aikido server hasn't
|
14
|
-
received stats yet.
|
15
|
-
- Fix the SSRF scanner to ensure the port in the user-supplied payload matches
|
16
|
-
the port in the request.
|
17
|
-
- Don't break the HTTP.rb sink when a Zen context isn't set.
|
18
|
-
- Don't break the Typhoeus sink when a Zen context isn't set.
|
19
|
-
- Don't break the PG sink outside of Rails.
|
20
|
-
- Updated [libzen](https://github.com/AikidoSec/zen-internals) to v0.1.31 to
|
21
|
-
prevent flagging false positives in SQL queries with comments.
|
22
|
-
|
23
|
-
## 0.1.0
|
24
|
-
|
25
|
-
- Initial version
|
Binary file
|
data/lib/aikido.rb
DELETED