pwn 0.5.725 → 0.5.728

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 (207) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/bin/pwn-capd +11 -2
  4. data/documentation/Capability-Broker-Sandbox.md +49 -10
  5. data/documentation/LoRaPHY-LICENSE.txt +25 -0
  6. data/documentation/SDR-Decoder-Coverage.md +550 -0
  7. data/etc/default_skills/pwn/ffi/dsp_native/SKILL.md +51 -0
  8. data/etc/default_skills/pwn/ffi/hack_rf/SKILL.md +1 -1
  9. data/etc/default_skills/pwn/plugins/capability_broker/daemon/SKILL.md +50 -0
  10. data/etc/default_skills/pwn/plugins/sandbox/driver/SKILL.md +53 -0
  11. data/etc/default_skills/pwn/sdr/decoder/adsb/SKILL.md +4 -1
  12. data/etc/default_skills/pwn/sdr/decoder/apt/SKILL.md +4 -3
  13. data/etc/default_skills/pwn/sdr/decoder/base/SKILL.md +1 -1
  14. data/etc/default_skills/pwn/sdr/decoder/bluetooth/SKILL.md +5 -3
  15. data/etc/default_skills/pwn/sdr/decoder/dect/SKILL.md +9 -3
  16. data/etc/default_skills/pwn/sdr/decoder/dect/references/urls.md +3 -0
  17. data/etc/default_skills/pwn/sdr/decoder/dsp/SKILL.md +2 -1
  18. data/etc/default_skills/pwn/sdr/decoder/flex/SKILL.md +2 -1
  19. data/etc/default_skills/pwn/sdr/decoder/gps/SKILL.md +7 -3
  20. data/etc/default_skills/pwn/sdr/decoder/gsm/SKILL.md +3 -1
  21. data/etc/default_skills/pwn/sdr/decoder/iridium/SKILL.md +5 -3
  22. data/etc/default_skills/pwn/sdr/decoder/lora/SKILL.md +2 -1
  23. data/etc/default_skills/pwn/sdr/decoder/lte/SKILL.md +2 -1
  24. data/etc/default_skills/pwn/sdr/decoder/morse/SKILL.md +3 -2
  25. data/etc/default_skills/pwn/sdr/decoder/p25/SKILL.md +9 -3
  26. data/etc/default_skills/pwn/sdr/decoder/p25/references/urls.md +3 -0
  27. data/etc/default_skills/pwn/sdr/decoder/pager/SKILL.md +3 -2
  28. data/etc/default_skills/pwn/sdr/decoder/pocsag/SKILL.md +6 -2
  29. data/etc/default_skills/pwn/sdr/decoder/rds/SKILL.md +2 -1
  30. data/etc/default_skills/pwn/sdr/decoder/rfid/SKILL.md +9 -3
  31. data/etc/default_skills/pwn/sdr/decoder/rfid/references/urls.md +4 -0
  32. data/etc/default_skills/pwn/sdr/decoder/rtl433/SKILL.md +9 -3
  33. data/etc/default_skills/pwn/sdr/decoder/rtl433/references/urls.md +4 -0
  34. data/etc/default_skills/pwn/sdr/decoder/rtty/SKILL.md +3 -2
  35. data/etc/default_skills/pwn/sdr/decoder/tempest/SKILL.md +51 -0
  36. data/etc/default_skills/pwn/sdr/decoder/wifi/SKILL.md +10 -3
  37. data/etc/default_skills/pwn/sdr/decoder/wifi/references/urls.md +3 -0
  38. data/etc/default_skills/pwn/sdr/decoder/zigbee/SKILL.md +13 -3
  39. data/etc/default_skills/pwn/sdr/decoder/zigbee/references/urls.md +3 -0
  40. data/ext/pwn_dsp/.gitignore +4 -0
  41. data/ext/pwn_dsp/README.md +81 -0
  42. data/ext/pwn_dsp/benchmark-results.json +321 -0
  43. data/ext/pwn_dsp/benchmark.rb +38 -0
  44. data/ext/pwn_dsp/build.rb +19 -0
  45. data/ext/pwn_dsp/pwn_dsp.c +72 -0
  46. data/ext/pwn_gsm/.gitignore +4 -0
  47. data/ext/pwn_gsm/README.md +61 -0
  48. data/ext/pwn_gsm/benchmark-results.json +24 -0
  49. data/ext/pwn_gsm/benchmark.rb +44 -0
  50. data/ext/pwn_gsm/build.rb +7 -0
  51. data/ext/pwn_gsm/fixtures/generate.py +41 -0
  52. data/ext/pwn_gsm/pwn_gsm.c +40 -0
  53. data/ext/pwn_lte/.gitignore +3 -0
  54. data/ext/pwn_lte/README.md +108 -0
  55. data/ext/pwn_lte/benchmark-results.json +19 -0
  56. data/ext/pwn_lte/benchmark.rb +52 -0
  57. data/ext/pwn_lte/build.rb +13 -0
  58. data/ext/pwn_lte/pwn_lte.c +101 -0
  59. data/ext/pwn_rds/.gitignore +2 -0
  60. data/ext/pwn_rds/README.md +17 -0
  61. data/ext/pwn_rds/build.rb +15 -0
  62. data/ext/pwn_rds/stream_verify.rb +53 -0
  63. data/ext/pwn_rds/verify.rb +24 -0
  64. data/lib/pwn/ai/agent/loop.rb +13 -11
  65. data/lib/pwn/ai/agent/swarm.rb +11 -2
  66. data/lib/pwn/ffi/adalm_pluto.rb +20 -14
  67. data/lib/pwn/ffi/dsp_native.rb +121 -0
  68. data/lib/pwn/ffi/hack_rf.rb +43 -19
  69. data/lib/pwn/ffi/rtl_sdr.rb +7 -1
  70. data/lib/pwn/ffi/soapy_sdr.rb +23 -7
  71. data/lib/pwn/ffi.rb +1 -0
  72. data/lib/pwn/plugins/capability_broker/daemon.rb +284 -0
  73. data/lib/pwn/plugins/capability_broker.rb +6 -1
  74. data/lib/pwn/plugins/sandbox/Dockerfile +2 -2
  75. data/lib/pwn/plugins/sandbox/driver.rb +251 -0
  76. data/lib/pwn/plugins/sandbox.rb +2 -5
  77. data/lib/pwn/sdr/decoder/adsb.rb +240 -21
  78. data/lib/pwn/sdr/decoder/apt.rb +119 -63
  79. data/lib/pwn/sdr/decoder/base.rb +362 -305
  80. data/lib/pwn/sdr/decoder/bluetooth.rb +282 -46
  81. data/lib/pwn/sdr/decoder/dect.rb +155 -28
  82. data/lib/pwn/sdr/decoder/dsp.rb +126 -23
  83. data/lib/pwn/sdr/decoder/flex.rb +118 -16
  84. data/lib/pwn/sdr/decoder/gps.rb +320 -16
  85. data/lib/pwn/sdr/decoder/gsm.rb +230 -55
  86. data/lib/pwn/sdr/decoder/iridium.rb +221 -26
  87. data/lib/pwn/sdr/decoder/lora.rb +349 -6
  88. data/lib/pwn/sdr/decoder/lte.rb +201 -55
  89. data/lib/pwn/sdr/decoder/morse.rb +37 -3
  90. data/lib/pwn/sdr/decoder/p25.rb +282 -12
  91. data/lib/pwn/sdr/decoder/pager.rb +34 -3
  92. data/lib/pwn/sdr/decoder/pocsag.rb +162 -29
  93. data/lib/pwn/sdr/decoder/rds.rb +167 -77
  94. data/lib/pwn/sdr/decoder/rfid.rb +226 -25
  95. data/lib/pwn/sdr/decoder/rtl433.rb +245 -25
  96. data/lib/pwn/sdr/decoder/rtty.rb +39 -10
  97. data/lib/pwn/sdr/decoder/tempest.rb +318 -0
  98. data/lib/pwn/sdr/decoder/wifi.rb +333 -25
  99. data/lib/pwn/sdr/decoder/zigbee.rb +326 -54
  100. data/lib/pwn/sdr/decoder.rb +2 -0
  101. data/lib/pwn/sdr/gqrx.rb +13 -3
  102. data/lib/pwn/version.rb +1 -1
  103. data/spec/conventions_spec.rb +1 -1
  104. data/spec/fixtures/sdr/gps/README.md +77 -0
  105. data/spec/fixtures/sdr/gps/cttc-lnav.json +33 -0
  106. data/spec/fixtures/sdr/gsm/README.md +40 -0
  107. data/spec/fixtures/sdr/gsm/bad-crc.cs16 +0 -0
  108. data/spec/fixtures/sdr/gsm/sch.cs16 +0 -0
  109. data/spec/fixtures/sdr/gsm/vectors.json +16 -0
  110. data/spec/fixtures/sdr/iridium/README.md +115 -0
  111. data/spec/fixtures/sdr/iridium/TOOLKIT-LICENSE.txt +28 -0
  112. data/spec/fixtures/sdr/iridium/ira-row-19.cf32 +0 -0
  113. data/spec/fixtures/sdr/iridium/ira-row-19.cs16 +0 -0
  114. data/spec/fixtures/sdr/iridium/ira-row-43.cf32 +0 -0
  115. data/spec/fixtures/sdr/iridium/ira-row-43.cs16 +3 -0
  116. data/spec/fixtures/sdr/iridium/ira-row-5.cf32 +0 -0
  117. data/spec/fixtures/sdr/iridium/ira-row-5.cs16 +0 -0
  118. data/spec/fixtures/sdr/iridium/source-rows.tsv +3 -0
  119. data/spec/fixtures/sdr/iridium/vectors.json +50 -0
  120. data/spec/fixtures/sdr/lora/README.md +125 -0
  121. data/spec/fixtures/sdr/lora/benchmark-results.json +142 -0
  122. data/spec/fixtures/sdr/lora/benchmark.txt +20 -0
  123. data/spec/fixtures/sdr/lora/generate.txt +31 -0
  124. data/spec/fixtures/sdr/lora/generate_modes.txt +47 -0
  125. data/spec/fixtures/sdr/lora/mode-0.cf32.gz +0 -0
  126. data/spec/fixtures/sdr/lora/mode-1.cf32.gz +0 -0
  127. data/spec/fixtures/sdr/lora/mode-10.cf32.gz +0 -0
  128. data/spec/fixtures/sdr/lora/mode-11.cf32.gz +0 -0
  129. data/spec/fixtures/sdr/lora/mode-12.cf32.gz +0 -0
  130. data/spec/fixtures/sdr/lora/mode-13.cf32.gz +0 -0
  131. data/spec/fixtures/sdr/lora/mode-2.cf32.gz +0 -0
  132. data/spec/fixtures/sdr/lora/mode-3.cf32.gz +0 -0
  133. data/spec/fixtures/sdr/lora/mode-4.cf32.gz +0 -0
  134. data/spec/fixtures/sdr/lora/mode-5.cf32.gz +0 -0
  135. data/spec/fixtures/sdr/lora/mode-6.cf32.gz +0 -0
  136. data/spec/fixtures/sdr/lora/mode-7.cf32.gz +0 -0
  137. data/spec/fixtures/sdr/lora/mode-8.cf32.gz +0 -0
  138. data/spec/fixtures/sdr/lora/mode-9.cf32.gz +0 -0
  139. data/spec/fixtures/sdr/lora/modes.json +637 -0
  140. data/spec/fixtures/sdr/lora/sf7-cr1.cf32 +0 -0
  141. data/spec/fixtures/sdr/lora/sf7-cr4.cf32 +0 -0
  142. data/spec/fixtures/sdr/lora/sf8-cr2.cf32 +0 -0
  143. data/spec/fixtures/sdr/lora/sf8-cr3.cf32 +0 -0
  144. data/spec/fixtures/sdr/lora/vectors.json +189 -0
  145. data/spec/fixtures/sdr/lte/SRSRAN-LICENSE +661 -0
  146. data/spec/fixtures/sdr/lte/signal.1.92M.dat +0 -0
  147. data/spec/fixtures/sdr/p25/README.md +24 -0
  148. data/spec/fixtures/sdr/p25/tsdu3.bin +1 -0
  149. data/spec/fixtures/sdr/p25/updu.bin +2 -0
  150. data/spec/fixtures/sdr/rds/LICENSE +18 -0
  151. data/spec/fixtures/sdr/rds/README.md +10 -0
  152. data/spec/fixtures/sdr/rds/mpx-testfile-yksi.flac +0 -0
  153. data/spec/fixtures/sdr/rfid/LICENSE.txt +674 -0
  154. data/spec/fixtures/sdr/rfid/README.md +30 -0
  155. data/spec/fixtures/sdr/rfid/fdxb_animal.pm3 +10000 -0
  156. data/spec/fixtures/sdr/rfid/fdxb_extended.pm3 +10000 -0
  157. data/spec/fixtures/sdr/rtl433/README.md +81 -0
  158. data/spec/fixtures/sdr/rtl433/acurite_th_609_001.cu8 +118 -0
  159. data/spec/fixtures/sdr/rtl433/acurite_th_609_001.json +6 -0
  160. data/spec/fixtures/sdr/rtl433/toyota.cu8 +9 -0
  161. data/spec/fixtures/sdr/rtl433/toyota.json +1 -0
  162. data/spec/fixtures/sdr/rtl433/wh31.cu8 +66 -0
  163. data/spec/fixtures/sdr/rtl433/wh31.json +2 -0
  164. data/spec/integration/native_ruby_helpers_spec.rb +23 -0
  165. data/spec/lib/pwn/ai/agent/loop_spec.rb +42 -0
  166. data/spec/lib/pwn/ai/agent/swarm_spec.rb +15 -0
  167. data/spec/lib/pwn/ffi/adalm_pluto_spec.rb +47 -0
  168. data/spec/lib/pwn/ffi/dsp_native_spec.rb +53 -0
  169. data/spec/lib/pwn/ffi/hack_rf_spec.rb +36 -0
  170. data/spec/lib/pwn/ffi/rtl_sdr_spec.rb +16 -0
  171. data/spec/lib/pwn/ffi/soapy_sdr_spec.rb +24 -0
  172. data/spec/lib/pwn/plugins/capability_broker/daemon_spec.rb +241 -0
  173. data/spec/lib/pwn/plugins/capability_broker_spec.rb +7 -0
  174. data/spec/lib/pwn/plugins/sandbox/driver_spec.rb +37 -0
  175. data/spec/lib/pwn/plugins/sandbox_spec.rb +107 -0
  176. data/spec/lib/pwn/sdr/decoder/adsb_spec.rb +262 -4
  177. data/spec/lib/pwn/sdr/decoder/apt_spec.rb +124 -0
  178. data/spec/lib/pwn/sdr/decoder/base_iq_spec.rb +3 -11
  179. data/spec/lib/pwn/sdr/decoder/base_spec.rb +457 -6
  180. data/spec/lib/pwn/sdr/decoder/bluetooth_spec.rb +213 -0
  181. data/spec/lib/pwn/sdr/decoder/dect_spec.rb +138 -0
  182. data/spec/lib/pwn/sdr/decoder/dsp_native_spec.rb +105 -0
  183. data/spec/lib/pwn/sdr/decoder/flex_spec.rb +206 -0
  184. data/spec/lib/pwn/sdr/decoder/gps_spec.rb +154 -0
  185. data/spec/lib/pwn/sdr/decoder/gsm_spec.rb +161 -0
  186. data/spec/lib/pwn/sdr/decoder/iridium_spec.rb +131 -0
  187. data/spec/lib/pwn/sdr/decoder/lora_spec.rb +291 -0
  188. data/spec/lib/pwn/sdr/decoder/lte_spec.rb +199 -0
  189. data/spec/lib/pwn/sdr/decoder/morse_spec.rb +41 -0
  190. data/spec/lib/pwn/sdr/decoder/p25_spec.rb +170 -0
  191. data/spec/lib/pwn/sdr/decoder/pager_spec.rb +26 -0
  192. data/spec/lib/pwn/sdr/decoder/pocsag_spec.rb +87 -0
  193. data/spec/lib/pwn/sdr/decoder/rds_spec.rb +92 -0
  194. data/spec/lib/pwn/sdr/decoder/rfid_spec.rb +94 -0
  195. data/spec/lib/pwn/sdr/decoder/rtl433_spec.rb +79 -0
  196. data/spec/lib/pwn/sdr/decoder/rtty_spec.rb +54 -0
  197. data/spec/lib/pwn/sdr/decoder/tempest_spec.rb +192 -0
  198. data/spec/lib/pwn/sdr/decoder/wifi_spec.rb +208 -0
  199. data/spec/lib/pwn/sdr/decoder/zigbee_spec.rb +169 -0
  200. data/spec/lib/pwn/sdr/gqrx_spec.rb +126 -0
  201. data/spec/lib/pwn/setup_spec.rb +17 -0
  202. data/third_party/pwn_rdoc.jsonl +174 -38
  203. metadata +109 -7
  204. data/lib/pwn/plugins/capability_broker/daemon.py +0 -145
  205. data/lib/pwn/plugins/sandbox/driver.py +0 -187
  206. data/spec/lib/pwn/plugins/capd_test.py +0 -27
  207. data/spec/lib/pwn/plugins/sandbox_test.py +0 -47
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ada4e79d8d8864ce2ea48b7378b4d10e124e7925d050424d3ef10e269438d5f
4
- data.tar.gz: 714c044b1ab48bf33ca175d73fee3997d0788ed9d34e6c124d59c7fdf630c01e
3
+ metadata.gz: '0018be9794020a4b996e0d67a076e2741ca124d475f1439a047a77ecc0667d9d'
4
+ data.tar.gz: 46eae2746ab67af7ace35e7dc4caa6e09897a187ec7295a6fe5b103a33262722
5
5
  SHA512:
