Method · how the gate decides

We publish the decision. Not the detector.

live
security gates
124
the Firewall · count derived from the catalogue
categories
6
access · injection · auth · crypto · supply · infra
dataflow gates
11
source→sink taint · the rest = pattern
advisory
$0
everywhere, no card · blocking = public or slot
One Action, two layers: the slop check (an advisory quality note) and the Firewall (11 classes enforced in CI, on a 124-class engine that grows server-side). The decision is a pure, public, tested function — made live below. The detector stays black-box: we publish which, never how.

The decision, live

Not an illustration: the chips call firewallVerdict and firewallGateLevelthe same functions your CI runs. Change an input, the verdict recomputes. Two lanes: gate #1 (cross-tenant leak) and the other 123 gates.
firewall-modethe Action input
repo visibilityproven by OIDC
Firewall slotassigned to this repo
reliable verdictexplicit scoping vs ORM ceiling
hard leaksHIGH findings on the PR
gate level paid · the slot wins, public or private
Gate #1 · cross-tenant leakblocks if level ≠ nonegate-blocked · exit 1
The other 10 gatesblock if level = paidgate-blocked · exit 1
// lib/tenant-isolation/gate-verdict.ts — PURE, pinned by test
blocks ⇔ gate ∧ entitled ∧ reliable ∧ leaks ≥ 1
// else: advisory (exit 0) · gate-unpaid (free sees, never blocks) · gate-pass
// lib/entitlements.ts:167 — slot ⇒ paid · public ⇒ public · else none · fail-closed

The 124 guarded classes

Six OWASP categories. Each class carries its CWE and its analysis depth. The list is derived from the shipped catalogue (parity pinned to the rulepacks by test) — a new gate appears here without touching the page.

Isolation & access

5 gates
Access-ControlOWASP A01 · decorative authzpattern
DB-SafetyRLS / GRANT / policy hygienepattern
Mass assignmentwhole request bag bound to a model · privilege escalation · CWE-915pattern
CORS misconfigurationcredentialed cross-origin from any site · reflected Origin / wildcard+credentials · CWE-942pattern
Firebase public-write rulesa Firebase Realtime Database / Firestore / Storage rule grants write to any client (allow write: if true · '.write': true) · anyone can overwrite or delete the whole datastore · CWE-284pattern

Injection

