mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
135 lines
6.4 KiB
Markdown
135 lines
6.4 KiB
Markdown
|
|
# Architecture & Project-Specific Checks Reference
|
||
|
|
# Phase 3 checks for common ASP.NET Core project patterns. Read the project's CLAUDE.md
|
||
|
|
# or AGENTS.md for project-specific details (endpoint list, service names, DI registrations)
|
||
|
|
# to inform these checks.
|
||
|
|
|
||
|
|
## Check 1: Endpoint Auth Matrix Verification
|
||
|
|
|
||
|
|
Cross-reference the controller's actual `[Authorize]`/`[AllowAnonymous]` attributes against the project's documented auth requirements. Read CLAUDE.md or AGENTS.md for the expected auth matrix. Any mismatch is CRITICAL.
|
||
|
|
|
||
|
|
For projects with multiple auth schemes (e.g., Azure AD + custom JWT), verify each endpoint uses the correct scheme/policy.
|
||
|
|
|
||
|
|
## Check 2: Anonymous Endpoint Abuse Potential
|
||
|
|
|
||
|
|
For each `[AllowAnonymous]` endpoint, verify:
|
||
|
|
- Rate limiting or throttling exists for sensitive operations (e.g., code generation, login attempts)
|
||
|
|
- Enumeration attacks are mitigated (IDs are GUIDs or non-sequential, not auto-increment)
|
||
|
|
- No state modification without prior authentication or verification (e.g., OTP first)
|
||
|
|
|
||
|
|
## Check 3: OTP / MFA Security Review
|
||
|
|
|
||
|
|
If the project implements OTP or MFA, read the service implementation and verify:
|
||
|
|
- Code length is sufficient (6+ characters)
|
||
|
|
- Codes are generated with `RandomNumberGenerator`
|
||
|
|
- Hash is SHA-256 or stronger (not MD5/SHA1)
|
||
|
|
- Expiry is enforced (typically 5-10 minutes)
|
||
|
|
- Wrong attempt counter increments correctly and triggers lockout after a threshold
|
||
|
|
- No timing side-channel in hash comparison
|
||
|
|
|
||
|
|
## Check 4: Exception Handling Coverage
|
||
|
|
|
||
|
|
Grep for `throw new` statements. Verify that all thrown exceptions are either:
|
||
|
|
- The project's structured error type (e.g., `ApiException`, `DomainException`, or the project's custom base exception), OR
|
||
|
|
- Known typed exceptions for external service failures
|
||
|
|
|
||
|
|
Any unstructured exception thrown from handler/service code may bypass error filters and leak internal details.
|
||
|
|
|
||
|
|
## Check 5: Optimistic Concurrency on State Writes
|
||
|
|
|
||
|
|
If using a database with optimistic concurrency (ETags, row versions):
|
||
|
|
- Verify every write/update operation passes the concurrency token
|
||
|
|
- Verify the concurrency token store/tracking mechanism is consulted on every read/write cycle
|
||
|
|
|
||
|
|
## Check 6: Expired State Handling
|
||
|
|
|
||
|
|
If the project uses application-level state expiry (not DB TTL):
|
||
|
|
- Verify expired records are deleted or excluded on read (not returned to callers)
|
||
|
|
- Verify callers cannot act on expired data
|
||
|
|
|
||
|
|
## Check 7: Blob Storage SAS URL Security
|
||
|
|
|
||
|
|
If the project generates SAS URLs for blob storage:
|
||
|
|
- SAS token expiry is short-lived (minutes, not days)
|
||
|
|
- Permission is read-only (not write/delete)
|
||
|
|
- Scoped to the specific blob (not container-level)
|
||
|
|
|
||
|
|
## Check 8: Message Queue Security
|
||
|
|
|
||
|
|
If the project uses message queues (Service Bus, RabbitMQ, etc.):
|
||
|
|
- Messages do not contain secrets or unnecessary PII
|
||
|
|
- Queue connections use managed identity or connection strings from secret stores
|
||
|
|
|
||
|
|
## Check 9: JSON Serialization Settings
|
||
|
|
|
||
|
|
Check that `TypeNameHandling` is set to `None` (default) and not `Auto`/`All` anywhere. This applies to both Newtonsoft.Json and any custom serializer configuration.
|
||
|
|
|
||
|
|
## Check 10: Background Task Queue Safety
|
||
|
|
|
||
|
|
If the project uses a background task queue:
|
||
|
|
- Bounded capacity prevents unbounded memory growth
|
||
|
|
- Backpressure is handled correctly (not silently dropping critical events like audit logs)
|
||
|
|
- Task failures are observed and logged/metered
|
||
|
|
|
||
|
|
## Check 11: Custom Token / JWT Security
|
||
|
|
|
||
|
|
If the project issues its own JWTs (not just validating external tokens):
|
||
|
|
- **Algorithm**: HMAC-SHA256 or stronger (RSA for distributed validation)
|
||
|
|
- **Signing key source**: Key loaded from configuration/secret store, NOT hardcoded
|
||
|
|
- **Signing key length**: Minimum 256 bits (32 bytes) for HMAC-SHA256
|
||
|
|
- **Token expiry**: Appropriately capped (tokens should not outlive the session/resource they protect)
|
||
|
|
- **Claims validation**: Custom claims (e.g., resource IDs) are validated against route parameters by an authorization handler
|
||
|
|
- **TokenValidationParameters**: `ValidateIssuer`, `ValidateAudience`, `ValidateLifetime`, `ValidateIssuerSigningKey` all `true`
|
||
|
|
- **ClockSkew**: Tightened from default 5 minutes to 2 minutes or less
|
||
|
|
|
||
|
|
## Check 12: Response Data Sanitization
|
||
|
|
|
||
|
|
If the project sanitizes response data (e.g., stripping internal paths or fields):
|
||
|
|
- Sanitization handles malformed input gracefully (does not throw/crash)
|
||
|
|
- Only known sensitive fields are stripped (no over-stripping that breaks functionality)
|
||
|
|
- Sanitization is applied on every code path returning the data (not just the happy path)
|
||
|
|
|
||
|
|
## Check 13: Rate Limiting
|
||
|
|
|
||
|
|
Verify rate limiting posture:
|
||
|
|
- Grep for `AddRateLimiter` and `UseRateLimiter` -- if absent, note as finding
|
||
|
|
- Application-level throttling exists for sensitive operations (e.g., SMS/code generation resend limits)
|
||
|
|
- Brute force protection exists for verification endpoints (wrong attempt lockout)
|
||
|
|
- **Recommendation**: Add ASP.NET Core `System.Threading.RateLimiting` middleware for IP-based throttling on public endpoints
|
||
|
|
|
||
|
|
## Check 14: Security Headers Completeness
|
||
|
|
|
||
|
|
Check Program.cs / middleware for these headers (report missing ones):
|
||
|
|
- `X-Content-Type-Options: nosniff`
|
||
|
|
- `X-Frame-Options: DENY`
|
||
|
|
- `Referrer-Policy: strict-origin-when-cross-origin`
|
||
|
|
- `Permissions-Policy: camera=(), microphone=(), geolocation=()`
|
||
|
|
- `X-XSS-Protection: 0` (disable legacy XSS filter; CSP is the modern replacement)
|
||
|
|
- `Content-Security-Policy` (at minimum for APIs: `default-src 'none'`)
|
||
|
|
- `Server` header removed
|
||
|
|
- `X-Powered-By` header removed
|
||
|
|
|
||
|
|
## Check 15: Middleware Pipeline Ordering
|
||
|
|
|
||
|
|
Read Program.cs and verify correct middleware order:
|
||
|
|
1. `UseExceptionHandler` (outermost -- catches everything)
|
||
|
|
2. `UseHsts` (non-development only)
|
||
|
|
3. `UseHttpsRedirection`
|
||
|
|
4. Security headers middleware
|
||
|
|
5. `UseRateLimiter` (if present)
|
||
|
|
6. `UseRouting` (if explicit)
|
||
|
|
7. `UseCors`
|
||
|
|
8. `UseAuthentication`
|
||
|
|
9. `UseAuthorization`
|
||
|
|
10. `MapControllers` / endpoints
|
||
|
|
|
||
|
|
Authentication MUST come before Authorization. CORS MUST come before Authentication. ExceptionHandler MUST be first.
|
||
|
|
|
||
|
|
## Check 16: NuGet Audit & Build Security
|
||
|
|
|
||
|
|
Check for build-level security configuration:
|
||
|
|
- Does `Directory.Build.props` exist? If so, verify `NuGetAudit`, `NuGetAuditMode`, `NuGetAuditLevel` settings.
|
||
|
|
- Are Roslyn security analyzer packages referenced? (`SecurityCodeScan.VS2019`, `SonarAnalyzer.CSharp`, `Meziantou.Analyzer`)
|
||
|
|
- Are `AnalysisLevel` / `AnalysisMode` set in `.csproj` or `Directory.Build.props`?
|
||
|
|
- Run Grep for floating versions: `Version="[^"]*\*"` in `.csproj` files
|
||
|
|
- Recommend `dotnet list package --vulnerable --include-transitive` as a CI step
|