SAST Checkmarx: integration setup, tuning, and noise reduction

Static code analysis in the build pipeline either drowns in false positives or slows releases so much that it is disabled. We set up turnkey checks for your project: clean up rules, distribute checks across stages, and make reports readable at a glance. Let's discuss the task and we'll come back with an estimate and plan.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Why configuring Checkmarx doesn't eliminate noise and slows down the build

Configuring Checkmarx often looks like a one-evening task: add a step to the build, set up access, wait for the first report. The problem starts on the second run, when tens of thousands of findings surface in the results, of which only a few are real vulnerabilities.

The scanner formally works, but the team stops opening its reports because reading them takes longer than fixing them.

The bulk of the lines comes from scanner false positives on custom wrappers, test data, generated code, and outdated modules that will be rewritten anyway.

Without tuning rules and exclusions, noise in reports grows faster than defects are closed, and separating a critical finding from junk becomes more expensive in engineer time with every release.

The second reason is where the check sits in the build. When static analysis is the last step, it blocks nothing: the code is already built, the artifact is deployed, and the developer sees the report an hour after submitting changes and does not associate it with their commit.

The code quality gate is either not set or set at random. Then the build fails on the first minor finding, build time grows on every run, and the team learns to bypass the check instead of reading it.

We break down how this is addressed: where to narrow the scope of analysis, which rules to mute and which to make blocking, and how to integrate the check so that it helps rather than hinders.

What changes after proper integration: noise, speed, coverage

Code scanning in Checkmarx without rule tuning produces a flood of findings, a significant part of which are false: hits on test data, generated code, template stubs.

We configure rule sets for the project's actual stack and move noise into exclusions with justification rather than disabling checks entirely. The share of false positives drops by a factor, and sorting findings from a week-long queue becomes a couple-hour task.

Speed comes not from hardware power but from where the check sits in the process.

Instead of a nightly run over the entire repository, we set up incremental checking of changed files on every merge request — feedback on a new line of code arrives within minutes, while the author still has the context in mind. Full scanning remains a safeguard before release, not the only way to learn anything.

Coverage grows through automatic registration of new repositories and branches: a service spun up yesterday comes under scanning without a separate request.

Quality gates in the pipeline do not allow merging without a successful scan — this closes a class of vulnerabilities that previously slipped by simply because no one had connected the project.

Vulnerability classes begin to be seen as a whole: injections, unsafe handling of files and credentials, dependency issues are consolidated into a single report by severity.

Findings are triaged by priority — first what is actually exploitable — and recurring patterns become a rule with a ready remediation example for the team.

Scanning modes: full, incremental, scheduled

The scanning mode is chosen not by "power" but by where the result is needed — before commit, during the build, or across accumulated changes. Below are the real alternatives a team chooses between when configuring Checkmarx.

Mode When it fits Limitations
Full scan Initial run, major release, rule set change Slow on large repositories, excessive for a one-file edit
Incremental analysis Daily work, checking changes in a branch Sees only affected code — long-standing defects will not appear in the report
Scheduled scan Nightly full-profile run, release branches Result arrives with a delay and does not block an urgent commit
Local loop Checking before pushing to the repository, filtering out gross errors Reduced rule set, environment differs from the build one
Cloud scan in the build Blocking pipeline step, unified profile for all branches Depends on service availability and job queue

The modes do not replace one another but join up: the local loop and incremental analysis provide fast feedback, the nightly scheduled run closes accumulated debt, and the cloud scan maintains a unified rule profile and does not let critical issues past the build.

The condition for comparability is the same rule profile and a shared baseline across all modes; otherwise reports diverge and issues closed locally resurface.

We select time thresholds and blocking rules so that the incremental run stays within minutes and the full run does not compete for resources with the build.

How Checkmarx configuration proceeds: stages of work

Configuring Checkmarx is not deploying a scanner but a sequence of engineering work: from inventorying current rules to handing the team a regulation for triaging findings.

The order here is fundamental — if you enable the full profile right away, the flow of hits will block the build pipeline, and developers will stop opening reports. Each subsequent step relies on the agreed result of the previous one.

  1. Audit of current rules. We look at which profiles are enabled, which findings were actually closed and which were silently ignored, and where scanning does not run at all.
  2. Pilot project. We take one service or repository, run the full profile, and record scan duration, report volume, and the share of hits the team recognizes as significant.
  3. Integration into the build pipeline. We separate modes: a short rule set on merge request, full on nightly build. We set the severity threshold at which the build stops.
  4. Finding baseline. For legacy code, we record the current list as a baseline: it does not block the build but remains visible and is gradually reduced. New findings fall under the common threshold.
  5. Rule tuning. We remove noise: exclude test and generated files, fix queries that produce false positives on our stack, collapse duplicates.
  6. Rule acceptance and regulation handover. A run on a labeled set where it is known in advance where a vulnerability exists and where it does not: we calculate the share of correct hits and residual noise. Based on the results, we document who receives findings, within what timeframe they are triaged, and who approves exclusions.

What the customer receives: profiles, rules, regulations

At the output, the customer receives not a scan report but a set of configurations that lives in the repository alongside the code and transfers between projects.