6
- metadata.gz: 2472a6aa034cd281f4b2b67804558b7f40827abfca843857b7f713d1c492a9ea1e3c2bfd03282134bc2d2270e1db77cdc7c20876b0f4baf58d5b36c929ba536f
7
- data.tar.gz: e7550328388a59e8d4047bceef0da28446850c2b0d40670930e104ea3ca7a89559aa65db510bd2d2e60f02053f85a98890a5bd96fee7d0435d1a53c845a5fe44
6
+ metadata.gz: dd8e061914bb0941234e210a8ea346d4f11dbd0babcd5137e93fe529b094826459b469f6cfb5d2e8cabdc306bbb8471df5703275035a9e8d27fc36352b50ec84
7
+ data.tar.gz: 4f361334ec04c20998333623be5c2d5b97ab27189dc52f1d4fda470ff40e743c38f58b1ae37b85244557a1f7eaf93954abd3baafdcb96c8bc8d57eb4fc71ff98
data/Gemfile CHANGED
@@ -88,7 +88,7 @@ gem 'ruby-audio', '1.6.1'
88
88
  gem 'ruby-nmap', '1.0.3'
89
89
  gem 'ruby-saml', '1.18.1'
90
90
  gem 'rvm', '1.11.3.9'
91
- gem 'savon', '2.17.4'
91
+ gem 'savon', '2.17.5'
92
92
  gem 'selenium-devtools', '0.153.0'
