Kelvar Docs

Reference

Scanner checks

The scanner runs four deterministic checks. A check is a plain function over the files in a folder, so the same input always gives the same findings. This page lists exactly what each check looks for.

CheckLooks forSeverities
secretsCredentials committed to sourcecritical
depsKnown-vulnerable pinned dependenciesmedium to critical
iacRisky infrastructure and container configurationmedium, high
zero_clickCode and payload patterns that lead to remote code executionhigh, critical

#What gets scanned

The scanner walks the folder and skips .git, node_modules, .venv, venv, __pycache__, target, dist and build. It skips any file larger than 512 KB. Findings are sorted by severity, highest first.

#secrets

Looks for these patterns, line by line, in every scanned file.

PatternReported as
AKIA followed by 16 uppercase letters or digitsAWS access key
ghp_ followed by 36 letters or digitsGitHub personal access token
sk- followed by 20 or more letters or digitsOpenAI or Stripe-style secret key
-----BEGIN PRIVATE KEY-----, with optional RSA or ECPrivate key
password, passwd, api_key, api-key or secret assigned a quoted string of 8 or more charactersHardcoded credential

Every match is critical. A line is skipped when it contains example, changeme, your_, xxxxx, dummy, placeholder or redacted, in any case, so documentation and templates do not trigger findings.

#deps

Reads pinned versions in requirements*.txt, constraints*.txt, Gemfile.lock, pom.xml and package.json. A line is parsed when it has the form name==version. It compares the version to the advisories below.

PackageAffectedAdvisorySeverity
lodashbelow 4.17.21CVE-2021-23337, command injection via templatehigh
requestsbelow 2.31.0CVE-2023-32681, Proxy-Authorization header leakmedium
opensslbelow 3.0.0CVE-2022-0778, infinite loop in BN_mod_sqrthigh
log4j-corebelow 2.17.1CVE-2021-44832, RCE via JDBC appendercritical

#iac

Reads .tf, .yaml, .yml and .json files for these rules.

PatternMessageSeverity
0.0.0.0/0Network rule open to the worldmedium
publicly_accessible = trueDatabase publicly accessiblehigh
An IAM statement with "Effect": "Allow" and "Action": "*" on one lineIAM policy allows Action *high

In any file whose name starts with Dockerfile, it also reports the following.

PatternMessageSeverity
:latestUnpinned :latest image tagmedium
USER rootContainer runs as rootmedium

#zero_click

Looks for sinks that attackers reach without any user action.

PatternMessageSeverity
pickle.loads, yaml.unsafe_load, marshal.loads, ObjectInputStreamUnsafe deserialization sinkcritical
${jndi:ldap://, and the rmi, dns and iiop formsJNDI remote lookup sinkcritical
subprocess.Popen, run, call or check_output with shell=True on one lineShell command execution sinkhigh

#Choosing checks

The built-in codebase-guardian agent enables all four checks. To run a subset on part of a repository, add a repository agent. See Configuration.

#What the scanner does not do

  • It does not follow data flow, so it cannot tell whether a sink is reachable.
  • It does not read inside binary files or files over 512 KB.
  • It reports patterns line by line, so a pattern split across lines is missed.

For these, use the agents. The Zero-Click Rapid Defender confirms from the source whether a sink is reachable. See Security agents.