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.
185 lines
No EOL
10 KiB
HTML
185 lines
No EOL
10 KiB
HTML
<!doctype html>
|
|
<html lang="en"><head><meta charset="utf-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>The method — 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: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>
|
|
<body><div class="wrap"><nav>
|
|
<a href="/">The list</a>
|
|
<a href="/method.html">Method</a>
|
|
<a href="/badges.html">Badge</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>The method</h1>
|
|
<p class="sub">How every score on this site is produced, and what we refuse to do to get one.</p>
|
|
|
|
<p class="lede">A privacy claim that cannot be checked is a slogan. We publish the method so a
|
|
stranger can catch us lying.</p>
|
|
|
|
<h2>Eight dimensions, weighted to 100</h2>
|
|
<table>
|
|
<tr><th>Dimension</th><th class="num" style="text-align:right">Weight</th><th>What a 10 requires</th></tr>
|
|
<tr>
|
|
<td>Telemetry and egress</td>
|
|
<td class="num">25</td>
|
|
<td class="tier">Published destination allowlist; cold idle produces zero unlisted packets, independently confirmed.</td>
|
|
</tr><tr>
|
|
<td>Verifiability</td>
|
|
<td class="num">20</td>
|
|
<td class="tier">Reproducible build verified on the scored platform.</td>
|
|
</tr><tr>
|
|
<td>Server-side retention</td>
|
|
<td class="num">15</td>
|
|
<td class="tier">Subpoena answer is two timestamps or an empty set.</td>
|
|
</tr><tr>
|
|
<td>Ownership, jurisdiction, business model</td>
|
|
<td class="num">12</td>
|
|
<td class="tier">Nonprofit or cooperative, no ad model, strong process protections.</td>
|
|
</tr><tr>
|
|
<td>Local data exposure</td>
|
|
<td class="num">10</td>
|
|
<td class="tier">All artifacts encrypted at rest under a user-presence key.</td>
|
|
</tr><tr>
|
|
<td>Dependency surface</td>
|
|
<td class="num">8</td>
|
|
<td class="tier">Small audited dependency tree, signed and pinned update channel.</td>
|
|
</tr><tr>
|
|
<td>User control and exit</td>
|
|
<td class="num">5</td>
|
|
<td class="tier">Usable export, real deletion, no identity hostage-taking.</td>
|
|
</tr><tr>
|
|
<td>Incident record</td>
|
|
<td class="num">5</td>
|
|
<td class="tier">Flaws found, disclosed honestly, fixed fast.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h2>Evidence tiers</h2>
|
|
<table>
|
|
<tr><th>Tier</th><th>Meaning</th></tr>
|
|
<tr><td>T1</td><td>We observed it, saved the artifact, and the procedure is re-runnable.</td></tr>
|
|
<tr><td>T2</td><td>A primary source anyone can open: a vendor repository, a court filing, a regulator advisory.</td></tr>
|
|
<tr><td>T3</td><td>Credible second-hand: reporting, an academic paper, an independent audit summary.</td></tr>
|
|
<tr><td>T4</td><td>A claim with no artifact. <strong>Never allowed to move a score.</strong> It appears in an appendix, labelled, and that is all.</td></tr>
|
|
</table>
|
|
|
|
<h2>The caps</h2>
|
|
<p class="note">These are the only two places where a score is limited by something other than evidence.
|
|
Both exist because the alternative is pretending to know something we cannot.</p>
|
|
|
|
<h3 style="font-size:.9rem;margin:1.8rem 0 .4rem">Reproducible builds</h3>
|
|
<pre>no reproducible build verifiability <= 3
|
|
experimental, unverified verifiability <= 6
|
|
verified, bit-identical verifiability <= 10</pre>
|
|
<p class="note">Reading the source proves what the code does. It does not prove the binary running on
|
|
your machine is that code. Reproducible builds are the only bridge, and nothing else is.</p>
|
|
|
|
<h3 style="font-size:.9rem;margin:1.8rem 0 .4rem">Closed source</h3>
|
|
<p class="note">Closed source is not penalised. It starts lower and climbs a public ladder. The ceiling
|
|
is the rung you are standing on.</p>
|
|
<pre>L0 unattested -> 3 nothing but your word
|
|
L1 declared -> 5 SBOM + signed hash + published destination allowlist
|
|
L2 observed -> 7 someone other than you watched this exact binary
|
|
L3 reproducible -> 9 anyone can rebuild it and get the same bytes
|
|
L4 contested -> 10 someone tried to break it and published the attempt</pre>
|
|
<p class="note">A court filing lifts the ceiling entirely, because it needs no vendor cooperation.</p>
|
|
|
|
<h3 style="font-size:.9rem;margin:1.8rem 0 .4rem">And the rule that makes it honest</h3>
|
|
<pre>a vendor running our harness produces a DECLARATION, not an OBSERVATION.</pre>
|
|
<p class="note">A self-run test is a claim about oneself, so it caps at L1. But L3 and L4 survive a
|
|
self-run, because a public rebuild recipe and a published adversarial review can be re-executed by
|
|
anyone. That is the whole escape hatch: reproducibility converts a claim into a check.</p>
|
|
|
|
<h2>The dynamic test</h2>
|
|
<table>
|
|
<tr><th>Run</th><th>What it does</th></tr>
|
|
<tr><td>D1</td><td>Cold idle. Fresh install, no account, one hour. Capture every packet.</td></tr>
|
|
<tr><td>D2</td><td>Normal use, 24 hours. Capture all egress.</td></tr>
|
|
<tr><td>D3</td><td>Device access trace: audio, camera, location, clipboard, contacts, screen.</td></tr>
|
|
<tr><td>D4</td><td>Update cycle. Capture the channel, verify the signature, check the pinning.</td></tr>
|
|
</table>
|
|
<p class="note">The vendor publishes a destination allowlist. Every destination observed in D1 and D2
|
|
must appear on it. <strong>Anything unlisted is a defect, regardless of what it turns out to be.</strong></p>
|
|
|
|
<h2>What this method cannot do</h2>
|
|
<p class="note">It cannot prove the absence of a backdoor. Rice's theorem makes non-trivial behavioural
|
|
properties of arbitrary programs undecidable, and a backdoor triggered by remote configuration or by
|
|
message content is invisible to static inspection.</p>
|
|
<p class="note">So the honest claim is not purity. It is this: <strong>we can prove what a specific
|
|
build did while we watched, and we can make a false statement expensive to sign.</strong> An attestation
|
|
raises the cost of a backdoor and shortens its shelf life. It is not a certificate of innocence, and
|
|
anyone selling you one is selling you nothing.</p>
|
|
|
|
<h2>Our own stack goes first</h2>
|
|
<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
|
|
to say it.</p>
|
|
<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> |