seccomp-tools 1.1.0 → 1.5.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.
Files changed (43) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +112 -30
  3. data/bin/seccomp-tools +1 -0
  4. data/ext/ptrace/extconf.rb +2 -0
  5. data/ext/ptrace/ptrace.c +107 -5
  6. data/lib/seccomp-tools.rb +5 -0
  7. data/lib/seccomp-tools/asm/asm.rb +5 -2
  8. data/lib/seccomp-tools/asm/compiler.rb +96 -18
  9. data/lib/seccomp-tools/asm/tokenizer.rb +25 -8
  10. data/lib/seccomp-tools/bpf.rb +7 -4
  11. data/lib/seccomp-tools/cli/asm.rb +16 -6
  12. data/lib/seccomp-tools/cli/base.rb +10 -4
  13. data/lib/seccomp-tools/cli/cli.rb +9 -6
  14. data/lib/seccomp-tools/cli/disasm.rb +6 -2
  15. data/lib/seccomp-tools/cli/dump.rb +37 -6
  16. data/lib/seccomp-tools/cli/emu.rb +41 -22
  17. data/lib/seccomp-tools/const.rb +47 -16
  18. data/lib/seccomp-tools/consts/sys_arg.rb +432 -0
  19. data/lib/seccomp-tools/consts/sys_nr/aarch64.rb +284 -0
  20. data/lib/seccomp-tools/consts/{amd64.rb → sys_nr/amd64.rb} +6 -1
  21. data/lib/seccomp-tools/consts/{i386.rb → sys_nr/i386.rb} +18 -15
  22. data/lib/seccomp-tools/disasm/context.rb +125 -34
  23. data/lib/seccomp-tools/disasm/disasm.rb +5 -2
  24. data/lib/seccomp-tools/dumper.rb +75 -8
  25. data/lib/seccomp-tools/emulator.rb +19 -8
  26. data/lib/seccomp-tools/instruction/alu.rb +7 -2
  27. data/lib/seccomp-tools/instruction/base.rb +5 -3
  28. data/lib/seccomp-tools/instruction/instruction.rb +2 -0
  29. data/lib/seccomp-tools/instruction/jmp.rb +28 -14
  30. data/lib/seccomp-tools/instruction/ld.rb +28 -12
  31. data/lib/seccomp-tools/instruction/ldx.rb +2 -0
  32. data/lib/seccomp-tools/instruction/misc.rb +2 -0
  33. data/lib/seccomp-tools/instruction/ret.rb +14 -2
  34. data/lib/seccomp-tools/instruction/st.rb +4 -2
  35. data/lib/seccomp-tools/instruction/stx.rb +2 -0
  36. data/lib/seccomp-tools/logger.rb +40 -0
  37. data/lib/seccomp-tools/syscall.rb +24 -13
  38. data/lib/seccomp-tools/templates/asm.amd64.asm +26 -0
  39. data/lib/seccomp-tools/templates/asm.c +17 -0
  40. data/lib/seccomp-tools/templates/asm.i386.asm +33 -0
  41. data/lib/seccomp-tools/util.rb +24 -3
  42. data/lib/seccomp-tools/version.rb +3 -1
  43. metadata +51 -44
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'seccomp-tools/instruction/ld'
2
4
 
3
5
  module SeccompTools
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'seccomp-tools/instruction/base'
2
4
 
3
5
  module SeccompTools
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'seccomp-tools/instruction/base'
2
4
 
3
5
  module SeccompTools
@@ -6,8 +8,7 @@ module SeccompTools
6
8
  class RET < Base
7
9
  # Decompile instruction.
8
10
  def decompile
9
- _, type = symbolize
10
- "return #{type == :a ? 'A' : ACTION.invert[type & 0x7fff0000]}"
11
+ "return #{ret_str}"
11
12
  end
12
13
 
13
14
  # See {Instruction::Base#symbolize}.
@@ -22,6 +23,17 @@ module SeccompTools
22
23
  def branch(*)
23
24
  []
24
25
  end