61 gates · 11 dataflow
SQL injectionuser value built into the SQL string · query rewrite · CWE-89dataflow
NoSQL injectionraw request bag as a Mongo filter · operator injection · CWE-943dataflow
LDAP injectionuser value built into an LDAP filter · auth bypass / directory dump · CWE-90dataflow
XPath injectionuser value built into an XPath query · auth bypass / data extraction · CWE-643dataflow
Unrestricted uploadupload stored under the attacker's filename+extension · shell drop · CWE-434pattern
Command injectionuser input in an eval/exec/shell sink · RCE · CWE-94/78dataflow
Template injectionuser input compiled as a template source · RCE · CWE-1336dataflow
Path traversaluser input as a file path — reads arbitrary files · CWE-22/98dataflow
XSS / HTML injectionunescaped user input in an HTML sink · session theft · CWE-79dataflow
SSRFuser input as an outbound-request URL · cloud metadata theft · CWE-918dataflow
XXE injectionexternal XML entities enabled · CWE-611pattern
Open redirectuser input as a redirect target · phishing · CWE-601pattern
Prototype pollutionuser input recursively merged into an object · __proto__ inject · CWE-1321pattern
ReDoS (user regex)user input compiled as a regex pattern · CPU denial of service · CWE-1333pattern
CRLF / header injectionrequest value in a response header / cookie · response splitting · CWE-113pattern
Log injectionrequest value concatenated into a log line · forged entries / SIEM poisoning · CWE-117pattern
PHP variable extractionpopulates the local symbol table from request data · extract($_GET) / import_request_variables / single-arg parse_str · overwrite $is_admin (register_globals) · CWE-621pattern
SpEL injectiona request value reaches a Spring SpEL parser (parseExpression/parseRaw) · evaluated as a Java expression · T(java.lang.Runtime).exec(...) → RCE (CVE-2022-22963) · CWE-917pattern
Obfuscated code executionan eval/exec wrapping a decoder (eval(base64_decode(…)) · eval(atob(…)) · exec(base64.b64decode(…))) runs a decoded blob as code — the signature of a webshell or backdoor · CWE-506 / CWE-94pattern
Unsafe reflectiona request value (getParameter / getHeader) passed inline to Class.forName / getMethod — the attacker chooses which class is loaded or which method runs → arbitrary instantiation and RCE · CWE-470pattern
OGNL injectiona request value (getParameter / getHeader) evaluated inline as an OGNL expression (Ognl.getValue / parseExpression, or a Struts OgnlUtil) — the attacker authors the expression → arbitrary method invocation and RCE · CWE-917pattern
Script-engine injectiona request value (getParameter / getHeader) executed inline as script source by a JVM script engine (ScriptEngine.eval / GroovyShell.evaluate / Eval.me) — the attacker authors the program → RCE · CWE-94pattern
JNDI injectiona request value (getParameter / getHeader) is the name resolved by a JNDI context lookup (InitialContext / DirContext) — the attacker points it at a malicious LDAP/RMI server → RCE (the Log4Shell mechanism) · CWE-74pattern
EL injectiona request value (getParameter / getHeader) evaluated inline as a Jakarta/Java EL expression (ELProcessor.eval / createValueExpression) — the attacker authors the expression → RCE · CWE-917pattern
XSLT injectiona request value (getParameter / getHeader) compiled inline as an XSLT stylesheet (newTransformer / newTemplates) — the attacker authors the stylesheet, whose extension functions reach Java → RCE · CWE-91pattern
Node vm code injectiona request field (req.query / req.body) executed inline as code by the Node vm module (runInNewContext / new vm.Script) — the vm module is not a sandbox → RCE · CWE-95pattern
Node require / import injectiona request field (req.query / req.body) is the module specifier loaded inline by require() or a dynamic import() — the attacker names an arbitrary module (LFI → RCE via its top-level side-effects) · CWE-98pattern
Python import injectiona request accessor (request.args / request.GET) is the module name imported inline by __import__() or importlib.import_module() — the attacker names an arbitrary module (LFI/RCE via its side-effects) · CWE-94pattern
Go command injectiona net/http request accessor (r.FormValue / r.URL / r.Header) is passed inline to exec.Command / exec.CommandContext — the attacker injects the command → RCE · CWE-78pattern
.NET command injectionan ASP.NET request accessor (Request[...] / Request.QueryString / Request.Form) is passed inline to Process.Start / new ProcessStartInfo — the attacker injects the command → RCE · CWE-78pattern
Go SSRFa net/http request accessor (r.FormValue / r.URL / r.Header) is the URL of an outbound call by http.Get / http.Post / http.NewRequest — the server fetches an attacker-chosen endpoint (cloud metadata / localhost / internal services) · CWE-918pattern
.NET SSRFan ASP.NET request accessor (Request[...] / Request.QueryString / Request.Form) is the URL of an outbound call by HttpClient / WebClient / WebRequest.Create — the server fetches an attacker-chosen endpoint (cloud metadata / localhost / internal services) · CWE-918pattern
Go SQL injectiona net/http request accessor (r.FormValue / r.URL) is spliced into a database/sql query (db.Query / Exec) via fmt.Sprintf or concatenation — the attacker rewrites the query · CWE-89dataflow
.NET SQL injectionan ASP.NET request accessor (Request[...] / Request.QueryString) is spliced into a SQL string at a .NET sink (SqlCommand / .CommandText / EF FromSqlRaw) via interpolation, string.Format or concat — the attacker rewrites the query · CWE-89dataflow
Go path traversal / LFIa net/http request accessor (r.FormValue / r.URL) is the path of a Go file-read sink (os.Open / os.ReadFile / ioutil.ReadFile) — an attacker supplies ../../etc/passwd for arbitrary file read · CWE-22pattern
.NET path traversal / LFIan ASP.NET request accessor (Request[...] / Request.QueryString) is the path of a .NET file-read sink (File.ReadAllText / OpenRead / new StreamReader / new FileStream) — an attacker supplies ..\..\web.config for arbitrary file read · CWE-22pattern
Go open redirecta net/http request accessor (r.FormValue / r.URL.Query) is the target of http.Redirect — an attacker supplies https://evil.example to bounce the victim off your trusted domain (phishing / OAuth token theft) · CWE-601pattern
.NET open redirectan ASP.NET request accessor (Request[...] / Request.QueryString) is the target of Response.Redirect / the MVC Redirect helper — an attacker supplies https://evil.example to bounce the victim off your trusted domain (phishing / OAuth token theft) · CWE-601pattern
Go XSSa net/http request accessor (r.FormValue / r.URL.Query) is written unescaped into an HTML response (fmt.Fprintf(w, …) / w.Write / io.WriteString with markup) — the attacker's script runs in the victim's session (session theft / account takeover) · CWE-79pattern
.NET XSSan ASP.NET request accessor (Request[...] / Request.QueryString) is written unescaped to the response (Response.Write / Response.WriteAsync) — the attacker's script runs in the victim's session (session theft / account takeover) · CWE-79pattern
Go LDAP injectiona net/http request accessor (r.FormValue / r.URL.Query().Get / r.Header.Get) is built into an LDAP filter string (a `(uid=` literal via concat / fmt.Sprintf) searched by go-ldap — an attacker rewrites the filter (*)(uid=*))(|(uid=* to bypass auth or dump the directory · CWE-90pattern
.NET LDAP injectionan ASP.NET request accessor (Request[...] / Request.QueryString / Request.Form) is built into an LDAP filter string (a `(uid=` literal via concat / interpolation) run by a DirectorySearcher — an attacker rewrites the filter to bypass auth or dump the directory · CWE-90pattern
Go XPath injectiona net/http request accessor (r.FormValue / r.URL.Query().Get / r.Header.Get) is built into an XPath expression (a `//elem` / `[@attr=` literal at a go-xpath sink: xpath.Compile / htmlquery.Find / xmlquery.Find / node.SelectElements) — an attacker rewrites the query to bypass auth or read the whole document · CWE-643pattern
.NET XPath injectionan ASP.NET request accessor (Request[...] / Request.QueryString / Request.Form) is built into an XPath expression (a `//elem` / `[@attr=` literal at a .NET XPath sink: SelectNodes / SelectSingleNode / XPathNavigator.Select / XPathExpression.Compile) — an attacker rewrites the query to bypass auth or read the whole XML document · CWE-643pattern
Go template (SSTI)a net/http request accessor (r.FormValue / r.URL.Query().Get / r.Header.Get) becomes the template SOURCE of a template.New(...).Parse( chain (Go text/template · html/template) — the attacker controls the template itself (action injection, info disclosure) · CWE-1336pattern
.NET template (SSTI)an ASP.NET request accessor (Request[...] / Request.QueryString / Request.Form) becomes the template SOURCE of a Razor/Scriban compile sink (RunCompile / CompileRenderStringAsync / Razor.Parse / Template.Parse) — the attacker controls the template (Razor @{ } C# code = RCE) · CWE-1336pattern
Go log injectiona net/http request accessor (r.FormValue / r.URL.Query().Get / r.Header.Get) is concatenated with + into a Go log call (log.Printf / slog.Info / a logrus-zap logger) with no CR/LF stripping — an attacker forges log entries or poisons a SIEM parser · CWE-117pattern
.NET log injectionan ASP.NET request accessor (Request[...] / Request.QueryString / Request.Form) is concatenated (+) or $"..."-interpolated into a .NET log call (ILogger Log* / Console.WriteLine / Serilog) with no CR/LF stripping — an attacker forges log entries or poisons a SIEM · CWE-117pattern
Go zip-slipan archive entry name (zip/tar .Name) is joined with filepath.Join into a Go file-create sink (os.Create / os.OpenFile / os.MkdirAll) with no containment check — a crafted archive writes ../../ outside the target dir, an arbitrary file write / RCE · CWE-22pattern
.NET zip-slipa ZipArchiveEntry .FullName is joined with Path.Combine into a .NET extract sink (entry.ExtractToFile / new FileStream / File.Create) with no containment check — a crafted archive writes ../../ outside the target dir, an arbitrary file write / RCE · CWE-22pattern
Go weak randomnessa security-named value (token / OTP / session id / salt) is generated from the non-cryptographic math/rand package (Intn / Int63 / Uint64 / Perm) — the value is predictable, an account-takeover / reset-token-prediction risk · CWE-338pattern
.NET weak randomnessa security-named value (token / OTP / session id / salt) is generated from System.Random (new Random() / Random.Shared / rnd.Next*) — the value is predictable, an account-takeover / reset-token-prediction risk · CWE-338pattern
Go CORS misconfigurationa net/http handler sets the Access-Control-Allow-Origin response header to the caller's own Origin request header (w.Header().Set with r.Header.Get Origin) — any site is reflected as an allowed origin; with credentials this is a full same-origin bypass, account takeover · CWE-942pattern
.NET CORS misconfigurationan ASP.NET handler sets Access-Control-Allow-Origin to the caller's own Request.Headers Origin, or a Core CORS policy uses SetIsOriginAllowed(_ => true) with AllowCredentials() — any site gets a credentialed cross-origin response, account takeover · CWE-942pattern
Go NoSQL injectiona net/http request value reaches a MongoDB server-side-JS operator ($where / $function / $accumulator) or is parsed as an extended-JSON query document (bson.UnmarshalExtJSON) — attacker JavaScript runs in the database, or query operators are smuggled ({$ne:null} auth bypass, {$gt:''} dump) · CWE-943pattern
.NET NoSQL injectionan ASP.NET request value reaches a MongoDB server-side-JS operator ($where / $function / $accumulator) or is parsed as a BSON query document (BsonDocument.Parse) — attacker JavaScript runs in the database, or query operators are smuggled ({$ne:null} auth bypass) · CWE-943pattern
Go unrestricted uploada Go multipart upload's raw client .Filename (from multipart.FileHeader) is written to a path-built destination (os.Create / os.OpenFile / os.WriteFile) with no allow-list or generated name — the attacker drops shell.php / x.aspx into a servable directory → RCE · CWE-434pattern
.NET unrestricted uploada .NET multipart upload's raw client .FileName (from IFormFile / HttpPostedFile) is written to disk via SaveAs or a create sink (new FileStream / File.Create) on a path-built destination with no allow-list — the attacker drops shell.aspx into a servable directory → RCE · CWE-434pattern
Go unsafe reflectiona net/http request value names the Go plugin to load (plugin.Open) or the method to invoke (reflect MethodByName) — the attacker chooses which code runs: a plugin's init() executes (RCE) or an arbitrary method is called · CWE-470pattern
.NET unsafe reflectionan ASP.NET request value names the type/assembly to load (Type.GetType / Assembly.Load / Activator.CreateInstance) or the method to invoke (GetMethod / InvokeMember) — arbitrary class instantiation / method call → RCE · CWE-470pattern
LLM insecure code executionan LLM agent is handed an arbitrary-code executor (a Python REPL tool, a PAL chain, a pandas/csv/python code agent, or allow_dangerous_code=True) — a prompt-injected instruction becomes code the runner executes · OWASP LLM06 excessive agency → RCE · CWE-94pattern

Auth & secrets

15 gates
JWT auth bypassalg "none" / verification off · CWE-347pattern
JWT algorithm confusiona verify list accepts both an asymmetric (RS/ES) and a symmetric (HS) algorithm · sign with the public key as the HMAC secret · CWE-347pattern
Hardcoded JWT secretJWT signed with a string-literal key · token forgery · CWE-798pattern
Secretshardcoded provider credentialpattern
CSRF disabledforgery protection turned off app-wide · CWE-352pattern
Insecure session cookiesession/CSRF cookie with HttpOnly or Secure disabled · XSS theft / plain-HTTP leak · CWE-1004/614pattern
Hardcoded connection credentiala service password hardcoded in a connection URL (scheme://user:password@host) · anyone with repo read access gets the credential and rotation needs a redeploy · CWE-798pattern
Credential in a URLa hard-coded password in a URL authority (scheme://user:password@host on an http/ftp/ssh URL) · a real secret baked into the source: anyone with repo read access gets it and rotation needs a code change · CWE-798pattern
Framework session secreta web-framework session-signing secret (Django SECRET_KEY / Rails secret_key_base / Flask secret_key) hardcoded as a string literal · it signs sessions, CSRF tokens and password-reset tokens, and a committed key lets anyone with repo read access forge them · CWE-798pattern
Go JWT secret in codea Go JWT is signed with a string-literal HMAC key ([]byte(...) at token.SignedString, or a Parse keyfunc) — anyone who reads the source or guesses the short secret forges valid tokens → full authentication bypass · CWE-798pattern
.NET JWT secret in codea .NET JWT signing key is built from a string literal (SymmetricSecurityKey with Encoding.UTF8.GetBytes or Convert.FromBase64String) — anyone who reads the source or guesses the short secret forges valid tokens → full authentication bypass · CWE-798pattern
Go JWT algorithm confusiona golang-jwt jwt.WithValidMethods list accepts BOTH an asymmetric algorithm (RS/ES/PS — verified with a PUBLIC key) and a symmetric one (HS — verified with a SHARED secret) — an attacker forges an HS token signed with the server's public key as the HMAC secret and the server accepts it → full authentication bypass · CWE-347pattern
.NET JWT algorithm confusiona TokenValidationParameters.ValidAlgorithms list accepts BOTH an asymmetric algorithm (RS/ES/PS — verified with a PUBLIC key) and a symmetric one (HS — verified with a SHARED secret) — an attacker forges an HS token signed with the server's public key as the HMAC secret and the server accepts it → full authentication bypass · CWE-347pattern
Go insecure session cookiea Go session library disables a security flag on the session cookie — a gorilla/sessions Options with Secure or HttpOnly set false, or an scs SessionManager cookie with Secure or HttpOnly false — so the session cookie is JS-readable (XSS session theft) or rides plain HTTP (MITM) · CWE-1004/CWE-614pattern
.NET insecure session cookiea .NET auth/session cookie disables a security flag — an ASP.NET Core cookie SecurePolicy of None, or a classic ASP.NET forms auth with requireSSL turned off — so the auth cookie is sent over plain HTTP and a passive MITM reads the session · CWE-614pattern

Crypto & data

26 gates
Weak cryptobroken cipher / weak hash · CWE-327/328pattern
Static IV / noncecipher initialized with a zero/hardcoded IV · CBC prefix leak / CTR-GCM reuse break · CWE-329pattern
Hardcoded crypto keysymmetric key baked into the source as a literal · anyone with repo access decrypts every ciphertext · CWE-321pattern
Committed private keya complete PEM PRIVATE KEY block committed to the repo · anyone with repo read access extracts it (a TLS/SSH/signing key) → impersonation or forged tokens, and rotation forces a redeploy · CWE-321pattern
Insecure deserializationRCE via an untrusted object · CWE-502pattern
JSON polymorphic typingJackson enableDefaultTyping / activateDefaultTyping(LaissezFaire…) or fastjson AutoType · resolves an attacker-named class from the JSON @type · gadget chain → RCE · CWE-502pattern
Insecure randomnesssecurity token from a non-crypto RNG · predictable · CWE-338pattern
Zip sliparchive entry extracted to an attacker path · arbitrary file write · CWE-22pattern
Insecure temp filetempfile.mktemp() name-only temp · symlink race · CWE-377pattern
Transport TLScertificate verification disabled · CWE-295pattern
SSH host-key check offSSH host-key verification disabled (StrictHostKeyChecking no / AutoAddPolicy) · the client accepts any server key, so an active attacker can transparently man-in-the-middle the SSH session · CWE-295pattern
Timing-unsafe signature checkan HMAC/signature compared with == instead of a constant-time function · signature forgery · CWE-208pattern
gRPC cleartext channela gRPC channel built without transport credentials · insecure_channel / WithInsecure / createInsecure / usePlaintext · every RPC in plaintext · CWE-319pattern
Obsolete TLS versionan explicit pin/floor to a broken protocol · SSLv3 / TLS 1.0 / TLS 1.1 (POODLE, BEAST, RFC 8996) · a MITM downgrades and decrypts · CWE-327pattern
.NET obsolete TLS versiona .NET SslProtocols or SecurityProtocolType is pinned to a dead protocol version (SSL 2.0/3.0, TLS 1.0 or TLS 1.1) — .NET negotiates 1.2/1.3 by default, so this is a deliberate downgrade a MITM decrypts · CWE-326/CWE-327pattern
.NET gRPC cleartext channela .NET gRPC channel runs with transport security off — a Grpc.Core insecure credential, or a Grpc.Net.Client channel on a cleartext http (not https) address — so every RPC (auth metadata, PII) travels in plaintext for a MITM to read · CWE-319pattern
.NET hardcoded crypto keya .NET SymmetricAlgorithm Key is set to a literal value (an encoded string, a base64 constant, or a byte-array initializer) — anyone with repo read access decrypts every ciphertext and rotation needs a redeploy · CWE-321pattern
.NET static IVa .NET SymmetricAlgorithm IV is a fixed literal, or a zero buffer passed to the encryptor — a non-random IV breaks semantic security (CBC prefix leak, CTR/GCM nonce reuse) · CWE-329pattern
Weak key sizean RSA key is generated below 2048 bits (Node modulusLength / Python cryptography key_size / pycryptodome-Ruby RSA.new / PHP private_key_bits / Java RSAKeyGenParameterSpec) or a DSA key (withdrawn, FIPS 186-5) — factorable / forgeable, voiding every signature and key-exchange built on it · CWE-326pattern
Go weak key sizea Go RSA key is generated below 2048 bits (rsa.GenerateKey(rand.Reader, <2048)) or a deprecated crypto/dsa key — factorable / forgeable · CWE-326pattern
.NET weak key sizea .NET RSA key is generated below 2048 bits (new RSACryptoServiceProvider(<2048) / RSA.Create(<2048)) or a DSA key (DSACryptoServiceProvider / DSA.Create) — factorable / forgeable · CWE-326pattern
Weak elliptic curvea sub-224-bit / legacy elliptic curve is selected (secp192/160/128, prime192, sect163/193, NIST P-192/P-160) — under 112-bit security, forgeable · CWE-326pattern
Weak DH parametersDiffie-Hellman key-exchange parameters generated below 2048 bits (Node createDiffieHellman / Java DHGenParameterSpec / OpenSSL DH_generate_parameters) — Logjam-precomputable, exposing the shared secret and every derived session key · CWE-326pattern
Null / no-encryption ciphera NULL cipher performs NO encryption — Java NullCipher, a NULL TLS ciphersuite (*_WITH_NULL_*), or an OpenSSL eNULL/aNULL entry — data travels in cleartext while the code looks encrypted · CWE-327pattern
Insecure ECB cipher modea block cipher used in ECB (Electronic Codebook) mode — a `<cipher>/ECB` transform, Python MODE_ECB, .NET CipherMode.ECB, or an OpenSSL EVP_*_ecb cipher — encrypts each block independently, so identical plaintext blocks leak as identical ciphertext (the "ECB penguin"); use an authenticated mode (AES-GCM / ChaCha20-Poly1305) · CWE-327pattern
Insecure RSA paddingRSA encryption with textbook (NoPadding) or PKCS#1 v1.5 padding (a RSA/…/NoPadding or RSA/…/PKCS1Padding transform, or .NET RSAEncryptionPadding.Pkcs1) — textbook RSA is deterministic and malleable, PKCS#1 v1.5 is Bleichenbacher/ROBOT padding-oracle vulnerable; use RSA-OAEP · CWE-780pattern

Supply-chain & CI

2 gates
Supply-chainunpinned dependencypattern
CI/CDmutable action ref · pwn-requestpattern

Infra & containers

15 gates
Containerunpinned base imagepattern
IaC — open ingressSSH/DB open to 0.0.0.0/0 · CWE-284pattern
K8s — privileged workloadContainer→node escape · CWE-250pattern
CloudFormation exposureOpen ingress / unencrypted · CWE-284pattern
Insecure Electron configwebPreferences disables the renderer sandbox (nodeIntegration / contextIsolation / webSecurity) · renderer→main RCE · CWE-1188pattern
Actuator over-exposureSpring Boot Actuator opened to the web (exposure.include=* / management.security.enabled=false / shutdown enabled) · leaks env & heapdump, /shutdown & /jolokia reach RCE · CWE-200/668pattern
World-writable permissionsa file/dir created world-writable (chmod 0o777 / chmod 777 / setWritable(true,false)) · any local user can overwrite it → tampering / privilege escalation / RCE · CWE-732pattern
Debug mode in productionframework debug / verbose errors on in prod (Flask app.run(debug=True) · <compilation debug="true"> · ini_set('display_errors', on) · Symfony prod-debug) · the Werkzeug debugger console is RCE and stack traces leak the attack surface · CWE-489/209pattern
S3 public-write ACLa public-read-write S3 canned ACL · any anonymous internet user can overwrite or delete the bucket's objects (defacement, malware hosting, runaway cost) · CWE-284pattern
Azure Blob public accessan Azure blob container is opened to anonymous public access — a public access type of Blob or Container, or the account-level public-access master switch enabled — exposing the data to the whole internet (Azure blobs are private by default) · CWE-284pattern
GCS bucket public accessa Google Cloud Storage bucket or object is granted to the public members allUsers or allAuthenticatedUsers, or made public explicitly — exposing the data to the whole internet · CWE-284pattern
AWS RDS publicly accessiblean AWS managed database (RDS/Aurora/Redshift/DocumentDB/Neptune) is created with a public endpoint in app/SDK/CDK code — it becomes reachable from the whole internet, one credential-guess away from full data theft · CWE-284pattern
S3 public-access-block offan S3 Public Access Block control (block-public-acls / block-public-policy / ignore-public-acls / restrict-public-buckets) is set to false in app/SDK/CDK code — the guard that prevents accidental public S3 exposure is disabled · CWE-284pattern
Host-header auth offHost-header validation disabled (Django ALLOWED_HOSTS = ['*'] / Rails host authorization cleared) · an attacker sets the Host freely → web-cache poisoning and password-reset-link poisoning → account takeover · CWE-16pattern
Clickjacking (X-Frame-Options)X-Frame-Options set to ALLOWALL — not a valid directive, so the browser applies no framing protection and any origin can frame the page → clickjacking / UI-redress · CWE-1021pattern

Analysis depth

Two tiers, pinned to the shipped code: the dataflow list equals exactly the packs importing the shared taint engine. A promise that cannot be displayed without the code.
113

Pattern — calibrated fingerprints

An unambiguous vulnerability shape at line level, scoped out of the adjacent safe pattern (parameterized query, allow-listed field, escaped value). Calibrated to zero false positives on real production code before shipping.

11

Dataflow — source→sink taint

Follows a user value through variables and string-building to the sink, intra-function and inter-procedural. Fires only if it arrives unsanitized — a validation call, a guard, a function boundary clear it. The computation is local: only {file, line, kind} leaves the runner.

Who blocks, who reports

A repo's gate level is a server rule, the same one the isolation API applies — never a display setting. The free tier never breaks a build: the paywall fails open.
paid · slot

A slot assigned: all 124 gates block, full file:line locations. Public or private — the slot wins.firewallGateLevel → "paid" · firewallPacksEntitled = true

public · free

Open-source without a slot: only gate #1 (cross-tenant leak) blocks, full verdict; the other 123 stay advisory (count + sample).firewallGateLevel → "public" · gate #1 active, packs advisory

none · advisory

Private without a slot: all advisory. The Action reports, real count, never blocks. Enabling the Firewall on this repo lives on /ci.firewallGateLevel → "none" · fail-closed on any dirty value

// ci/action.yml — firewall-mode: off skips · advisory (default) reports, never blocks · gate fails the check on a hard leak — only if the repo has the gate (public or slot). Requires permissions: id-token: write — zero secret.

Layer ① — the slop check

The first layer of the same Action: a diff file (Markdown by default) graded into an advisory slop note — reported on the slop-gate / slop check, it never fails it; the Firewall is what blocks (the one Protect main requires). Score computed locally, no content leaves; only the config is served by gate-config, proven by OIDC.
SlopScore = 0.18·nominalization + 0.16·burstiness + 0.14·markers + 0.14·concreteness + 0.12·longword + 0.1·redundancy + 0.09·diversity + 0.07·entropy · formula v8 · reproducible hash
per-repo thresholdglobal defaultD bound = 60·gate-config returns source · fails open to the public constant
Reproduce a score by hand — GET /api/formula →

No source ever leaves

The structural fingerprint is computed on your machine. What reaches the server: shapes, never lines of code. The CI client is open-source and auditable.

OIDC · zero secret

GitHub Actions proves the repo via OIDC — no key in your repo. The threshold, the gate level and the verdict hang off it; an invalid token falls back to the public constants.

Fail-open, never a broken build

Neither a missing OIDC, a network outage nor an unreachable brain blocks. Blocking only exists with a reliable server verdict AND an entitled repo. A gate that cries wolf gets disabled in a week — ours doesn't cry.

The boundary, stated

We publish WHICH, never HOW — the classification brain stays server-side (the moat). The rules are public knowledge; what we sell is the ~0-false-positive detector on a real codebase, calibrated on 5,000+ real repos with a verified true positive per gate.

The gate loop · §45
01
Detect · the fingerprint, locally
02
Decide · the pure function, on your gate level
03
Verify · the block rate falls over time