Profiles and rules are versioned together with the service — the result is reproducible on any branch and does not depend on who ran the check manually.

  • Scanning profiles for each service type: web application, public interface, internal library — each with its own query set and hit threshold, so the full set is not run on every commit.
  • Exclusion files with justification: for each suppressed query, the path, category, and reason are specified. An exclusion without a comment does not pass approval and does not make it into the branch.
  • Finding triage regulation: severity levels, closure timeframes for each level, procedure for confirming a false positive, indicating who approved it and on what basis.
  • Access roles: a developer sees findings for their service, the security owner sees a project summary, and changes to profiles and exclusions are made only through approval.
  • Scanning documentation: what exactly is scanned, which exclusions are currently in effect, who approved them, and where to view the history of settings changes.
  • Checklist for connecting a new service — so that expansion does not disrupt thresholds or open access to unnecessary data.

The Checkmarx configuration is handed over together with these artifacts and a short team training: engineers tune profiles themselves, add exclusions, and read reports without contacting us for every finding.

Case: reduced noise and accelerated checks in the build pipeline

A product team with several dozen repositories enabled Checkmarx by default: full rule set, all branches, scanning on every change.

Within a month, no one was opening the report of several thousand findings in full — developers triaged the obvious ones, and the rest accumulated in a common list. The check took so long that it stopped being a blocking build step.

What was changed

We analyzed accumulated findings from historical data and divided the rules into three groups: precise (used for blocking), requiring manual triage, and noisy.

We moved the noisy ones out of the main profile into a deferred set, raised the confidence threshold for the rest, and added exclusions for generated code and test directories. Scanning was shifted to branch changes, and the full run was left only for release branches.

What changed

Metric Before After
False positive rate about 60% below 15%
Change check time tens of minutes single-digit minutes
Overdue findings grew every sprint decreased by a factor

The developer again sees a short list where almost every line requires action, so triage stopped being postponed.

The blocking step returned to the build pipeline, while the full profile remained for release branches — returning to the previous rule set is possible by editing one profile, without rebuilding the integration.

How code analysis differs from dependency and secret scanning

These three checks are often placed side by side, although each sees its own layer of the application.

Code analysis examines what we wrote ourselves, dependency scanning examines connected third-party code, and secret scanning examines strings that should not be in the repository.

Code analysis answers the question "is there a hole in our logic." The analyzer builds a data flow from an entry point to a dangerous operation and shows places where user input reaches a query, file, or system command without validation.

This is also where Checkmarx works: most of the effort goes into tuning rules and exclusions; otherwise the report drowns in hits on test and generated code.

Dependency scanning solves a different task: it compares manifests and pinned library versions against databases of known vulnerabilities and shows the chain through which a vulnerable component entered the build.

The result here is not "bad code" but a list of updates: the fix takes minutes but requires compatibility checking and rerunning tests.

Secret scanning follows a third logic: key and token patterns, anomalous string entropy, a separate pass over commit history. It catches what cannot be closed by editing code — a compromised key must be revoked and replaced, and the trace in history rewritten.

The methods do not replace one another but cover different risk classes, so the choice starts with which layer is currently uncovered.

The usual implementation order is: secrets first — quick results with minimal false positives, then dependencies, then code analysis with gradual rule rollout.

Common doubts when integrating a scanner into the build pipeline

Before starting integration, teams ask the same set of questions: will the scanner slow down the build, how will rules behave after an update, who is responsible for disputed findings. Below are the answers we give during a Checkmarx task review.

Will the scanner slow down the build and people start bypassing it?

We check only changed files, and full analysis goes into a schedule outside active hours. Only a new high-severity finding blocks the build, and we keep overhead within a few percent of its time.

Will a rule update break already accepted code?

We enable new rules in observation mode and compare against the recorded baseline — releases do not fail just because the rule set expanded. Thresholds and exclusions are reviewed on every update.

Who decides that a finding is disputed?

The code owner: the finding is either fixed or moved to an exclusion with justification and a review deadline. Tuning queries and labeling rules removes the bulk of false positives — only a few per release remain.

We have several teams — is the policy shared or per-team?

The minimum severity threshold is the same for everyone; otherwise summaries between teams are not comparable. We make rule profiles for the stack and maturity level, and distribute findings by directory owners.

Legacy code with thousands of findings — should scanning be enabled right away?

Yes, but without blocking: we record the current state as a starting point. We work off the debt in waves in the modules we are already editing — new findings do not accumulate.

Let's discuss the task and come back with an estimate and work plan

Discussing an estimate without data about the environment means naming numbers at random. The scope of static analysis configuration depends on the number of projects, how scanning is embedded in the build, and how many rules are actually used. Therefore the first step is task review, not a rough estimate.

What we need from you for this and what we will come back with:

  • From you — an environment map: a list of repositories and branches that are built, and the points where scanning is already embedded.
  • From you — current settings: which rule sets and policies are enabled, what has been muted manually, and where exclusions are set.
  • From you — one real report: an export of the latest run on the largest project — it shows the share of noise and problem areas.
  • From us — an implementation plan: stages, order of connecting projects, control points, and owners on both sides.
  • From us — noise filtering rules: an agreed list of exclusions, the threshold at which the build stops, and the procedure for reviewing it.
  • From us — a support scheme: how new hits are triaged after launch, who updates rules, and what goes into the management report.

Describe the task in two or three paragraphs — which projects, how they are built, what is already configured from Checkmarx.

After diagnosing the environment, we will come back with an estimate of work and a staged implementation plan, indicating what we do ourselves and where access or a decision is needed on your side.