THE SECURITY BRUTALIST

Brutalist Application Security: A Guide

Brutalist Application Security embraces a philosophy of transparency, visible and unapologetic security measures, and infrastructure-aware controls. It prioritizes clarity over subtlety and enforces protection, even when the implementation feels rough or intrusive. This approach is designed for modern tech stacks with CI/CD pipelines supporting both cloud and local development environments.

Core Philosophy

Security Brutalism in application security focuses on truth over comfort. The fundamental principle is simple: make security rules visible, inflexible, and codified into your developer lifecycle, both locally and in the cloud.

Key tenets:

Six Core Security Brutalism Tenets in Practice

1. Make Security Controls Visible and Unignorable

Fail loudly and early: If a security check fails in CI/CD, make the error unambiguous and impossible to ignore.

Force exposure of controls in developer workflows: Don't hide security checks in background processes.

2. Immutable, Auditable, and Declarative Pipelines

Embrace declarative CI/CD where security configuration is code-reviewed and version-controlled:

3. Don't Trust Developer Devices, Verify Everything

For local development:

Security Brutalist twist: If you can't verify commit signatures, reject the merge. Make that policy loudly known to all developers.

4. Zero Implicit Trust in CI/CD

Secure secrets management:

Cryptographic verification:

5. Loud, Inflexible Policy Enforcement

Treat policies like WAFs or firewalls: brutal, deterministic, unapologetic.

Examples of inflexible enforcement:

6. Expose Risk Visibly in Git and UI

Bot-driven transparency: Have bots post visible messages on PRs about security debt:

This PR introduces 3 new dependencies, including one with known CVEs (CVSS 8.3). Link to triage: [Security Dashboard]

Label-based classification: Label pull requests with security impact levels:

Fundamental Security Controls

Input Validation

Authentication and Authorization

Output Encoding

Error Handling and Logging

Dependency Management

Automated Security Testing

Secure Deployment

Security Brutalist CI/CD Pipeline Example

[Developer Local Environment]

Containerized dev environment (Gitpod/Codespaces)

Pre-commit hooks run:
- Semgrep (SAST)
- Secrets scanner
- Dependency check

Signed commit pushed → Git repository

[CI/CD Pipeline Triggers]

Security Gates (all must pass):
- Static Application Security Testing (SAST)
- Dependency vulnerability scanning
- Container image scanning
- Infrastructure as Code security scanning
- Secret detection verification

Build and test (if security gates pass)

Signed artifact creation with SBOM

Runtime attestation and deployment

Implementation Guidelines

Accept Friction as a Signal, Not a Flaw

Be Transparent About Failures

Enforce Policies as Code

Monitor and Measure

Final Security Brutalist Recommendations

  1. Do not hide security behind UX niceties: Let developers feel the edge of security controls
  2. Enforce policies as code: Not by tribal knowledge or Slack messages
  3. Accept friction as a signal: Not a flaw in the system
  4. Be transparent: About what failed, how, and why
  5. Build solid foundations: Security isn't a product you buy; it's a fundamental way you build

End Goal

The ultimate objective is creating applications where:

Security Brutalism focuses on truth over comfort. Make the security rules visible, inflexible, and woven into every aspect of your development lifecycle. The result is applications that are genuinely secure, not just compliant.