Skip to content

fix(security): instance-wide budget and retention for anonymous bug-report screenshots - #708

Merged
fclairamb merged 14 commits into
mainfrom
security/scan-specs-2026-10-29
Oct 29, 2026
Merged

fclairamb merged 14 commits into
mainfrom
security/scan-specs-2026-10-29

Conversation

@fclairamb

@fclairamb fclairamb commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

Fixes the findings of the daily security scans. Each spec is the tracker for its finding.

Fixed by this PR

  • Y1 (low): specs/done/2026/10/2026-10-29-01-bug-report-upload-instance-budget.md. Anonymous bug-report screenshots are capped at 100 MB per org, but the caller picks the org, so the instance-wide total is 100 MB times the number of orgs. Screenshots are also stored past the issue-dispatch cap and never deleted. The fix adds an instance-wide budget for anonymous screenshots, reserves the dispatch slot before storing, makes the quota atomic and adds a retention.

Earlier scan specs (implemented, in specs/done/2026/10/)

  • X1 (high): 2026-10-28-01-pat-cannot-mint-sessions-or-sign-in-factors.md. A PAT could open sessions in its owner's other orgs and add sign-in factors. Fixed in fix(security): PAT org binding, subscribe throttle, invite lookup, SNMP secret #699.
  • X2 (medium): 2026-10-28-02-status-subscribe-throttle-and-keep-confirmed.md. Unthrottled subscribe confirm emails, and re-subscribing un-confirmed a subscriber. Fixed in fix(security): PAT org binding, subscribe throttle, invite lookup, SNMP secret #699.
  • X3 (medium on SaaS): 2026-10-28-03-invite-lookup-without-org-scan.md. Invite lookup scanned every org. Fixed in fix(security): PAT org binding, subscribe throttle, invite lookup, SNMP secret #699.
  • X4 (low): 2026-10-28-04-snmp-community-secret-field.md. The SNMP community was not a secret field. Fixed in fix(security): PAT org binding, subscribe throttle, invite lookup, SNMP secret #699.
  • V1 (medium): 2026-10-27-01-device-consent-phishing-guard.md. Device-flow consent phishing. Fixed in fix(security): device consent phishing guard and 2FA disable throttle #693.
  • W1 (low): 2026-10-27-02-disable-2fa-attempt-throttle.md. DELETE /auth/2fa had no attempt budget. Fixed in fix(security): device consent phishing guard and 2FA disable throttle #693.
  • U1 (low): 2026-10-26-02-ai-repair-hold-skips-param-only-secrets.md. The repair: auto hold applied only when the check's secrets map had a value. Fixed in fix(ai): hold every scheduled repair-auto run to its granted hosts #683.
  • S1 (medium): 2026-10-25-01-ai-repair-grant-dropped-by-reference-resolution.md. The repair grant was compared after ${…} references were resolved. Fixed in fix(ai): hold the repair: auto host grant when the script or env holds a reference #678; U1 closed the remaining gap.
  • R1 (medium): 2026-10-24-01-ai-repair-auto-apply-partial-runtime-host.md. repair: auto applied a candidate that kept a literal host and added one built at runtime. Fixed in feat(ai): hold auto-applied repairs to the previous version's hosts (+ scan specs) #663.
  • Q1 (medium): 2026-10-23-02-ai-loop-secret-relay-through-model.md. AI loops relayed an encoded secret through the model.
  • P1 (medium): 2026-10-22-01-ai-script-secret-host-guard-runtime.md. AI runs with real secrets were only host-checked by regex.
  • K1 (medium): 2026-10-20-01-sender-response-body-caps.md. Notification senders and RabbitMQ read responses uncapped.
  • J1 (medium): 2026-10-19-01-a2a-response-size-cap.md. A2A responses were read uncapped.
  • I1 (low): 2026-10-18-01-plugin-schema-file-ref.md. Plugin schema $ref could load local files.
  • G1/G2 (low): 2026-10-17-01-postgres-check-connection-config.md. Postgres conninfo escaping and fallback to the worker's PG* env.
  • F1: 2026-10-16-15-pat-cache-revocation.md. The PAT cache outlived revocation.
  • E1: 2026-10-16-14-totp-on-federated-sign-in.md. No TOTP on federated sign-in.
  • E2: 2026-10-16-13-atomic-auth-attempt-counters.md. Auth attempt counters were not atomic.
  • H3: 2026-10-16-12-mcp-tokens-rejected-on-rest.md. MCP OAuth tokens worked on REST.
  • H2: 2026-10-16-11-slack-signature-fail-closed.md. Slack signature check failed open.
  • T1 / M2 (high): 2026-10-16-10-discovery-scans-egress-guard.md. Discovery scans were outside the egress policy.
  • N4: 2026-10-16-09-js-check-nested-docker-guard.md. A JS docker sub-check bypassed the gate.
  • N3 (high): 2026-10-16-08-status-page-components-cross-org.md. Status-page components could be edited across orgs.
  • D2/D3 (high): 2026-10-16-07-guard-status-subscriber-and-publication-webhooks.md. Subscriber and publication webhooks were not guarded.
  • C3: 2026-10-16-06-accept-invite-existing-account.md. Accepting an invite logged in as an existing account.
  • C1: 2026-10-16-05-kubeconfig-exec-and-incluster.md. Kubeconfig exec and inCluster were allowed.
  • N2: 2026-10-16-04-mysql-dsn-injection.md. MySQL DSN injection.
  • N1: 2026-10-16-03-env-secret-reference-allowlist.md. No allowlist for ${env:} references.
  • C2/H1: 2026-10-16-02-token-purpose-separation.md. Purpose tokens were accepted as access tokens.
  • D1: 2026-10-16-01-microsoft-signin-unverified-email-linking.md. Microsoft nOAuth email linking.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb and others added 6 commits October 29, 2026 07:48
