pwn 0.5.657 → 0.5.659

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af75906b3c582dea27fb9ec31f19c7d3774aabcc928549cee27df74ad75220f3
4
- data.tar.gz: c3424966d7b298c78b3edac59a777ee8e927f130ecefbf84fd0a46371256900e
3
+ metadata.gz: 1cab86775d3b1611d7b0aadf6bd7ceb11ba1e673d239ff4b141bbf29a0212217
4
+ data.tar.gz: 1833f2e8bff11bbeedfc059734c99d3b1743291795829a65d24066e8319d8272
5
5
  SHA512:
6
- metadata.gz: 396a1f16a96e071396689cdfde74364ee9bae88544275f037137007b5ddd94dc1fc37f181a99ef239db5339b5fb24ecf750605ba67dd28bd62969ec9360ed5f6
7
- data.tar.gz: 976c310a1e93bac33b383bcb7702a6350f2268062e71a0bb73ee28454d6ea23798fc654744b88dad048472d721d2417713d5664e81f39e819ddd2ccefe51c555
6
+ metadata.gz: 44a37c7080857da5ca07df39e9bb4856d8c30c621b77e8348be7f4257afdcb5c05bd4d0c4816b67b20415c5e22c80d44b4bf276823b02c7028067c4bdbae95bd
7
+ data.tar.gz: 2ddbac637da6b33a5f96e45d58f9210ec843fd6077b5815ccd1698d13143d7ec645aa2a7c2dc2a23a84b93e0d1cc4498283119565d61152af49805704b4ab58e
data/Gemfile CHANGED
@@ -20,7 +20,7 @@ gem 'base32', '0.3.4'
20
20
  gem 'bitcoin-ruby', '0.0.20'
21
21
  gem 'brakeman', '8.0.5'
22
22
  gem 'bson', '5.2.0'
23
- gem 'bundler', '>=4.0.17'
23
+ gem 'bundler', '>=4.0.18'
24
24
  gem 'bundler-audit', '>=0.9.3'
25
25
  gem 'bunny', '3.1.0'
26
26
  gem 'colorize', '1.1.0'
@@ -6,6 +6,13 @@ require 'pwn/ai/agent/registry'
6
6
 
7
7
  # Run a shell command on the pwn host. Lifted from the bash branch of the
8
8
  # legacy :pwn_ai_hook (repl.rb).
