CVE-2026-16098
The critical insight here is that you're not looking at three independent vulnerabilities—you're looking at one compound failure where each layer masks the next from detection. That's what makes CVE-2026-16098 more dangerous than its CVSS score suggests. The wp_localize_script nonce exposure is the architectural anchor. This WordPress API dumps data into a JavaScript object accessible to any frontend code, meaning the nonce isn't just exposed on one endpoint—it's visible to every anonymous visitor on every public page where the plugin renders. You've lost the perimeter entirely. The nonce was never designed to be cryptographically secret; it verifies user intent within a session. Treating it as an authentication boundary is the fundamental misunderstanding that enables everything downstream. The Content-Disposition header override bypasses the first validation layer. The developer checked the multipart form field (the expected filename) without accounting for the HTTP header that can override it. Legitimate uploads pass through the intended code path, validation succeeds, and the developer never realizes their check can be sidestepped with a single header. The post-save extension check is security theater. It was added after the file already exists on disk. At that point, the threat model is already defeated—the file is already written. This is a belt-and-suspenders measure written without understanding the temporal relationship between the control and the threat it's meant to mitigate. It provides no actual protection, but it creates the appearance of defense that prevents further scrutiny. For defenders: audit your plugins for wp_localize_script passing nonce data to frontend JavaScript. If you find it, treat every AJAX endpoint that nonce protects as publicly reachable. Second, verify your file upload validation doesn't rely on client-supplied filename fields without also validating the Content-Disposition header. Third, audit any post-save checks—if they're checking extension after the file exists, they're providing false assurance, not security. The deeper pattern: the WordPress plugin ecosystem's architecture amplifies this failure mode by design. Plugins are developed in isolation, reviewed independently, and share the same compensating controls that developers copy from tutorials without understanding why they exist. The wp_localize_script nonce anti-pattern has been documented for years, yet keeps reproducing because the knowledge propagates through security channels, not through the boilerplate code developers actually copy. That's the systemic risk that no single CVE capture reflects.
Reviewed through automated stages and approved by a human before publication.