26
+
27
+ private
28
+
29
+ def ret_str
30
+ _, type = symbolize
31
+ return 'A' if type == :a
32
+
33
+ str = ACTION.invert[type & SECCOMP_RET_ACTION_FULL].to_s
34
+ str << "(#{type & SECCOMP_RET_DATA})" if str == 'ERRNO'
35
+ str
36
+ end
25
37
  end
26
38
  end
27
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'seccomp-tools/instruction/ld'
2
4
 
3
5
  module SeccompTools
@@ -10,7 +12,7 @@ module SeccompTools
10
12
  end
11
13
 
12
14
  # See {Instruction::Base#symbolize}.
13
- # @return [[:misc, (:a, :x), Integer]]
15
+ # @return [[:st, (:a, :x), Integer]]
14
16
  def symbolize
15
17
  [:st, reg.downcase.to_sym, k]
16
18
  end
@@ -18,7 +20,7 @@ module SeccompTools
18
20
  # @return [Array<(Integer, Context)>]
19
21
  def branch(context)
20
22
  ctx = context.dup
21
- ctx[k] = ctx[reg]
23
+ ctx.store(k, reg)
22
24
  [[line + 1, ctx]]
23
25
  end
24
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'seccomp-tools/instruction/st'
2
4
 
3
5
  module SeccompTools
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ require 'seccomp-tools/util'
6
+
7
+ module SeccompTools
8
+ # A logger for internal use.
9
+ #
10
+ # @private
11
+ module Logger
12
+ module_function
13
+
14
+ # Returns a +::Logger+ object for internal logging.
15
+ #
16
+ # @return [::Logger]
17
+ def logger
18
+ ::Logger.new($stdout).tap do |log|
19
+ log.formatter = proc do |severity, _datetime, _progname, msg|
20
+ prep = ' ' * (severity.size + 3)
21
+ message = msg.lines.map.with_index do |str, i|
22
+ next str if i.zero?
23
+
24
+ str.strip.empty? ? str : prep + str
25
+ end
26
+ color = severity.downcase.to_sym
27
+ msg = +"[#{SeccompTools::Util.colorize(severity, t: color)}] #{message.join}"
28
+ msg << "\n" unless msg.end_with?("\n")
29
+ msg
30
+ end
31
+ end
32
+ end
33
+
34
+ %i[error].each do |sym|
35
+ define_method(sym) do |msg|
36
+ logger.__send__(sym, msg)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,13 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'os'
4
+
1
5
  require 'seccomp-tools/const'
2
- require 'seccomp-tools/ptrace'
6
+ require 'seccomp-tools/ptrace' if OS.linux?
3
7
 
4
8
  module SeccompTools
5
9
  # Record syscall number, arguments, return value.
6
10
  class Syscall
7
11
  # Syscall arguments offset of +struct user+ in different arch.
8
12
  ABI = {
9
- amd64: { number: 120, args: [112, 104, 96, 56, 72, 44], ret: 80, SYS_prctl: 157 },
10
- i386: { number: 120, args: [40, 88, 96, 104, 112, 32], ret: 80, SYS_prctl: 172 }
13
+ amd64: { number: 120, args: [112, 104, 96, 56, 72, 44], ret: 80, SYS_prctl: 157, SYS_seccomp: 317 },
14
+ i386: { number: 44, args: [0, 4, 8, 12, 16, 20], ret: 24, SYS_prctl: 172, SYS_seccomp: 354 },
15
+ aarch64: { number: 64, args: [0, 8, 16, 24, 32, 40, 48], ret: 0, SYS_prctl: 167, SYS_seccomp: 277 }
11
16
  }.freeze
12
17
 
13
18
  # @return [Integer] Process id.
@@ -27,17 +32,21 @@ module SeccompTools
27
32
  def initialize(pid)
28
33
  @pid = pid
29
34
  raise ArgumentError, "Only supports #{ABI.keys.join(', ')}" if ABI[arch].nil?
35
+
30
36
  @abi = ABI[arch]
31
37
  @number = peek(abi[:number])
32
38
  @args = abi[:args].map { |off| peek(off) }
33
39
  @ret = peek(abi[:ret])
34
40
  end
35
41
 
36
- # Is this a +prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, addr)+ syscall?
42
+ # Is this a +seccomp(SECCOMP_MODE_FILTER, addr)+/+prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, addr)+ syscall?
43
+ #
37
44
  # @return [Boolean]
