Skip to content

docs: describe the security boundary and how to harden a plugin - #24

Merged
TobbenTM merged 1 commit into
mainfrom
security-hardening-note
Aug 21, 2026
Merged

docs: describe the security boundary and how to harden a plugin#24
TobbenTM merged 1 commit into
mainfrom
security-hardening-note

Conversation

@TobbenTM

Copy link
Copy Markdown
Member

Adds a "Security and hardening" section to the README, sitting between the device fingerprint and 3.x migration sections so the trust material reads as one run: how the binding is computed, then what it does and does not buy you. It states what the SDK guarantees (only Moonbase can mint a token, the product and device bindings, the bounded grace period, the store being a cache rather than a credential, fail-closed defaults), why anti-tamper and obfuscation are deliberately left to the consumer, and seven principles for doing that well. The rationale for the boundary is the part worth keeping: hardening only works when it lives inside your binary and is specific to it, so anything general enough to ship in an open-source header would be public, identical in every plugin using it, and one published bypass would apply to all of them. Guidance is positive throughout, with no enumeration of the SDK's weak points and no attack recipes, and much of the reasoning already existed in code comments consumers never read (the on-disk cache warning in device_id_resolver.hpp, the fail-closed default in LicenseGate.h).

Docs only, no code changes.

The SDK ships no anti-tamper, anti-debug, obfuscation or integrity-checking
code, and that is a deliberate scope decision rather than an oversight. Nothing
in the documentation said so, so a reader could reasonably finish the README
believing it was a DRM layer, wire `licensedFlag()` into a single `processBlock`
branch, and ship.
A new "Security and hardening" section sits between the device fingerprint and
3.x migration sections, keeping the trust material together: how the binding is
computed, then what it does and does not buy you. It states what the SDK
guarantees (only Moonbase can mint a token, the product and device bindings, the
bounded grace period, the store being a cache rather than a credential,
fail-closed defaults), why hardening is deliberately left to the consumer, and
seven principles for doing it.
The rationale for the boundary is the part worth keeping: hardening only works
when it lives inside your binary and is specific to it, so anything general
enough to ship in an open-source header would be public, identical in every
plugin using it, and one published bypass would apply to all of them.
Guidance is positive throughout. The section does not enumerate the SDK's weak
points or publish attack recipes. Much of the reasoning already existed in code
comments that consumers never read, notably the on-disk cache warning in
device_id_resolver.hpp and the fail-closed default in LicenseGate.h.
@argos-ci

argos-ciBot commented Aug 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Argos notifications ↗︎

BuildStatusDetailsUpdated (UTC)
default (Inspect)✅ No changes detected-Aug 21, 2026, 11:35 AM

@TobbenTM
TobbenTM merged commit fe15e1b into mainAug 21, 2026
12 checks passed
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 4.2.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@TobbenTM