93
93
  gem 'selenium-webdriver', '4.49.0'
94
94
  gem 'slack-ruby-client', '3.2.0'
data/bin/pwn-capd CHANGED
@@ -1,5 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- # Packaging-compatible driver; privileged deployments execute daemon.py directly.
5
- exec('/usr/bin/python3', '-I', File.expand_path('../lib/pwn/plugins/capability_broker/daemon.py', __dir__), *ARGV)
4
+ # Deploy the reviewed Ruby library tree with this executable, never setcap Ruby.
5
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
6
+ require 'pwn'
7
+ require 'pwn/plugins/capability_broker/daemon'
8
+
9
+ begin
10
+ PWN::Plugins::CapabilityBroker::Daemon.main(argv: ARGV)
11
+ rescue StandardError => e
12
+ warn "pwn-capd: #{e.message}"
13
+ exit 1
14
+ end
@@ -2,7 +2,12 @@
2
2
 
3
3
  ## pwn-capd (P8)
4
4
 
5
- The Python stdlib helper speaks one bounded JSON request per Unix connection.
5
+ The native Ruby helper speaks one bounded JSON request per Unix connection.
6
+ Ruby `Socket` and `pack` implement AF_PACKET send/capture and pcap encoding;
7
+ the existing `ffi` gem calls Linux libc `prctl`, `capget` and `capset`.
8
+ There is no Python runtime or fallback. Read-only ARP/ND queries retain the
9
+ `/usr/sbin/ip` (iproute2) dependency, executed as an argument vector with a
10
+ clean environment, bounded output and a five-second deadline.
6
11
  Linux SO_PEERCRED authenticates the configured caller UID; the client also