The state-cleanup job now purges reports files (row and blob) older than
app.feedback_retention_days (default 90, SP_APP_FEEDBACK_RETENTION_DAYS,
0 keeps them). Adds db.ListFilesByGroup and the
app.feedback_anon_screenshots_per_hour config (default 20,
SP_APP_FEEDBACK_ANON_SCREENSHOTS_PER_HOUR).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Anonymous bug reports with a screenshot now spend an instance-wide hourly
budget (db.BumpGlobalCounter, key feedback_report_anon) and need a free
GitHub issue dispatch slot, reserved before the file is written; otherwise
POST /api/mgmt/report answers 429 RATE_LIMITED and stores nothing. The
per-org quota check is serialized with the insert and re-checked after it.
Authenticated members keep the per-org quota only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pped per org, not per instance

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.25352% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.75%. Comparing base (e1a6e94) to head (7ba7c6b).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
server/internal/handlers/feedback/service.go 88.60% 9 Missing ⚠️
server/internal/jobs/jobtypes/job_state_cleanup.go 90.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #708      +/-   ##
==========================================
- Coverage   89.77%   89.75%   -0.02%     
==========================================
  Files        1296     1296              
  Lines      132089   132195     +106     
==========================================
+ Hits       118580   118650      +70     
- Misses      13500    13536      +36     
  Partials        9        9              
Files with missing lines Coverage Δ
server/internal/app/server.go 92.02% <ø> (ø)
server/internal/config/config.go 94.05% <100.00%> (+0.05%) ⬆️
server/internal/config/envvars.go 100.00% <100.00%> (ø)
server/internal/db/postgres/postgres.go 94.85% <100.00%> (-0.06%) ⬇️
server/internal/db/sqlite/sqlite.go 96.66% <100.00%> (+0.01%) ⬆️
server/internal/handlers/feedback/handler.go 81.94% <100.00%> (+0.51%) ⬆️
server/internal/jobs/jobtypes/job_state_cleanup.go 88.60% <90.00%> (+0.47%) ⬆️
server/internal/handlers/feedback/service.go 88.77% <88.60%> (+6.65%) ⬆️

... and 11 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

fclairamb and others added 2 commits October 29, 2026 08:08
… tolerates Freebox 502 (batch gate)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A redialed websocket kept its handler blocked on read, which goleak reported
after the checkworker package passed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fclairamb fclairamb changed the title chore(specs): security scan findings fix(security): instance-wide budget and retention for anonymous bug-report screenshots Oct 29, 2026
@fclairamb
fclairamb merged commit 2be7787 into main Oct 29, 2026
34 checks passed
@fclairamb
fclairamb deleted the security/scan-specs-2026-10-29 branch October 29, 2026 23:27
fclairamb added a commit that referenced this pull request Oct 30, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.42.1](v0.42.0...v0.42.1)
(2026-10-30)


### Bug Fixes

* **checkicmp:** socket-open failure is an infrastructure error
([#712](#712))
([208ff0a](208ff0a))
* **dash0:** explain chart Full range switch and status page visibility
hint ([#702](#702))
([9c6141b](9c6141b))
* **deps:** update github.com/dop251/goja digest to 5f913d1
([#697](#697))
([146cb22](146cb22))
* **deps:** update github.com/dop251/goja digest to 85be141
([#706](#706))
([c6abd8e](c6abd8e))
* **deps:** update github.com/dop251/goja digest to d535508
([#696](#696))
([7529c15](7529c15))
* **deps:** update github.com/dop251/goja digest to f818168
([#709](#709))
([7d03f42](7d03f42))
* **deps:** update go dependencies (non-major)
([#690](#690))
([6de8ac7](6de8ac7))
* **deps:** update go dependencies (non-major)
([#694](#694))
([0838916](0838916))
* **deps:** update go dependencies (non-major)
([#698](#698))
([ea540e8](ea540e8))
* **deps:** update go dependencies (non-major) to v0.37.2
([#704](#704))
([67da7f7](67da7f7))
* **deps:** update module github.com/posthog/posthog-go to v1.39.0
([#711](#711))
([b2a7f2c](b2a7f2c))
* **deps:** update module github.com/prometheus/common to v0.73.0
([#703](#703))
([1ac4dc8](1ac4dc8))
* **deps:** update module github.com/slack-go/slack to v0.32.0
([#707](#707))
([74db3d2](74db3d2))
* ICMP capability for workers, escalation targets on events, login bug
report and degraded incident fixes
([#701](#701))
([9613f98](9613f98))
* **security:** device consent phishing guard and 2FA disable throttle
([#693](#693))
([822186f](822186f))
* **security:** instance-wide budget and retention for anonymous
bug-report screenshots
([#708](#708))
([2be7787](2be7787))
* **security:** PAT org binding, subscribe throttle, invite lookup, SNMP
secret ([#699](#699))
([cdf59bb](cdf59bb))
* **security:** scope on-call override deletion to its schedule and org
([#714](#714))
([6708f03](6708f03))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant