bigtech-sucks/packages/web/public/report/signal-desktop.html

193 lines
11 KiB
HTML
Raw Normal View History

<!doctype html>
<html lang="en"><head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Signal Desktop scored 76.4 — BigTech.sucks</title>
<style>
:root{--ink:#0d0f0e;--bone:#e8e2d4;--dim:#8a8272;--amber:#d9a441;--good:#7fae7a;--bad:#c9563f;--rule:#2a2d2a}
*{box-sizing:border-box}
body{margin:0;padding:3rem 1.25rem 7rem;background:var(--ink);color:var(--bone);
font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;font-size:15px;line-height:1.7;
-webkit-font-smoothing:antialiased}
.wrap{max-width:58rem;margin:0 auto}
nav{font-size:.72rem;letter-spacing:.18em;text-transform:uppercase;color:var(--dim);margin-bottom:3rem;display:flex;gap:1.5rem;flex-wrap:wrap}
nav a{color:var(--dim);text-decoration:none;border-bottom:1px solid transparent}
nav a:hover{color:var(--amber);border-bottom-color:var(--amber)}
h1{font-size:clamp(1.3rem,3.6vw,2.1rem);font-weight:400;line-height:1.2;margin:0 0 .6rem;letter-spacing:-.01em}
h2{font-size:.78rem;letter-spacing:.22em;text-transform:uppercase;color:var(--dim);font-weight:400;
margin:3.5rem 0 1rem;padding-bottom:.5rem;border-bottom:1px solid var(--rule)}
.sub{color:var(--dim);font-size:.85rem;margin:0 0 2.5rem}
.score{display:flex;align-items:baseline;gap:1rem;flex-wrap:wrap;margin:0 0 .5rem}
.score .n{font-size:clamp(2.6rem,9vw,4.4rem);line-height:1;color:var(--amber);letter-spacing:-.03em}
.score .g{font-size:1rem;color:var(--dim);letter-spacing:.2em}
.lede{font-size:1.02rem;margin:1.5rem 0 0;padding-left:1rem;border-left:2px solid var(--amber);color:var(--bone)}
table{width:100%;border-collapse:collapse;font-size:.84rem;margin:0}
th{text-align:left;color:var(--dim);font-weight:400;font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;
padding:.5rem .6rem;border-bottom:1px solid var(--rule)}
td{padding:.55rem .6rem;border-bottom:1px solid #1b1e1b;vertical-align:top}
td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.bar{display:inline-block;height:7px;background:var(--amber);vertical-align:middle;border-radius:1px}
.bar.low{background:var(--bad)}
.weak td{background:rgba(201,86,63,.07)}
tr.cathead td{background:#151815;color:var(--dim);font-size:.7rem;letter-spacing:.18em;
text-transform:uppercase;padding:.9rem .6rem .45rem;border-bottom:1px solid var(--rule)}
.sev{font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;padding:.1rem .4rem;border:1px solid var(--rule)}
.sev.high{border-color:var(--bad);color:var(--bad)}
.sev.medium{border-color:var(--amber);color:var(--amber)}
.sev.low,.sev.info{color:var(--dim)}
.tier{color:var(--dim);font-size:.72rem}
a{color:var(--amber);text-decoration:none;border-bottom:1px solid rgba(217,164,65,.35)}
a:hover{border-bottom-color:var(--amber)}
.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)}
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}
</style></head>
<body><div class="wrap"><nav>
<a href="/">The list</a>
<a href="/method.html">Method</a>
<a href="/oath.html">The Oath</a>
<a href="/game.html">Game</a>
<a href="https://forge.binaryranch.com/bunkhouse/bigtech-sucks">Source</a>
</nav>
<h1>Signal Desktop <span style="color:var(--dim);font-size:.55em">8.36.0-alpha.1 on </span></h1>
<p class="sub">Assessed 2026-10-29 by CLU, Binary Ranch. Source commit
<code>5dad34ad5ea1</code>. Method btr-0.1.</p>
<div class="score"><span class="n">76.4</span><span class="g">/ 100 &nbsp; GRADE B</span></div>
<p class="lede">The strongest transport on the internet, sitting behind the weakest desktop client we have scored.</p>
<h2>The score</h2>
<table>
<tr><th>Dimension</th><th class="num" style="text-align:right">Weight</th><th class="num" style="text-align:right">Score</th><th></th></tr>
<tr class="">
<td>Telemetry and egress</td>
<td class="num">25</td>
<td class="num">9</td>
<td style="width:150px"><span class="bar" style="width:126px"></span></td>
</tr><tr class="">
<td>Verifiability</td>
<td class="num">20</td>
<td class="num">6</td>
<td style="width:150px"><span class="bar" style="width:84px"></span></td>
</tr><tr class="">
<td>Server-side retention</td>
<td class="num">15</td>
<td class="num">10</td>
<td style="width:150px"><span class="bar" style="width:140px"></span></td>
</tr><tr class="">
<td>Ownership, jurisdiction, business model</td>
<td class="num">12</td>
<td class="num">8</td>
<td style="width:150px"><span class="bar" style="width:112px"></span></td>
</tr><tr class="weak">
<td>Local data exposure</td>
<td class="num">10</td>
<td class="num">5</td>
<td style="width:150px"><span class="bar low" style="width:70px"></span></td>
</tr><tr class="">
<td>Dependency surface</td>
<td class="num">8</td>
<td class="num">6</td>
<td style="width:150px"><span class="bar" style="width:84px"></span></td>
</tr><tr class="">
<td>User control and exit</td>
<td class="num">5</td>
<td class="num">7</td>
<td style="width:150px"><span class="bar" style="width:98px"></span></td>
</tr><tr class="">
<td>Incident record</td>
<td class="num">5</td>
<td class="num">8</td>
<td style="width:150px"><span class="bar" style="width:112px"></span></td>
</tr>
</table>
<p class="note">The weighted average is not the headline. <strong>The weakest dimension is</strong>, because a
high average with one bad rung is an average that hides the thing that will hurt you.</p>
<h2>Findings</h2>
<table>
<tr><th>Severity</th><th>Finding</th><th>Status</th></tr>
<tr>
<td><span class="sev high">high</span></td>
<td>Received attachments are stored unencrypted on disk <span class="tier">CVE-2023-24069</span></td>
<td class="tier">by_design</td>
</tr><tr>
<td><span class="sev medium">medium</span></td>
<td>No verified reproducible build for the Linux package</td>
<td class="tier">open</td>
</tr><tr>
<td><span class="sev medium">medium</span></td>
<td>Local database key is held in the OS keyring</td>
<td class="tier">accepted</td>
</tr><tr>
<td><span class="sev low">low</span></td>
<td>Registration requires a phone number</td>
<td class="tier">accepted</td>
</tr>
</table>
<h2>Evidence</h2>
<table>
<tr><th>Claim</th><th>Tier</th><th>Artifact</th></tr>
<tr>
<td>Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.</td>
<td class="tier">T1</td>
<td><code>01-capture-sites.txt</code></td>
</tr><tr>
<td>Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.</td>
<td class="tier">T1</td>
<td><code>02-permissions.txt</code></td>
</tr><tr>
<td>Zero analytics, tracker or crash-upload dependencies across 224 packages.</td>
<td class="tier">T1</td>
<td><code>05-dependencies.txt</code></td>
</tr><tr>
<td>Only two audio capture call sites exist and both are reachable only from an explicit UI action.</td>
<td class="tier">T1</td>
<td><code>03-call-path.txt</code></td>
</tr><tr>
<td>Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.</td>
<td class="tier">T2</td>
<td><a href="https://github.com/signalapp/Signal-Desktop/blob/main/reproducible-builds/README.md">source</a></td>
</tr><tr>
<td>Grand jury subpoena response returned two timestamps and nothing else.</td>
<td class="tier">T2</td>
<td><a href="https://signal.org/bigbrother/cd-california-grand-jury/">source</a></td>
</tr><tr>
<td>Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.</td>
<td class="tier">T2</td>
<td><a href="https://projects.propublica.org/nonprofits/organizations/824506840">source</a></td>
</tr><tr>
<td>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.</td>
<td class="tier">T2</td>
<td><a href="https://www.ic3.gov/PSA/2026/PSA260626">source</a></td>
</tr><tr>
<td>Signal statement, 28 April 2026: &quot;Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised.&quot; Additional linkage confirmations shipped 13 May 2026.</td>
<td class="tier">T2</td>
<td><a href="https://x.com/signalapp/status/2048866663580246302">source</a></td>
</tr><tr>
<td>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 &quot;US government funded Signal&quot; claim, and it is already reflected in the two points docked on this dimension.</td>
<td class="tier">T2</td>
<td><a href="https://www.opentech.fund/projects-we-support/supported-projects/signal-open-whisper-systems">source</a></td>
</tr><tr>
<td>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.</td>
<td class="tier">T2</td>
<td><a href="https://www.infosecurity-magazine.com/news/signal-exit-sweden-government/">source</a></td>
</tr>
</table>
<p class="note">Tier 1 is something we observed and saved. Tier 2 is a primary source anyone can open.
Tier 3 is credible second-hand. Tier 4 is a claim with no artifact, and <strong>no tier 4 claim is
allowed to move a score</strong>.</p>
<h2>What was not tested</h2>
<p class="note">No live account was used. No packet capture was run (D1 to D4 not executed, this is a source audit only). Android and iOS clients not assessed. No attempt to verify the shipped .deb against a local rebuild.</p>
<h2>Check it yourself</h2>
<p class="note">The audit script that produced the tier 1 rows is public and re-runnable.
The database that holds this score is public. The build refuses to pass if the total does not
recompute from these weights and these scores.</p>
<pre>git clone ssh://git@forge.binaryranch.com:2222/bunkhouse/bigtech-sucks.git
cd bigtech-sucks &amp;&amp; npm run db:build</pre>
<footer>Generated from <code>bigtech.db</code> on 2026-10-29.
Method btr-0.1. Every number recomputes from its evidence or the build fails.</footer>
</div></body></html>