7
12
  checks the daemon UID. The socket is mode 0600. Only explicitly configured
8
13
  interfaces are accepted. Operations: `status`, `raw_send` (base64 Ethernet
@@ -11,10 +16,32 @@ neighbor-cache queries). There is no command endpoint, arbitrary privileged
11
16
  output path, firewall mutation, or implicit sudo. ARP/ND currently query cache;
12
17
  they do not actively solicit neighbors or mutate entries.
13
18
 
14
- Operator installation (NOT executed by the application): install
15
- `lib/pwn/plugins/capability_broker/daemon.py` (not the Ruby packaging driver)
16
- root-owned under `/usr/local/libexec/pwn-capd`, mode 0755, in a root-owned
17
- non-writable directory. Do **not** setcap the system Ruby/Python interpreter
19
+ Requests are limited to 100,000 bytes including the newline; each connection
20
+ has a 35-second total deadline. Ethernet sends accept 14..65,535 decoded bytes.
21
+ Captures accept 1..128 packets, at most 30 seconds, and 4,096 bytes per packet.
22
+ The helper sets `no_new_privs`, intersects effective/permitted capabilities
23
+ with CAP_NET_RAW/CAP_NET_ADMIN, and clears both inheritable words before
24
+ handling requests. It never adds a capability. Existing socket paths (including
25
+ symlinks) and writable or foreign-owned socket directories are refused.
26
+
27
+ Unprivileged protocol and native-executable smoke (no raw packets or privilege grants):
28
+
29
+ ```
30
+ bundle exec rspec spec/lib/pwn/plugins/capability_broker_spec.rb spec/lib/pwn/plugins/capability_broker/daemon_spec.rb
31
+ ```
32
+
33
+ Operator installation (NOT executed by the application): install the reviewed
34
+ PWN Ruby package and its dependencies root-owned, including `bin/pwn-capd`,
35
+ `lib/pwn/plugins/capability_broker.rb` and
36
+ `lib/pwn/plugins/capability_broker/daemon.rb`. Keep the package's `bin/` and
37
+ `lib/` layout intact; point the service ExecStart at that package's
38
+ `bin/pwn-capd`. A root-managed installed-gem executable may also be exposed
39
+ as `/usr/local/libexec/pwn-capd` (mode 0755). The executable, library tree,
40
+ Ruby interpreter, gems and all ancestor directories must be administrator
41
+ controlled and non-writable by clients. Clear user-controlled `RUBYOPT`,
42
+ `RUBYLIB`, `GEM_HOME`, `GEM_PATH` and Bundler environment settings in the
43
+ service; use only the reviewed installation's dependency paths.
44
+ Do **not** setcap the shared Ruby interpreter
18
45
  or this script: Linux ignores script file capabilities, and granting a shared
