Hand-rolling an LDAP listener to catch Log4Shell callbacks
Catching a jndi:ldap callback needs your own LDAP server: BER-encoded ASN.1 over TCP, no Host header or SNI. The search base DN is the only signal.
Fail the build when your CSP regresses
CSP policies regress silently when someone adds unsafe-inline to unblock a widget. How to make CI catch it, and what is actually worth gating on.
Multi-tenant isolation as defense-in-depth: when WHERE owner_user_id isn't enough
One forgotten WHERE clause leaks another tenant's data. Here is a second layer that fails closed automatically, built on a SQLAlchemy hook.
Six layers to sandbox untrusted Python — and the escape I missed
Running user-supplied Python in production: the six independent layers that contain it, why each exists, and the AST bypass that slipped through.
Building an authoritative DNS server in ~200 lines
A from-scratch authoritative DNS server for an OAST platform: wildcards, apex records, deliverable MX, ACME challenges, and the subtleties that bite.
The OWASP LLM Top 10: A Practitioner's Field Guide
A plain-English walk through the OWASP Top 10 for LLM Applications from someone who reviews AI code for a living, and what each risk means.
Hand-rolling the JNDI Reference: what the JVM actually deserializes
How a Log4Shell-style LDAP/RMI callback returns a javax.naming.Reference, byte for byte — and two serialization bugs that only a real JVM catches.
OWASP A05: Injection Prevention Guide 2025
How SQL and command injection actually work, and why parameterized queries and safe APIs in Python end the problem. OWASP A05:2025 explained.
OWASP A04: Cryptographic Failures Guide 2025
OWASP A04:2025 in practice: weak password hashing, plaintext data, bad randomness, hardcoded keys, and the secure Python fix for each one.
OWASP A03: Software Supply Chain Failures Guide 2025
OWASP A03:2025 is a brand-new category. What xz and dependency confusion teach us, and how to lock down dependencies and your CI/CD pipeline.
Book Review: The Developer's Playbook for Large Language Model Security: Building Secure AI Applications
My honest take on Steve Wilson's LLM security playbook: OWASP-flavored, practitioner-first, aimed at people who ship code that calls an LLM.
Don't Trust JWT Headers: Algorithm Confusion Attacks Explained
JWT algorithm confusion in Python: the none-algorithm bypass, RS256-to-HS256 substitution, and the PyJWT validation that stops both cold.
OWASP A01: Broken Access Control Prevention Guide
Broken access control tops the OWASP 2025 list. IDOR, privilege escalation, and the authorization checks that actually hold, with real code.
OWASP Top 10 2025 Developer Guide
Master the OWASP Top 10 2025 web application vulnerabilities. Complete developer guide with supply chain failures, exceptional conditions, and modern security risks.
OWASP A02: Security Misconfiguration Guide 2025
Security misconfiguration jumped to #2 in OWASP 2025. The defaults that bite you, real attack paths, and hardening steps per framework.
Python SSRF Prevention Guide [2026]
SSRF prevention in Flask, Django, and FastAPI: URL validation that survives redirects and DNS rebinding, plus how to test it before you ship.
CSRF vs SSRF: Developer Guide [2026]
CSRF and SSRF sound alike and behave nothing alike. What each attack does, why the defenses do not transfer, and how to get both right.
AppSec.fyi Hits 2,200+ Resources: What's New
AppSec.fyi has grown to a full application security reference platform with 2,241 resources across 24 categories, weekly newsletter, and glossary.
MCP Tool Poisoning: Hidden Attack Surface
MCP tool descriptions are an attack surface. Malicious servers can embed hidden instructions to exfiltrate SSH keys and hijack agent behavior.
csp-toolkit: CSP Header Analysis at Scale
I built csp-toolkit to parse CSP headers and find bypasses at scale. Here is what turned up when I pointed it at the web's busiest sites.
Use-After-Free: Classic Memory Corruption Guide
Use-after-free vulnerabilities are among the most dangerous memory corruption bugs. Learn what they are, how they work, and how to find them.
CVE-2026-27696: SSRF in changedetection.io
How CVE-2026-27696 slipped past changedetection.io's URL validation to reach AWS metadata. Full PoC, disclosure timeline, and fix. CVSS 8.6.
AppSec.fyi: Curated Security Resources
I built AppSec.fyi as a curated collection of application security resources organized by vulnerability class — a go-to reference for security professionals.
Secure Python Applications Guide [2026]
Practical Python security: stopping SSRF, SQL injection, and XSS with code you can lift, plus the libraries and tests worth adding to a project.
Understanding HTTP Request Smuggling Attacks
HTTP request smuggling exploits parsing gaps between front-end and back-end servers. How CL.TE and TE.CL desync works, and how to shut it down.
7 Critical SSRF Attack Techniques [2026]
Seven SSRF techniques attackers really use: cloud metadata, internal services, redirect chains, DNS rebinding, and how to detect each one.
SSRF Prevention Guide [2026]
Stop SSRF before it reaches your cloud metadata endpoint. URL validation that actually holds up, with Python and Node.js code you can lift.
What is the Common Weakness Enumeration (CWE)?
CWE is MITRE's catalog of 900+ software weakness types. What it is, how it differs from CVE, and how to use it in code review and bug triage.
XXE Injection Payloads for Security Testing
A collection of common XXE (XML External Entity) injection payloads for security testing, with notes on how each exploits vulnerable XML parsers.
Content Security Policy Complete Guide [2026]
How Content Security Policy actually stops XSS: directive-by-directive examples, the common bypasses, and how to test a policy before you ship it.