Skip to main content

Reverse engineering

Research, not an audit
These pages are research and development and may not match the live app. Do not treat this as an audit. Shared for testing and demo only. Please use responsibly.

Published installers are an attacker surface. Anyone who can download the app already has the program. Closed source does not hide how the client is shaped once those builds ship.

This page is that surface in product language: what reverse engineering recovers, what risk that creates for users, and what stayed hard. Narrative write-up: Reverse-engineering a closed-source Glitr build. Leftover catalog: Residual risk.

Scope​

In scope: shipped clients people can download — Linux TUI, desktop .deb, Android APK, and web — plus this site’s public docs.

Out of scope as a secrecy claim: treating the closed messenger tree as something an installer cannot reveal. Open source remains a roadmap goal, not a current product claim.

Two vocabularies appear below. Do not mix them.

VocabularyWordsRole
Product statusDocumented / Mitigated / Partial / OpenSame four words as the rest of this folder
Investigation tagsobserved / derived / inferred / unknownHow glitr-decompiled labels evidence in evidence/

A reconstruction is not an audit and not Glitr’s product source.

Adversary​

AdversaryCapabilityIn scope
Reverse engineer with public installersDownloads builds, mines strings and embedded schema, unpacks APK/deb assets, mirrors docs, uses AI agentsYes
Lookalike publisherShips a familiar chat UI that speaks a parallel dialect — or wraps malware in Glitr chromeYes — as residual social engineering
Deeper native analystDisassemblers / decompilers aimed at the same binariesYes in principle; the published research pass did not complete that path

What that adversary can do without deeper native RE: recover mailbox layout, outer ciphertext field names, password-envelope parameters, crate-name maps, and a toy client that talks to itself.

What that pass did not establish: full decrypt of real Glitr messages with a reconstructed client (official ↔ recon). The inner recipient cascade stayed unknown.

Threats​

ThreatStatusAsset / impactNotes
Closed source as secrecyOpenProtocol shape, architecture namesInstallers are public; hiding source is not hiding the program
Architecture / crate-map leakageDocumentedModule boundariesEmbedded debug paths and strings name crates across the stack
Mailbox schema leakageDocumentedSealed vs host-visible foldersGraphQL SDL and folder rules fall out of the binary
Outer cascade wire recoverablePartialCiphertext layout on git outboundField names and ML-KEM outer shape recovered; sealed mail still needs the unlock password
Password-envelope parameters recoverablePartialAt-rest sealingArgon2id / AES-GCM shape recovered; the secret is still the password
Inner recipient cascade (Signal / PQXDH / MLS)PartialMessage plaintext via RE alonePractical RE barrier in the published pass; not a permanent hardness claim
Recon ↔ recon interopDocumentedParallel dialectA reconstructed client can encrypt and decrypt with another copy of itself
Official ↔ recon full decryptOpenBreak E2E to real peers via RENot established; do not treat RE as opening the messenger
Lookalike / malware-wrapped clientOpenUser trust, credentials typed into a fakeFamiliar UI does not require ratchet parity
Docs-mirror false confidenceDocumentedAnalyst / reader judgmentCopying this site into a tree inflates “completeness” without proving behavior
Cheaper keep-up with new buildsOpenOngoing RE costAutomating “ingest the new installer” may shrink the closed-source window
Supply-chain confusionPartialWhich binary the user runsTrojaned lookalike vs official CDN / service worker — see Platforms

Password sealing and the recipient cascade remain separate jobs. Recovering how envelopes look is not the same as opening a mailbox without the password. Recovering the outer wrap is not the same as peeling the inner ratchet that unlocks real Glitr ciphertext.

What the decompile showed​

Public research tree: positive-intentions/glitr-decompiled. Ledger: evidence/FINDINGS.md. Tags below are investigation tags, not product status words.

Artifacts​

ArtifactTagDepth
Linux TUI (glitr-tui-linux)observedRichest oracle — strings, symbols, embedded GraphQL SDL
Linux GUI (.deb)observedUnpacked assets (webview layout, isomorphic-git bundles)
Android (.apk)observedUnpacked assets; full APK code RE deferred (no JADX in that environment)
Web buildobservedDigests and bundled surfaces; deep WASM inspect unsupported in that pass
Docs mirrorobservedScraped glitr.io pages — documentation recovery, not implementation recovery

Deep native decompile (Ghidra / Hopper) and JADX were unavailable for that run. See evidence/tooling-status.md in the research repo.

Schema​

ClaimTag
Messaging schema v10 embedded in the TUI binaryobserved (evidence/messaging.v10.graphql)
Public docs at the freeze still described an older version (v8)observed
Sealed collections: contacts, inbox, sent, groups, protocol-sessions, group-protocol-sessions, file-transfers, profile-secretsobserved
Peer-visible: profile-public, outbound, readreceipts, signaling, devicesobserved

A freeze is a point in time. Live product and docs keep moving.

Crypto shape​

LayerTagReconstruction status
Password at rest (Argon2id 19 MiB, t=2, p=1 → AES-256-GCM)observedShape matches official fixtures
Hybrid v1 (wrappedKey / nonce / ciphertext)observedImplemented in the research tree
Cascade v3 outer (ML-KEM-1024 field names and sizes)observed / derivedEmits official-shaped outbound JSON
Cascade inner (Signal / PQXDH / MLS bytes after outer peel)unknownNot recovered without deeper native analysis
protocolBundles key names (signal, pqxdh, mlkemPublic, mlsKeyPackage)observedEncodings beyond names stayed unknown

Interop​

QuestionAnswerTag
Recon ↔ recon decrypt?Yes (fixtures/official-interop.sh)observed
Official → recon full decrypt?Not establishedunknown
Recon → official full decrypt?Not establishedunknown
Live frame names / toy WebRTC lab?Partial (recon ↔ recon)observed
Tor / full TUI chrome / deep Android UI?Deferredunknown

Looking Glitr-shaped is cheaper than being Glitr. The scary residual for users is a lookalike that is good enough to trick someone — not a perfect copy of the closed tree.

What this does not mean​

  • The research tree is not an independent security audit.
  • A reconstruction is not the product — tests, formal-check scaffolding, Drive, Office, Local AI, and the multi-project split did not come back as shipping code from installers alone.
  • Recovering outer wire and envelope parameters is not plaintext without the unlock password or session keys.
  • Closed source did not stop reconnaissance. It also did not open the messenger to official peers in that pass.

Next leftover catalog: Residual risk.