Skip to content

feat(security): enforce packet authenticity policies - #10967

Merged
thebentern merged 9 commits into
meshtastic:developfrom
RCGV1:codex/packet-auth-policy
Jul 21, 2026
Merged

feat(security): enforce packet authenticity policies#10967
thebentern merged 9 commits into
meshtastic:developfrom
RCGV1:codex/packet-auth-policy

Conversation

@RCGV1

@RCGV1 RCGV1 commented Jul 10, 2026

Copy link
Copy Markdown
Member

Summary

Adds a device-owned receive policy for Meshtastic's existing XEdDSA and PKI authentication results:

  • Compatible verifies signatures when possible and accepts unsigned traffic.
  • Balanced preserves the current signed-broadcast downgrade protection and legacy interoperability.
  • Strict admits decryptable remote traffic to local processing only after a valid existing XEdDSA signature or successful existing PKI decryption.

Strict applies across packet types and destinations, including positions, NodeInfo, telemetry, text, routing/control, broadcasts, and unicasts. The policy is enforced before NodeDB/history storage, modules, connected clients, plaintext MQTT, ACK side effects, or rebroadcast of decryptable rejected traffic.

This PR does not add a signature version, change the existing signed tuple, change PKI/AES-CCM bytes, or make the receive policy affect outbound traffic. Licensed/ham plaintext signing is intentionally separate in design#122 / #10966.

Implementation

  • consumes SecurityConfig.packet_signature_policy and reports DeviceMetadata.has_xeddsa
  • validates first-contact signed NodeInfo against its embedded key and CRC32 node identity before committing the key
  • preserves known-signer downgrade state through warm-store eviction
  • distinguishes decryptable failures from opaque unknown-channel transit
  • keeps opaque traffic relay-only, limited to rebroadcast modes that permit opaque forwarding and routed through normal duty-cycle/queue/transmit safety
  • applies the same gate to RF, SimRadio/UDP, and MQTT ingress without trusting serialized auth flags
  • carries an exact, one-shot, nonserialized authentication handoff so packets are verified once while original ciphertext remains byte-exact for encrypted MQTT forwarding
  • enables XEdDSA on RAK3172 and CDEBYTE E77-MBL, while constrained STM32 targets that overflow remain excluded and report the capability as false

Validation

  • packet signing/policy suite: 46/46 passed
  • MQTT suite: 50/50 passed
  • crypto suite: 11/11 passed
  • warm store suite: 13/13 passed
  • RAK3172 final build: 25,852 / 65,536 RAM (39.4%), 201,516 / 247,808 flash (81.3%)
  • CDEBYTE E77-MBL policy build: 24,944 / 65,536 RAM (38.1%), 198,160 / 247,808 flash (80.0%)
  • trunk check and git diff --check: clean
  • dedicated security re-review: approved exact commit d6b12ea3f1fc83afcff63a7fb511d54c52cc871a

No RF/BLE/serial hardware verification has been performed. This PR must remain draft until real-device verification is recorded.

Depends on meshtastic/protobufs#983.

Closes #10963
Design: meshtastic/design#121

Summary by CodeRabbit

  • New Features
    • Improved XEdDSA signer recognition with warm-tier tracking/restoration.
    • Added routing authentication gate with “opaque relay-only” outcomes, including caching to reduce repeated verification.
  • Bug Fixes
    • Tightened rebroadcast/upgrade flows so forwarding stops when decode or signature-policy checks fail.
    • Standardized PKI/auth metadata handling across UDP/MQTT so untrusted packets are dropped consistently.
    • Added configuration normalization for signature policy with warning when PKI/XEdDSA is excluded.
  • Tests
    • Expanded signing-policy and authentication-order coverage, plus MQTT/PKI cases and fuzz acceptance of additional decode outcomes.
  • Chores
    • Updated STM32 build variants to disable XEdDSA exclusion where applicable.

@RCGV1

RCGV1 commented Jul 10, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@github-actions

github-actions Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

⚡ Try this PR in the Web Flasher

Flash this PR in the Web Flasher

firmware commit boards expires

Warning

This is an automated, unreviewed CI test build. Back up your device configuration
before flashing, and only flash devices you are able to recover.