19
46
  interpreter network privileges exposes every script. Use a dedicated systemd
20
47
  service with `User=<operator>`, `AmbientCapabilities=CAP_NET_RAW CAP_NET_ADMIN`,
@@ -60,7 +87,9 @@ PWN::Plugins::Sandbox.rollback(snapshot: s[:snapshot], backend: 'bwrap')
60
87
  ```
61
88
 
62
89
  Docker is default, image `pwn-sandbox:local`; it must be provisioned locally,
63
- with `/usr/bin/python3`, strace, GDB, and target runtime libraries. No implicit
90
+ with `/usr/bin/ruby`, strace, GDB, and target runtime libraries. The controller
91
+ and isolated worker use Ruby stdlib only; no Python interpreter is launched by
92
+ the sandbox driver (GDB itself may include Python support). No implicit
64
93
  pull, installation, daemon startup or host-execution fallback occurs. Use the
65
94
  included `lib/pwn/plugins/sandbox/Dockerfile` to build explicitly. Network none,
66
95
  read-only root/artifacts, unprivileged UID, all caps dropped, no-new-privileges,
@@ -84,13 +113,23 @@ Fuzzing is bounded seeded bit-flip stdin mutation, not coverage-guided AFL.
84
113
  Tools register via `require 'pwn/ai/agent/tools/sandbox'`: `sandbox_run` and
85
114
  `sandbox_fuzz`; normal Registry discovery finds that file.
86
115
 
87
- Verification:
116
+ Sandbox verification (safe bwrap fixtures require working unprivileged namespaces):
88
117
  ```
