feat(rules): add shared development and security rules

This commit is contained in:
Julian lechner
2026-09-11 14:42:29 +02:00
parent 25bc29b8a4
commit 8b5a7e39b3
12 changed files with 2169 additions and 0 deletions
+404
View File
@@ -0,0 +1,404 @@
# Security Guidelines
Security is a default requirement for all code, architecture, configuration and infrastructure changes.
## Core Principles
* Prefer secure defaults.
* Apply least privilege everywhere.
* Minimize exposed attack surface.
* Treat all external input as untrusted.
* Never trust client-side validation alone.
* Fail securely.
* Prefer deny-by-default over allow-by-default for sensitive operations.
* Keep security controls explicit and auditable.
* Do not weaken security for convenience.
* Do not bypass security mechanisms to make code easier to implement.
* Do not introduce insecure temporary solutions.
* Prefer simple, well-understood security mechanisms over custom cryptography or clever security logic.
## Secrets and Credentials
* Never hardcode passwords, API keys, tokens, connection strings, private keys or secrets.
* Never commit secrets to source control.
* Never log secrets or credentials.
* Never expose secrets in exceptions, diagnostics or UI messages.
* Use secure secret storage appropriate to the environment.
* Prefer short-lived credentials where supported.
* Rotate compromised credentials immediately.
* Do not reuse credentials across environments.
* Keep development, staging and production credentials separate.
* Avoid secrets in URLs, query strings or command-line arguments.
* Do not store secrets in frontend code.
* Do not include real credentials in examples, tests or fixtures.
## Authentication
* Use established authentication standards and framework capabilities.
* Do not implement custom authentication protocols without a strong reason.
* Store passwords only using modern password hashing algorithms designed for password storage.
* Never store plaintext passwords.
* Never use reversible encryption for password storage.
* Support secure session expiration.
* Invalidate sessions or tokens when security-sensitive account state changes.
* Protect authentication endpoints against brute-force abuse where applicable.
* Avoid exposing whether an account exists unless required.
* Require stronger authentication for security-sensitive actions where appropriate.
## Authorization
* Enforce authorization on the server side.
* Never rely on hidden UI elements, disabled buttons or frontend guards as authorization.
* Check authorization for every sensitive operation.
* Prefer explicit permission checks.
* Use least-privilege roles and permissions.
* Avoid broad administrative permissions unless required.
* Prevent horizontal privilege escalation between users or tenants.
* Prevent vertical privilege escalation between permission levels.
* Verify ownership of resources before access or modification.
* Do not trust identifiers supplied by the client as proof of authorization.
## Input Validation
* Validate all input from users, APIs, files, databases, queues, environment variables and external systems.
* Validate type, length, range, format and allowed values.
* Prefer allowlists over denylists.
* Reject unexpected input.
* Normalize input before validation when appropriate.
* Do not rely solely on client-side validation.
* Validate identifiers before using them for resource access.
* Validate uploaded files by content, size and expected type where applicable.
* Do not trust file extensions alone.
## Injection Prevention
* Never concatenate untrusted input into SQL.
* Use parameterized queries or ORM parameter binding.
* Never concatenate untrusted input into shell commands.
* Avoid executing shell commands when a direct API is available.
* Validate and escape command arguments when process execution is required.
* Prevent LDAP, XPath, template and expression injection where applicable.
* Avoid dynamic code execution.
* Avoid `eval`, dynamic compilation and equivalent mechanisms unless strictly required.
* Treat template engines and interpreters as security boundaries.
## Web Security
* Prevent Cross-Site Scripting by using framework escaping and sanitization.
* Never inject untrusted HTML directly.
* Avoid bypassing framework sanitization.
* Protect state-changing browser requests against CSRF where applicable.
* Use secure cookies for sensitive session data.
* Use `HttpOnly` for authentication cookies where possible.
* Use `Secure` cookies in HTTPS environments.
* Configure `SameSite` appropriately.
* Use appropriate Content Security Policy where applicable.
* Avoid leaking sensitive data through referrers or URLs.
* Validate redirect targets to prevent open redirects.
* Protect against clickjacking where applicable.
## API Security
* Authenticate sensitive endpoints.
* Authorize every protected operation.
* Validate all request payloads.
* Apply reasonable request-size limits.
* Apply pagination and bounded queries.
* Apply rate limiting where abuse is possible.
* Avoid exposing internal models directly when this leaks implementation details.
* Return only data the caller is authorized to access.
* Do not expose stack traces or internal exception details.
* Avoid excessive information in error responses.
* Version public APIs intentionally.
* Protect administrative endpoints separately where appropriate.
## Data Protection
* Collect only data that is actually required.
* Minimize storage of sensitive data.
* Classify sensitive data explicitly.
* Encrypt sensitive data in transit.
* Encrypt sensitive data at rest where appropriate.
* Do not implement custom encryption algorithms.
* Use established cryptographic libraries.
* Do not use obsolete cryptographic algorithms.
* Do not use hardcoded encryption keys.
* Use cryptographically secure random number generation for security-sensitive values.
* Avoid exposing personal or sensitive data in logs.
* Delete sensitive data when it is no longer required.
## Cryptography
* Never design custom cryptographic primitives.
* Use current, established cryptographic standards.
* Use authenticated encryption when confidentiality and integrity are required.
* Verify signatures before trusting signed content.
* Validate certificates correctly.
* Never disable certificate validation.
* Never accept all TLS certificates.
* Do not downgrade TLS security.
* Use secure randomness for tokens, nonces, identifiers and keys.
* Never use predictable random generators for security-sensitive values.
## Tokens and Sessions
* Treat tokens as secrets.
* Keep token lifetime as short as practical.
* Validate issuer, audience, signature and expiration where applicable.
* Do not accept unsigned tokens unless explicitly designed and safe.
* Do not trust token contents before validation.
* Avoid storing long-lived access tokens in insecure browser storage.
* Rotate refresh tokens where appropriate.
* Revoke compromised tokens where possible.
* Prevent replay attacks where the protocol requires it.
## File Security
* Validate file names and paths.
* Prevent path traversal.
* Never concatenate untrusted input directly into filesystem paths.
* Restrict file access to intended directories.
* Use generated server-side file names where appropriate.
* Enforce file size limits.
* Validate uploaded content.
* Do not execute uploaded files.
* Store uploads outside executable web roots where applicable.
* Handle archive extraction safely.
* Prevent zip-slip and equivalent path traversal attacks.
* Avoid following untrusted symbolic links where security-sensitive.
## Serialization
* Treat deserialized input as untrusted.
* Avoid insecure polymorphic deserialization.
* Avoid deserializing arbitrary runtime types.
* Use explicit schemas or known DTOs.
* Restrict type resolution.
* Do not deserialize executable objects or behavior.
* Validate deserialized data before use.
* Avoid insecure legacy serializers.
## Database Security
* Use parameterized queries.
* Use least-privilege database accounts.
* Do not use administrative database accounts for normal application traffic.
* Restrict schema modification permissions in runtime accounts.
* Protect connection strings.
* Avoid exposing raw database errors.
* Limit query size and result sets.
* Prevent tenant data leakage.
* Verify tenant boundaries in every relevant query.
* Use transactions where integrity requires atomicity.
## Logging and Monitoring
* Never log secrets.
* Never log passwords.
* Never log authentication tokens.
* Avoid logging sensitive personal data.
* Use structured logging.
* Include security-relevant context without exposing sensitive values.
* Log authentication and authorization failures where appropriate.
* Log suspicious or high-risk actions where appropriate.
* Avoid log injection by treating user input as data.
* Do not let logging failures break critical application behavior.
* Ensure logs have appropriate access controls.
## Error Handling
* Fail securely.
* Do not expose internal stack traces to users.
* Do not reveal implementation details unnecessarily.
* Preserve diagnostic detail internally where safe.
* Avoid different error responses that reveal sensitive existence checks where not required.
* Do not swallow security-relevant exceptions.
* Do not continue execution after critical validation or authorization failures.
## Dependencies
* Keep dependencies minimal.
* Prefer maintained and widely used packages.
* Avoid abandoned packages.
* Avoid unnecessary dependencies for trivial functionality.
* Keep dependencies updated with security patches.
* Review dependency changes before adoption.
* Do not blindly update major versions without compatibility review.
* Remove unused dependencies.
* Treat transitive dependencies as part of the attack surface.
* Verify package identity before installation.
* Avoid untrusted package sources.
* Respect lockfiles.
## Supply Chain Security
* Pin dependency versions where appropriate.
* Protect build and deployment pipelines.
* Do not expose CI/CD credentials.
* Use least privilege for pipeline identities.
* Review third-party actions, plugins and build scripts.
* Avoid executing untrusted build scripts.
* Verify artifacts and sources where practical.
* Keep generated artifacts traceable to source.
* Do not publish secrets in build logs or artifacts.
## Configuration
* Use secure production defaults.
* Do not enable debug mode in production.
* Do not expose development endpoints in production.
* Separate environment-specific configuration.
* Validate security-sensitive configuration at startup.
* Fail startup when mandatory security configuration is missing.
* Do not silently fall back to insecure settings.
* Protect configuration files containing sensitive values.
## Network Security
* Use HTTPS for sensitive or authenticated communication.
* Do not disable TLS validation.
* Restrict outbound network access where practical.
* Restrict inbound services to required ports and interfaces.
* Use timeouts for network operations.
* Limit retries to avoid amplification or denial-of-service behavior.
* Validate remote endpoints where SSRF is possible.
* Do not allow arbitrary user-controlled URLs for privileged server-side requests.
* Block access to internal network ranges when handling untrusted remote URLs where applicable.
## SSRF Prevention
* Treat user-controlled URLs as dangerous.
* Validate schemes.
* Prefer allowlisted hosts.
* Resolve and verify target addresses where necessary.
* Prevent access to localhost, metadata endpoints and internal networks where not explicitly required.
* Revalidate after redirects.
* Limit redirects.
* Apply request timeouts and response-size limits.
## Concurrency and Resource Abuse
* Bound concurrency.
* Avoid unbounded task creation.
* Avoid unbounded queues.
* Limit request sizes.
* Limit collection sizes when processing external input.
* Apply timeouts to external operations.
* Apply cancellation where practical.
* Prevent expensive operations from being triggered repeatedly without limits.
* Protect endpoints against denial-of-service through algorithmic complexity.
* Avoid user-controlled regular expressions that may cause catastrophic backtracking.
## Memory Safety and Resource Management
* Dispose files, streams, sockets and other resources correctly.
* Prevent resource leaks.
* Avoid retaining sensitive data in memory longer than necessary.
* Avoid unsafe code unless explicitly required.
* Review pointer and memory operations carefully.
* Avoid exposing raw memory or buffers across trust boundaries.
* Clear sensitive buffers where warranted.
## Multi-Tenant Systems
* Treat tenant boundaries as security boundaries.
* Scope every tenant-owned query explicitly.
* Never trust tenant identifiers from the client without authorization.
* Prevent cross-tenant cache leakage.
* Prevent cross-tenant logging or diagnostics leakage.
* Keep tenant-specific secrets isolated.
* Test horizontal privilege escalation explicitly.
## Frontend Security
* Assume frontend code and data are visible to the user.
* Never embed secrets in frontend applications.
* Never rely on frontend checks for authorization.
* Treat browser storage as potentially accessible to malicious scripts.
* Avoid storing sensitive long-lived tokens unnecessarily.
* Escape or sanitize untrusted content.
* Do not bypass framework security controls without explicit justification.
## Desktop Application Security
* Treat local files and IPC input as untrusted where applicable.
* Do not assume local users or processes are trusted.
* Avoid storing secrets in plaintext configuration.
* Protect locally cached sensitive data.
* Validate update packages and downloaded executables.
* Do not execute arbitrary files or commands from untrusted input.
* Use least privilege and avoid unnecessary elevation.
## Security-Sensitive Changes
Changes affecting any of the following require additional scrutiny:
* Authentication
* Authorization
* Cryptography
* Secrets
* User permissions
* File access
* Process execution
* Network access
* Input validation
* Serialization
* Database access
* Payment or financial data
* Personal or confidential data
* Admin functionality
* Deployment or infrastructure security
For security-sensitive changes:
* Prefer established framework functionality.
* Review trust boundaries.
* Review failure behavior.
* Review privilege requirements.
* Review input validation.
* Review logging for data leakage.
* Review backward compatibility for security implications.
* Add or update relevant security tests.
## Security Testing
* Test authorization failures.
* Test invalid and malicious input.
* Test boundary values.
* Test unauthenticated access.
* Test unauthorized resource access.
* Test cross-user and cross-tenant access where applicable.
* Test expired and invalid credentials.
* Test malformed payloads.
* Test path traversal where files are involved.
* Test injection risks where interpreters or databases are involved.
* Test rate and resource limits where abuse is realistic.
* Preserve regression tests for discovered security issues.
## Agent Rules
* Never intentionally weaken security controls without explicit user instruction.
* Never disable certificate validation, authentication, authorization, validation or security middleware to solve a problem.
* Never add hardcoded secrets.
* Never expose sensitive data for debugging convenience.
* Never bypass a security check because it blocks implementation.
* Never assume trusted input without a clearly defined trust boundary.
* Never silently choose a less secure implementation because it is easier.
* If a requested change creates a meaningful security risk, clearly identify the risk before proceeding.
* If requirements are ambiguous in a security-sensitive area, ask the user instead of making an autonomous security decision.
## Priority Order
Prioritize security decisions in this order:
* Prevent unauthorized access
* Protect sensitive data
* Preserve integrity
* Minimize privileges
* Minimize attack surface
* Validate trust boundaries
* Maintain availability
* Preserve auditability
* Optimize usability and performance only within acceptable security constraints
Security must not be traded away for convenience without an explicit and informed decision.