# Switzerland Has No Doorbell

> Nine in ten Swiss websites publish no security.txt, so a researcher has no way to report a vulnerability. We checked every .ch domain in two public lists. Here is the data, and the ten-minute fix.

Published: 2026-06-03

Canonical article: https://0.security/blog/swiss-securitytxt-survey/

You find a serious bug on a Swiss company's website. You try to warn them. There's no door to knock on.

The fix is one file, `security.txt` <a href="#src-1">[1]</a>, that says *report security issues here*. Ten minutes. Free.

We checked every `.ch` site in two independent public lists. **Nine in ten don't have one.**

<figure style="border:1px solid var(--border);border-radius:.75rem;background:var(--secondary);padding:1.5rem;margin:2rem 0">
<svg viewBox="0 0 600 104" width="100%" style="color:var(--foreground)" role="img" aria-label="9.4 percent of Swiss .ch sites publish a security.txt; 90.6 percent do not.">
  <text x="0" y="20" font-family="var(--font-sans)" font-size="12" letter-spacing="0.12em" fill="currentColor" fill-opacity="0.55">SWISS .CH SITES · CAN A RESEARCHER REPORT A BUG?</text>
  <rect x="0" y="38" width="600" height="40" rx="6" fill="currentColor" fill-opacity="0.10"/>
  <rect x="0" y="38" width="56.4" height="40" rx="6" fill="#ff2030"/>
  <text x="600" y="64" text-anchor="end" font-family="var(--font-sans)" font-size="15" font-weight="700" fill="currentColor">90.6%: no way to report</text>
  <text x="0" y="98" font-family="var(--font-sans)" font-size="12.5" font-weight="600" fill="#ff2030">9.4% reachable</text>
</svg>
<figcaption style="font-size:.8rem;color:var(--muted-foreground);margin-top:.5rem">Two lists, built differently, same answer: Majestic Million (full <code>.ch</code>, n=4,188) <a href="#src-3">[3]</a> → 9.4%; Tranco (top 3,000) <a href="#src-4">[4]</a> → 10.7%. One public file fetched per domain, nothing else.</figcaption>
</figure>

## Worst where it should be best

The biggest banks, hospitals and cantonal governments are about half-covered. Everyone else falls off a cliff. The smaller you are, the longer a flaw sits unreported before anyone can tell you.

<figure style="border:1px solid var(--border);border-radius:.75rem;background:var(--secondary);padding:1.5rem 1.5rem 1rem;margin:2rem 0">
<svg viewBox="0 0 600 300" width="100%" style="color:var(--foreground)" role="img" aria-label="security.txt adoption by Swiss site rank: top 100 is 42 percent, 101 to 500 is 19 percent, 501 to 1000 is 8 percent, 1001 to 2000 is 9 percent, 2001 plus is 7 percent.">
  <text x="0" y="16" font-family="var(--font-sans)" font-size="12" letter-spacing="0.12em" fill="currentColor" fill-opacity="0.55">SECURITY.TXT ADOPTION BY SITE RANK (.CH)</text>
  <line x1="365" y1="36" x2="365" y2="266" stroke="currentColor" stroke-opacity="0.15" stroke-dasharray="3 4"/>
  <text x="365" y="286" text-anchor="middle" font-family="var(--font-sans)" font-size="10" fill="currentColor" fill-opacity="0.5">50%</text>
  <g font-family="var(--font-sans)" font-size="13">
    <text x="135" y="58" text-anchor="end" fill="currentColor" fill-opacity="0.8">Top 100</text>
    <rect x="150" y="44" width="430" height="22" rx="4" fill="currentColor" fill-opacity="0.08"/>
    <rect x="150" y="44" width="180.6" height="22" rx="4" fill="#ff2030"/>
    <text x="338" y="60" font-size="12.5" font-weight="700" fill="currentColor">42%</text>
    <text x="135" y="106" text-anchor="end" fill="currentColor" fill-opacity="0.8">Rank 101–500</text>
    <rect x="150" y="92" width="430" height="22" rx="4" fill="currentColor" fill-opacity="0.08"/>
    <rect x="150" y="92" width="81.7" height="22" rx="4" fill="#ff2030"/>
    <text x="239" y="108" font-size="12.5" font-weight="700" fill="currentColor">19%</text>
    <text x="135" y="154" text-anchor="end" fill="currentColor" fill-opacity="0.8">501–1,000</text>
    <rect x="150" y="140" width="430" height="22" rx="4" fill="currentColor" fill-opacity="0.08"/>
    <rect x="150" y="140" width="34.4" height="22" rx="4" fill="#ff2030"/>
    <text x="192" y="156" font-size="12.5" font-weight="700" fill="currentColor">8%</text>
    <text x="135" y="202" text-anchor="end" fill="currentColor" fill-opacity="0.8">1,001–2,000</text>
    <rect x="150" y="188" width="430" height="22" rx="4" fill="currentColor" fill-opacity="0.08"/>
    <rect x="150" y="188" width="38.7" height="22" rx="4" fill="#ff2030"/>
    <text x="196" y="204" font-size="12.5" font-weight="700" fill="currentColor">9%</text>
    <text x="135" y="250" text-anchor="end" fill="currentColor" fill-opacity="0.8">2,001+ (tail)</text>
    <rect x="150" y="236" width="430" height="22" rx="4" fill="currentColor" fill-opacity="0.08"/>
    <rect x="150" y="236" width="30.1" height="22" rx="4" fill="#ff2030"/>
    <text x="188" y="252" font-size="12.5" font-weight="700" fill="currentColor">7%</text>
  </g>
