Skip to content

feat(security): serve /.well-known/security.txt (RFC 9116) - #129

Merged
bryanfawcett merged 1 commit into
mainfrom
claude/cross-repo-event-creation-o2vb7j
Aug 12, 2026
Merged

feat(security): serve /.well-known/security.txt (RFC 9116)#129
bryanfawcett merged 1 commit into
mainfrom
claude/cross-repo-event-creation-o2vb7j

Conversation

@bryanfawcett

Copy link
Copy Markdown
Contributor

Summary

Cloudflare's security-insights scan flags nhimbe.com under "Security.txt not configured" — there was no vulnerability-disclosure contact at a machine-discoverable location, so a researcher's only route was guessing an address.

Served as a route handler, not a static file in public/, for a specific reason: RFC 9116 makes Expires mandatory and caps it at a year out, so a checked-in file becomes non-compliant purely by ageing. Deriving it per request (180 days ahead) means it can't expire.

Both production origins are listed under Canonical, since either host serves this app and RFC 9116 §2.5.5 wants every URI the file is reachable at — a mismatch is grounds for a scanner to distrust it. Contact and Policy match what SECURITY.md already tells reporters.

Test plan

  • npm run test:run891 passed (4 new)
  • npm run lint — 0 errors (23 pre-existing warnings, none new)
  • Tests assert: required RFC 9116 fields; both canonicals; Expires is in the future and inside the one-year maximum; exactly one Expires line

Context

Part of working through a Cloudflare Security Insights export (318 active findings). Of the 43 security.txt findings, three are on domains served by repos I have access to — nhimbe.com (this one), barstool.co.zw (kweli), and mukoko.com (the marketing repo, which I don't have access to).

Worth recording what the same export says about the 8 Critical "Exposed RDP Servers" findings, since that's what prompted this sweep: they name api.nyuchi.com, auth.nyuchi.com, fundi.nyuchi.com and couch.mukoko.com, with detection "TCP connections on port 3389 for this host succeed." I could not reproduce that. A raw socket connect to :3389 on all four times out, while :443 connects instantly through the same code path — and three of the four sit on Fly shared IPv4s, where only 80/443 are routable by construction. The fourth (fundi) has a dedicated IPv4 whose app config defines only 80/443. Three independent lines point to a false positive. The one caveat I can't rule out from this sandbox is filtered outbound 3389 and no IPv6 egress.


🤖 Generated with Claude Code

https://claude.ai/code/session_01HFaeL83iEL5gqQXhHweH6u


Generated by Claude Code

Cloudflare's security-insights scan flags nhimbe.com under "Security.txt
not configured" — there was no vulnerability-disclosure contact at a
machine-discoverable location, so a researcher's only route was guessing
an address.

Served as a route handler rather than a static file in public/ because
RFC 9116 makes Expires mandatory and caps it at a year ahead: a
checked-in file becomes non-compliant purely by ageing. Deriving it per
request (180 days out) means it cannot expire.

Lists both production origins under Canonical, since either host serves
this app and a mismatch is grounds for a scanner to distrust the file.
Points at the existing SECURITY.md for policy and at security@nyuchi.com,
matching what SECURITY.md already tells reporters.

Tests assert the required fields, both canonicals, that Expires is in the
future and inside the one-year maximum, and that there is exactly one
Expires line.
@vercel

vercel Bot commented Aug 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
nhimbe Ready Ready Preview Aug 12, 2026 6:54am

Request Review

@claude

claude Bot commented Aug 12, 2026

Copy link
Copy Markdown

Claude encountered an error —— View job


I'll analyze this and get back to you.

@bryanfawcett
bryanfawcett marked this pull request as ready for review August 12, 2026 06:57

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review for a one-time review, or @claude review always to subscribe this PR to a review on every future push.

Tip: disable this comment in your organization's Code Review settings.

@bryanfawcett
bryanfawcett merged commit ccc8a1d into main Aug 12, 2026
19 checks passed
@bryanfawcett
bryanfawcett deleted the claude/cross-repo-event-creation-o2vb7j branch August 12, 2026 06:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants