L0 security limits and threat grades
Evidence level: Implemented capability for the current CoNET-SI forwarding plane; design study for listed upgrades that are not in SI main.
This page states what Layer Minus actually protects. It answers common over-claims: Fetch-and-Close is not an anonymity protocol; Chat SSE is a traffic fingerprint; long-term user OpenPGP keys do not provide forward secrecy; a valid EOA signature does not by itself stop replay; A/B/C role names are not independent operators.
L0 remains a permissionless decentralized cloud whose live wire is a PGP / wallet-address forwarding network. Any node may be malicious. Stronger privacy modes are application compositions (privacy routing + fragmentation + client crypto) unless SI implements them.
Public source for the live plane: CoNET-project/CoNET-SI.
Fetch-and-Close is a short-session mode
Fetch-and-Close is optional:
select an entry → send one bounded request → receive a bounded response → close
It can reduce:
- long-lived connection duration;
- a fixed tunnel fingerprint;
- single-connection bidirectional volume statistics;
- long-term binding to one entry;
- a continuous network identity at one exit;
- the window during which one connection can be monitored.
It cannot remove:
- the set of entry IPs a client uses;
- request time;
- packet or ciphertext length;
- request frequency;
- periodic polling;
- a stable client or TLS fingerprint when HTTPS is used;
- correlation of adjacent requests;
- the bandwidth curve of a large download;
- global entry–exit matching by a well-placed observer.
The current book already treats Fetch-and-Close as optional. Chat and mining use long-lived SSE. UDP client and server listens are also SSE. Browsers may reuse HTTP/2 connections. Browser pooling, caching, and OS behavior can break a “new connection per resource” assumption. Those effects must be measured, not inferred from the design.
Grade: Fetch-and-Close lowers persistent-flow features. It is not a traffic-anonymity protocol. Size padding and timing jitter are not implemented.
Outer envelope and nested PGP hops
Byte-level freeze: X-CoNET-Hop-Sigs v1. The header is a compact miner signature used to meter forwarded bytes. It is not a public HopRecordV1 itinerary (messageId, inner/outer hashes, previous-hop hash, hopIndex). That extra JSON would let a path observer reconstruct the forward chain.
SI routing is not limited to “one key ID, never decrypt.” After a local decrypt once:
- If the plaintext is still OpenPGP armor, read the inner
getEncryptionKeyIDs(). - If that inner key ID is this node's route PGP, treat it as an attack: emit socket
endand stop. Do not peel again on the same node. - If the inner key ID is not this node, read SI-to-SI
X-CoNET-Hop-Sigs. More than 3 hop signatures (or a count that cannot take another hop) is an all-node flood: emitendand do not forward. The packet is discarded. - Otherwise forward the inner armor and append this node's miner hop signature. When the destination SI ends the socket, the previous hop closes and frees that connection.
- If the plaintext is signed JSON
{ message, signMessage }, the last hop verifies hop signatures, meters those prior-hop bytes against the user wallet for GB, and runs the API command (listen, proxy, storage, WASM / container, and so on).
The client POST /post body is only OpenPGP armor and must not carry X-CoNET-Hop-Sigs. If the outer key ID is not a routable node / mailbox, A responds 404. A then miner-signs and forwards to B; B sees the header because A created it.
Loop protection
A loop that never reaches a valid recipient inside 3 miner signatures is discarded. A → D → A or A → D → E → D cannot complete a useful delivery or invent GB. The protocol therefore does not publish a previous-hop hash chain.
Adjacent and header checks already stop the useful cases:
- inner key ID equals this node →
end; - this miner wallet already appears in the hop list → refuse append;
- hop count already 3 →
end.
There is one budget: 3 miner signatures. Do not add a second maxPeels / maxForwardHops pair.
An application can wrap a user-PGP business message to entry A, or use a short hop chain. A first-hop path observer then sees the outer key ID, not R's. Each peel node still learns the next key ID, time, and size. Extra hops are extra GB. This is not a mix network and does not replace padding.
Current Chat clients may still post a single user-PGP layer (A forwards without decrypting when the key maps to a mailbox). The peel rule is available to any client that wraps.
Chat SSE is a primary L0 traffic fingerprint
DePIN Chat’s recipient opens a long-lived HTTP/SSE listen through entry C (command: "mining", listenKind: "chat"). Mining collectors and UDP listens also keep SSE sessions.
An ISP or entry C can observe:
- a long-lived HTTP/SSE;
- disconnect and reconnect;
- liveness heartbeats;
- a downlink push pattern;
- active hours;
- traffic peaks;
- online / offline cadence.
Content remains OpenPGP-encrypted. Metadata can still support inferences about when a user is online, how often messages arrive, device sleep/wake, and that a chat-like application is in use.
Receive modes
| Mode | Mechanism | Status |
|---|---|---|
| Realtime | Long-lived SSE. The listen command inside route-PGP carries the user’s Securitykey; the node encrypts SSE downlink with that key. Intermediate entries that only forward armor do not receive it. |
Implemented |
| Entry rotation | The user may close C and open another SSE through a different healthy entry at any time. That breaks a long-lived bind to one ingress. It does not remove the SSE shape on the new C. | Implemented (client choice) |
| Privacy poll | Randomized short polls, batch fetch, optional padding and dummy polls | Not implemented |
Do not set every client to the same fixed poll period if a poll mode is added later — that creates a new sync fingerprint. Current SI mailbox delivery is store-then-push over SSE.
Long-term user OpenPGP is not forward-secret
Business messages are encrypted to the recipient’s registered user OpenPGP public key. OpenPGP typically creates a per-message symmetric session key and wraps that key to the long-term recipient public key.
If that long-term private key is later compromised, an attacker who stored earlier ciphertext may decrypt it. The live model therefore provides:
- confidentiality against nodes that lack the user private key;
- sender authentication when the outer EOA signature verifies;
- a per-message random session key wrapped by the long-term key.
It does not currently specify or implement:
- forward secrecy for stored Chat ciphertext;
- post-compromise security;
- Double Ratchet;
- automatic session-key rotation after first contact;
- MLS group messaging (RFC 9420).
Encrypted Chat history (IPFS fragments + ChatIndexRegistry) is likewise keyed from long-term EOA/OpenPGP material. Compromise of that authority can expose recoverable history.
Chat crypto profile (roadmap)
Acknowledging the gap does not raise the live grade. Until a later profile ships, do not describe Chat as forward-secret.
| Profile | Cryptography | Status |
|---|---|---|
| V1 | Long-term recipient OpenPGP (per-message session key wrapped to that key) | Live |
| V2 | AddressPGP / OpenPGP handshake → X25519 identity and prekey bundle → Double Ratchet session keys on later messages; L0 still carries the ratchet ciphertext | Planned |
| V3 | MLS (or equivalent tree-based group key agreement) instead of one PGP encrypt per member | Research |
AddressPGP remains the wallet identity, offline discovery, mailbox route, initial handshake, and session-recovery root. On-demand new wallets reduce future correlation after a leak; they do not decrypt-protect already captured V1 armor.
HTTP versus HTTPS (neither is “more private”)
The /post body is only OpenPGP ciphertext. Confidentiality of business content does not come from TLS. That does not mean “HTTP is more private than HTTPS.”
| HTTP | HTTPS | |
|---|---|---|
| Hides from an ISP | No SNI, no JA3/JA4, no certificate fingerprint, no TLS handshake | /post body, JSON wrap, ASCII armor, outer key ID, content-length |
| Shows to an ISP | POST /post, JSON, armor, outer key ID, length; active drop / delay / replay / fake status |
SNI / certificate / JA3/JA4; a fixed entry domain; TLS client fingerprint |
| Channel | No TLS authentication of the hop | Authenticated, integrity-protected channel |
Carrier decision
| Environment | Recommended carrier |
|---|---|
| Ordinary Internet / browser page served over HTTPS | HTTPS + OpenPGP body (mixed content forbids http://) |
| SNI / certificate blocking | HTTP + OpenPGP body |
| High privacy, delay acceptable | HTTP or HTTPS + outer envelope (wrap to A) |
| Payments / POS / Treasury / AA control | HTTPS preferred + application consumed-nonce (not hop-sigs) |
| Research / diagnostics | Label the capture; not a privacy baseline |
Protocol rule: both HTTP and HTTPS are valid client carriers. SI-to-SI stays HTTP :80. Do not advertise plain HTTP as the default privacy mode for every environment.
Plain HTTP allows active path attacks
OpenPGP and EOA signatures stop a path observer from quietly rewriting plaintext. They do not stop an HTTP observer from:
- dropping or delaying packets;
- replaying an old request;
- injecting a false HTTP status;
- returning a fake entry response;
- blocking a recipient key ID;
- classifying by key ID;
- forcing client retries;
- measuring whether a mailbox accepted a copy.
checkSign in CoNET-SI recovers the EOA from personal_sign(message) and checks it against walletAddress. That is authentication of that exact string, not a consumed-nonce store. X-CoNET-Hop-Sigs is also not an anti-replay store — it meters miner-forwarded bytes (hop-sigs v1).
Partial anti-replay exists only on some route-key commands:
| Object | Current binding | Replay store |
|---|---|---|
Generic /post business armor |
OpenPGP integrity + client-defined inner fields | Mailbox saveLocal appends; identical armor can be stored again |
wallet_online_query / gossip_delivery_ack |
EIP-191 + timestamp within ±600 s |
No durable nonce set |
| UDP listen / relay / uplink | EIP-191 + timestamp within ±600 s; payload size cap |
No replay window beyond the skew |
Chat sendId |
Application field; clients may drop duplicates | Not an SI mailbox invariant |
A correct EOA signature therefore does not automatically reject a previously valid message. Replaying the same valid armor to entry 1, 2, and 3 can duplicate mailbox store, push, APNs, or application handling unless the application consumes an id.
Required application bindings (normative for payments / POS / control)
Do not put a full L0SignedObjectV1 on the hop header. That would publish messageId / payloadHash to every SI hop.
Non-idempotent application objects (payments, POS authorization, AA / Treasury control, spend) must bind at least messageId, nonce, timestamp / expiry, senderWallet, recipientWallet, commandType, payloadHash inside the encrypted application object, and persist consumed identifiers at the consumer:
| Location | Store |
|---|---|
| Recipient / Chat client | sendId / application messageId |
| POS / payment / AA / Treasury | Durable consumed nonce — not a 600-second window alone |
| UDP | Sliding sequence window (upgrade; not live) |
| GB accounting | Verified hop rows (w,t,n,h,k,s) on the last command hop |
Do not treat TLS, HTTP 2xx, checkSign, or hop-sigs alone as that store.
TLS 1.3 0-RTT (not used by the HTTP-first path)
If a future Fetch-and-Close client uses TLS 1.3 0-RTT for performance, 0-RTT has no inherent anti-replay (RFC 8446). Non-idempotent operations must still consume application nonces.
Mailbox isolation fails under collusion
A/B/C separation prevents an ordinary mailbox from seeing the client’s direct IP. It is a role split, not a proof that A, B, and C are independent operators.
| Collusion | Combined view |
|---|---|
| A + B | A has sender IP, recipient key ID, mailbox identity, time, and size. B has the route, stored armor, and arrival time. Together they reconstruct a send relationship. |
| C + B | C has the recipient IP. B has the recipient wallet, presence, listen session, and message-arrival times. Together they bind wallet to network location. |
| Same operator for A, B, and C | Distinct chain addresses or Guardian IDs do not create independent trust domains. |
L1 has no public operator-domain census equivalent to the DLE OperatorDomainRegistryV1 specification. Clients today pick healthy entries; SI does not enforce “this operator must not be both entry and mailbox on one path.”
Proposed operator hygiene (not implemented on L0)
- Same operator domain must not be both entry and mailbox on one path.
- Clients check an operator-domain signal before selecting A/C.
- Diversify by ASN, cloud, and region.
- Rotate mailboxes.
- Publish independence metrics.
- Challenge and slash correlated multi-wallet operators.
- Remember recent path triples locally and avoid immediate reuse.
Until those exist, treat A/B/C as correct use of roles, not as multi-operator anonymity.
UDP forward: cryptography vs native UDP
The cryptographic split is sound and implemented:
- session AES key is encrypted only to the UDP server user PGP;
- mailbox B must not receive that key;
- route commands must not carry
Securitykey; - frames are AES-256-GCM;
- client and server should reach B through different entries;
- UDP pools are separate from chat/mining.
UDP forward is not native UDP. It is HTTP request plus SSE. It does not automatically provide UDP timing, congestion control, retransmission, delivery ACK, application-consumption proof, packet ordering, or low-jitter realtime performance.
Mailbox B still sees sessionId, client and server wallets, frame timing and size, direction, and session duration. That metadata can classify VoIP-like, game-like, or sensor-like use even when payloads stay encrypted.
Implemented bounds: 12,000-character payload, ±600 s timestamp, session-count caps, 10-minute idle sweep, downlink seq for SSE writes.
Proposed UDP hardening (not implemented)
Sequence numbers with a replay window, padding buckets, optional constant-rate mode, application ACKs, rekey, and tighter per-session byte limits. Document these as upgrades, not as the live relay.
Wallet identity is a correlation paradox
A wallet solves problems IP cannot: cryptographic ownership, mobility without renaming the peer, and accounts that are not issued by a platform.
A long-lived wallet used for Chat, POS, Beamio, mining, L1 transfers, DLE, BT, Treasury, and public social identity becomes a stable join key. Observers can build wallet → chat activity → payments → services → social graph.
A wallet is more autonomous than an IP. It is not automatically harder to correlate than an IP.
Layered identities (application, not L0)
L0 will forward whatever key ID it is given. Isolation is an application registration policy.
Available now: use a routing wallet for AddressPGP, listen, ACK, presence, and hop GB, and keep sender / recipient EOAs only inside the encrypted envelope. Mailbox B does not need the payment or display wallet. How to wire it: wallet-addressed peer identity.
Master wallet
├── Routing wallet ← mailbox + listen + GB (what B sees)
├── Chat / display
├── POS
├── BT session
├── DLE payment
└── Temporary network
This does not hide an on-chain gas or token transfer from master → routing wallet. Putting both addresses in one plaintext command or hop header undoes the split. Delegation proofs, stealth addresses, or ZK membership are not L0 features.
Current L0 threat grades
Grades describe the current SI + intended A/B/C client path, not a future ratchet, poll mode, or operator registry.
| Attack or observer goal | Current protection | Note |
|---|---|---|
| Intermediate node reads business plaintext | Strong | User-PGP armor is not decrypted on forward |
| Mailbox reads business plaintext | Strong | B stores and pushes armor; decrypts only route-key commands |
| Recipient learns sender IP | Moderately strong | Intended path posts through A; inner envelope may still name the sender wallet |
| Mailbox learns client IP | Moderately strong on a correct A/B/C path | Direct-to-B use collapses this |
| ISP reads business plaintext | Strong | OpenPGP body |
| ISP classifies an HTTPS entry | Weak to moderate | SNI / JA3 / certificate |
ISP classifies HTTP POST /post |
Weak | Path, JSON, ASCII armor; key ID is the outer layer (R's key unless the client wrapped) |
| Entry learns recipient wallet / route | Weak on a one-layer post; reduced for the first-hop observer with an outer wrap | After a local peel, A still sees the next key ID |
| Long-term wallet graph | Moderate to weak | Public chain + reused EOA |
| Single malicious relay | Moderately strong | Cannot read user-PGP content; can drop, delay, or classify |
| Entry + mailbox collusion | Weak | Role split ≠ operator split |
| Global timing correlation | Weak | No padding or mix |
| Endpoint compromise | Weak | Device or long-term key exposure |
| Historical-message forward secrecy | Insufficient | Long-term user PGP wrap |
| Sybil / correlated relays | Economic and operational | Guardian stake and ops; no L0 operator-domain enforcement |
What applications must not claim
- Fetch-and-Close as mix-net or anonymity.
- Chat SSE as metadata-private presence.
- OpenPGP-to-AddressPGP as Double Ratchet / MLS (that is Chat crypto V2/V3, not live V1).
checkSignorX-CoNET-Hop-Sigsas anti-replay for payments or POS.- A detailed hop JSON (
HopRecordV1) as required for loop safety — the cap is 3 miner signatures, then discard. - HTTP as “more private than HTTPS.”
- A/B/C as independent-operator anonymity.
- UDP forward as native realtime UDP.
- One wallet as an unlinkable identity across products.
Implementation anchors
- Entry HTTP/HTTPS and
{ data }POST: CoNET-SIserver.ts - Key-ID forward and
checkSign: CoNET-SIlocalNodeCommand.ts - Mailbox append store:
saveLocalin CoNET-SIutil.ts - UDP bounds: CoNET-SI
udpForward.ts - Chat listen composition: DePIN Chat
Next
- How to use Layer Minus — compose only the primitives that exist.
- X-CoNET-Hop-Sigs v1 — compact miner hop encoding and failure codes.
- HTTP transport and Fetch-and-Close — short-session carrier.
- Zero-trust mailbox routing — A/B/C roles.
- Wallet-addressed peer identity — key roles and reuse risk.
- UDP frame forwarding — AES split and remaining metadata.