</svg>
<figcaption style="font-size:.8rem;color:var(--muted-foreground);margin-top:.25rem">Bars scaled to 100%. Even the best tier is below half. Majestic Million <code>.ch</code>, n=4,188. US federal agencies have been required to publish one since 2020 <a href="#src-5">[5]</a>.</figcaption>
</figure>

## We almost got it wrong

Our first number was 8%. Wrong. We'd forgotten to follow redirects, undercounting six-fold. We caught it and fixed it. A hygiene statistic produced sloppily belongs in the bin.

<figure style="border:1px solid var(--border);border-radius:.75rem;background:var(--secondary);padding:1.5rem;margin:2rem 0">
<svg viewBox="0 0 600 90" width="100%" style="color:var(--foreground)" role="img" aria-label="Naive fetch reported 8 percent; following redirects reported 48 percent on the same set, a six-fold error.">
  <text x="0" y="18" font-family="var(--font-sans)" font-size="12" letter-spacing="0.12em" fill="currentColor" fill-opacity="0.55">SAME DATA, TWO METHODS (large-company set)</text>
  <g font-family="var(--font-sans)" font-size="13">
    <text x="135" y="46" text-anchor="end" fill="currentColor" fill-opacity="0.8">No redirects</text>
    <rect x="150" y="34" width="430" height="16" rx="4" fill="currentColor" fill-opacity="0.08"/>
    <rect x="150" y="34" width="34.4" height="16" rx="4" fill="currentColor" fill-opacity="0.4"/>
    <text x="192" y="47" font-size="12" font-weight="700" fill="currentColor" fill-opacity="0.6">8% (wrong)</text>
    <text x="135" y="78" text-anchor="end" fill="currentColor" fill-opacity="0.8">Follow redirects</text>
    <rect x="150" y="66" width="430" height="16" rx="4" fill="currentColor" fill-opacity="0.08"/>
    <rect x="150" y="66" width="206.4" height="16" rx="4" fill="#ff2030"/>
    <text x="364" y="79" font-size="12" font-weight="700" fill="currentColor">48% (correct)</text>
  </g>
</svg>
<figcaption style="font-size:.8rem;color:var(--muted-foreground);margin-top:.5rem">Reproduce it in an afternoon: take a list, fetch one file per domain, follow redirects, check for <code>Contact:</code>.</figcaption>
</figure>

## Ten minutes

A `security.txt` patches nothing. It just gives a willing stranger somewhere to send the warning:

1. Create `https://yourdomain/.well-known/security.txt`
2. Add a `Contact:` line and an `Expires:` date
3. Done. [securitytxt.org](https://securitytxt.org/) <a href="#src-2">[2]</a> writes it for you

We find problems, report them, and ask for nothing back. This is the first in a series on the Swiss web: aggregate, reproducible, free. We hold ourselves to the same bar.

## Sources

<ol>
<li id="src-1">RFC 9116: <em>A File Format to Aid in the Coordinated Disclosure of Security Vulnerabilities</em>. IETF. <a href="https://www.rfc-editor.org/rfc/rfc9116" target="_blank" rel="noopener">rfc-editor.org/rfc/rfc9116</a></li>
<li id="src-2">securitytxt.org: standard overview and file generator. <a href="https://securitytxt.org/" target="_blank" rel="noopener">securitytxt.org</a></li>
<li id="src-3">Majestic Million: public top-million domains list; the <code>.ch</code> subset used in full (n=4,188). <a href="https://majestic.com/reports/majestic-million" target="_blank" rel="noopener">majestic.com/reports/majestic-million</a></li>
<li id="src-4">Tranco: <em>A Research-Oriented Top Sites Ranking Hardened Against Manipulation</em> (NDSS 2019); top 3,000 <code>.ch</code> as a cross-check. <a href="https://tranco-list.eu/" target="_blank" rel="noopener">tranco-list.eu</a></li>
<li id="src-5">CISA Binding Operational Directive 20-01: US federal agencies must publish a Vulnerability Disclosure Policy. <a href="https://www.cisa.gov/news-events/directives/bod-20-01-develop-and-publish-vulnerability-disclosure-policy" target="_blank" rel="noopener">cisa.gov</a></li>
<li id="src-6">ENISA: Coordinated Vulnerability Disclosure. <a href="https://www.enisa.europa.eu/topics/vulnerability-disclosure" target="_blank" rel="noopener">enisa.europa.eu</a></li>
<li id="src-7">NCSC Switzerland: Coordinated Vulnerability Disclosure. <a href="https://www.ncsc.admin.ch/ncsc/en/home/infos-fuer/infos-it-spezialisten/themen/schwachstelle-melden.html" target="_blank" rel="noopener">ncsc.admin.ch</a></li>
<li id="src-8">disclose.io: open-source safe-harbor framework for coordinated disclosure. <a href="https://disclose.io/" target="_blank" rel="noopener">disclose.io</a></li>
</ol>

---

*Method: aggregate survey of `.ch` domains from the Majestic Million and Tranco public ranking lists on 2026-06-03; one passive request per domain to `/.well-known/security.txt`, following redirects and validating a `Contact:` field. A published file isn't proof of a working programme, and a single snapshot can miss slow hosts. No company is named for the absence of a file. Research post, not legal advice.*
