RULES CATALOGUE
Every rule earns its place.
Each rule maps to a CWE and ships a vulnerable and a safe example. Filter by language, category, severity, or by how often AI coding tools generate it.
OWASP coverage → AI prevalence = how often Copilot / Cursor / Claude generate the anti-pattern by default
Dataflow analysis. 10 rules run in dataflow (taint) mode · OAuthLint traces untrusted input and sensitive data from source to a dangerous sink, catching multi-line bugs that pattern rules miss. See the proof →
271 rules
| RULE | SEVERITY | CATEGORY | AI | LANG |
|---|---|---|---|---|
| better-auth's CSRF / origin protection is explicitly disabled. | ● HIGH | betterauth | ● MEDIUM | js · ts |
| The better-auth secret is set to a hard-coded string literal. | ● HIGH | betterauth | ● HIGH | js · ts |
| better-auth is configured to issue insecure session cookies. | ● MEDIUM | betterauth | ● MEDIUM | js · ts |
| A fully-permissive wildcard appears in better-auth's trustedOrigins. | ● HIGH | betterauth | ● MEDIUM | js · ts |
| An auth-looking cookie is being set with a maxAge greater than 30 days. | ● LOW | cookie | ● MEDIUM | js · ts |
| A session/auth cookie is being set WITHOUT the HttpOnly flag. | ● MEDIUM | cookie | ● HIGH | js · ts |
| A session/auth cookie is being set WITHOUT the SameSite attribute. | ● LOW | cookie | ● MEDIUM | js · ts |
| A cookie that looks like a session or auth cookie is being set WITHOUT the Secure flag. | ● MEDIUM | cookie | ● HIGH | js · ts |
| A cookie is being set with SameSite=None but WITHOUT Secure. | ● MEDIUM | cookie | ● MEDIUM | js · ts |
| CORS is configured to allow the literal origin 'null'. | ● HIGH | cors | ● MEDIUM | js · ts |
| CORS is configured to echo the request's Origin back as Access-Control-Allow-Origin. | ● HIGH | cors | ● MEDIUM | js · ts |
| CORS is configured with Access-Control-Allow-Origin: * and Access-Control-Allow-Credentials: true at the same time. | ● HIGH | cors | ● HIGH | js · ts |
| A cookie is created with HttpOnly = false, making it readable from client-side JavaScript. | ● HIGH | csharp-cookie | ● MEDIUM | C# |
| A cookie is set to SameSite = SameSiteMode.None, which removes the SameSite defense and sends the cookie on cross-site requests. | ● MEDIUM | csharp-cookie | ● MEDIUM | C# |
| A cookie policy is set to SecurePolicy = CookieSecurePolicy.None, which lets authentication and session cookies be sent over plain HTTP. | ● HIGH | csharp-cookie | ● MEDIUM | C# |
| A CORS policy combines credentialed requests with a wildcard or reflected origin ( AllowCredentials() together with AllowAnyOrigin() or SetIsOriginAllowed(...) that returns true for everything). | ● HIGH | csharp-cors | ● HIGH | C# |
| A symmetric cipher is configured with CipherMode.ECB. | ● MEDIUM | csharp-crypto | ● MEDIUM | C# |
| A security-sensitive value is generated with System.Random or Guid.NewGuid() inside a token/secret/OTP generator. | ● HIGH | csharp-crypto | ● HIGH | C# |
| A password is hashed with a fast general-purpose digest ( MD5, SHA1, SHA256, SHA512) from System.Security.Cryptography. | ● HIGH | csharp-crypto | ● HIGH | C# |
| A redirect target comes straight from user input (a query-string value or a returnUrl-style parameter) and is passed to Redirect(...) without a local-URL check. | ● MEDIUM | csharp-flow | ● MEDIUM | C# |
| A JWT signing key is built from a hard-coded string literal ( new SymmetricSecurityKey(Encoding.UTF8.GetBytes("..."))). | ● HIGH | csharp-jwt | ● HIGH | C# |
| A JWT is decoded with a read-only API that performs NO validation ( new JwtSecurityToken(tokenString), handler.ReadJwtToken(...), or new JsonWebToken(tokenString)). | ● MEDIUM | csharp-jwt | ● HIGH | C# |
| A JWT setup sets RequireExpirationTime = false on TokenValidationParameters. | ● MEDIUM | csharp-jwt | ● MEDIUM | C# |
| A JWT setup sets RequireSignedTokens = false on TokenValidationParameters. | ● HIGH | csharp-jwt | ● MEDIUM | C# |
| A custom SignatureValidator on TokenValidationParameters returns a parsed token WITHOUT verifying its signature: it just constructs and returns new JwtSecurityToken(token) / new JsonWebToken(token). | ● HIGH | csharp-jwt | ● MEDIUM | C# |
| A JWT bearer setup disables audience validation ( ValidateAudience = false) on TokenValidationParameters. | ● HIGH | csharp-jwt | ● MEDIUM | C# |
| A JWT bearer setup disables issuer validation ( ValidateIssuer = false) on TokenValidationParameters. | ● HIGH | csharp-jwt | ● MEDIUM | C# |
| A JWT bearer setup disables lifetime validation ( ValidateLifetime = false) on TokenValidationParameters. | ● HIGH | csharp-jwt | ● MEDIUM | C# |
| A JWT bearer setup disables signature validation ( ValidateIssuerSigningKey = false) on TokenValidationParameters. | ● HIGH | csharp-jwt | ● MEDIUM | C# |
| An OAuth/OIDC client secret is assigned from a hard-coded string literal ( options.ClientSecret = "..."). | ● HIGH | csharp-oauth | ● HIGH | C# |
| An OpenID Connect handler turns PKCE off ( UsePkce = false). | ● HIGH | csharp-oauth | ● MEDIUM | C# |
| An OIDC/JWT bearer handler disables HTTPS for its metadata and token exchange ( RequireHttpsMetadata = false). | ● HIGH | csharp-oauth | ● MEDIUM | C# |
| TLS server-certificate validation is turned off: the handler accepts any certificate via DangerousAcceptAnyServerCertificateValidator or a callback that always returns true. | ● HIGH | csharp-tls | ● HIGH | C# |
| The middleware pipeline calls UseAuthorization() BEFORE UseAuthentication(). | ● HIGH | csharp-web | ● MEDIUM | C# |
| An authentication/authorization middleware does nothing but call next(). | ● HIGH | express | ● MEDIUM | js · ts |
| An Express session cookie is explicitly configured as insecure. | ● MEDIUM | express | ● MEDIUM | js · ts |
cookie-parser is initialised with a hard-coded string secret (cookieParser('some-secret')). | ● HIGH | express | ● MEDIUM | js · ts |
| A Helmet security header is explicitly turned off. | ● MEDIUM | express | ● MEDIUM | js · ts |
| A static file handler is configured with dotfiles: 'allow', which serves dotfiles from the mounted directory. | ● HIGH | express | ● LOW | js · ts |
| Express is configured to trust EVERY proxy ( app.set('trust proxy', true) or the equivalent app.enable('trust proxy')). | ● MEDIUM | express | ● MEDIUM | js · ts |
@fastify/cookie, @fastify/session, or @fastify/secure-session is registered with a hard-coded secret string literal. | ● HIGH | fastify | ● HIGH | js · ts |
@fastify/cors is registered with a wildcard/reflected origin (origin: '*' or origin: true) together with credentials: true. | ● HIGH | fastify | ● MEDIUM | js · ts |
@fastify/jwt is registered with a hard-coded secret string literal. | ● HIGH | fastify | ● HIGH | js · ts |
| Fastify is created with trustProxy: true, which trusts EVERY proxy. | ● MEDIUM | fastify | ● MEDIUM | js · ts |
| HTTP Basic credentials flow into a logging call ( console.* or logger.*). | ● HIGH | flow | ● MEDIUM | js · ts |
| A secret credential is placed in a URL query string. | ● HIGH | flow | ● HIGH | js · ts |
Math.random() produces a value whose name marks it as security-sensitive. | ● HIGH | flow | ● HIGH | js · ts |
| A /login, /signin, /auth, or /reset-password POST handler is registered without any rate-limit middleware in scope. | ● LOW | flow | ● HIGH | js · ts |
| An OAuth/OIDC credential from the request flows into a logging call. | ● HIGH | flow | ● MEDIUM | js · ts |
| auth.flow.open-redirect
DATAFLOW
Untrusted request input flows into a redirect destination. | ● HIGH | flow | ● HIGH | js · ts |
| A password validation schema is enforcing a minimum length of less than 8 characters. | ● MEDIUM | flow | ● MEDIUM | js · ts |
| A user-supplied password is being persisted WITHOUT being hashed first. | ● HIGH | flow | ● MEDIUM | js · ts |
| A secret-shaped value is passed to a logging call. | ● MEDIUM | flow | ● HIGH | js · ts |
| auth.flow.secret-in-response
DATAFLOW
A server-side secret read from process.env flows into an HTTP response body. | ● HIGH | flow | ● HIGH | js · ts |
| auth.flow.ssrf
DATAFLOW
Untrusted request input flows into the URL of an outbound HTTP request. | ● HIGH | flow | ● HIGH | js · ts |
| A secret-shaped value ( password, token, secret, apiKey, csrf, hmac) is being compared with === / !== / string1 == string2. | ● MEDIUM | flow | ● MEDIUM | js · ts |
| A bcrypt cost factor below 10 was used. | ● MEDIUM | flow | ● MEDIUM | js · ts |
| A password is being hashed with a fast, general-purpose hash (MD5/SHA-1/SHA-256/SHA-512 via crypto.createHash). | ● HIGH | flow | ● HIGH | js · ts |
| A Gin auth/session cookie is written with secure or httpOnly set to a literal false. | ● HIGH | go-cookie | ● HIGH | go |
| A session/auth http.Cookie is created with a security attribute explicitly disabled (Secure: false or HttpOnly: false). | ● HIGH | go-cookie | ● HIGH | go |
| CORS is configured to allow every origin with the wildcard *. | ● HIGH | go-cors | ● HIGH | go |
| An Echo CORS middleware is configured to allow every origin with the wildcard "*". | ● HIGH | go-cors | ● HIGH | go |
| A Fiber CORS middleware is configured with the wildcard origin "*". | ● HIGH | go-cors | ● HIGH | go |
bcrypt.GenerateFromPassword is called with a cost factor below 10. | ● MEDIUM | go-crypto | ● MEDIUM | go |
| A broken or deprecated block/stream cipher is used to protect data. | ● HIGH | go-crypto | ● MEDIUM | go |
| A password is being hashed with a fast, general-purpose digest from the Go standard library (MD5, SHA-1, SHA-256, SHA-512). | ● HIGH | go-crypto | ● HIGH | go |
| An OAuth/OIDC credential from the HTTP request flows into a logging call. | ● HIGH | go-flow | ● MEDIUM | go |
| auth.go.flow.open-redirect
DATAFLOW
Untrusted request data flows into an HTTP redirect destination. | ● HIGH | go-flow | ● HIGH | go |
| auth.go.flow.secret-in-response
DATAFLOW
A server-side secret read from the environment flows into an HTTP response body, leaking it to the client. | ● HIGH | go-flow | ● HIGH | go |
| auth.go.flow.ssrf
DATAFLOW
Untrusted request data flows into the URL of an outbound HTTP request. | ● HIGH | go-flow | ● HIGH | go |
| A security-sensitive value is being generated with the math/rand package. | ● HIGH | go-flow | ● HIGH | go |
| The Echo JWT middleware ( labstack/echo-jwt) is configured with a hardcoded string-literal SigningKey. | ● HIGH | go-jwt | ● HIGH | go |
| The Fiber JWT middleware ( gofiber/contrib/jwt) is configured with a hardcoded string-literal signing key (SigningKey: jwtware.SigningKey{Key: []byte("...")}). | ● HIGH | go-jwt | ● HIGH | go |
| A JWT HMAC signing/verification key is hardcoded as a string literal in a call to golang-jwt. | ● HIGH | go-jwt | ● HIGH | go |
| A JWT is created or accepted with the none algorithm, which produces an unsigned token. | ● HIGH | go-jwt | ● HIGH | go |
| A JWT is decoded with ParseUnverified, which parses the token WITHOUT checking its signature. | ● HIGH | go-jwt | ● HIGH | go |
| A JWT parser turns off registered-claims validation with jwt.WithoutClaimsValidation(). | ● MEDIUM | go-jwt | ● MEDIUM | go |
| A JWT Keyfunc returns the verification key without checking token.Method, enabling algorithm confusion. | ● HIGH | go-jwt | ● HIGH | go |
| Untrusted request input flows into the verification key returned by a golang-jwt Keyfunc (or into the WithValidMethods allowlist). | ● HIGH | go-jwt | ● LOW | go |
| An oauth2.Config is built with a hardcoded string-literal ClientSecret. | ● HIGH | go-oauth | ● MEDIUM | go |
| An OAuth/OIDC endpoint is being contacted over cleartext http://. | ● HIGH | go-oauth | ● MEDIUM | go |
| OAuth token request uses the Resource Owner Password Credentials grant ( grant_type=password). | ● HIGH | go-oauth | ● MEDIUM | go |
| OAuth authorization request is built with a hardcoded, constant state value. | ● MEDIUM | go-oauth | ● MEDIUM | go |
| A gorilla/sessions or securecookie store is initialized with a hardcoded string-literal key. | ● HIGH | go-session | ● HIGH | go |
| A tls.Config sets InsecureSkipVerify: true, disabling TLS certificate verification. | ● HIGH | go-tls | ● HIGH | go |
| A tls.Config is created with MinVersion pinned to an obsolete protocol: SSL 3.0, TLS 1.0, or TLS 1.1. | ● HIGH | go-tls | ● MEDIUM | go |
| A session/auth cookie is set with Hono's setCookie(c, name, value, ...) helper WITHOUT the Secure flag, or with secure/httpOnly explicitly disabled. | ● MEDIUM | hono | ● MEDIUM | js · ts |
| Hono's cors() middleware is given an origin function that reflects the caller's origin straight back (origin: (origin) => origin) together with credentials: true. | ● HIGH | hono | ● MEDIUM | js · ts |
| Hono's jwt() middleware from hono/jwt is configured with a hard-coded secret string literal. | ● HIGH | hono | ● HIGH | js · ts |
| A servlet Cookie is created with a security attribute explicitly disabled. | ● HIGH | java-cookie | ● HIGH | java |
| CORS is configured to allow every origin with the wildcard *. | ● HIGH | java-cors | ● HIGH | java |
| CORS is configured to allow any origin together with credentials. | ● HIGH | java-cors | ● MEDIUM | java |
| A JCA Cipher is being created in ECB mode (or with a bare algorithm alias that defaults to ECB). | ● HIGH | java-crypto | ● MEDIUM | java |
| A security-sensitive value (token, secret, key, password, nonce, OTP, or salt) is generated with a non-cryptographic PRNG. | ● HIGH | java-crypto | ● HIGH | java |
| Spring stores passwords with no hashing. | ● HIGH | java-crypto | ● HIGH | java |
| A broken hash algorithm (MD5 or SHA-1) is being instantiated via JCA MessageDigest.getInstance(...). | ● MEDIUM | java-crypto | ● MEDIUM | java |
| A password is being hashed with a fast, general-purpose digest from the JCA MessageDigest (MD5, SHA-1, SHA-256, SHA-512). | ● HIGH | java-crypto | ● HIGH | java |
| Untrusted request input flows into the URL of an outbound HTTP request. | ● HIGH | java-flow | ● HIGH | java |
| A JWT signing key is hard-coded as a string literal (CWE-798). | ● HIGH | java-jwt | ● HIGH | java |
| This JWT is verified for signature but its intended-recipient claims are never asserted: the Auth0 JWT.require(alg)...build() verifier pins no withIssuer(...)/withAudience(...), or the jjwt parser sets a signature key but pins no requireIssuer(...)/requireAudience(...). | ● MEDIUM | java-jwt | ● MEDIUM | java |
| A JWT is created or verified with the none algorithm, which means there is no signature at all. | ● HIGH | java-jwt | ● MEDIUM | java |
| This JWT is created or parsed without a signature, so its contents are neither authenticated nor tamper-proof (CWE-347). | ● HIGH | java-jwt | ● MEDIUM | java |
| Untrusted request input flows into the JWT verification key. | ● HIGH | java-jwt | ● LOW | java |
| An OAuth 2.0 client secret is hard-coded as a string literal in a Spring Security ClientRegistration builder (.clientSecret("...")). | ● MEDIUM | java-oauth | ● MEDIUM | java |
| An OAuth/OIDC endpoint is being contacted over cleartext http://. | ● HIGH | java-oauth | ● MEDIUM | java |
| OAuth token request uses the Resource Owner Password Credentials grant ( grant_type=password). | ● HIGH | java-oauth | ● MEDIUM | java |
| OAuth authorization request sends a hardcoded, constant state value. | ● MEDIUM | java-oauth | ● MEDIUM | java |
| Spring Security session fixation protection is disabled via sessionFixation().none(). | ● HIGH | java-session | ● MEDIUM | java |
| TLS hostname verification is disabled. | ● HIGH | java-tls | ● HIGH | java |
| Spring Security CSRF protection is disabled. | ● HIGH | java-web | ● HIGH | java |
| Spring Security's X-Frame-Options header is disabled. | ● MEDIUM | java-web | ● MEDIUM | java |
| Spring Security authorizes every request without authentication via anyRequest().permitAll(). | ● HIGH | java-web | ● HIGH | java |
| Spring Security grants permitAll() to a sensitive management path. | ● MEDIUM | java-web | ● MEDIUM | java |
| Spring excludes all paths from the security filter chain. | ● HIGH | java-web | ● MEDIUM | java |
| Spring permits every request via a catch-all matcher. | ● HIGH | java-web | ● HIGH | java |
| JWTs are being verified with the none algorithm in the allowed list. | ● HIGH | jwt | ● HIGH | js · ts |
| A JWT is being verified with HS256 (a symmetric algorithm) but the key looks like an RSA / EC public key in PEM format. | ● HIGH | jwt | ● MEDIUM | js · ts |
jwt.decode() from jsonwebtoken only parses the token. | ● MEDIUM | jwt | ● HIGH | js · ts |
ignoreExpiration: true in a jsonwebtoken verify() call disables the exp claim check. | ● MEDIUM | jwt | ● HIGH | js · ts |
| A JWT-looking value (header eyJ…) appears in a URL query string or fragment. | ● HIGH | jwt | ● MEDIUM | js · ts |
| A JWT (or other auth token) is being written to localStorage. | ● MEDIUM | jwt | ● HIGH | js · ts |
jwt.verify(...) is called without an explicit algorithms allowlist. | ● MEDIUM | jwt | ● HIGH | js · ts |
| JWT is being verified without checking the aud (audience) claim. | ● MEDIUM | jwt | ● MEDIUM | js · ts |
| JWT is signed without any expiresIn / exp claim, OR a token is verified without an maxAge check. | ● MEDIUM | jwt | ● HIGH | js · ts |
| JWT is being verified without checking the iss (issuer) claim. | ● LOW | jwt | ● LOW | js · ts |
| Untrusted request input flows into the verification key or the algorithms allowlist of jwt.verify(...). | ● HIGH | jwt | ● LOW | js · ts |
| JWT signing or verification uses a hard-coded secret. | ● HIGH | jwt | ● HIGH | js · ts |
| An authentication / OAuth endpoint is called over cleartext http://. | ● MEDIUM | kotlin-android | ● MEDIUM | Kotlin |
| An OAuth client secret / API key / password is assigned from a hard-coded string literal. | ● HIGH | kotlin-android | ● HIGH | Kotlin |
| An AppAuth AuthorizationRequest.Builder explicitly disables PKCE with .setCodeVerifier(null). | ● MEDIUM | kotlin-android | ● LOW | Kotlin |
| An auth token / secret is written to plain SharedPreferences (prefs.edit().putString("auth_token", ...)). | ● HIGH | kotlin-android | ● HIGH | Kotlin |
| An OAuth authorization URL is loaded inside an in-app WebView (webView.loadUrl("...authorize?client_id=...")). | ● MEDIUM | kotlin-android | ● HIGH | Kotlin |
| A WebViewClient.onReceivedSslError(...) handler calls handler.proceed(), telling the WebView to ignore a TLS certificate error and load the page anyway. | ● HIGH | kotlin-android | ● MEDIUM | Kotlin |
| A Ktor session cookie is configured without cookie.secure = true, so the browser will send it over plain HTTP as well as HTTPS. | ● MEDIUM | kotlin-cookie | ● MEDIUM | Kotlin |
| A Ktor CORS configuration combines anyHost() with allowCredentials = true. | ● HIGH | kotlin-cors | ● HIGH | Kotlin |
| A JWT signer or verifier is built with Algorithm.none(), the unsecured algorithm that produces (and accepts) tokens with no signature. | ● HIGH | kotlin-jwt | ● MEDIUM | Kotlin |
| A JWT is decoded but its signature is never verified. | ● MEDIUM | kotlin-jwt | ● HIGH | Kotlin |
| This JWT verifier checks the signature but never asserts the token's intended recipient: the Auth0 JWT.require(alg)...build() chain pins no .withIssuer(...) and no .withAudience(...). | ● MEDIUM | kotlin-jwt | ● MEDIUM | Kotlin |
| A JWT signing key is built from a hard-coded string literal ( Algorithm.HMAC256("...")). | ● HIGH | kotlin-secret | ● HIGH | Kotlin |
| This MCP StreamableHTTPServerTransport is created without DNS-rebinding protection (CWE-346). | ● HIGH | mcp | ● HIGH | js · ts |
| This MCP server enforces bearer auth via requireBearerAuth(...) but passes no resourceMetadataUrl. | ● MEDIUM | mcp | ● HIGH | js · ts |
| This MCP StreamableHTTPServerTransport derives its session id from a predictable source: Date.now(), Math.random(), or an incrementing counter (CWE-330). | ● MEDIUM | mcp | ● MEDIUM | js · ts |
| An MCP server forwards the INCOMING caller token to an upstream API (token pass-through). | ● HIGH | mcp | ● HIGH | js · ts |
| An argument of an MCP tool handler ( server.registerTool / server.tool) flows into an outbound HTTP request without validation, a server-side request forgery (SSRF, CWE-918). | ● HIGH | mcp | ● HIGH | js · ts |
| This MCP transport is mounted on an Express route with NO auth middleware. | ● HIGH | mcp | ● HIGH | js · ts |
| NestJS app.enableCors() is configured with a wildcard/reflected origin (origin: '*' or origin: true) together with credentials: true. | ● HIGH | nestjs | ● MEDIUM | js · ts |
| A NestJS guard's canActivate returns a constant true. | ● HIGH | nestjs | ● MEDIUM | js · ts |
| A NestJS JwtModule is configured with a hard-coded secret (or secretOrPrivateKey) string literal. | ● HIGH | nestjs | ● HIGH | js · ts |
| The NextAuth/Auth.js authorized callback returns true unconditionally. | ● HIGH | nextauth | ● HIGH | js · ts |
| A NextAuth/Auth.js custom cookie is configured as insecure. | ● MEDIUM | nextauth | ● MEDIUM | js · ts |
| The NextAuth/Auth.js config hard-codes debug: true. | ● MEDIUM | nextauth | ● MEDIUM | js · ts |
| The NextAuth/Auth.js secret is set to a hard-coded string literal. | ● HIGH | nextauth | ● HIGH | js · ts |
| The NextAuth/Auth.js redirect callback returns the incoming url without validating it against baseUrl. | ● HIGH | nextauth | ● HIGH | js · ts |
| The NextAuth/Auth.js session callback copies an OAuth token onto the session object. | ● MEDIUM | nextauth | ● MEDIUM | js · ts |
| An OAuth access_token (or refresh_token / id_token) is placed in a URL query string. | ● MEDIUM | oauth | ● MEDIUM | js · ts |
| OAuth scope request includes an over-broad scope such as admin, full_access, *, or repo (entire GitHub access). | ● LOW | oauth | ● HIGH | js · ts |
| An OAuth client_secret (or similarly sensitive credential) is being assigned a hard-coded string literal. | ● HIGH | oauth | ● HIGH | js · ts |
| OAuth implicit flow is deprecated by the OAuth 2.0 Security BCP (RFC 9700) and the OAuth 2.1 draft. | ● HIGH | oauth | ● MEDIUM | js · ts |
| An OAuth/OIDC endpoint is being contacted over cleartext http://. | ● HIGH | oauth | ● MEDIUM | js · ts |
| An OAuth token-lifetime field is set to a literal value longer than 24 hours. | ● MEDIUM | oauth | ● MEDIUM | js · ts |
| OIDC authorization request (scope contains openid) is being built WITHOUT a nonce parameter. | ● MEDIUM | oauth | ● MEDIUM | js · ts |
| OAuth authorization request from a public client omits the PKCE code_challenge parameter. | ● MEDIUM | oauth | ● HIGH | js · ts |
| OAuth 2.0 authorization request is being built WITHOUT a state parameter. | ● HIGH | oauth | ● HIGH | js · ts |
| OAuth callback handler reads state from the request but never compares it to a stored value. | ● MEDIUM | oauth | ● HIGH | js · ts |
| auth.oauth.open-redirect-callback
DATAFLOW
The OAuth callback handler redirects to a URL taken straight from the request without validating it. | ● HIGH | oauth | ● HIGH | js · ts |
| PKCE is configured with code_challenge_method=plain. | ● MEDIUM | oauth | ● MEDIUM | js · ts |
| OAuth token request uses the Resource Owner Password Credentials grant ( grant_type=password). | ● HIGH | oauth | ● MEDIUM | js · ts |
| OAuth authorization request sends a hardcoded, constant state value. | ● MEDIUM | oauth | ● MEDIUM | js · ts |
| An OAuth/OIDC token is written to localStorage / sessionStorage, readable by any script on the origin. | ● MEDIUM | oauth | ● HIGH | js · ts |
| OAuth redirect_uri allow-list contains a wildcard, an http:// URL, or localhost. | ● HIGH | oauth | ● MEDIUM | js · ts |
| A passport-jwt strategy is configured with ignoreExpiration: true. | ● MEDIUM | passport | ● MEDIUM | js · ts |
| An authentication-related cookie is set without the Secure and/or HttpOnly flags (or with SameSite=None). | ● MEDIUM | php-cookie | ● HIGH | PHP |
| A Laravel session config hard-codes an insecure cookie flag: 'secure' => false, 'http_only' => false, or 'same_site' => 'none'. | ● MEDIUM | php-cookie | ● MEDIUM | PHP |
| This endpoint sends Access-Control-Allow-Credentials: true together with an Access-Control-Allow-Origin that is either the wildcard * or the request's own Origin reflected back unchecked. | ● MEDIUM | php-cors | ● MEDIUM | PHP |
| A Laravel Socialite OAuth flow calls ->stateless(), which disables the state parameter that ties the redirect to the user's session. | ● MEDIUM | php-flow | ● MEDIUM | PHP |
| A JWT payload is read by hand ( json_decode(base64_decode($parts[1])) on the second dot-segment of a token) without ever verifying the signature. | ● HIGH | php-jwt | ● HIGH | PHP |
| A JWT is configured with an unsecured / none signer, e.g. Configuration::forUnsecuredSigner() or new Signer\None() (lcobucci/jwt), or the 'none' algorithm passed to JWT::encode() / new Key(...) (firebase/php-jwt). | ● HIGH | php-jwt | ● MEDIUM | PHP |
| A JWT signing key is a hard-coded string literal, passed to JWT::encode() / new Key() (firebase/php-jwt) or InMemory::plainText() / InMemory::base64Encoded() (lcobucci/jwt). | ● HIGH | php-secret | ● HIGH | PHP |
| A PHP session hardening flag is turned off at runtime with ini_set(): session.cookie_httponly, session.cookie_secure, or session.use_only_cookies set to 0 / '0' / false. | ● MEDIUM | php-session | ● MEDIUM | PHP |
| A session/auth cookie is issued with a security attribute explicitly disabled. | ● HIGH | py-cookie | ● HIGH | python |
| Flask-CORS allows any origin while credentials are enabled. | ● HIGH | py-cors | ● MEDIUM | python |
| FastAPI CORS allows any origin with credentials. | ● HIGH | py-cors | ● HIGH | python |
| A symmetric cipher is configured in ECB mode. | ● MEDIUM | py-crypto | ● MEDIUM | python |
| passlib configured with a weak or plaintext password scheme. | ● HIGH | py-crypto | ● MEDIUM | python |
| django-cors-headers is configured to allow every origin, disabling cross-origin access control. | ● MEDIUM | py-django | ● MEDIUM | python |
| DRF disables authentication globally with an empty DEFAULT_AUTHENTICATION_CLASSES list. | ● HIGH | py-drf | ● MEDIUM | python |
| DRF makes every endpoint public because DEFAULT_PERMISSION_CLASSES is set to AllowAny. | ● HIGH | py-drf | ● HIGH | python |
| A DRF view disables authentication with an empty authentication_classes list. | ● HIGH | py-drf | ● MEDIUM | python |
| A FastAPI security dependency ( Security(...), an API-key scheme such as APIKeyHeader/APIKeyQuery/APIKeyCookie, or an OAuth2 bearer scheme) injects a credential that is then compared against a hard-coded string literal. | ● HIGH | py-fastapi | ● MEDIUM | python |
| A FastAPI HTTP Basic auth dependency compares the request's username or password against a hard-coded string literal. | ● HIGH | py-fastapi | ● HIGH | python |
| Starlette's SessionMiddleware is configured with a hard-coded secret_key string literal. | ● HIGH | py-fastapi | ● HIGH | python |
| Starlette's TrustedHostMiddleware is added but configured to trust every Host header (allowed_hosts=["*"], or a list that contains "*"). | ● MEDIUM | py-fastapi | ● MEDIUM | python |
| A Flask cookie security flag is disabled through app.config, weakening session and remember-me cookie protection. | ● HIGH | py-flask | ● MEDIUM | python |
| A Django view disables CSRF protection. | ● MEDIUM | py-flow | ● HIGH | python |
| Debug mode is hard-coded to True. | ● MEDIUM | py-flow | ● HIGH | python |
| A security-sensitive value is being generated with the random module. | ● HIGH | py-flow | ● HIGH | python |
| An OAuth/OIDC credential from the request flows into a logging call. | ● HIGH | py-flow | ● MEDIUM | python |
| auth.py.flow.open-redirect
DATAFLOW
Untrusted request data flows into a Flask redirect(...) without validation, an open redirect (CWE-601). | ● HIGH | py-flow | ● HIGH | python |
| A requests call disables TLS certificate verification with verify=False. | ● HIGH | py-flow | ● HIGH | python |
| auth.py.flow.secret-in-response
DATAFLOW
A server-side secret read from the environment flows into an HTTP response sent back to the client, leaking it (CWE-200). | ● HIGH | py-flow | ● HIGH | python |
| auth.py.flow.ssrf
DATAFLOW
Untrusted request data flows into an outbound HTTP request without validation, a Server-Side Request Forgery (SSRF, CWE-918). | ● HIGH | py-flow | ● HIGH | python |
| A password is being hashed with a fast, general-purpose digest from hashlib (MD5, SHA-1, SHA-256, SHA-512). | ● HIGH | py-flow | ● HIGH | python |
| A JWT is decoded or signed with the none algorithm. | ● HIGH | py-jwt | ● HIGH | python |
| A JWT is decoded with an algorithms allowlist that mixes an HMAC algorithm with an asymmetric one. | ● HIGH | py-jwt | ● MEDIUM | python |
| A JWT signing/verification key is hardcoded as a string literal in the call to PyJWT. | ● HIGH | py-jwt | ● HIGH | python |
| A JWT is decoded with a verification key but WITHOUT an explicit algorithms allowlist. | ● MEDIUM | py-jwt | ● HIGH | python |
| A JWT is decoded with options={"verify_exp": False}, which turns off PyJWT's exp (expiration) check. | ● MEDIUM | py-jwt | ● HIGH | python |
| A JWT is decoded with signature verification disabled. | ● HIGH | py-jwt | ● HIGH | python |
| Untrusted request input flows into the verification key or the algorithms allowlist of jwt.decode(...) (PyJWT / python-jose). | ● HIGH | py-jwt | ● LOW | python |
| PyJWT decode disables audience or issuer checks. | ● MEDIUM | py-jwt | ● MEDIUM | python |
| This FastMCP server binds to 0.0.0.0 and serves a network transport (streamable-http / SSE) without DNS-rebinding protection (CWE-346). | ● MEDIUM | py-mcp | ● MEDIUM | python |
| This MCP server enables auth via AuthSettings(...) but never sets resource_server_url. | ● MEDIUM | py-mcp | ● HIGH | python |
| An MCP server forwards the INCOMING caller token to an upstream API (token pass-through). | ● HIGH | py-mcp | ● HIGH | python |
| An argument of an MCP tool handler ( @mcp.tool()) flows into an outbound HTTP request without validation, a server-side request forgery (SSRF, CWE-918). | ● HIGH | py-mcp | ● HIGH | python |
| This MCP server is exposed over a NETWORK transport (streamable-http / SSE) but was constructed with no authentication: no auth= and no token_verifier=. | ● HIGH | py-mcp | ● HIGH | python |
| An OAuth client secret is passed as a string literal to the OAuth client. | ● HIGH | py-oauth | ● HIGH | python |
| An OAuth/OIDC endpoint is being contacted over cleartext http://. | ● HIGH | py-oauth | ● MEDIUM | python |
OAUTHLIB_INSECURE_TRANSPORT is set, disabling oauthlib's HTTPS requirement for OAuth flows. | ● HIGH | py-oauth | ● HIGH | python |
| OAuth token request uses the Resource Owner Password Credentials grant ( grant_type=password). | ● HIGH | py-oauth | ● MEDIUM | python |
| OAuth authorization request sends a hardcoded, constant state value. | ● MEDIUM | py-oauth | ● MEDIUM | python |
| An OAuth client fetches or refreshes a token with TLS certificate verification disabled ( verify=False). | ● HIGH | py-oauth | ● MEDIUM | python |
| The Django SECRET_KEY is set to a hard-coded string literal in settings. | ● HIGH | py-secret | ● HIGH | python |
| The Flask SECRET_KEY (used to sign session cookies and CSRF tokens) is set to a hard-coded string literal. | ● HIGH | py-secret | ● HIGH | python |
| The Rails cookie session store is configured with secure: false or httponly: false. | ● MEDIUM | ruby-cookie | ● MEDIUM | Ruby |
| A rack-cors allow block combines origins '*' with credentials: true. | ● MEDIUM | ruby-cors | ● HIGH | Ruby |
| A JWT is encoded or decoded with the none algorithm, which produces (and accepts) unsigned tokens. | ● HIGH | ruby-jwt | ● MEDIUM | Ruby |
JWT.decode is called with its third positional argument set to false, which disables signature verification entirely. | ● HIGH | ruby-jwt | ● HIGH | Ruby |
JWT.decode is called with verification enabled (true) but no algorithm: / algorithms: option, so the library trusts whatever alg the token header names. | ● MEDIUM | ruby-jwt | ● HIGH | Ruby |
| A Doorkeeper (OAuth provider) initializer weakens a core protection: force_ssl_in_redirect_uri false allows plaintext http:// redirect URIs (authorization codes/tokens travel in cleartext and are open to interception/redirect tampering, CWE-601); allow_blank_redirect_uri true accepts clients with no registered redirect URI; and an unconditional skip_authorization do true end auto-approves EVERY client with no user consent. | ● MEDIUM | ruby-oauth | ● MEDIUM | Ruby |
| OmniAuth is configured to accept GET requests on the request phase ( allowed_request_methods includes :get, or silence_get_warning is set to true). | ● MEDIUM | ruby-oauth | ● MEDIUM | Ruby |
| An OmniAuth provider is configured with provider_ignores_state: true, which disables verification of the OAuth state parameter on the callback. | ● HIGH | ruby-oauth | ● MEDIUM | Ruby |
| The HMAC key passed to JWT.encode / JWT.decode is a hard-coded string literal. | ● HIGH | ruby-secret | ● HIGH | Ruby |
| A Rails secret_key_base / secret_key is assigned a hard-coded string literal. | ● HIGH | ruby-secret | ● MEDIUM | Ruby |
| A Rails controller disables CSRF protection with skip_before_action :verify_authenticity_token. | ● MEDIUM | ruby-session | ● HIGH | Ruby |
| A session/auth cookie is built with a security attribute explicitly disabled ( secure(false) or http_only(false)). | ● HIGH | rust-cookie | ● HIGH | rust |
| A wide-open CORS policy is configured. | ● HIGH | rust-cors | ● MEDIUM | rust |
bcrypt::hash (or bcrypt::hash_with_result) is called with a cost factor below 10. | ● MEDIUM | rust-crypto | ● MEDIUM | rust |
| A broken or deprecated cipher from the RustCrypto ecosystem is used to protect data. | ● HIGH | rust-crypto | ● MEDIUM | rust |
| A password is hashed with a fast, general-purpose digest unsuitable for password storage. | ● HIGH | rust-crypto | ● HIGH | rust |
| Untrusted request input flows into the URL of an outbound HTTP request. | ● HIGH | rust-flow | ● HIGH | rust |
| A secret-shaped value ( password, token, secret, apikey, hmac, signature, mac, digest) is being compared with == / !=. | ● MEDIUM | rust-flow | ● MEDIUM | rust |
| A jsonwebtoken Validation accepts both HMAC and asymmetric algorithms, enabling algorithm confusion. | ● HIGH | rust-jwt | ● MEDIUM | rust |
Validation::insecure_disable_signature_validation() turns off JWT signature verification. | ● HIGH | rust-jwt | ● MEDIUM | rust |
| A JWT HMAC signing/verification key is hardcoded as a literal. | ● HIGH | rust-jwt | ● HIGH | rust |
| JWT audience ( aud) validation is disabled by setting validate_aud: false on the jsonwebtoken Validation. | ● MEDIUM | rust-jwt | ● MEDIUM | rust |
| JWT expiration validation is turned off by setting validate_exp: false on the jsonwebtoken Validation. | ● HIGH | rust-jwt | ● MEDIUM | rust |
| A JWT is decoded with a jsonwebtoken Validation that never sets the expected issuer. | ● MEDIUM | rust-jwt | ● MEDIUM | rust |
| An OAuth client_secret is hardcoded as a string literal and passed to the oauth2 crate's ClientSecret::new(...). | ● HIGH | rust-oauth | ● HIGH | rust |
| An OAuth/OIDC endpoint is being contacted over cleartext http://. | ● HIGH | rust-oauth | ● MEDIUM | rust |
| OAuth token request uses the Resource Owner Password Credentials grant ( grant_type=password). | ● HIGH | rust-oauth | ● MEDIUM | rust |
| OAuth authorization request is built with a hardcoded, constant state value (CsrfToken::new("literal")). | ● MEDIUM | rust-oauth | ● MEDIUM | rust |
| A reqwest client is built with danger_accept_invalid_certs(true), which turns off TLS certificate validation. | ● HIGH | rust-tls | ● HIGH | rust |
| A reqwest client is built with danger_accept_invalid_hostnames(true), which turns off TLS hostname verification. | ● HIGH | rust-tls | ● HIGH | rust |
| A hard-coded credential matching a well-known provider's key format was found in the source. | ● HIGH | secret | ● HIGH | js · ts |
| A secret is being read from an environment variable whose name carries a client-public prefix. | ● HIGH | secret | ● HIGH | js · ts |
| An express-session / cookie-session secret is a hard-coded string literal. | ● HIGH | session | ● HIGH | js · ts |
| A session token / id appears in a URL query string. | ● HIGH | session | ● MEDIUM | js · ts |
| The user is marked as logged in without first regenerating the session id. | ● MEDIUM | session | ● MEDIUM | js · ts |
| A Vapor CORSMiddleware.Configuration combines allowedOrigin: .all (the * wildcard) with allowCredentials: true. | ● MEDIUM | swift-cors | ● MEDIUM | Swift |
| An ASWebAuthenticationSession explicitly sets prefersEphemeralWebBrowserSession = false. | ● MEDIUM | swift-flow | ● MEDIUM | Swift |
| An OAuth / OpenID authorization URL is loaded inside a WKWebView. | ● MEDIUM | swift-flow | ● MEDIUM | Swift |
| A JWTKit HMAC signing key is registered from a hard-coded string literal ( add(hmac: "...", ...)). | ● HIGH | swift-jwt | ● MEDIUM | Swift |
| A Keychain item is created with kSecAttrAccessibleAlways (or kSecAttrAccessibleAlwaysThisDeviceOnly). | ● MEDIUM | swift-keychain | ● MEDIUM | Swift |
| A secret, API key, token, or password is assigned from a hard-coded string literal. | ● HIGH | swift-secret | ● HIGH | Swift |
| A token, secret, or credential is bound to @AppStorage. | ● MEDIUM | swift-storage | ● HIGH | Swift |
| A token, secret, or credential is written to UserDefaults. | ● HIGH | swift-storage | ● HIGH | Swift |
| TLS certificate validation is disabled for this connection. | ● HIGH | tls | ● HIGH | js · ts |
| An exported activity registers a BROWSABLE intent-filter for a custom-scheme OAuth redirect ( android:scheme="com.example.app" with an oauth/callback/ redirect host). | ● MEDIUM | xml-android | ● MEDIUM | XML |
| A credential (client secret, API key, password, bearer token) is hard-coded as a value in res/values/strings.xml. | ● HIGH | xml-android | ● HIGH | XML |
| The manifest sets android:usesCleartextTraffic="true" on <application>, re-enabling plaintext HTTP for the entire app. | ● HIGH | xml-android | ● HIGH | XML |
| A network-security-config permits cleartext traffic ( cleartextTrafficPermitted="true") in a <base-config> or in a <domain-config> that is not restricted to a loopback dev host. | ● MEDIUM | xml-android | ● MEDIUM | XML |
No rules match these filters.