Supported boards built by this PR (30)
Device Board Platform
Crowpanel Adv 3.5 TFT elecrow-adv-35-tft esp32-s3
Heltec HT62 heltec-ht62-esp32c3-sx1262 esp32-c3
Heltec Mesh Node 096 heltec-mesh-node-t096 nrf52840
Heltec Mesh Node T1 heltec-mesh-node-t1 nrf52840
Heltec Mesh Node T114 heltec-mesh-node-t114 nrf52840
Heltec V3 heltec-v3 esp32-s3
Heltec V4 heltec-v4 esp32-s3
Meshnology W10 meshnology_w10 esp32-s3
Raspberry Pi Pico pico rp2040
Raspberry Pi Pico W picow rp2040
RAK WisMesh Pocket V3 rak_wismesh_pocket nrf52840
RAK WisMesh Pod rak_wismesh_pod nrf52840
RAK WisMesh Repeater Mini V2 rak_wismesh_repeater_mini nrf52840
RAK WisMesh Tag rak_wismeshtag nrf52840
RAK WisBlock 11200 rak11200 esp32
RAK WisBlock 11310 rak11310 rp2040
RAK3312 rak3312 esp32-s3
RAK WisBlock 4631 rak4631 nrf52840
Seeed SenseCAP Mesh-Tracker-X1 seeed_mesh_tracker_X1 nrf52840
Seeed Wio Tracker L1 seeed_wio_tracker_L1 nrf52840
Seeed Xiao NRF52840 Kit seeed_xiao_nrf52840_kit nrf52840
Seeed Xiao ESP32-S3 seeed-xiao-s3 esp32-s3
Station G2 station-g2 esp32-s3
Station G3 station-g3 esp32-s3
LILYGO T-Deck t-deck-tft esp32-s3
LILYGO T-Echo t-echo nrf52840
LILYGO T-Echo Plus t-echo-plus nrf52840
LILYGO T-Impulse Plus t-impulse-plus nrf52840
LilyGo T3-C6 tlora-c6 esp32-c6
Seeed SenseCAP T1000-E tracker-t1000-e nrf52840

Build artifacts expire on 2026-08-20. Updated for e11635b.

@RCGV1

RCGV1 commented Jul 10, 2026

Copy link
Copy Markdown
Member Author

CI label check requires an enhancement (or equivalent allowed) label. This contributor account cannot add repository labels; a maintainer will need to apply it before the check can pass.

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR centralizes packet-authenticity decisions, adds configurable XEdDSA receive-policy enforcement, preserves signer state through warm storage, supports opaque relay, gates routing side effects, updates ingress handling, and expands packet-signing and MQTT test coverage.

Changes

Packet authenticity policy