89
- bundle exec rspec spec/lib/pwn/plugins/{packet,capability_broker,sandbox}_spec.rb
90
- python3 spec/lib/pwn/plugins/capd_test.py
91
- python3 spec/lib/pwn/plugins/sandbox_test.py
118
+ bundle exec rspec spec/lib/pwn/plugins/sandbox_spec.rb spec/lib/pwn/plugins/sandbox/driver_spec.rb
92
119
  ```
93
120
 
121
+ The tests exercise `/bin/true`, read-only mounts, namespace isolation without
122
+ network requests, timeouts, resource limits, SIGSEGV/GDB/strace replay,
123
+ byte-exact stdin mutation and snapshot integrity. Docker command/cleanup unit
124
+ checks are not evidence of a running Docker backend. The GDB fixture requests
125
+ 1024 MiB: this host's GDB can exhaust the default 256 MiB address-space budget.
126
+ Instrumentation failures retain raw output and an unknown classification.
127
+
128
+ Fuzz seeds are reproducible within this Ruby implementation, not bit-for-bit
129
+ compatible with Python's PRNG sequence. Each iteration retains the execution
130
+ and replay budget plus bounded backend startup/cleanup overhead; the minutes
131
+ budget stops starting new iterations, rather than preempting cleanup.
132
+
94
133
  Safe real Docker smoke after explicit provisioning:
95
134
  ```
96
135
  bundle exec ruby -Ilib -rpwn/plugins/sandbox -e 'p PWN::Plugins::Sandbox.run(binary: "/bin/true")'
@@ -0,0 +1,25 @@
1
+ LoRa PHY coding equations in lib/pwn/sdr/decoder/lora.rb are adapted from
2
+ https://github.com/jkadbear/LoRaPHY/blob/4fddd9a7b47682781c663608bfc4f196e4bf656d/LoRaPHY.m
3
+
4
+ The MIT License (MIT)
5
+
6
+ Copyright (C) 2020-2022 jkadbear, jkadbear@gmail.com
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining
9
+ a copy of this software and associated documentation files (the
10
+ "Software"), to deal in the Software without restriction, including
11
+ without limitation the rights to use, copy, modify, merge, publish,
12
+ distribute, sublicense, and/or sell copies of the Software, and to
13
+ permit persons to whom the Software is furnished to do so, subject to
14
+ the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be
17
+ included in all copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.