Affected: gr-satellites >= 1.0.0, <= 5.9.0
Severity: Medium (CVSS 3.1: 6.5, AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)
Summary
Each of the telemetry-submitter blocks wraps a network call
(requests.post, requests.put, urlopen, WebSocket.send) inside
the GNU Radio handle_msg entry point without a try/except clause.
GNU Radio's thread-per-block scheduler catches uncaught exceptions
only at the very top of the thread function; once caught, the thread
exits and is not respawned. The block's input queue keeps accepting
messages — they just stay queued and never get processed.
Any transient network failure (DNS timeout, TCP RST, TLS handshake
failure, slow server, network change) raises, the handler thread
dies, and every subsequent telemetry submission is silently dropped.
The flowgraph keeps running so there's no visible error; the operator
believes they're uploading but the queue is being discarded.
Eight call sites, one fix family
| Sub-finding |
File:line |
Trigger |
| F22a |
funcube_submit.py:58 |
requests.post() outside try/except |
| F22b |
pwsat2_submitter.py:83,112 |
requests.put() + .post() outside try/except |
| F22c |
submit.py:130-140 |
partial wrap; mid-stream errors escape |
| F20 |
bme_submitter.py:80-87 |
putPacket response JSON parse uncaught |
| F33 |
bme_submitter.py:50 |
authenticate response JSON parse uncaught |
| F34 |
bme_submitter.py:53 |
authenticate keyError on missing field |
| F35 |
bme_submitter.py:71-73 |
putPacket keyError on missing field |
| F36 |
bme_ws_submitter.py:31,48,49 |
no timeout= on connect/send/recv — connect is unwrapped, send/recv are wrapped at the handler level but a stalled server still hangs the thread indefinitely |
The BME server in particular completes a TLS handshake then closes
the stream on anonymous connections, which raises ConnectionError
on the very first frame after every flowgraph start — operators
running BME submission hit the bug without any attacker present.
Live endpoint status (verified 2026-05-24)
| Submitter |
Endpoint |
Live |
Exploit today |
| FUNcube AMSAT-UK |
http://data.amsat-uk.org/api/data/hex/... |
yes |
yes |
| BME |
https://gnd.bme.hu:8080/api/tokens |
yes |
yes (self-trigger) |
| SatNOGS DB |
https://db.satnogs.org/api/telemetry/ |
yes |
yes |
| PW-Sat2 |
http://radio.pw-sat.pl/api/authenticate |
host up, app gone |
historical only |
Reproduction
disclosure/bundle-2026-05-24/v2/pocs/F22-submitter-robustness/:
poc_F22c_urllib.py — standalone, no external deps; mock server
half-closes mid-response, demonstrates the unpatched handler crashes
Fix
Wrap each handle_msg body in try/except Exception with a log line,
and add timeout=10 to every requests.* and websocket call. Eight
sites in five files.
Long-form advisory
https://github.com/Marnick39/gr-satellites/blob/audit-advisories/disclosure/bundle-2026-05-24/v2/ADVISORY-05-F22-submitter-robustness.md
Affected: gr-satellites
>= 1.0.0, <= 5.9.0Severity: Medium (CVSS 3.1: 6.5, AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)
Summary
Each of the telemetry-submitter blocks wraps a network call
(
requests.post,requests.put,urlopen,WebSocket.send) insidethe GNU Radio
handle_msgentry point without atry/exceptclause.GNU Radio's thread-per-block scheduler catches uncaught exceptions
only at the very top of the thread function; once caught, the thread
exits and is not respawned. The block's input queue keeps accepting
messages — they just stay queued and never get processed.
Any transient network failure (DNS timeout, TCP RST, TLS handshake
failure, slow server, network change) raises, the handler thread
dies, and every subsequent telemetry submission is silently dropped.
The flowgraph keeps running so there's no visible error; the operator
believes they're uploading but the queue is being discarded.
Eight call sites, one fix family
funcube_submit.py:58requests.post()outside try/exceptpwsat2_submitter.py:83,112requests.put()+.post()outside try/exceptsubmit.py:130-140bme_submitter.py:80-87putPacketresponse JSON parse uncaughtbme_submitter.py:50bme_submitter.py:53bme_submitter.py:71-73bme_ws_submitter.py:31,48,49timeout=on connect/send/recv —connectis unwrapped,send/recvare wrapped at the handler level but a stalled server still hangs the thread indefinitelyThe BME server in particular completes a TLS handshake then closes
the stream on anonymous connections, which raises
ConnectionErroron the very first frame after every flowgraph start — operators
running BME submission hit the bug without any attacker present.
Live endpoint status (verified 2026-05-24)
http://data.amsat-uk.org/api/data/hex/...https://gnd.bme.hu:8080/api/tokenshttps://db.satnogs.org/api/telemetry/http://radio.pw-sat.pl/api/authenticateReproduction
disclosure/bundle-2026-05-24/v2/pocs/F22-submitter-robustness/:poc_F22c_urllib.py— standalone, no external deps; mock serverhalf-closes mid-response, demonstrates the unpatched handler crashes
Fix
Wrap each
handle_msgbody intry/except Exceptionwith a log line,and add
timeout=10to everyrequests.*and websocket call. Eightsites in five files.
Long-form advisory
https://github.com/Marnick39/gr-satellites/blob/audit-advisories/disclosure/bundle-2026-05-24/v2/ADVISORY-05-F22-submitter-robustness.md