38
45
  # +true+ for is a seccomp installation syscall.
39
46
  def set_seccomp?
40
- # TODO: handle SECCOMP_MODE_STRICT
47
+ # TODO: handle SECCOMP_MODE_SET_STRICT / SECCOMP_MODE_STRICT
48
+ return true if number == abi[:SYS_seccomp] && args[0] == Const::BPF::SECCOMP_SET_MODE_FILTER
49
+
41
50
  number == abi[:SYS_prctl] && args[0] == Const::BPF::PR_SET_SECCOMP && args[1] == Const::BPF::SECCOMP_MODE_FILTER
42
51
  end
43
52
 
@@ -54,10 +63,11 @@ module SeccompTools
54
63
  # Architecture of this syscall.
55
64
  def arch
56
65
  @arch ||= File.open("/proc/#{pid}/exe", 'rb') do |f|
57
- f.pos = 4
66
+ f.pos = 18
58
67
  case f.read(1).ord
59
- when 1 then :i386
60
- when 2 then :amd64
68
+ when 3 then :i386
69
+ when 62 then :amd64
70
+ when 183 then :aarch64
61
71
  end
62
72
  end
63
73
  end
@@ -65,14 +75,15 @@ module SeccompTools
65
75
  private
66
76
 
67
77
  def bits
68
- case arch
69
- when :i386 then 32
70
- when :amd64 then 64
71
- end
78
+ {
79
+ i386: 32,
80
+ amd64: 64,
81
+ aarch64: 64
82
+ }[arch]
72
83
  end
73
84
 
74
85
  def peek(offset)
75
- Ptrace.peekuser(pid, offset, 0)
86
+ Ptrace.peekuser(pid, offset, 0, bits)
76
87
  end
77
88
  end
78
89
  end
@@ -0,0 +1,26 @@
1
+ install_seccomp:
2
+ push rbp
3
+ mov rbp, rsp
4
+ push 38
5
+ pop rdi
6
+ push 0x1
7
+ pop rsi
8
+ xor eax, eax
9
+ mov al, 0x9d
10
+ syscall
11
+ push 22
12
+ pop rdi
13
+ lea rdx, [rip + _filter]
14
+ push rdx /* .filter */
15
+ push _filter_end - _filter >> 3 /* .len */
16
+ mov rdx, rsp
17
+ push 0x2
18
+ pop rsi
19
+ xor eax, eax
20
+ mov al, 0x9d
21
+ syscall
22
+ leave
23
+ ret
24
+ _filter:
25
+ .ascii "<TO_BE_REPLACED>"
26
+ _filter_end:
@@ -0,0 +1,17 @@
1
+ #include <linux/seccomp.h>
2
+ #include <stdio.h>
3
+ #include <stdlib.h>
4
+ #include <sys/prctl.h>
5
+
6
+ static void install_seccomp() {
7
+ static unsigned char filter[] = {<TO_BE_REPLACED>};
8
+ struct prog {
9
+ unsigned short len;
10
+ unsigned char *filter;
11
+ } rule = {
12
+ .len = sizeof(filter) >> 3,
13
+ .filter = filter
14
+ };
15
+ if(prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) { perror("prctl(PR_SET_NO_NEW_PRIVS)"); exit(2); }
16
+ if(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &rule) < 0) { perror("prctl(PR_SET_SECCOMP)"); exit(2); }
17
+ }
@@ -0,0 +1,33 @@
1
+ install_seccomp:
2
+ push ebx
3
+ push ebp
4
+ mov ebp, esp
5
+ push 38
6
+ pop ebx
7
+ push 0x1
8
+ pop ecx
9
+ xor eax, eax
10
+ mov al, 0xac
11
+ int 0x80
12
+ push 22
13
+ pop ebx
14
+ jmp __get_eip__
15
+ __back__:
16
+ pop edx
17
+ push edx /* .filter */
18
+ mov edx, _filter_end - _filter >> 3 /* .len */
19
+ push edx
20
+ mov edx, esp
21
+ push 0x2
22
+ pop ecx
23
+ xor eax, eax
24
+ mov al, 0xac
25
+ int 0x80
26
+ leave
27
+ pop ebx
28
+ ret
29
+ __get_eip__:
30
+ call __back__
31
+ _filter:
32
+ .ascii "<TO_BE_REPLACED>"
33
+ _filter_end:
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SeccompTools
2
4
  # Define utility methods.
