"Private Note — Notes only visible to you" is stored in plaintext account data that homeserver admins can read #329

Closed
opened 2026-10-05 22:57:13 -04:00 by jared · 0 comments
Owner

The user-profile Private Note (UserPrivateNotes, src/app/components/user-profile/UserRoomProfile.tsx:212-292; placeholder "Notes only visible to you…") is saved as global account data io.lotus.user_notes = { "@user:server": "note text" } (verified: GET /user/@aud_main:localhost/account_data/io.lotus.user_notes → {"@aud_bob:localhost":"note 73843"}).

Account data isn't end-to-end encrypted. Homeserver admins can read it in the database or via admin tooling, and so can anything holding the user's access token: a bridge, a bot, or a compromised session. People write notes about other members of the same server ("ignore his DMs", "owes me 20 €") on the assumption, which the UI states, that only they can see them.

Other features already handle this distinction well: reminders and bookmarks deliberately drop text for E2EE rooms because "account data is server-readable".

Fix (either):

  • Wording: "Only you can see this in Lotus Chat. It's stored on your homeserver and isn't end-to-end encrypted."
  • Encryption: encrypt the notes with a key kept in secret storage (SSSS, like cross-signing and backup keys), e.g. a per-account AES key stored as io.lotus.user_notes_key. The account data then holds only ciphertext. Devices without the key (not verified) would show "Verify this device to see your notes".

Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny 30e2dbcd, cinny-desktop 8f67ec7, element-call 3b0050e8.

The user-profile **Private Note** (`UserPrivateNotes`, src/app/components/user-profile/UserRoomProfile.tsx:212-292; placeholder *"Notes only visible to you…"*) is saved as global account data **`io.lotus.user_notes`** = `{ "@user:server": "note text" }` (verified: `GET /user/@aud_main:localhost/account_data/io.lotus.user_notes` → `{"@aud_bob:localhost":"note 73843"}`). Account data isn't end-to-end encrypted. Homeserver admins can read it in the database or via admin tooling, and so can anything holding the user's access token: a bridge, a bot, or a compromised session. People write notes *about other members of the same server* ("ignore his DMs", "owes me 20 €") on the assumption, which the UI states, that only they can see them. Other features already handle this distinction well: reminders and bookmarks deliberately drop text for E2EE rooms because "account data is server-readable". **Fix (either):** - **Wording:** "Only you can see this in Lotus Chat. It's stored on your homeserver and isn't end-to-end encrypted." - **Encryption:** encrypt the notes with a key kept in secret storage (SSSS, like cross-signing and backup keys), e.g. a per-account AES key stored as `io.lotus.user_notes_key`. The account data then holds only ciphertext. Devices without the key (not verified) would show "Verify this device to see your notes". --- _Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny `30e2dbcd`, cinny-desktop `8f67ec7`, element-call `3b0050e8`._
jared added the priority: lowsecurityarea: settings labels 2026-10-05 22:57:13 -04:00
jared closed this issue 2026-10-19 02:07:07 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#329