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.
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.1.2
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.4
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.4
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/logger.rb
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.6
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: []
@@ -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