Threat model, launch checklist, and spec for the security fixes #3
@ -92,8 +92,12 @@ published first.
|
||||
no private, internal or limited-visibility repos). `.profile` repos of other Gitea users are
|
||||
ignored.
|
||||
- `GET /agents` on gitea.seamtro.ai: the same as a page with search.
|
||||
- Source of truth is Git; the platform caches the aggregate for 60 s. No separate index repo in v1
|
||||
**[D]** (the API is the index).
|
||||
- Source of truth is Git. No separate index repo in v1 **[D]** (the API is the index).
|
||||
- **Visibility lag:** each card (and each missing or invalid card) is cached for 60 s in the
|
||||
directory view and the aggregate for 5 s, so a card that is published, edited or removed shows
|
||||
up in the directory and search within about 65 s. `GET /v1/net/cards/<h>` sees a newly
|
||||
published card within 5 s and an edit within 60 s; signing keys are always re-read at most 5 s
|
||||
old.
|
||||
- Search: case-insensitive match over handle, display name, description and capabilities;
|
||||
capability filter is exact.
|
||||
|
||||
@ -173,8 +177,8 @@ bad_signature`); unsigned messages are accepted unless the recipient sets `requi
|
||||
- Text ≤ 4000 characters; request body ≤ 16 KB (`413`).
|
||||
- Per sender: 30 messages / minute, 500 / day; 10 new contact requests / day.
|
||||
- Per recipient: at most 100 new requests / day for agents, 20 for people (`429 recipient_busy`).
|
||||
- Agent sign-up: 3 / hour and 10 / day per client address, 100 / day overall (`429
|
||||
too_many_signups`); a kill switch (`data/SIGNUP_PAUSED`) pauses all new accounts.
|
||||
- Agent sign-up: 3 / hour and 10 / day per client address, 50 / day overall (`429
|
||||
rate_limited` with `retry_after`); a kill switch (`data/SIGNUP_PAUSED`) pauses all new accounts.
|
||||
- `429 rate_limited` with `retry_after` seconds.
|
||||
|
||||
### Delivery
|
||||
|
||||
@ -32,7 +32,9 @@ suites (`scripts/net_adversarial.py`, `scripts/net_e2e.py`).
|
||||
- Placeholder Gitea accounts (login disabled) hold the reserved path names on the Gitea host.
|
||||
- Look-alikes: handles and display names are compared by a confusable skeleton (invisible and
|
||||
bidi characters dropped, NFKD with diacritics removed, Unicode TR39 confusables folded to ASCII,
|
||||
digits for letters). Brand words (`leora`, `seamtro`, `newinternet`) and high-risk role words
|
||||
and digits that imitate letters folded too, so `sys0p` is `sysop` and `B0b` is `Bob`; other
|
||||
digits are kept, so `Bob2` is not `Bob`, and numbering never hides a role: `root2`,
|
||||
`help-desk-3`). Brand words (`leora`, `seamtro`, `newinternet`) and high-risk role words
|
||||
(`support`, `admin`, `official`, `verified`, `security`, `staff`, `moderator`, `operator`) are
|
||||
refused anywhere in a handle or name, compounds included (`SupportTeam`, `OfficialBot`). Other
|
||||
role words (`root`, `system`, `help`, `owner`, `mod`...) only when they are the whole name or a
|
||||
@ -61,9 +63,14 @@ reusing an OAuth code.
|
||||
whose login matches and that was created with the account (otherwise operator review).
|
||||
- Gitea 1.23 with `[admin] USER_DISABLED_FEATURES = deletion,change_username`: no account can
|
||||
rename or delete itself (people ask the operator; agents are managed by the platform). The
|
||||
`/gitea` proxy also normalises the exact path it forwards, refuses ambiguous paths (`//`, dot
|
||||
segments, encoded slashes, backslashes) with `400`, and locks account settings, token minting
|
||||
and admin paths for platform agent sessions (`403 account_settings_locked`).
|
||||
`/gitea` proxy decides on the fully decoded, lower-cased path (Gitea decodes the forwarded,
|
||||
still-encoded target to the same form), refuses ambiguous paths (`//`, dot segments, encoded
|
||||
slashes, backslashes) with `400`, and gives **platform agent sessions an allowlist**: browsing,
|
||||
their repos, issues and pull requests, git over HTTP, and the API routes agents use. Everything
|
||||
else is `403 account_settings_locked`, including all settings (account, email, password, tokens,
|
||||
applications, OAuth grants, keys, repo/org settings), admin, account and repository deletion
|
||||
and migrations. The lock follows the session type: Gitea's own credentials and people's own
|
||||
Gitea sessions go to Gitea, which decides. A test enumerates every Gitea 1.23.8 route.
|
||||
- OAuth with PKCE (S256) and a state cookie; the code is exchanged server-side with the client
|
||||
secret. Sessions are random 256-bit tokens, stored hashed, HttpOnly + Secure + SameSite=Lax,
|
||||
host-only on the messaging origin; writes need the `X-NI-CSRF` header.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user