3
5
  module Util
@@ -7,7 +9,9 @@ module SeccompTools
7
9
  # @return [Array<Symbol>]
8
10
  # Architectures.
9
11
  def supported_archs
10
- @archs ||= Dir.glob(File.join(__dir__, 'consts', '*.rb')).map { |f| File.basename(f, '.rb').to_sym }.sort
12
+ @supported_archs ||= Dir.glob(File.join(__dir__, 'consts', 'sys_nr', '*.rb'))
13
+ .map { |f| File.basename(f, '.rb').to_sym }
14
+ .sort
11
15
  end
12
16
 
13
17
  # Detect system architecture.
@@ -16,6 +20,7 @@ module SeccompTools
16
20
  case RbConfig::CONFIG['host_cpu']
17
21
  when /x86_64/ then :amd64
18
22
  when /i386/ then :i386
23
+ when /aarch64/ then :aarch64
19
24
  else :unknown
20
25
  end
21
26
  end
@@ -38,12 +43,16 @@ module SeccompTools
38
43
  !@disable_color && $stdout.tty?
39
44
  end
40
45
 
46
+ # color code of light yellow
47
+ LIGHT_YELLOW = "\e[38;5;230m"
41
48
  # Color codes for pretty print.
42
49
  COLOR_CODE = {
43
50
  esc_m: "\e[0m",
44
51
  syscall: "\e[38;5;120m", # light green
45
- arch: "\e[38;5;230m", # light yellow
46
- gray: "\e[2m"
52
+ arch: LIGHT_YELLOW,
53
+ args: LIGHT_YELLOW,
54
+ gray: "\e[2m",
55
+ error: "\e[38;5;196m" # heavy red
47
56
  }.freeze
48
57
  # Wrapper color codes.
49
58
  # @param [String] s
@@ -55,9 +64,21 @@ module SeccompTools
55
64
  def colorize(s, t: nil)
56
65
  s = s.to_s
57
66
  return s unless colorize_enabled?
67
+
58
68
  cc = COLOR_CODE
59
69
  color = cc[t]
60
70
  "#{color}#{s.sub(cc[:esc_m], cc[:esc_m] + color)}#{cc[:esc_m]}"
61
71
  end
72
+
73
+ # Get content of filename under directory templates/.
74
+ #
75
+ # @param [String] filename
76
+ # The filename.
77
+ #
78
+ # @return [String]
79
+ # Content of the file.
80
+ def template(filename)
81
+ IO.binread(File.join(__dir__, 'templates', filename))
82
+ end
62
83
  end
63
84
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SeccompTools
2
4
  # Gem version.
3
- VERSION = '1.1.0'.freeze
5
+ VERSION = '1.5.0'
4
6
  end
metadata CHANGED
@@ -1,127 +1,125 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seccomp-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - david942j
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-29 00:00:00.000000000 Z
11
+ date: 2021-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: codeclimate-test-reporter
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.6'
19
+ version: '13.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.6'
26
+ version: '13.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: pry
28
+ name: rake-compiler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.10'
33
+ version: '1.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.10'
40
+ version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '12.0'
47
+ version: '3.9'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '12.0'
54
+ version: '3.9'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake-compiler
56
+ name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.0'
61
+ version: '1.1'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.0'
68
+ version: '1.1'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.5'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.5'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
75
+ version: '0.17'
76
+ - - "<"
88
77
  - !ruby/object:Gem::Version
89
- version: '0.49'
78
+ version: '0.18'
90
79
  type: :development
91
80
  prerelease: false
92
81
  version_requirements: !ruby/object:Gem::Requirement
93
82
  requirements:
94
83
  - - "~>"
95
84
  - !ruby/object:Gem::Version
96
- version: '0.49'
85
+ version: '0.17'
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.18'
97
89
  - !ruby/object:Gem::Dependency
