Cross-file taint tracking, 200+ built-in rules, and a post-quantum crypto audit in a single binary. Free and open source.
Written in Rust, with no database to build.
foxguard 0.8.1 built-ins vs Semgrep 1.156 & OpenGrep 1.22 (--config auto, identical findings) · median of 3 runs, Apple Silicon · bars animate at true measured wall-clock time ·full comparison vs CodeQL, Snyk & SonarQube →
foxguard tracks untrusted input across files in eight languages — Python, JavaScript, Go, Java, Ruby, PHP, C#, and Kotlin — linking a source in one file to a sink in another in 0.03 seconds.
from . import queries
def search(request):
name = request.GET["name"]
return queries.run_query(name)def run_query(name):
cur = db.cursor()
cur.execute(
"SELECT * FROM users"
" WHERE name = '" + name + "'"
)--explain prints the full source-to-sink path, file and line, plus a fix.
Findings are ranked by dataflow depth, so the most certain ones surface first.
foxguard diff main shows only findings your branch introduces.
Readable scan output, plus an interactive TUI. Run foxguard tui . to browse findings, read dataflow traces, and dismiss false positives.
$ npx foxguard tui .Built-in rules understand Express, Django, Flask, and Spring, so a safe idiom won't raise a false alert.
Trace untrusted input across file boundaries. Source in one file, sink in another — the engine connects them.
foxguard diff main shows only new findings your branch introduces. No noise from existing code.
--github-pr posts findings as inline review comments directly on pull requests.
Every taint finding includes a concrete fix with safe code patterns. --explain shows full dataflow traces.
Detect leaked credentials and private keys with redacted output in the same tool.
Load existing Semgrep/OpenGrep rules with --rules. Loads ~98% of the public Semgrep/OpenGrep registry, parity-tested in CI.
Load your existing rules with --rules — foxguard loads ~98% of the public registry, parity-tested in CI.
One command flags RSA, ECDSA, ECDH, DH, and DSA across five languages, web-server configs, and six lockfile formats.
$ foxguard pqc .Every finding carries its CNSA 2.0 migration deadline. Know what moves, and by when.
A readiness score: how exposed you are, and where to start.
foxguard pqc . --format cbom exports a CycloneDX cryptography bill of materials.
240 built-in rules, each mapped to a CWE.
js/express-cookie-no-httponlymediumCWE-1004js/express-cookie-no-samesitemediumCWE-352js/express-cookie-no-securemediumCWE-614js/express-direct-response-writehighCWE-79js/express-no-hardcoded-session-secrethighCWE-798js/express-session-resave-truemediumCWE-384js/express-session-saveuninitialized-truemediumCWE-359js/hardcoded-crypto-algorithmlowCWE-327js/jwt-decode-without-verifyhighCWE-347js/jwt-hardcoded-secrethighCWE-798js/jwt-ignore-expirationhighCWE-613js/jwt-none-algorithmhighCWE-347js/jwt-verify-missing-algorithmshighCWE-347js/no-command-injectioncriticalCWE-78js/no-cors-starmediumCWE-942js/no-document-writehighCWE-79js/no-evalcriticalCWE-95js/no-hardcoded-secrethighCWE-798js/no-open-redirectmediumCWE-601js/no-path-traversalhighCWE-22js/no-prototype-pollutionhighCWE-1321js/no-sql-injectioncriticalCWE-89js/no-ssrfhighCWE-918js/no-unsafe-deserializationcriticalCWE-502js/no-unsafe-format-stringmediumCWE-134js/no-unsafe-regexmediumCWE-1333js/no-weak-cryptomediumCWE-327js/no-xss-innerhtmlhighCWE-79js/pq-ready-cryptolowjs/pq-vulnerable-cryptohighCWE-327js/taint-command-injectioncriticalCWE-78js/taint-evalcriticalCWE-95js/taint-ldap-injectionhighCWE-90js/taint-log-injectionmediumCWE-117js/taint-nosql-injectionhighCWE-943js/taint-sql-injectioncriticalCWE-89js/taint-ssrfhighCWE-918js/taint-ssticriticalCWE-1336js/taint-xpath-injectionhighCWE-643js/taint-xss-innerhtmlhighCWE-79js/taint-xxehighCWE-611py/csrf-cookie-httponly-disabledmediumCWE-1004py/csrf-cookie-samesite-disabledmediumCWE-352py/csrf-cookie-secure-disabledmediumCWE-614py/csrf-exempthighCWE-352py/django-allowed-hosts-wildcardmediumCWE-346py/django-secret-key-hardcodedhighCWE-798py/flask-debug-modehighCWE-489py/flask-secret-key-hardcodedhighCWE-798py/hardcoded-crypto-algorithmlowCWE-327py/jwt-hardcoded-secrethighCWE-798py/jwt-no-verifycriticalCWE-347py/no-command-injectioncriticalCWE-78py/no-cors-starmediumCWE-942py/no-debug-truemediumCWE-489py/no-evalcriticalCWE-95py/no-hardcoded-secrethighCWE-798py/no-open-redirectmediumCWE-601py/no-path-traversalhighCWE-22py/no-picklehighCWE-502py/no-sql-injectioncriticalCWE-89py/no-ssrfhighCWE-918py/no-weak-cryptomediumCWE-327py/no-yaml-loadhighCWE-502py/pq-ready-cryptolowpy/pq-vulnerable-cryptohighCWE-327py/secure-ssl-redirect-disabledmediumCWE-319py/session-cookie-httponly-disabledmediumCWE-1004py/session-cookie-samesite-disabledmediumCWE-352py/session-cookie-secure-disabledmediumCWE-614py/taint-command-injectioncriticalCWE-78py/taint-evalcriticalCWE-95py/taint-ldap-injectionhighCWE-90py/taint-log-injectionmediumCWE-117py/taint-nosql-injectionhighCWE-943py/taint-pickle-deserializationcriticalCWE-502py/taint-sql-injectioncriticalCWE-89py/taint-ssrfhighCWE-918py/taint-ssticriticalCWE-1336py/taint-xpath-injectionhighCWE-643py/taint-xxehighCWE-611py/taint-yaml-loadcriticalCWE-502py/wtf-csrf-check-default-disabledhighCWE-352py/wtf-csrf-disabledhighCWE-352go/cookie-missing-httponlymediumCWE-1004go/cookie-missing-securemediumCWE-614go/gin-no-trusted-proxiesmediumCWE-346go/insecure-tls-skip-verifyhighCWE-295go/jwt-hardcoded-secrethighCWE-798go/jwt-no-verifycriticalCWE-347go/math-random-usedmediumCWE-338go/missing-ssl-minversionmediumCWE-326go/net-http-no-timeoutmediumCWE-400go/no-command-injectioncriticalCWE-78go/no-hardcoded-secrethighCWE-798go/no-sql-injectioncriticalCWE-89go/no-ssrfhighCWE-918go/no-unsafe-deserializationhighCWE-502go/no-weak-cryptomediumCWE-327go/pq-ready-cryptolowgo/pq-vulnerable-cryptohighCWE-327go/taint-command-injectioncriticalCWE-78go/taint-ldap-injectionhighCWE-90go/taint-log-injectionmediumCWE-117go/taint-nosql-injectionhighCWE-943go/taint-path-traversalhighCWE-22go/taint-sql-injectioncriticalCWE-89go/taint-ssrfhighCWE-918go/taint-ssticriticalCWE-1336go/taint-xpath-injectionhighCWE-643rb/no-command-injectioncriticalCWE-78rb/no-csrf-skiphighCWE-352rb/no-evalcriticalCWE-95rb/no-hardcoded-secrethighCWE-798rb/no-html-safehighCWE-79rb/no-mass-assignmenthighCWE-915rb/no-open-redirecthighCWE-601rb/no-path-traversalhighCWE-22rb/no-sql-injectioncriticalCWE-89rb/no-ssrfhighCWE-918rb/no-unsafe-deserializationcriticalCWE-502rb/no-weak-cryptomediumCWE-327rb/taint-command-injectioncriticalCWE-78rb/taint-open-redirectmediumCWE-601rb/taint-sql-injectioncriticalCWE-89rb/taint-unsafe-deserializationcriticalCWE-502rb/taint-xsshighCWE-79java/hardcoded-crypto-algorithmlowCWE-327java/no-command-injectioncriticalCWE-78java/no-hardcoded-secrethighCWE-798java/no-path-traversalhighCWE-22java/no-sql-injectioncriticalCWE-89java/no-ssrfhighCWE-918java/no-unsafe-deserializationcriticalCWE-502java/no-weak-cryptomediumCWE-327java/no-xsshighCWE-79java/no-xxehighCWE-611java/pq-ready-cryptolowjava/pq-vulnerable-cryptohighCWE-327java/spring-cors-permissivemediumCWE-942java/spring-csrf-disabledhighCWE-352java/taint-command-injectioncriticalCWE-78java/taint-sql-injectioncriticalCWE-89java/taint-ssrfhighCWE-918java/taint-unsafe-deserializationcriticalCWE-502php/no-command-injectioncriticalCWE-78php/no-evalcriticalCWE-95php/no-extracthighCWE-621php/no-file-inclusioncriticalCWE-98php/no-hardcoded-secrethighCWE-798php/no-preg-evalcriticalCWE-95php/no-sql-injectioncriticalCWE-89php/no-ssrfhighCWE-918php/no-unserializecriticalCWE-502php/no-weak-cryptomediumCWE-327php/taint-command-injectioncriticalCWE-78php/taint-file-inclusioncriticalCWE-98php/taint-sql-injectioncriticalCWE-89php/taint-unsafe-deserializationcriticalCWE-502php/taint-xsshighCWE-79rs/no-command-injectioncriticalCWE-78rs/no-hardcoded-secrethighCWE-798rs/no-path-traversalmediumCWE-22rs/no-sql-injectioncriticalCWE-89rs/no-ssrfhighCWE-918rs/no-unwrap-in-libmediumCWE-248rs/no-weak-hashmediumCWE-328rs/pq-ready-cryptolowrs/pq-vulnerable-cryptohighCWE-327rs/tls-verify-disabledhighCWE-295rs/transmute-usagehighCWE-843rs/unsafe-blockmediumCWE-676cs/no-command-injectioncriticalCWE-78cs/no-cors-starmediumCWE-942cs/no-hardcoded-secrethighCWE-798cs/no-ldap-injectionhighCWE-90cs/no-path-traversalhighCWE-22cs/no-sql-injectioncriticalCWE-89cs/no-ssrfhighCWE-918cs/no-unsafe-deserializationcriticalCWE-502cs/no-weak-cryptomediumCWE-327cs/no-xxehighCWE-611csharp/taint-command-injectioncriticalCWE-78csharp/taint-open-redirectmediumCWE-601csharp/taint-sql-injectioncriticalCWE-89csharp/taint-unsafe-loadcriticalCWE-502csharp/taint-xsshighCWE-79csharp/taint-xxehighCWE-611swift/no-command-injectioncriticalCWE-78swift/no-eval-jscriticalCWE-95swift/no-hardcoded-secrethighCWE-798swift/no-insecure-keychainhighCWE-311swift/no-insecure-transporthighCWE-319swift/no-path-traversalhighCWE-22swift/no-sql-injectioncriticalCWE-89swift/no-ssrfhighCWE-918swift/no-tls-disabledhighCWE-295swift/no-weak-cryptomediumCWE-327swift/taint-command-injectioncriticalCWE-78swift/taint-js-injectionhighCWE-79swift/taint-nsexpression-injectionhighCWE-95swift/taint-sql-injectioncriticalCWE-89kt/no-command-injectioncriticalCWE-78kt/no-cors-starmediumCWE-942kt/no-evalcriticalCWE-94kt/no-hardcoded-secrethighCWE-798kt/no-path-traversalhighCWE-22kt/no-sql-injectioncriticalCWE-89kt/no-ssrfhighCWE-918kt/no-unsafe-deserializationcriticalCWE-502kt/no-weak-cryptomediumCWE-327kt/no-xxehighCWE-611kt/taint-command-injectioncriticalCWE-78kt/taint-sql-injectioncriticalCWE-89kt/taint-ssrfhighCWE-918solidity/taint-arbitrary-delegatecallcriticalCWE-829solidity/taint-unchecked-callhighCWE-829solidity/taint-unprotected-selfdestructcriticalCWE-284semgrep/cardano-haskell/cbor-decoder-edgehighCWE-248semgrep/cardano-haskell/ffi-foreign-importcriticalCWE-125semgrep/cardano-haskell/ffi-pointer-offsetcriticalCWE-787semgrep/cardano-haskell/lazy-eval-doshighCWE-400semgrep/cardano-haskell/partial-functionhighCWE-248semgrep/cardano-haskell/unsafe-escapecriticalCWE-704config/nginx-pq-ready-tlslowconfig/nginx-pq-vulnerable-tlsmediumCWE-327config/apache-pq-ready-tlslowconfig/apache-pq-vulnerable-tlsmediumCWE-327config/haproxy-pq-ready-tlslowconfig/haproxy-pq-vulnerable-tlsmediumCWE-327config/dockerfile-insecure-tls-envhighCWE-295manifest/cargo-pq-ready-deplowmanifest/cargo-pq-vulnerable-dephighCWE-327manifest/npm-pq-vulnerable-dephighCWE-327manifest/osv-vulnerable-dephighCWE-937manifest/pip-pq-ready-deplowmanifest/pip-pq-vulnerable-dephighCWE-327manifest/pipfile-pq-vulnerable-dephighCWE-327manifest/pnpm-pq-vulnerable-dephighCWE-327manifest/poetry-pq-vulnerable-dephighCWE-327One command, no setup.
foxguard secrets . also catches leaked AWS, GitHub, Stripe, Slack, and private keys, redacted by default.