Signal's Contact Discovery automatically sends your contact list...

V12 broke into that enclave and leaked the key, allowing the server host to decrypt everything.
Two separate critical bugs: arbitrary read and RCE.
Here's how. 🧵
It's on by default, and the app sends your full contacts list every 48h.
Queries run inside an SGX enclave, so even Signal's servers can't see them.
SGX encrypts the enclave's memory, so the host can't read the queries directly, and uses ORAM to hide the access pattern.
As ORAM is expensive, the database is split into shards, each serviced by an enclave worker.
A malicious host can use page faults to pause enclave threads at critical points, enabling fine-grained deterministic exploitation of data races.
A shard queues a lookup, then a wait. With one worker per shard, consuming the wait proves the lookup finished. But the enclave doesn't prevent us from spawning a duplicate:
1. Worker A starts a lookup.
2. Worker B consumes the wait.
3. The query frees its result buffer.
4. Worker A resumes and writes 56 bytes into freed memory.
We groom the heap to reuse the freed memory as a protobuf workspace, replacing a pointer and length with host-chosen values. The protobuf encoder in a normal client response path then copies out the bytes we selected.
This allows the owner of the untrusted server to steal all the phone numbers in your contacts.
CDSI hands the host opaque pointers to client state. When performing operations, it authenticates these client pointers by checking a secret canary, then separately CASing a state field.
We used our host control primitive to pause between the two, free the client, groom the heap, and reuse its address for our own object. The enclave validates the original client, but uses our replacement.
Our POC makes the pwned enclave memcpy its secrets out to host memory.
This again allows the server to impersonate the enclave, decrypting all incoming contact information.
Full technical write-up, report and POCs: v12.sh/blog/signal
V12 is our autonomous AI hacker.
Find bugs like this in your code: v12.sh

