seccomp-tools 1.1.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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