fix(signal): the uninstall does not uninstall
Observed on the operator's machine 2026-10-30 while reinstalling to put the app to use. Four months after the package was purged, a fresh install found ~/.config/Signal/sql/db.sqlite (54,214,656 bytes, mtime 2026-06-21), tried to open it, and aborted before the linking screen: MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL MainSQL: migrateDatabase: Migration without cipher change failed sql.initialize was unsuccessful; returning early The SQLCipher key in config.json no longer resolved. The UI named nothing and offered only 'Delete data and restart', which discards the history. Moving the config directory aside fixes it; nothing in the product says so. Recorded as a medium finding, status open. The score does not move: 76.4 / B. local_data_exposure was already 5 for exactly this behaviour, and a finding is evidence, not a point. What changes is that the number now has a receipt instead of a rationale. Artifact: Servetus/00-Artifacts/2026/10-Oct/30/clu-signal-startup-failure/ main.log.excerpt - the failing run, verbatim 00-provenance.txt - package version, file sizes, sha256 of the retained db Retained state moved to ~/Signal-backup-2026-10-30-0026, not deleted.
This commit is contained in:
parent
21208d50ab
commit
f27ec770fc
10 changed files with 261 additions and 66 deletions
|
|
@ -59,7 +59,12 @@ a:hover{border-bottom-color:var(--amber)}
|
||||||
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
||||||
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
||||||
code{font-size:.86em;color:var(--bone)}
|
code{font-size:.86em;color:var(--bone)}
|
||||||
footer{margin-top:5rem;padding-top:1.5rem;border-top:1px solid var(--rule);color:var(--dim);font-size:.75rem}
|
footer{margin-top:4rem;padding:1.25rem 0 2rem;border-top:1px dashed var(--rule);color:var(--dim);font-size:.78rem}
|
||||||
|
footer a{color:var(--dim);border-bottom:1px solid var(--rule)}
|
||||||
|
footer a:hover{color:var(--amber);border-color:var(--amber)}
|
||||||
|
.frow{display:flex;justify-content:space-between;gap:2rem;flex-wrap:wrap;margin-bottom:.6rem}
|
||||||
|
.frow>div{flex:1 1 22rem;min-width:16rem}
|
||||||
|
.fmeta{font-size:.72rem;letter-spacing:.02em}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const NAV = `<nav>
|
const NAV = `<nav>
|
||||||
|
|
@ -78,8 +83,29 @@ function page(title, body) {
|
||||||
<title>${esc(title)}</title>
|
<title>${esc(title)}</title>
|
||||||
<style>${CSS}</style></head>
|
<style>${CSS}</style></head>
|
||||||
<body><div class="wrap">${NAV}${body}
|
<body><div class="wrap">${NAV}${body}
|
||||||
<footer>Generated from <code>bigtech.db</code> on ${esc(cat.generated_at.slice(0, 10))}.
|
<footer>
|
||||||
Method ${esc(cat.method_version)}. Every number recomputes from its evidence or the build fails.</footer>
|
<div class="frow">
|
||||||
|
<div>
|
||||||
|
Built in the open at the
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse">Binary Ranch Bunkhouse</a>.
|
||||||
|
Every repository there is one you can read, clone, and leave with.
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
Generated from <code>bigtech.db</code> on ${esc(cat.generated_at.slice(0, 10))}.
|
||||||
|
Method ${esc(cat.method_version)}. Every number recomputes from its evidence or the build fails.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="frow">
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/bigtech-sucks">Source for this site</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/vitals">vitals</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/otter-dark-mode">otter-dark-mode</a>
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://binaryranch.com">Binary Ranch</a> · Venice, Florida
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div></body></html>`;
|
</div></body></html>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
34
packages/core/db/seed/0005-signal-uninstall.sql
Normal file
34
packages/core/db/seed/0005-signal-uninstall.sql
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
-- =====================================================================
|
||||||
|
-- 0005 — Signal Desktop: the uninstall does not uninstall
|
||||||
|
--
|
||||||
|
-- Observed on the operator's own machine, 2026-10-30 00:24 CDT, while trying
|
||||||
|
-- to use the product for the first time since June.
|
||||||
|
--
|
||||||
|
-- This is a FINDING, not a score change. It does not move any dimension,
|
||||||
|
-- because local_data_exposure is already at 5 for the plaintext attachment
|
||||||
|
-- behaviour. What it does is replace a rationale with a demonstrated failure.
|
||||||
|
--
|
||||||
|
-- Artifact: 00-Artifacts/2026/10-Oct/30/clu-signal-startup-failure/
|
||||||
|
-- =====================================================================
|
||||||
|
|
||||||
|
INSERT INTO finding (assessment_id, severity, title, detail, status, disclosed_on)
|
||||||
|
VALUES (
|
||||||
|
'A-2026-10-29-SIGNAL-DESKTOP',
|
||||||
|
'medium',
|
||||||
|
'Purging the package leaves the database behind, and the next install then fails to start',
|
||||||
|
|
||||||
|
'On Linux, Signal keeps its state in ~/.config/Signal. Removing the signal-desktop package does not remove '
|
||||||
|
|| 'that directory. Reinstalling on 2026-10-30 found a 54,214,656-byte sql/db.sqlite last written 2026-06-21 '
|
||||||
|
|| 'and tried to open it. The SQLCipher key recorded in config.json no longer resolved, so every startup '
|
||||||
|
|| 'aborted with SQLITE_NOTADB before the app could reach the linking screen: '
|
||||||
|
|| '"MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL", then '
|
||||||
|
|| '"MainSQL: migrateDatabase: Migration without cipher change failed", then '
|
||||||
|
|| '"sql.initialize was unsuccessful; returning early". The user sees a "Can''t Open Signal" dialog '
|
||||||
|
|| 'whose only working option is "Delete data and restart", which discards the retained history. '
|
||||||
|
|| 'The same directory also held 355 received attachments (25 MB) in plaintext, 25 stickers, 189 badge '
|
||||||
|
|| 'files and an encryptedKey, all surviving a four-month-old uninstall. '
|
||||||
|
|| 'The failure is recoverable by moving the configuration directory aside, but nothing in the product '
|
||||||
|
|| 'tells the user that the old database is the cause, and the offered remedy is data loss.',
|
||||||
|
'open',
|
||||||
|
'2026-10-30'
|
||||||
|
);
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"generated_at": "2026-10-29T22:24:16.522Z",
|
"generated_at": "2026-10-30T05:31:05.570Z",
|
||||||
"method_version": "btr-0.1",
|
"method_version": "btr-0.1",
|
||||||
"dimensions": [
|
"dimensions": [
|
||||||
{
|
{
|
||||||
|
|
@ -3159,7 +3159,7 @@
|
||||||
],
|
],
|
||||||
"evidence": [
|
"evidence": [
|
||||||
{
|
{
|
||||||
"id": 77,
|
"id": 99,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "local_data_exposure",
|
"dimension_id": "local_data_exposure",
|
||||||
"claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.",
|
"claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.",
|
||||||
|
|
@ -3170,7 +3170,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 78,
|
"id": 100,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.",
|
"claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.",
|
||||||
|
|
@ -3181,7 +3181,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 79,
|
"id": 101,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.",
|
"claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.",
|
||||||
|
|
@ -3192,7 +3192,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 80,
|
"id": 102,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.",
|
"claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.",
|
||||||
|
|
@ -3203,7 +3203,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 81,
|
"id": 103,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "verifiability",
|
"dimension_id": "verifiability",
|
||||||
"claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.",
|
"claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.",
|
||||||
|
|
@ -3214,7 +3214,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 82,
|
"id": 104,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "server_retention",
|
"dimension_id": "server_retention",
|
||||||
"claim": "Grand jury subpoena response returned two timestamps and nothing else.",
|
"claim": "Grand jury subpoena response returned two timestamps and nothing else.",
|
||||||
|
|
@ -3225,7 +3225,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 83,
|
"id": 105,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "ownership_jurisdiction",
|
"dimension_id": "ownership_jurisdiction",
|
||||||
"claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.",
|
"claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.",
|
||||||
|
|
@ -3236,7 +3236,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 84,
|
"id": 106,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "incident_record",
|
"dimension_id": "incident_record",
|
||||||
"claim": "FBI and CISA PSA260626: Russian intelligence compromised individual Signal accounts via phishing and Backup Recovery Key theft, but NOT the encryption or the application itself.",
|
"claim": "FBI and CISA PSA260626: Russian intelligence compromised individual Signal accounts via phishing and Backup Recovery Key theft, but NOT the encryption or the application itself.",
|
||||||
|
|
@ -3247,7 +3247,7 @@
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 85,
|
"id": 107,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "incident_record",
|
"dimension_id": "incident_record",
|
||||||
"claim": "Signal statement, 28 April 2026: \"Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised.\" Additional linkage confirmations shipped 13 May 2026.",
|
"claim": "Signal statement, 28 April 2026: \"Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised.\" Additional linkage confirmations shipped 13 May 2026.",
|
||||||
|
|
@ -3258,7 +3258,7 @@
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 86,
|
"id": 108,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "ownership_jurisdiction",
|
"dimension_id": "ownership_jurisdiction",
|
||||||
"claim": "Open Technology Fund funded Open Whisper Systems $2,955,000 across 2013 to 2016, itemised on OTF own project page. This is the factual core under the \"US government funded Signal\" claim, and it is already reflected in the two points docked on this dimension.",
|
"claim": "Open Technology Fund funded Open Whisper Systems $2,955,000 across 2013 to 2016, itemised on OTF own project page. This is the factual core under the \"US government funded Signal\" claim, and it is already reflected in the two points docked on this dimension.",
|
||||||
|
|
@ -3269,7 +3269,7 @@
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 87,
|
"id": 109,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "user_control_exit",
|
"dimension_id": "user_control_exit",
|
||||||
"claim": "Signal publicly committed to leaving the UK (2023, Online Safety Act) and Sweden (Feb 2025) rather than weaken encryption. A vendor that threatens to lose a market is behaving incompatibly with a secret backdoor.",
|
"claim": "Signal publicly committed to leaving the UK (2023, Online Safety Act) and Sweden (Feb 2025) rather than weaken encryption. A vendor that threatens to lose a market is behaving incompatibly with a secret backdoor.",
|
||||||
|
|
@ -3282,7 +3282,7 @@
|
||||||
],
|
],
|
||||||
"findings": [
|
"findings": [
|
||||||
{
|
{
|
||||||
"id": 33,
|
"id": 41,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "high",
|
"severity": "high",
|
||||||
"title": "Received attachments are stored unencrypted on disk",
|
"title": "Received attachments are stored unencrypted on disk",
|
||||||
|
|
@ -3291,7 +3291,7 @@
|
||||||
"cve": "CVE-2023-24069"
|
"cve": "CVE-2023-24069"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 34,
|
"id": 42,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "medium",
|
"severity": "medium",
|
||||||
"title": "No verified reproducible build for the Linux package",
|
"title": "No verified reproducible build for the Linux package",
|
||||||
|
|
@ -3300,7 +3300,7 @@
|
||||||
"cve": null
|
"cve": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 35,
|
"id": 43,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "medium",
|
"severity": "medium",
|
||||||
"title": "Local database key is held in the OS keyring",
|
"title": "Local database key is held in the OS keyring",
|
||||||
|
|
@ -3309,7 +3309,16 @@
|
||||||
"cve": null
|
"cve": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 36,
|
"id": 45,
|
||||||
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
|
"severity": "medium",
|
||||||
|
"title": "Purging the package leaves the database behind, and the next install then fails to start",
|
||||||
|
"detail": "On Linux, Signal keeps its state in ~/.config/Signal. Removing the signal-desktop package does not remove that directory. Reinstalling on 2026-10-30 found a 54,214,656-byte sql/db.sqlite last written 2026-06-21 and tried to open it. The SQLCipher key recorded in config.json no longer resolved, so every startup aborted with SQLITE_NOTADB before the app could reach the linking screen: \"MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL\", then \"MainSQL: migrateDatabase: Migration without cipher change failed\", then \"sql.initialize was unsuccessful; returning early\". The user sees a \"Can't Open Signal\" dialog whose only working option is \"Delete data and restart\", which discards the retained history. The same directory also held 355 received attachments (25 MB) in plaintext, 25 stickers, 189 badge files and an encryptedKey, all surviving a four-month-old uninstall. The failure is recoverable by moving the configuration directory aside, but nothing in the product tells the user that the old database is the cause, and the offered remedy is data loss.",
|
||||||
|
"status": "open",
|
||||||
|
"cve": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "low",
|
"severity": "low",
|
||||||
"title": "Registration requires a phone number",
|
"title": "Registration requires a phone number",
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ export interface CatalogDimension {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const catalog = {
|
export const catalog = {
|
||||||
"generated_at": "2026-10-29T22:24:16.522Z",
|
"generated_at": "2026-10-30T05:31:05.570Z",
|
||||||
"method_version": "btr-0.1",
|
"method_version": "btr-0.1",
|
||||||
"dimensions": [
|
"dimensions": [
|
||||||
{
|
{
|
||||||
|
|
@ -3199,7 +3199,7 @@ export const catalog = {
|
||||||
],
|
],
|
||||||
"evidence": [
|
"evidence": [
|
||||||
{
|
{
|
||||||
"id": 77,
|
"id": 99,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "local_data_exposure",
|
"dimension_id": "local_data_exposure",
|
||||||
"claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.",
|
"claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.",
|
||||||
|
|
@ -3210,7 +3210,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 78,
|
"id": 100,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.",
|
"claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.",
|
||||||
|
|
@ -3221,7 +3221,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 79,
|
"id": 101,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.",
|
"claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.",
|
||||||
|
|
@ -3232,7 +3232,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 80,
|
"id": 102,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.",
|
"claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.",
|
||||||
|
|
@ -3243,7 +3243,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 81,
|
"id": 103,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "verifiability",
|
"dimension_id": "verifiability",
|
||||||
"claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.",
|
"claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.",
|
||||||
|
|
@ -3254,7 +3254,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 82,
|
"id": 104,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "server_retention",
|
"dimension_id": "server_retention",
|
||||||
"claim": "Grand jury subpoena response returned two timestamps and nothing else.",
|
"claim": "Grand jury subpoena response returned two timestamps and nothing else.",
|
||||||
|
|
@ -3265,7 +3265,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 83,
|
"id": 105,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "ownership_jurisdiction",
|
"dimension_id": "ownership_jurisdiction",
|
||||||
"claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.",
|
"claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.",
|
||||||
|
|
@ -3276,7 +3276,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 84,
|
"id": 106,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "incident_record",
|
"dimension_id": "incident_record",
|
||||||
"claim": "FBI and CISA PSA260626: Russian intelligence compromised individual Signal accounts via phishing and Backup Recovery Key theft, but NOT the encryption or the application itself.",
|
"claim": "FBI and CISA PSA260626: Russian intelligence compromised individual Signal accounts via phishing and Backup Recovery Key theft, but NOT the encryption or the application itself.",
|
||||||
|
|
@ -3287,7 +3287,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 85,
|
"id": 107,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "incident_record",
|
"dimension_id": "incident_record",
|
||||||
"claim": "Signal statement, 28 April 2026: \"Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised.\" Additional linkage confirmations shipped 13 May 2026.",
|
"claim": "Signal statement, 28 April 2026: \"Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised.\" Additional linkage confirmations shipped 13 May 2026.",
|
||||||
|
|
@ -3298,7 +3298,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 86,
|
"id": 108,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "ownership_jurisdiction",
|
"dimension_id": "ownership_jurisdiction",
|
||||||
"claim": "Open Technology Fund funded Open Whisper Systems $2,955,000 across 2013 to 2016, itemised on OTF own project page. This is the factual core under the \"US government funded Signal\" claim, and it is already reflected in the two points docked on this dimension.",
|
"claim": "Open Technology Fund funded Open Whisper Systems $2,955,000 across 2013 to 2016, itemised on OTF own project page. This is the factual core under the \"US government funded Signal\" claim, and it is already reflected in the two points docked on this dimension.",
|
||||||
|
|
@ -3309,7 +3309,7 @@ export const catalog = {
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 87,
|
"id": 109,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "user_control_exit",
|
"dimension_id": "user_control_exit",
|
||||||
"claim": "Signal publicly committed to leaving the UK (2023, Online Safety Act) and Sweden (Feb 2025) rather than weaken encryption. A vendor that threatens to lose a market is behaving incompatibly with a secret backdoor.",
|
"claim": "Signal publicly committed to leaving the UK (2023, Online Safety Act) and Sweden (Feb 2025) rather than weaken encryption. A vendor that threatens to lose a market is behaving incompatibly with a secret backdoor.",
|
||||||
|
|
@ -3322,7 +3322,7 @@ export const catalog = {
|
||||||
],
|
],
|
||||||
"findings": [
|
"findings": [
|
||||||
{
|
{
|
||||||
"id": 33,
|
"id": 41,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "high",
|
"severity": "high",
|
||||||
"title": "Received attachments are stored unencrypted on disk",
|
"title": "Received attachments are stored unencrypted on disk",
|
||||||
|
|
@ -3331,7 +3331,7 @@ export const catalog = {
|
||||||
"cve": "CVE-2023-24069"
|
"cve": "CVE-2023-24069"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 34,
|
"id": 42,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "medium",
|
"severity": "medium",
|
||||||
"title": "No verified reproducible build for the Linux package",
|
"title": "No verified reproducible build for the Linux package",
|
||||||
|
|
@ -3340,7 +3340,7 @@ export const catalog = {
|
||||||
"cve": null
|
"cve": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 35,
|
"id": 43,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "medium",
|
"severity": "medium",
|
||||||
"title": "Local database key is held in the OS keyring",
|
"title": "Local database key is held in the OS keyring",
|
||||||
|
|
@ -3349,7 +3349,16 @@ export const catalog = {
|
||||||
"cve": null
|
"cve": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 36,
|
"id": 45,
|
||||||
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
|
"severity": "medium",
|
||||||
|
"title": "Purging the package leaves the database behind, and the next install then fails to start",
|
||||||
|
"detail": "On Linux, Signal keeps its state in ~/.config/Signal. Removing the signal-desktop package does not remove that directory. Reinstalling on 2026-10-30 found a 54,214,656-byte sql/db.sqlite last written 2026-06-21 and tried to open it. The SQLCipher key recorded in config.json no longer resolved, so every startup aborted with SQLITE_NOTADB before the app could reach the linking screen: \"MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL\", then \"MainSQL: migrateDatabase: Migration without cipher change failed\", then \"sql.initialize was unsuccessful; returning early\". The user sees a \"Can't Open Signal\" dialog whose only working option is \"Delete data and restart\", which discards the retained history. The same directory also held 355 received attachments (25 MB) in plaintext, 25 stickers, 189 badge files and an encryptedKey, all surviving a four-month-old uninstall. The failure is recoverable by moving the configuration directory aside, but nothing in the product tells the user that the old database is the cause, and the offered remedy is data loss.",
|
||||||
|
"status": "open",
|
||||||
|
"cve": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "low",
|
"severity": "low",
|
||||||
"title": "Registration requires a phone number",
|
"title": "Registration requires a phone number",
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,12 @@ a:hover{border-bottom-color:var(--amber)}
|
||||||
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
||||||
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
||||||
code{font-size:.86em;color:var(--bone)}
|
code{font-size:.86em;color:var(--bone)}
|
||||||
footer{margin-top:5rem;padding-top:1.5rem;border-top:1px solid var(--rule);color:var(--dim);font-size:.75rem}
|
footer{margin-top:4rem;padding:1.25rem 0 2rem;border-top:1px dashed var(--rule);color:var(--dim);font-size:.78rem}
|
||||||
|
footer a{color:var(--dim);border-bottom:1px solid var(--rule)}
|
||||||
|
footer a:hover{color:var(--amber);border-color:var(--amber)}
|
||||||
|
.frow{display:flex;justify-content:space-between;gap:2rem;flex-wrap:wrap;margin-bottom:.6rem}
|
||||||
|
.frow>div{flex:1 1 22rem;min-width:16rem}
|
||||||
|
.fmeta{font-size:.72rem;letter-spacing:.02em}
|
||||||
</style></head>
|
</style></head>
|
||||||
<body><div class="wrap"><nav>
|
<body><div class="wrap"><nav>
|
||||||
<a href="/">The list</a>
|
<a href="/">The list</a>
|
||||||
|
|
@ -94,6 +99,27 @@ for your customer, and charging for it would make it worthless to both.</p>
|
||||||
<p class="note">Because every competitor who cannot show one is leaving a question on the table.
|
<p class="note">Because every competitor who cannot show one is leaving a question on the table.
|
||||||
A privacy claim in your own copy is a claim. A badge that links to a re-runnable audit is evidence,
|
A privacy claim in your own copy is a claim. A badge that links to a re-runnable audit is evidence,
|
||||||
and it costs you nothing but the honesty of being measured.</p>
|
and it costs you nothing but the honesty of being measured.</p>
|
||||||
<footer>Generated from <code>bigtech.db</code> on 2026-10-29.
|
<footer>
|
||||||
Method btr-0.1. Every number recomputes from its evidence or the build fails.</footer>
|
<div class="frow">
|
||||||
|
<div>
|
||||||
|
Built in the open at the
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse">Binary Ranch Bunkhouse</a>.
|
||||||
|
Every repository there is one you can read, clone, and leave with.
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
Generated from <code>bigtech.db</code> on 2026-10-30.
|
||||||
|
Method btr-0.1. Every number recomputes from its evidence or the build fails.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="frow">
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/bigtech-sucks">Source for this site</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/vitals">vitals</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/otter-dark-mode">otter-dark-mode</a>
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://binaryranch.com">Binary Ranch</a> · Venice, Florida
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div></body></html>
|
</div></body></html>
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"generated_at": "2026-10-29T22:24:16.522Z",
|
"generated_at": "2026-10-30T05:31:05.570Z",
|
||||||
"method_version": "btr-0.1",
|
"method_version": "btr-0.1",
|
||||||
"dimensions": [
|
"dimensions": [
|
||||||
{
|
{
|
||||||
|
|
@ -3159,7 +3159,7 @@
|
||||||
],
|
],
|
||||||
"evidence": [
|
"evidence": [
|
||||||
{
|
{
|
||||||
"id": 77,
|
"id": 99,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "local_data_exposure",
|
"dimension_id": "local_data_exposure",
|
||||||
"claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.",
|
"claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.",
|
||||||
|
|
@ -3170,7 +3170,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 78,
|
"id": 100,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.",
|
"claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.",
|
||||||
|
|
@ -3181,7 +3181,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 79,
|
"id": 101,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.",
|
"claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.",
|
||||||
|
|
@ -3192,7 +3192,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 80,
|
"id": 102,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "telemetry_egress",
|
"dimension_id": "telemetry_egress",
|
||||||
"claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.",
|
"claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.",
|
||||||
|
|
@ -3203,7 +3203,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 81,
|
"id": 103,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "verifiability",
|
"dimension_id": "verifiability",
|
||||||
"claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.",
|
"claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.",
|
||||||
|
|
@ -3214,7 +3214,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 82,
|
"id": 104,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "server_retention",
|
"dimension_id": "server_retention",
|
||||||
"claim": "Grand jury subpoena response returned two timestamps and nothing else.",
|
"claim": "Grand jury subpoena response returned two timestamps and nothing else.",
|
||||||
|
|
@ -3225,7 +3225,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 83,
|
"id": 105,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "ownership_jurisdiction",
|
"dimension_id": "ownership_jurisdiction",
|
||||||
"claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.",
|
"claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.",
|
||||||
|
|
@ -3236,7 +3236,7 @@
|
||||||
"observed_at": "2026-10-29T13:13:56-05:00"
|
"observed_at": "2026-10-29T13:13:56-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 84,
|
"id": 106,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "incident_record",
|
"dimension_id": "incident_record",
|
||||||
"claim": "FBI and CISA PSA260626: Russian intelligence compromised individual Signal accounts via phishing and Backup Recovery Key theft, but NOT the encryption or the application itself.",
|
"claim": "FBI and CISA PSA260626: Russian intelligence compromised individual Signal accounts via phishing and Backup Recovery Key theft, but NOT the encryption or the application itself.",
|
||||||
|
|
@ -3247,7 +3247,7 @@
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 85,
|
"id": 107,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "incident_record",
|
"dimension_id": "incident_record",
|
||||||
"claim": "Signal statement, 28 April 2026: \"Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised.\" Additional linkage confirmations shipped 13 May 2026.",
|
"claim": "Signal statement, 28 April 2026: \"Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised.\" Additional linkage confirmations shipped 13 May 2026.",
|
||||||
|
|
@ -3258,7 +3258,7 @@
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 86,
|
"id": 108,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "ownership_jurisdiction",
|
"dimension_id": "ownership_jurisdiction",
|
||||||
"claim": "Open Technology Fund funded Open Whisper Systems $2,955,000 across 2013 to 2016, itemised on OTF own project page. This is the factual core under the \"US government funded Signal\" claim, and it is already reflected in the two points docked on this dimension.",
|
"claim": "Open Technology Fund funded Open Whisper Systems $2,955,000 across 2013 to 2016, itemised on OTF own project page. This is the factual core under the \"US government funded Signal\" claim, and it is already reflected in the two points docked on this dimension.",
|
||||||
|
|
@ -3269,7 +3269,7 @@
|
||||||
"observed_at": "2026-10-29T15:26:00-05:00"
|
"observed_at": "2026-10-29T15:26:00-05:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 87,
|
"id": 109,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"dimension_id": "user_control_exit",
|
"dimension_id": "user_control_exit",
|
||||||
"claim": "Signal publicly committed to leaving the UK (2023, Online Safety Act) and Sweden (Feb 2025) rather than weaken encryption. A vendor that threatens to lose a market is behaving incompatibly with a secret backdoor.",
|
"claim": "Signal publicly committed to leaving the UK (2023, Online Safety Act) and Sweden (Feb 2025) rather than weaken encryption. A vendor that threatens to lose a market is behaving incompatibly with a secret backdoor.",
|
||||||
|
|
@ -3282,7 +3282,7 @@
|
||||||
],
|
],
|
||||||
"findings": [
|
"findings": [
|
||||||
{
|
{
|
||||||
"id": 33,
|
"id": 41,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "high",
|
"severity": "high",
|
||||||
"title": "Received attachments are stored unencrypted on disk",
|
"title": "Received attachments are stored unencrypted on disk",
|
||||||
|
|
@ -3291,7 +3291,7 @@
|
||||||
"cve": "CVE-2023-24069"
|
"cve": "CVE-2023-24069"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 34,
|
"id": 42,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "medium",
|
"severity": "medium",
|
||||||
"title": "No verified reproducible build for the Linux package",
|
"title": "No verified reproducible build for the Linux package",
|
||||||
|
|
@ -3300,7 +3300,7 @@
|
||||||
"cve": null
|
"cve": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 35,
|
"id": 43,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "medium",
|
"severity": "medium",
|
||||||
"title": "Local database key is held in the OS keyring",
|
"title": "Local database key is held in the OS keyring",
|
||||||
|
|
@ -3309,7 +3309,16 @@
|
||||||
"cve": null
|
"cve": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 36,
|
"id": 45,
|
||||||
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
|
"severity": "medium",
|
||||||
|
"title": "Purging the package leaves the database behind, and the next install then fails to start",
|
||||||
|
"detail": "On Linux, Signal keeps its state in ~/.config/Signal. Removing the signal-desktop package does not remove that directory. Reinstalling on 2026-10-30 found a 54,214,656-byte sql/db.sqlite last written 2026-06-21 and tried to open it. The SQLCipher key recorded in config.json no longer resolved, so every startup aborted with SQLITE_NOTADB before the app could reach the linking screen: \"MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL\", then \"MainSQL: migrateDatabase: Migration without cipher change failed\", then \"sql.initialize was unsuccessful; returning early\". The user sees a \"Can't Open Signal\" dialog whose only working option is \"Delete data and restart\", which discards the retained history. The same directory also held 355 received attachments (25 MB) in plaintext, 25 stickers, 189 badge files and an encryptedKey, all surviving a four-month-old uninstall. The failure is recoverable by moving the configuration directory aside, but nothing in the product tells the user that the old database is the cause, and the offered remedy is data loss.",
|
||||||
|
"status": "open",
|
||||||
|
"cve": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
"assessment_id": "A-2026-10-29-SIGNAL-DESKTOP",
|
||||||
"severity": "low",
|
"severity": "low",
|
||||||
"title": "Registration requires a phone number",
|
"title": "Registration requires a phone number",
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,12 @@ a:hover{border-bottom-color:var(--amber)}
|
||||||
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
||||||
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
||||||
code{font-size:.86em;color:var(--bone)}
|
code{font-size:.86em;color:var(--bone)}
|
||||||
footer{margin-top:5rem;padding-top:1.5rem;border-top:1px solid var(--rule);color:var(--dim);font-size:.75rem}
|
footer{margin-top:4rem;padding:1.25rem 0 2rem;border-top:1px dashed var(--rule);color:var(--dim);font-size:.78rem}
|
||||||
|
footer a{color:var(--dim);border-bottom:1px solid var(--rule)}
|
||||||
|
footer a:hover{color:var(--amber);border-color:var(--amber)}
|
||||||
|
.frow{display:flex;justify-content:space-between;gap:2rem;flex-wrap:wrap;margin-bottom:.6rem}
|
||||||
|
.frow>div{flex:1 1 22rem;min-width:16rem}
|
||||||
|
.fmeta{font-size:.72rem;letter-spacing:.02em}
|
||||||
</style></head>
|
</style></head>
|
||||||
<body><div class="wrap"><nav>
|
<body><div class="wrap"><nav>
|
||||||
<a href="/">The list</a>
|
<a href="/">The list</a>
|
||||||
|
|
@ -1132,6 +1137,27 @@ rated next. If you leave a contact we will tell you when it ships.</p>
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
<footer>Generated from <code>bigtech.db</code> on 2026-10-29.
|
<footer>
|
||||||
Method btr-0.1. Every number recomputes from its evidence or the build fails.</footer>
|
<div class="frow">
|
||||||
|
<div>
|
||||||
|
Built in the open at the
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse">Binary Ranch Bunkhouse</a>.
|
||||||
|
Every repository there is one you can read, clone, and leave with.
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
Generated from <code>bigtech.db</code> on 2026-10-30.
|
||||||
|
Method btr-0.1. Every number recomputes from its evidence or the build fails.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="frow">
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/bigtech-sucks">Source for this site</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/vitals">vitals</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/otter-dark-mode">otter-dark-mode</a>
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://binaryranch.com">Binary Ranch</a> · Venice, Florida
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div></body></html>
|
</div></body></html>
|
||||||
|
|
@ -40,7 +40,12 @@ a:hover{border-bottom-color:var(--amber)}
|
||||||
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
||||||
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
||||||
code{font-size:.86em;color:var(--bone)}
|
code{font-size:.86em;color:var(--bone)}
|
||||||
footer{margin-top:5rem;padding-top:1.5rem;border-top:1px solid var(--rule);color:var(--dim);font-size:.75rem}
|
footer{margin-top:4rem;padding:1.25rem 0 2rem;border-top:1px dashed var(--rule);color:var(--dim);font-size:.78rem}
|
||||||
|
footer a{color:var(--dim);border-bottom:1px solid var(--rule)}
|
||||||
|
footer a:hover{color:var(--amber);border-color:var(--amber)}
|
||||||
|
.frow{display:flex;justify-content:space-between;gap:2rem;flex-wrap:wrap;margin-bottom:.6rem}
|
||||||
|
.frow>div{flex:1 1 22rem;min-width:16rem}
|
||||||
|
.fmeta{font-size:.72rem;letter-spacing:.02em}
|
||||||
</style></head>
|
</style></head>
|
||||||
<body><div class="wrap"><nav>
|
<body><div class="wrap"><nav>
|
||||||
<a href="/">The list</a>
|
<a href="/">The list</a>
|
||||||
|
|
@ -154,6 +159,27 @@ anyone selling you one is selling you nothing.</p>
|
||||||
<p class="note">brainix will be scored by this instrument before it is advertised by it. "Zero telemetry"
|
<p class="note">brainix will be scored by this instrument before it is advertised by it. "Zero telemetry"
|
||||||
will mean a captured packet log with nothing in it, published, dated, and re-runnable, or we do not get
|
will mean a captured packet log with nothing in it, published, dated, and re-runnable, or we do not get
|
||||||
to say it.</p>
|
to say it.</p>
|
||||||
<footer>Generated from <code>bigtech.db</code> on 2026-10-29.
|
<footer>
|
||||||
Method btr-0.1. Every number recomputes from its evidence or the build fails.</footer>
|
<div class="frow">
|
||||||
|
<div>
|
||||||
|
Built in the open at the
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse">Binary Ranch Bunkhouse</a>.
|
||||||
|
Every repository there is one you can read, clone, and leave with.
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
Generated from <code>bigtech.db</code> on 2026-10-30.
|
||||||
|
Method btr-0.1. Every number recomputes from its evidence or the build fails.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="frow">
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/bigtech-sucks">Source for this site</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/vitals">vitals</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/otter-dark-mode">otter-dark-mode</a>
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://binaryranch.com">Binary Ranch</a> · Venice, Florida
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div></body></html>
|
</div></body></html>
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"digest": "c71ec40b3fcf45f2ab25bea80b0f2d21745463f86ed5ca15d6347cfb1a5f1fcc",
|
"digest": "e557e117f60a43f5023ebb2ebe51978c9a20aa1bcffca920623f79c92f0343d3",
|
||||||
"algorithm": "sha256",
|
"algorithm": "sha256",
|
||||||
"file": "catalog.json",
|
"file": "catalog.json",
|
||||||
"byte_length": 91034,
|
"byte_length": 92427,
|
||||||
"rebuilt_at": "2026-10-29T22:24:16.527Z",
|
"rebuilt_at": "2026-10-30T05:31:05.573Z",
|
||||||
"method_version": "btr-0.1",
|
"method_version": "btr-0.1",
|
||||||
"products": 137,
|
"products": 137,
|
||||||
"assessed": 1
|
"assessed": 1
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,12 @@ a:hover{border-bottom-color:var(--amber)}
|
||||||
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
|
||||||
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
|
||||||
code{font-size:.86em;color:var(--bone)}
|
code{font-size:.86em;color:var(--bone)}
|
||||||
footer{margin-top:5rem;padding-top:1.5rem;border-top:1px solid var(--rule);color:var(--dim);font-size:.75rem}
|
footer{margin-top:4rem;padding:1.25rem 0 2rem;border-top:1px dashed var(--rule);color:var(--dim);font-size:.78rem}
|
||||||
|
footer a{color:var(--dim);border-bottom:1px solid var(--rule)}
|
||||||
|
footer a:hover{color:var(--amber);border-color:var(--amber)}
|
||||||
|
.frow{display:flex;justify-content:space-between;gap:2rem;flex-wrap:wrap;margin-bottom:.6rem}
|
||||||
|
.frow>div{flex:1 1 22rem;min-width:16rem}
|
||||||
|
.fmeta{font-size:.72rem;letter-spacing:.02em}
|
||||||
</style></head>
|
</style></head>
|
||||||
<body><div class="wrap"><nav>
|
<body><div class="wrap"><nav>
|
||||||
<a href="/">The list</a>
|
<a href="/">The list</a>
|
||||||
|
|
@ -120,6 +125,10 @@ high average with one bad rung is an average that hides the thing that will hurt
|
||||||
<td><span class="sev medium">medium</span></td>
|
<td><span class="sev medium">medium</span></td>
|
||||||
<td>Local database key is held in the OS keyring</td>
|
<td>Local database key is held in the OS keyring</td>
|
||||||
<td class="tier">accepted</td>
|
<td class="tier">accepted</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><span class="sev medium">medium</span></td>
|
||||||
|
<td>Purging the package leaves the database behind, and the next install then fails to start</td>
|
||||||
|
<td class="tier">open</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><span class="sev low">low</span></td>
|
<td><span class="sev low">low</span></td>
|
||||||
<td>Registration requires a phone number</td>
|
<td>Registration requires a phone number</td>
|
||||||
|
|
@ -189,6 +198,27 @@ The database that holds this score is public. The build refuses to pass if the t
|
||||||
recompute from these weights and these scores.</p>
|
recompute from these weights and these scores.</p>
|
||||||
<pre>git clone ssh://git@forge.binaryranch.com:2222/bunkhouse/bigtech-sucks.git
|
<pre>git clone ssh://git@forge.binaryranch.com:2222/bunkhouse/bigtech-sucks.git
|
||||||
cd bigtech-sucks && npm run db:build</pre>
|
cd bigtech-sucks && npm run db:build</pre>
|
||||||
<footer>Generated from <code>bigtech.db</code> on 2026-10-29.
|
<footer>
|
||||||
Method btr-0.1. Every number recomputes from its evidence or the build fails.</footer>
|
<div class="frow">
|
||||||
|
<div>
|
||||||
|
Built in the open at the
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse">Binary Ranch Bunkhouse</a>.
|
||||||
|
Every repository there is one you can read, clone, and leave with.
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
Generated from <code>bigtech.db</code> on 2026-10-30.
|
||||||
|
Method btr-0.1. Every number recomputes from its evidence or the build fails.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="frow">
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/bigtech-sucks">Source for this site</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/vitals">vitals</a> ·
|
||||||
|
<a href="https://forge.binaryranch.com/bunkhouse/otter-dark-mode">otter-dark-mode</a>
|
||||||
|
</div>
|
||||||
|
<div class="fmeta">
|
||||||
|
<a href="https://binaryranch.com">Binary Ranch</a> · Venice, Florida
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div></body></html>
|
</div></body></html>
|
||||||
Loading…
Reference in a new issue