Skip to content
Back to Docs
14CHECK LIBRARY

Check Library

Every security check Fendix runs, with detection logic, default severity, and whether it requires active probing.

Black-box Checks

HTTP scanner — sends real requests to your API.

CheckWhat It DetectsSeverityActive
Security HeadersMissing HSTS, CSP, X-Content-Type-Options, X-Frame-Options, server version disclosureMEDIUM - INFO-
CORSWildcard origins with credentials, reflected origins, permissive methodsCRITICAL - LOW-
AuthenticationMissing auth, malformed JWT accepted, expired JWT accepted, alg:none bypassCRITICAL-
Data ExposurePasswords/secrets/tokens in responses, stack traces, internal IPs, sequential IDs, AND (v0.11+) exposed config files at well-known paths — .env, .git/HEAD, .htaccess, .npmrc, .aws/credentials, etc. — flagged CRITICAL with CWE-538 when a 2xx response is servedCRITICAL - INFO-
Rate LimitingNo rate limiting detected on endpointsMEDIUM-
Cookie FlagsCookies missing Secure / HttpOnly / SameSite attributes (CWE-1004/614/1275) — new in v0.18MEDIUM - LOW-
IDORBroken access control — one user accessing another user's resourcesHIGH-
SQL InjectionTime-based blind, error-based, and boolean probes (MySQL, Postgres, MSSQL, SQLite, Oracle); evidence notes (in=query|header|body)HIGH--enable-active
Command InjectionEcho canary detection — safe, non-destructive payloadCRITICAL--enable-active
Header InjectionCRLF injection in response headers via %0d%0a Set-Cookie probeHIGH--enable-active
Open RedirectUser-controlled redirect target sends the browser off-site (CWE-601) — new in v0.18MEDIUM--enable-active
Reflected XSSPayload reflected unescaped into the response, executing in the browser (CWE-79) — new in v0.18HIGH--enable-active
SSRFIn-band server-side request forgery — server fetches an attacker-supplied URL, confirmed in the response (CWE-918) — new in v0.18CRITICAL--enable-active
Host Header InjectionPoisoned Host / X-Forwarded-Host reflected into links, redirects, or cache keys (CWE-644/601) — new in v0.18MEDIUM--enable-active
GraphQL IntrospectionSchema introspection left enabled, exposing the full type graph (CWE-200) — new in v0.18LOW--enable-active
HTTP Method TamperingUnsafe or override HTTP methods accepted (e.g. PUT/DELETE/TRACE, X-HTTP-Method-Override) (CWE-650/693/285) — new in v0.18MEDIUM--enable-active

White-box Checks

Static analysis — analyzes source code without making network requests.

CheckWhat It Detects
SecretsAWS/GitHub/npm/Stripe/OpenAI keys, GCP SA JSON blobs, GCP API keys (AIza…), Slack (xoxa/b/p/r/s), Anthropic, .env NAME=value leaks, bearer tokens — plus Semgrep overlays
Semgrep Rules24-rule bundled pack (v0.14+; was 9 in v0.9). auth: missing Flask/Django/FastAPI decorators; injection: Django raw SQL, Flask render_template_string SSTI, subprocess(shell=True), pickle.loads, yaml.load unsafe; secrets: GCP SA JSON, AWS key, Slack webhook, PEM key; crypto: MD5/SHA1 for passwords, DES/3DES/RC4 ciphers, random module for token generation
Textscan (Go/JS/IaC)Unified regex SAST engine (v0.12+). Go: SQL concat injection, exec.Command shell invocation, MD5/SHA1 for passwords, hardcoded AWS key. JS/TS: eval/innerHTML/document.write with non-literal, child_process.exec, require with variable path, hardcoded AWS key. IaC: Dockerfile FROM missing privilege drop, ADD vs COPY, :latest pin; Kubernetes privileged/hostNetwork/allowPrivilegeEscalation/runAsUser=0
Spec ParserMissing security schemes in OpenAPI spec, API keys in query params, unauthenticated endpoints, HTTP instead of HTTPS, weak auth schemes
AST AnalysisPython/JS AST: pickle/yaml unsafe load, SSRF, open redirects, trusting client-controlled auth headers, weak password hashing, subprocess/eval/HTML/SQL literals — plus reachable XSS via Markup/mark_safe/render_template_string (v0.8), reachable command-injection via os.system/subprocess(shell=True)/os.popen (v0.8), and reachable path-traversal via open/Path/send_file/send_from_directory (v0.11). The engine has 7 reachable taint-chain sink classes total — SQLi, SSRF, open-redirect, XSS, path-traversal, and command-injection counted as three distinct shell sinks. Reachable findings carry a taint_chain proving intra-function dataflow from a request source to the sink. Proven Path v1 (v0.16) extends this for Django/Flask/FastAPI: route-table extraction binds the HTTP route to its handler so the chain spans route → handler → source → sink across files, exported as SARIF codeFlows/threadFlows (GitHub renders the step-through inline), and every finding carries a source_tier provenance tag (native_go / tree_sitter_sidecar / semgrep_shim)
DependenciesKnown CVEs in Go modules (in-process via golang.org/x/vuln — same call-graph reachability as the upstream govulncheck binary), PyPI (OSV.dev /v1/query per pinned ==, 24h local cache), and npm (OSV.dev against package-lock.json v2/v3, scoped-package aware, 24h cache) — all native in-process scanners (no binary deps required). As of v0.16, poetry.lock and Pipfile.lock are parsed as the full resolved closure so transitive Python CVEs are caught, not just direct requirements.txt pins. As of v0.9 the embedded Python distribution is no longer bundled; the legacy Python deps.py path is opt-in via --python-engine. Disable native scanners with --no-native-deps

SARIF Severity Mapping

How Fendix severities map to SARIF 2.1.0 levels for CI/CD integration.

Fendix SeveritySARIF Level
CRITICALerror
HIGHerror
MEDIUMwarning
LOWnote
INFOnote