9
+ #
10
+ # Timeout path must NOT leave Open3's pipe-reader threads racing a closed
11
+ # pipe — that surfaces as noisy:
12
+ # #<Thread:0x... open3.rb:664 run> terminated with exception
13
+ # (report_on_exception is true): IOError stream closed in another thread
14
+ # Fix: own the popen3 lifecycle, process-group kill on timeout, and silence
15
+ # report_on_exception on the reader threads before closing pipes.
9
16
  PWN::AI::Agent::Registry.register(
10
17
  name: 'shell',
11
18
  toolset: 'terminal',
@@ -29,16 +36,84 @@ PWN::AI::Agent::Registry.register(
29
36
  timeout = (args[:timeout] || 120).to_i
30
37
  raise ArgumentError, 'command is required' if cmd.strip.empty?
31
38
 
32
- stdout = stderr = ''
33
- status = nil
34
- begin
35
- Timeout.timeout(timeout) do
36
- stdout, stderr, status = Open3.capture3(cmd)
39
+ stdout = +''
40
+ stderr = +''
41
+ exitstatus = nil
42
+ timed_out = false
43
+
44
+ # pgroup: true => child is session/process-group leader; kill(-pid)
45
+ # reaps the whole tree (shell + grandchildren) on timeout.
46
+ Open3.popen3(cmd, pgroup: true) do |stdin, out_io, err_io, wait_thr|
47
+ stdin.close
48
+ pid = wait_thr.pid
49
+
50
+ out_reader = Thread.new { out_io.read.to_s }
51
+ err_reader = Thread.new { err_io.read.to_s }
52
+ # Prevent Ruby from dumping IOError to $stderr when we close pipes
53
+ # out from under these readers on the timeout path.
54
+ out_reader.report_on_exception = false
55
+ err_reader.report_on_exception = false
56
+
57
+ begin
58
+ Timeout.timeout(timeout) do
59
+ # Wait for the child; readers drain pipes concurrently.
60
+ wait_thr.value
61
+ end
62
+ rescue Timeout::Error
63
+ timed_out = true
64
+ begin
65
+ Process.kill('TERM', -pid)
66
+ rescue Errno::ESRCH, Errno::EPERM
67
+ nil
68
+ end
69
+ # Brief grace, then hard kill the process group.
70
+ sleep 0.2
71
+ begin
72
+ Process.kill('KILL', -pid)
73
+ rescue Errno::ESRCH, Errno::EPERM
74
+ nil
75
+ end
76
+ begin
77
+ wait_thr.value
78
+ rescue StandardError
79
+ nil
80
+ end
81
+ end
82
+
83
+ # Ensure pipes are closed so readers unblock even if the child
84
+ # ignored signals or left descendants holding fds.
85
+ begin
86
+ out_io.close unless out_io.closed?
87
+ rescue StandardError
88
+ nil
89
+ end
90
+ begin
91
+ err_io.close unless err_io.closed?
92
+ rescue StandardError
93
+ nil
94
+ end
95
+
96
+ # Join readers; swallow the IOError that arrives when the pipe was
97
+ # closed mid-read (timeout path). report_on_exception is already off.
98
+ begin
99
+ stdout = out_reader.value.to_s
100
+ rescue StandardError
101
+ stdout = +''
102
+ end
103
+ begin
104
+ stderr = err_reader.value.to_s
105
+ rescue StandardError
106
+ stderr = +''
107
+ end
108
+
109
+ unless timed_out
110
+ status = wait_thr.value
111
+ exitstatus = status&.exitstatus
37
112
  end
38
- rescue Timeout::Error
39
- return { stdout: stdout, stderr: stderr, exit: nil, error: "timeout after #{timeout}s" }
40
113
  end
41
114
 
42
- { stdout: stdout, stderr: stderr, exit: status&.exitstatus }
115
+ return { stdout: stdout, stderr: stderr, exit: nil, error: "timeout after #{timeout}s" } if timed_out
116
+
117
+ { stdout: stdout, stderr: stderr, exit: exitstatus }
43
118
  }
44
119
  )
@@ -15,7 +15,7 @@ module PWN
15
15
  / \ / \
16
16
  { } { }
17
17
  { { } }
18
- \ \ / /
18
+ \ \ / / R.I.P. Houdini
19
19
  \ Y /
20
20
  .-"`"`"-.
21
21
  ,` `.
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.5.657'
4
+ VERSION = '0.5.659'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.657
4
+ version: 0.5.659
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -141,14 +141,14 @@ dependencies:
141
141
  requirements:
142
142
  - - ">="
143
143
  - !ruby/object:Gem::Version
144
- version: 4.0.17
144
+ version: 4.0.18
145
145
  type: :development
146
146
  prerelease: false
147
147
  version_requirements: !ruby/object:Gem::Requirement
148
148
  requirements:
149
149
  - - ">="
150
150
  - !ruby/object:Gem::Version
151
- version: 4.0.17
151
+ version: 4.0.18
152
152
  - !ruby/object:Gem::Dependency
153
153
  name: bundler-audit
154
154
  requirement: !ruby/object:Gem::Requirement
@@ -2717,7 +2717,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2717
2717
  - !ruby/object:Gem::Version
2718
2718
  version: '0'
2719
2719
  requirements: []
2720
- rubygems_version: 4.0.17
2720
+ rubygems_version: 4.0.18
2721
2721
  specification_version: 4
2722
2722
  summary: Automated Security Testing for CI/CD Pipelines & Beyond
2723
2723
  test_files: []