Layer / File(s) Summary
Policy contracts and signer persistence
src/main.cpp, src/mesh/Router.h, src/mesh/WarmNodeStore.h, src/mesh/NodeDB.*, src/modules/AdminModule.cpp, variants/stm32/*
Adds routing-auth verdicts and decode states, reports XEdDSA capability, persists signer metadata through warm storage, normalizes unsupported policies, and enables XEdDSA for selected STM32 targets.
Centralized routing authentication
src/mesh/Router.*, src/mesh/udp/UdpMulticastHandler.h, src/mqtt/MQTT.cpp
Adds cached authentication evaluation, first-contact verification, policy handling, opaque decode results, pre-routing gates, trusted local delivery, and consistent ingress processing.
Opaque relay and retry gating
src/mesh/FloodingRouter.*, src/mesh/NextHopRouter.*
Prevents rebroadcast and ACK/retry actions after failed reprocessing and adds constrained opaque-packet relaying.
Policy matrix and pipeline validation
test/test_packet_signing/test_main.cpp, test/test_mqtt/MQTT.cpp, test/test_fuzz_packets/test_main.cpp, src/modules/NodeInfoModule.cpp
Adds policy-mode, malformed-signature, downgrade, warm-store, MQTT-ingress, fuzz, and routing-side-effect tests with an authentication pipeline harness.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Ingress
  participant Router
  participant AuthCache
  participant RelayOrRouting
  Ingress->>Router: submit packet
  Router->>AuthCache: reuse or evaluate authentication
  AuthCache-->>Router: ACCEPT, REJECT, or OPAQUE_RELAY_ONLY
  Router->>RelayOrRouting: relay opaque packet or continue routing
Loading

Possibly related issues

Possibly related PRs

Suggested labels: needs-review

Suggested reviewers: jp-bennett, thebentern

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 27.69% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: enforcing packet authenticity policies.
Description check ✅ Passed It includes summary, implementation, validation, and draft status, and states the remaining untested hardware paths.
Linked Issues check ✅ Passed The changes align with #10963 by adding policy gating, NodeInfo binding, opaque relay handling, XEdDSA reporting, and target enablement.
Out of Scope Changes check ✅ Passed The diff stays focused on packet-authentication policy, tests, and target configuration; no material unrelated work stands out.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@RCGV1

RCGV1 commented Jul 10, 2026

Copy link
Copy Markdown
Member Author

CI dependency status: the current Native Simulator, WASM, and Docker failures all stop at DeviceMetadata.has_xeddsa being absent from the checked-out protobuf submodule. That field is supplied by the linked draft dependency meshtastic/protobufs#983. The later lcov: command not found line in the native job is only a cascading post-failure step. No independent firmware compile failure appears in these jobs; they should be rerun after the protobuf dependency lands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/mesh/Router.h`:
- Around line 178-181: Shorten the API comments near the receive authentication
policy and the related declarations around `Router` to one or two concise lines
each. Retain only the essential contract; remove detailed packet-routing and
policy behavior explanations from the header comments.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 634c2153-5eb0-42bd-97e8-8d8610d3f738

📥 Commits

Reviewing files that changed from the base of the PR and between 91043fa and d6b12ea.

📒 Files selected for processing (19)
  • src/main.cpp
  • src/mesh/FloodingRouter.cpp
  • src/mesh/FloodingRouter.h
  • src/mesh/NextHopRouter.cpp
  • src/mesh/NextHopRouter.h
  • src/mesh/NodeDB.cpp
  • src/mesh/NodeDB.h
  • src/mesh/Router.cpp
  • src/mesh/Router.h
  • src/mesh/WarmNodeStore.h
  • src/mesh/udp/UdpMulticastHandler.h
  • src/modules/AdminModule.cpp
  • src/modules/NodeInfoModule.cpp
  • src/mqtt/MQTT.cpp
  • test/test_mqtt/MQTT.cpp
  • test/test_packet_signing/test_main.cpp
  • variants/stm32/CDEBYTE_E77-MBL/platformio.ini
  • variants/stm32/rak3172/platformio.ini
  • variants/stm32/stm32.ini

Comment thread src/mesh/Router.h Outdated
@RCGV1
RCGV1 force-pushed the codex/packet-auth-policy branch from a2415ec to 82ad09a Compare July 10, 2026 01:09
@RCGV1

RCGV1 commented Jul 10, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@thebentern

Copy link
Copy Markdown
Contributor

@RCGV1 protos have been merged. This needs to be updated now.

RCGV1 commented Jul 19, 2026

Copy link
Copy Markdown
Member Author

Updated this branch against current develop now that meshtastic/protobufs#983 is merged. The new head is 59ab12675a784b5cffd62ff8d6df415ad2f9ce8b.

I resolved the Router/NodeDB/STM32 overlap by retaining the packet-authentication policy and incorporating current PKI handling. I also made the packet-signing fixture explicitly use BALANCED; production correctly defaults to COMPATIBLE under the merged protobuf enum.

Local validation passed:

  • pio test -e native-macos -f test_packet_signing — 46/46
  • pio test -e native-macos -f test_mqtt -f test_crypto -f test_warm_store — 76/76
  • git diff --check origin/develop...HEAD

I could not rerun the two STM32 builds locally because PlatformIO's first-time ARM compiler download stalled; CI should cover those targets on this updated head.

The label workflow is currently red because the PR has no labels. I attempted to apply enhancement, but the repository integration does not have permission to add labels.

… assertion

The packet-auth-policy change extends the DecodeState enum with DECODE_OPAQUE
and DECODE_POLICY_REJECT. test_E1_perhaps_decode_fuzz drives arbitrary
ciphertext through perhapsDecode and asserted the verdict was one of the
original three states; random ciphertext that matches no channel with no PKI
attempt now returns DECODE_OPAQUE, tripping the assertion. Broaden the check to
accept all five valid verdicts, matching the test's stated 'any verdict is
fine' contract.
sendLocal() now dispatches local packets through handleReceived() directly
instead of the mock-overridden enqueueReceivedMessage(). The MQTT implicit
ACK-to-self therefore runs the full receive pipeline (RoutingModule ->
MeshService::handleFromRadio -> sendToPhone), enqueuing pooled MeshPacket
copies into toPhoneQueue. Production drains that queue via PhoneAPI, but the
test has no phone reader, so the copies leaked at teardown (LeakSanitizer:
42824 bytes / 101 objects across test_receiveFuzzServiceEnvelope and
test_receiveAcksOwnSentMessages).

Give MockMeshService a destructor that drains toPhoneQueue like the phone
would. Test-only; the real firmware does not leak here.
Resolve conflicts against the NodeDB signer/key primitives (meshtastic#11050) and the
admin-key PKI decrypt budget (meshtastic#11100).

- NodeDB: drop this branch's hasSeenXeddsaSigner in favour of develop's
  isKnownXeddsaSigner. They answer the same question, but develop's reads the
  dedicated warm signer bit (warmSignerOf) rather than the WarmProtected
  category, and TrafficManagementModule already depends on it. Keep develop's
  copyPublicKey/copyPublicKeyAuthoritative, isVerifiedSignerForKey and
  commitRemoteKey/KeyCommitTrust.
- checkXeddsaReceivePolicy: keep this branch's Strict/Balanced/Compatible
  policy, which is a superset of develop's balanced-only downgrade gate, and
  call isKnownXeddsaSigner from it. develop's !pki_encrypted term is dropped
  because the policy returns early for PKI packets before that check.
- perhapsDecode: keep develop's key resolution (NodeDB then pending-key, only
  for real PKI candidates) plus its admin-key token bucket, and re-apply this
  branch's pkiAttempted flag feeding the DECODE_OPAQUE verdict. Keep both
  passesRoutingAuthGate and adminKeyFallbackAllowed/Refund.
- test_A17: model eviction the way NodeDB actually does it, passing the warm
  signer bit as well as the XeddsaSigner category, since isKnownXeddsaSigner
  reads the former.

Native suite: 38 suites, 743/743 cases, no sanitizer findings.
@thebentern
thebentern merged commit 5548bd3 into meshtastic:develop Jul 21, 2026
101 of 103 checks passed
jamesarich added a commit to meshtastic/Meshtastic-Android that referenced this pull request Jul 23, 2026
Radio-config sub-screens correlate admin responses to requests via a
request-id set, but the id was registered only after the suspending send
returned — and the send suspends until the radio acks the packet via
QueueStatus. Firmware 2.8 (meshtastic/firmware#10967) routes self-addressed
packets through a synchronous local loopback, so the admin response now
reaches the phone BEFORE that ack. The response flowed through
meshPacketFlow while the request-id set was still empty, was silently
dropped by the correlation guard, and every local config screen sat at a 0%
loading overlay until the 30s timeout.

Every request method on RadioConfigUseCase / AdminActionsUseCase now takes
an onRequestId callback invoked with the packet id before the send is
issued, and RadioConfigViewModel registers there instead of after the call.
The manual-channel batch helper threads the same callback through
writeChannel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Ixitxachitl Ixitxachitl mentioned this pull request Jul 24, 2026
8 tasks
thebentern added a commit that referenced this pull request Jul 24, 2026
…FS (#11190)

Since #10967 made Router::sendLocal handle self-addressed packets
synchronously, the entire phone-API chain for a BLE client runs inline in
the Bluefruit characteristic write callback: toRadioWriteCb ->
PhoneAPI::handleToRadio -> admin set-config -> radio reconfigure ->
NodeDB::saveToDisk. That callback executes on the Bluefruit BLE FreeRTOS
task, whose stock stack is 5 KB (CFG_BLE_TASK_STACKSIZE = 256*5 words) -
not the Arduino loop task that #10944 already raised to 8 KB. The loop-task
fix therefore protects the wrong task for BLE-originated writes.

On a Seeed Wio Tracker L1 the 5 KB stack overflows during pairing
first-sync, resetting the device mid-LittleFS-write, every single time.
Repeated mid-write resets tear the LittleFS metadata, lfs_assert fires on
the next boot, and the corruption handler formats the whole filesystem:
region, channels, module config, and the node's keypair are all lost
(critical fault #13, new node identity on next region set). Reproduced
end-to-end tonight on stock develop 6908d27; with this change the same
device pairs, serves config screens, and survives back-to-back
config.proto saves over BLE.

Raise the BLE task to the same 2048 words (8 KB) as LOOP_STACK_SZ, for the
same reason. bluefruit.cpp's #ifndef guard makes the -D take effect with no
framework patch. Costs 3 KB of RAM on nrf52840 targets only.

Credit where due: Ixitxachitl independently established in #11155 testing
that the save-path crash persists after #11185 and that re-queueing
sendLocal (moving the pipeline back to the Router thread) makes it go away
- which corroborates this diagnosis from the other direction. This commit
is the minimal capacity-side fix; #11155's relocation of the pipeline off
the BLE task remains the right architectural follow-up, and this guard
stays correct even after it lands.

Likely also explains #10905 (L1 display-thread crash when a client
requests full configuration) and the 2.8 field reports of idle nodes
losing region and keys after a BLE session.
thebentern added a commit to cvaldess/firmware that referenced this pull request Jul 24, 2026
…astic#11185)

* Deliver locally-generated replies addressed to us to the phone

Config get/set from the phone times out on every device: the client sends an
admin request, the node handles it, and the response is silently dropped
before it reaches the phone queue.

meshtastic#10967 changed Router::sendLocal's isToUs branch from enqueueReceivedMessage()
to handleReceived(p, src), so a local packet keeps its RxSource instead of
being relabeled RX_SRC_RADIO by the queue round-trip. That is the right call
for the new policy gates, but module replies go out through
MeshService::sendToMesh() with the default RX_SRC_LOCAL, and a reply to a
phone-originated request is addressed to our own node (setReplyTo resolves
from == 0 to ourNodeNum). Those replies now re-enter callModules as
RX_SRC_LOCAL, where the loopback gate skips every module whose loopbackOk is
false - including RoutingModule, whose promiscuous sniff is the only path that
moves a received packet into toPhoneQueue. The reply is released, never sent.

Requests still work, because the phone's own packets arrive as RX_SRC_USER and
pass the gate, so a set_config is applied and only its acknowledgement is lost.
That is why a client can connect and download config but times out on every
config screen and every setter.

Deliver the phone's copy from sendToMesh() instead: for a local packet
addressed to us, the loopback gate is doing its job in keeping the packet away
from module re-dispatch, and the phone copy is exactly what is missing. Setting
loopbackOk on RoutingModule would instead echo every locally-generated
broadcast back to the phone, and relabeling replies RX_SRC_RADIO would undo the
origin separation meshtastic#10967 added.

Also stop reporting ERRNO_SHOULD_RELEASE (35) to the phone in the QueueStatus
for these packets. It means "caller frees", not a send failure, and the same
hunk changed it from the 0 the phone used to see.

* Address review: trim comments, assert the QueueStatus count

Condense the added comments to the one-or-two-line house style; the rationale
lives in the commit message and PR.

The reply test drained QueueStatus records in a while loop, which would have
passed just as happily on an empty queue. Count them and require both the
request's and the reply's.
jeremiah-k pushed a commit to jeremiah-k/meshtastic-firmware that referenced this pull request Jul 25, 2026
…stic#11202)

* Fix nRF52 freeze + watchdog reset when saving config over BLE

Since meshtastic#10967 phone-originated admin messages are handled synchronously on
Bluefruit's BLE event task. NRF52Bluetooth::disconnect() busy-waited for
BLE_GAP_EVT_DISCONNECTED, which only that same task can process, so any
config save that requires a reboot (e.g. position) deadlocked the device
until the 90s watchdog fired. Bound the wait to 1s and sleep instead of
spinning so lower-priority tasks (including the watchdog feed) keep
running; the SoftDevice completes the link termination on its own.

* Address review: use Throttle helper, tighten comment

* Name the disconnect timeout constant

* Log unconfirmed BLE disconnect at WARN with elapsed time
NomDeTom pushed a commit to NomDeTom/MeshtasticFirmware that referenced this pull request Jul 25, 2026
Since meshtastic#10967 phone-originated admin messages are handled synchronously on
Bluefruit's BLE event task. NRF52Bluetooth::disconnect() busy-waited for
BLE_GAP_EVT_DISCONNECTED, which only that same task can process, so any
config save that requires a reboot (e.g. position) deadlocked the device
until the 90s watchdog fired. Bound the wait to 1s and sleep instead of
spinning so lower-priority tasks (including the watchdog feed) keep
running; the SoftDevice completes the link termination on its own.
madeofstown pushed a commit to madeofstown/meshtastic-firmware that referenced this pull request Jul 26, 2026
…stic#11202)

* Fix nRF52 freeze + watchdog reset when saving config over BLE

Since meshtastic#10967 phone-originated admin messages are handled synchronously on
Bluefruit's BLE event task. NRF52Bluetooth::disconnect() busy-waited for
BLE_GAP_EVT_DISCONNECTED, which only that same task can process, so any
config save that requires a reboot (e.g. position) deadlocked the device
until the 90s watchdog fired. Bound the wait to 1s and sleep instead of
spinning so lower-priority tasks (including the watchdog feed) keep
running; the SoftDevice completes the link termination on its own.

* Address review: use Throttle helper, tighten comment

* Name the disconnect timeout constant

* Log unconfirmed BLE disconnect at WARN with elapsed time
@coderabbitai coderabbitai Bot mentioned this pull request Jul 28, 2026
8 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[2.8.0] Enforce configurable packet authenticity policy

2 participants