vivarium 0.1.2 → 0.3.0
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/CONTEXT.md +535 -0
- data/README.md +56 -7
- data/examples/execve_demo.rb +49 -0
- data/examples/file_operation_demo.rb +68 -0
- data/examples/privilege_event_demo.rb +38 -0
- data/examples/raise_demo.rb +42 -0
- data/examples/signal_kill_demo.rb +38 -0
- data/examples/sudo_attempt_demo.rb +18 -0
- data/exe/vivarium +6 -0
- data/image.png +0 -0
- data/lib/vivarium/cli.rb +40 -0
- data/lib/vivarium/correlator.rb +137 -0
- data/lib/vivarium/tree_renderer.rb +543 -0
- data/lib/vivarium/version.rb +1 -1
- data/lib/vivarium.rb +985 -157
- data/logo-simple.png +0 -0
- data/sig/vivarium.rbs +17 -0
- metadata +46 -5
- data/lib/vivarium/logger.rb +0 -68
data/logo-simple.png
ADDED
|
Binary file
|
data/sig/vivarium.rbs
CHANGED
|
@@ -11,6 +11,7 @@ module Vivarium
|
|
|
11
11
|
attr_accessor payload: String?
|
|
12
12
|
|
|
13
13
|
def empty?: bool
|
|
14
|
+
def severity: () -> String
|
|
14
15
|
def self.from_binary: (String raw) -> Event
|
|
15
16
|
end
|
|
16
17
|
|
|
@@ -41,6 +42,8 @@ module Vivarium
|
|
|
41
42
|
EVENT_NAME_SIZE: Integer
|
|
42
43
|
EVENT_PAYLOAD_SIZE: Integer
|
|
43
44
|
EVENT_TS_SIZE: Integer
|
|
45
|
+
PROC_EXEC_SLOT_SIZE: Integer
|
|
46
|
+
PROC_EXEC_SLOT_COUNT: Integer
|
|
44
47
|
EVENT_STRUCT_SIZE: Integer
|
|
45
48
|
EVENT_TS_OFFSET: Integer
|
|
46
49
|
EVENT_PID_OFFSET: Integer
|
|
@@ -50,10 +53,24 @@ module Vivarium
|
|
|
50
53
|
|
|
51
54
|
def self.bpf_pin_dir: () -> String
|
|
52
55
|
def self.bpf_pin_dir=: (String dir) -> String
|
|
56
|
+
def self.event_severity: (String event_name) -> String
|
|
53
57
|
def self.decode_dns_qname: (String raw_payload) -> String
|
|
54
58
|
def self.decode_sock_connect_payload: (String raw_payload) -> String
|
|
55
59
|
def self.decode_odd_socket_payload: (String raw_payload) -> String
|
|
56
60
|
def self.decode_bad_socket_payload: (String raw_payload) -> String
|
|
61
|
+
def self.decode_proc_exec_payload: (String raw_payload) -> String
|
|
62
|
+
def self.decode_ptrace_check_payload: (String raw_payload) -> String
|
|
63
|
+
def self.decode_sb_mount_payload: (String raw_payload) -> String
|
|
64
|
+
def self.decode_kernel_read_file_payload: (String raw_payload) -> String
|
|
65
|
+
def self.decode_task_kill_payload: (String raw_payload) -> String
|
|
66
|
+
def self.decode_setid_change_payload: (String raw_payload) -> String
|
|
67
|
+
def self.decode_capable_check_payload: (String raw_payload) -> String
|
|
68
|
+
def self.decode_bprm_creds_payload: (String raw_payload) -> String
|
|
69
|
+
def self.decode_file_symlink_payload: (String raw_payload) -> String
|
|
70
|
+
def self.decode_file_hardlink_payload: (String raw_payload) -> String
|
|
71
|
+
def self.decode_file_rename_payload: (String raw_payload) -> String
|
|
72
|
+
def self.decode_file_chmod_payload: (String raw_payload) -> String
|
|
73
|
+
def self.decode_file_getdents_payload: (String raw_payload) -> String
|
|
57
74
|
def self.render_event_payload: (Event event) -> String
|
|
58
75
|
def self.observe: (?pin_dir: String pin_dir, ?logger: untyped logger, ?dest: untyped dest, ?format: Symbol format) { () -> untyped } -> untyped
|
|
59
76
|
def self.top_observe: (?pin_dir: String pin_dir, ?logger: untyped logger, ?dest: untyped dest, ?format: Symbol format) -> ObservationSession
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: vivarium
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Uchio Kondo
|
|
@@ -15,30 +15,71 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: 0.11.
|
|
18
|
+
version: 0.11.8
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
23
|
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: 0.11.
|
|
25
|
+
version: 0.11.8
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: vivarium_usdt
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 0.3.0
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: 0.3.0
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: ostruct
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
26
54
|
description: Vivarium visualizes low-level events such as file open paths and relates
|
|
27
55
|
them to Ruby method boundaries by combining RbBCC (eBPF LSM) and TracePoint.
|
|
28
56
|
email:
|
|
29
57
|
- udzura@udzura.jp
|
|
30
58
|
executables:
|
|
59
|
+
- vivarium
|
|
31
60
|
- vivariumd
|
|
32
61
|
extensions: []
|
|
33
62
|
extra_rdoc_files: []
|
|
34
63
|
files:
|
|
64
|
+
- CONTEXT.md
|
|
35
65
|
- README.md
|
|
36
66
|
- Rakefile
|
|
67
|
+
- examples/execve_demo.rb
|
|
68
|
+
- examples/file_operation_demo.rb
|
|
37
69
|
- examples/network_client_demo.rb
|
|
70
|
+
- examples/privilege_event_demo.rb
|
|
71
|
+
- examples/raise_demo.rb
|
|
72
|
+
- examples/signal_kill_demo.rb
|
|
73
|
+
- examples/sudo_attempt_demo.rb
|
|
74
|
+
- exe/vivarium
|
|
38
75
|
- exe/vivariumd
|
|
76
|
+
- image.png
|
|
39
77
|
- lib/vivarium.rb
|
|
40
|
-
- lib/vivarium/
|
|
78
|
+
- lib/vivarium/cli.rb
|
|
79
|
+
- lib/vivarium/correlator.rb
|
|
80
|
+
- lib/vivarium/tree_renderer.rb
|
|
41
81
|
- lib/vivarium/version.rb
|
|
82
|
+
- logo-simple.png
|
|
42
83
|
- sig/vivarium.rbs
|
|
43
84
|
homepage: https://github.com/udzura/vivarium
|
|
44
85
|
licenses: []
|
|
@@ -61,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
61
102
|
- !ruby/object:Gem::Version
|
|
62
103
|
version: '0'
|
|
63
104
|
requirements: []
|
|
64
|
-
rubygems_version: 4.0.
|
|
105
|
+
rubygems_version: 4.0.10
|
|
65
106
|
specification_version: 4
|
|
66
107
|
summary: Ruby observation and sandbox helper with RbBCC + TracePoint
|
|
67
108
|
test_files: []
|
data/lib/vivarium/logger.rb
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "json"
|
|
4
|
-
|
|
5
|
-
module Vivarium
|
|
6
|
-
class Logger
|
|
7
|
-
FORMATS = %i[human json].freeze
|
|
8
|
-
|
|
9
|
-
# dest: IO object or file path string
|
|
10
|
-
# format: :human or :json
|
|
11
|
-
# TODO: support flushing in bulk for performance
|
|
12
|
-
def initialize(dest: $stdout, format: :human)
|
|
13
|
-
@format = format.to_sym
|
|
14
|
-
raise ArgumentError, "unknown format: #{@format}; choose from #{FORMATS.join(', ')}" unless FORMATS.include?(@format)
|
|
15
|
-
|
|
16
|
-
if dest.is_a?(String)
|
|
17
|
-
@io = File.open(dest, "a")
|
|
18
|
-
@owned = true
|
|
19
|
-
else
|
|
20
|
-
@io = dest
|
|
21
|
-
@owned = false
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def log(events, tp, stack)
|
|
26
|
-
case @format
|
|
27
|
-
when :human then log_human(events, tp, stack)
|
|
28
|
-
when :json then log_json(events, tp, stack)
|
|
29
|
-
end
|
|
30
|
-
@io.flush
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def info(message)
|
|
34
|
-
@io.puts("[vivarium] #{message}")
|
|
35
|
-
@io.flush
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def close
|
|
39
|
-
@io.close if @owned
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
private
|
|
43
|
-
|
|
44
|
-
def log_human(events, tp, stack)
|
|
45
|
-
@io.puts "[vivarium] #{events.size} event(s) at #{tp.defined_class}##{tp.method_id} (#{tp.event})"
|
|
46
|
-
@io.puts " location: #{tp.path}:#{tp.lineno}"
|
|
47
|
-
events.each do |event|
|
|
48
|
-
@io.puts " ktime_ns=#{event.ktime_ns} pid=#{event.pid} #{event.event_name} payload=#{Vivarium.render_event_payload(event)}"
|
|
49
|
-
end
|
|
50
|
-
@io.puts " stack:"
|
|
51
|
-
stack.each do |loc|
|
|
52
|
-
@io.puts " #{loc.path}:#{loc.lineno}:in #{loc.base_label}"
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def log_json(events, tp, stack)
|
|
57
|
-
entry = {
|
|
58
|
-
at: "#{tp.defined_class}##{tp.method_id}",
|
|
59
|
-
event: tp.event.to_s,
|
|
60
|
-
path: tp.path,
|
|
61
|
-
lineno: tp.lineno,
|
|
62
|
-
events: events.map { |e| { ktime_ns: e.ktime_ns, pid: e.pid, event_name: e.event_name, payload: Vivarium.render_event_payload(e) } },
|
|
63
|
-
stack: stack.map { |loc| "#{loc.path}:#{loc.lineno}:in #{loc.base_label}" }
|
|
64
|
-
}
|
|
65
|
-
@io.puts JSON.generate(entry)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|