98
- name: simplecov
90
+ name: yard
99
91
  requirement: !ruby/object:Gem::Requirement
100
92
  requirements:
101
93
  - - "~>"
102
94
  - !ruby/object:Gem::Version
103
- version: 0.13.0
95
+ version: '0.9'
104
96
  type: :development
105
97
  prerelease: false
106
98
  version_requirements: !ruby/object:Gem::Requirement
107
99
  requirements:
108
100
  - - "~>"
109
101
  - !ruby/object:Gem::Version
110
- version: 0.13.0
102
+ version: '0.9'
111
103
  - !ruby/object:Gem::Dependency
112
- name: yard
104
+ name: os
113
105
  requirement: !ruby/object:Gem::Requirement
114
106
  requirements:
115
107
  - - "~>"
116
108
  - !ruby/object:Gem::Version
117
- version: '0.9'
118
- type: :development
109
+ version: '1.1'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 1.1.1
113
+ type: :runtime
119
114
  prerelease: false
120
115
  version_requirements: !ruby/object:Gem::Requirement
121
116
  requirements:
122
117
  - - "~>"
123
118
  - !ruby/object:Gem::Version
124
- version: '0.9'
119
+ version: '1.1'
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 1.1.1
125
123
  description: |
126
124
  Provide useful tools to analyze seccomp rules.
127
125
  Visit https://github.com/david942j/seccomp-tools for more details.
@@ -149,8 +147,10 @@ files:
149
147
  - lib/seccomp-tools/cli/dump.rb
150
148
  - lib/seccomp-tools/cli/emu.rb
151
149
  - lib/seccomp-tools/const.rb
152
- - lib/seccomp-tools/consts/amd64.rb
153
- - lib/seccomp-tools/consts/i386.rb
150
+ - lib/seccomp-tools/consts/sys_arg.rb
151
+ - lib/seccomp-tools/consts/sys_nr/aarch64.rb
152
+ - lib/seccomp-tools/consts/sys_nr/amd64.rb
153
+ - lib/seccomp-tools/consts/sys_nr/i386.rb
154
154
  - lib/seccomp-tools/disasm/context.rb
155
155
  - lib/seccomp-tools/disasm/disasm.rb
156
156
  - lib/seccomp-tools/dumper.rb
@@ -165,13 +165,21 @@ files:
165
165
  - lib/seccomp-tools/instruction/ret.rb
166
166
  - lib/seccomp-tools/instruction/st.rb
167
167
  - lib/seccomp-tools/instruction/stx.rb
168
+ - lib/seccomp-tools/logger.rb
168
169
  - lib/seccomp-tools/syscall.rb
170
+ - lib/seccomp-tools/templates/asm.amd64.asm
171
+ - lib/seccomp-tools/templates/asm.c
172
+ - lib/seccomp-tools/templates/asm.i386.asm
169
173
  - lib/seccomp-tools/util.rb
170
174
  - lib/seccomp-tools/version.rb
171
- homepage: https://github.com/david942j/seccomp-tools
175
+ homepage:
172
176
  licenses:
173
177
  - MIT
174
- metadata: {}
178
+ metadata:
179
+ bug_tracker_uri: https://github.com/david942j/seccomp-tools/issues
180
+ documentation_uri: https://www.rubydoc.info/github/david942j/seccomp-tools/master
181
+ homepage_uri: https://github.com/david942j/seccomp-tools
182
+ source_code_uri: https://github.com/david942j/seccomp-tools
175
183
  post_install_message:
176
184
  rdoc_options: []
177
185
  require_paths:
@@ -180,15 +188,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
188
  requirements:
181
189
  - - ">="
182
190
  - !ruby/object:Gem::Version
183
- version: 2.1.0
191
+ version: '2.4'
184
192
  required_rubygems_version: !ruby/object:Gem::Requirement
185
193
  requirements:
186
194
  - - ">="
187
195
  - !ruby/object:Gem::Version
188
196
  version: '0'
189
197
  requirements: []
190
- rubyforge_project:
191
- rubygems_version: 2.5.2
198
+ rubygems_version: 3.1.4
192
199
  signing_key:
193
200
  specification_version: 4
194
201
  summary: seccomp-tools