Skip to content

Commit 0982114

Browse files
authored
Merge pull request #29 from adab-tech/security/disclosure-policy-clean
Replace one-line credential note with a real security policy
2 parents 975a1f7 + 934f0a4 commit 0982114

1 file changed

Lines changed: 70 additions & 2 deletions

File tree

SECURITY.md

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,71 @@
1-
# Security
1+
# Security Policy
22

3-
If `GOOGLE_API_KEY` or `GOOGLE_CSE_ID` were ever committed or shared, **revoke and recreate** them in [Google Cloud Console](https://console.cloud.google.com/apis/credentials). Store new values only in `backend/.env` and GitHub Actions secrets (see `.github/SECRETS.md`).
3+
Global Opportunities (globalopportunities.app) is a single-operator project, not a
4+
company with a security team. This policy is scoped and worded accordingly.
5+
6+
## Reporting a vulnerability
7+
8+
Preferred: use GitHub's private vulnerability reporting for this repo
9+
(Settings → Security → "Private vulnerability reporting", or the
10+
"Report a vulnerability" button under the Security tab). This opens a
11+
private advisory only the maintainer can see.
12+
13+
If that option isn't available to you, email **hello@globalopportunities.app**
14+
with:
15+
16+
- a description of the issue and its impact
17+
- steps to reproduce (or a PoC)
18+
- any relevant URLs, request/response examples, or logs
19+
20+
Do not open a public GitHub issue for a security report.
21+
22+
## Scope
23+
24+
**In scope:**
25+
26+
- The live site and API at globalopportunities.app
27+
- The source in this repository (`backend/` FastAPI app, `frontend/` static UI)
28+
29+
**Out of scope:**
30+
31+
- The infrastructure providers this app runs on — Render (hosting),
32+
Cloudflare (Workers/DNS), Neon (Postgres), and any transactional email
33+
provider (Resend/Brevo/SendGrid). Vulnerabilities in those platforms
34+
themselves belong to their own disclosure programs, not this repo.
35+
- Third-party content ingested by the scraper (RSS feeds, search results,
36+
listing pages on other sites). Report those to the source site.
37+
- Denial of service achieved purely by consuming the app's own rate limits
38+
as intended (see below).
39+
40+
## What not to do
41+
42+
- No automated scanning, fuzzing, or load testing against the live site.
43+
It's a small deployment and this can degrade it for other users.
44+
- In particular, don't script or hammer the public "Find new" button
45+
(`POST /api/v1/scraper/run`). It triggers a real scraping job against
46+
metered/rate-limited third-party search APIs and is protected by a
47+
5-minute global cooldown (`backend/app/routes/scraper.py`) — treat that
48+
cooldown as a hard limit, not a target to test.
49+
- No accessing, modifying, or exfiltrating other users' data beyond what's
50+
needed to demonstrate a finding.
51+
- No public disclosure until a fix has shipped. Please give reasonable time
52+
to respond before going public.
53+
54+
## Response expectations
55+
56+
This project is maintained by one person in their spare time, not a 24/7
57+
security team. Expect a best-effort acknowledgment within a few days, not a
58+
guaranteed SLA. Fix timelines depend on severity and available time — you'll
59+
be kept informed once a report is triaged.
60+
61+
## Credentials and committed secrets
62+
63+
If you find a committed secret (API key, token, connection string) in this
64+
repo's history, report it the same way as a vulnerability. As a past
65+
example: if `GOOGLE_API_KEY` or `GOOGLE_CSE_ID` are ever exposed (committed,
66+
logged, or otherwise leaked), they should be revoked and recreated
67+
immediately in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials),
68+
with new values stored only in `backend/.env` and GitHub Actions secrets
69+
(see `.github/SECRETS.md`) — never in the repo itself. The same applies to
70+
any other API key or credential used by this project (Resend/Brevo/SendGrid
71+
keys, `DATABASE_URL`, etc.).

0 commit comments

Comments
 (0)