Skip to main content
Integration · Azure DevOps

Azure DevOps security testing that leaves a finding somebody can act on

A task in azure-pipelines.yml, pointed at the deployment the stage before it produced. It returns a result the pipeline understands — succeed, or fail the step on a severity threshold you set — and every finding it proved is written up with the request and response that proved it before anyone opens the failed run.

The first question

Where a finding ends up, and who picks it up

Asked before anything about task inputs, so it is answered before anything about task inputs.

A run started from a pipeline leaves its output in three places, and they are not interchangeable. The pipeline run carries the decision: the task compares what was proved against the severity threshold you set, and returns a pass or a failure — which is the only part Azure DevOps itself acts on. The run also carries the summary: what the step found, counted by severity, written into the step log and kept with the run so it is still readable long after the agent is gone. And the finding itself lives in the B-52 dashboard — the request as sent, the response as returned, the steps that reproduce it, the severity with its CVSS v4.0 vector and the CWE — where it moves through open, fixed, retested and closed. Raising the work item is your side of the line. Everything a Boards item needs is already written; which project, which area path and which iteration it belongs to is a decision about your backlog rather than ours, and we would be guessing at it.

After the run

What the step leaves behind, and who reads each part

Three outputs from one run. Each has a different reader and a different shelf life.

OutputWhere it sitsWho reads it
The step result The pipeline run. It is a pass or a failure and nothing else, because that is the whole vocabulary a pipeline has for acting on something. The engineer whose commit started the run.
This is also what a branch policy reads, where the pipeline is set as build validation on the branch.
The summary in the log The step log inside the run — what was proved, counted by severity, and the threshold that was applied to it. Whoever opens the failed run first.
The finding record The B-52 dashboard The person who has to fix it.
The exchange that proved it travels with the record, so the fix does not start with a reproduction attempt.

The step result

Where it sits
The pipeline run. It is a pass or a failure and nothing else, because that is the whole vocabulary a pipeline has for acting on something.
Who reads it
The engineer whose commit started the run.

This is also what a branch policy reads, where the pipeline is set as build validation on the branch.

The summary in the log

Where it sits
The step log inside the run — what was proved, counted by severity, and the threshold that was applied to it.
Who reads it
Whoever opens the failed run first.

The finding record

Where it sits
The B-52 dashboard
Who reads it
The person who has to fix it.

The exchange that proved it travels with the record, so the fix does not start with a reproduction attempt.

Finding states

Four states, and the only one that closes a finding

The same vocabulary whether the run was started by a pipeline, by a schedule, or by hand. A pipeline does not get its own status words.

Four states, and the only one that closes a finding
StateWhat it meansWhat follows
Open Proved during the run and written up. It arrives in this state, with the request, the response and the reproduction steps already attached. Counts against the threshold on the run that found it.
Fixed Your team has changed something and marked it done. Nothing has been re-run against the change yet, so nothing has been established. Waits for a retest.
Retested The reproduction steps have been run again against the changed target. This is the state a finding sits in while that is being settled. Goes to closed, or back to open.
Closed Terminal The retest could not reproduce it. A finding closes on that and on nothing else — not on an assertion, not on a sprint ending. Terminal. It is the evidence that remediation held.
Key
  • Open against you
  • Claimed fixed, not yet checked
  • Being checked
  • Closed on evidence
  • TerminalNo state follows this one

Placement

Where the task goes in a multi-stage pipeline

The placement decides what gets tested. B-52 works a running deployment, so the step has to sit after one exists.

Task inputs

The four things the task has to be told

Named here for what they decide rather than by their spelling in the file, because what they decide is the part that survives.

InputWhat it decidesWhere the value comes from
The target The address the run works against — the deployment the previous stage produced, resolved at run time so a review environment can be tested at the address it was given this time. The pipeline, usually as an output variable from the deploy stage.
The credential set What the run authenticates as, so it reaches what a signed-in user reaches rather than only the surface a stranger sees. One credential per role where the scope names roles. A variable group or a secret variable. It is never written into the file.
The severity threshold The severity at or above which a proved finding fails the step. Below it, the finding is still reported and the step still succeeds. You. It lives on the task, so changing it is a commit with an author and a date.
The threshold and the failure behaviour work identically in all four pipelines — the build gate page sets that out once.
What the pipeline does while the run is open Whether the stage holds until the run returns a result, or records the run and lets a later stage read it. A run against one application can hold a stage; a full assessment of a large target is not a thing to keep an agent waiting on. Agreed with the scope, because it depends on what is being tested.
In the fully autonomous model the observed median from scope sign-off to report is one to three business days. That is an observed median, not a service level.

The target

What it decides
The address the run works against — the deployment the previous stage produced, resolved at run time so a review environment can be tested at the address it was given this time.
Where the value comes from
The pipeline, usually as an output variable from the deploy stage.

The credential set

What it decides
What the run authenticates as, so it reaches what a signed-in user reaches rather than only the surface a stranger sees. One credential per role where the scope names roles.
Where the value comes from
A variable group or a secret variable. It is never written into the file.

The severity threshold

What it decides
The severity at or above which a proved finding fails the step. Below it, the finding is still reported and the step still succeeds.
Where the value comes from
You. It lives on the task, so changing it is a commit with an author and a date.

The threshold and the failure behaviour work identically in all four pipelines — the build gate page sets that out once.

What the pipeline does while the run is open

What it decides
Whether the stage holds until the run returns a result, or records the run and lets a later stage read it. A run against one application can hold a stage; a full assessment of a large target is not a thing to keep an agent waiting on.
Where the value comes from
Agreed with the scope, because it depends on what is being tested.

In the fully autonomous model the observed median from scope sign-off to report is one to three business days. That is an observed median, not a service level.

The gate

One run that crossed the threshold, read three ways

The same result, as each of the three people who meet it experiences it.

01 In the pipeline

The step fails

What happened
A finding at or above the severity you set was proved during the run, so the task returned a failure rather than a warning.
What Azure DevOps does
The step fails, the job fails with it, and the stage does not hand over to the one after it.
What it does not touch
Nothing is rolled back and nothing is removed. A gate withholds the next stage; it does not undo the last one.
02 On the pull request

Completion is held

Where it shows
Where the pipeline is a build validation policy on the branch, the failed run shows on the pull request beside the other policy results.
Who meets it first
The author of the change, in the place they already read their test failures rather than in a report they open after the release has shipped.
What clears it
A fix and a fresh run, or an override under the rules your organisation already has for policy overrides. Both leave a record.
03 On the finding

The write-up is already done

What is waiting
The exchange that proved it, the steps to reproduce, severity with its CVSS v4.0 vector and the CWE — written before the run reported its result.
What the fix needs from us
Nothing. The reproduction steps stand on their own: whoever owns the code has enough to make it happen again, and then to make it stop.
What closes it
A retest that cannot reproduce it. Nothing shorter.

The threshold

The value is yours, and it is the only thing that fails a build

A gate that somebody else calibrated is a gate that gets switched off in its second week. So the threshold is a task input and the task does exactly one thing with it: it compares. Set it so that only a proved critical stops a release and the step will fail rarely and mean something when it does. Set it at medium and the pipeline becomes the place your severity policy is actually enforced. The value can also differ by stage — strict on the review environment, looser on the release stage, or the reverse — because each stage carries its own task with its own input. What the threshold never does is change the test. Everything the run proved is reported at every severity; the threshold decides only which of it is allowed to stop a pipeline, and a finding below the line is a finding in your dashboard rather than a finding you were not told about.

Before the first run

What is agreed once, and what is never in scope

A pipeline can start a run. It cannot widen one, and the scope it runs inside was settled before the first commit that triggered it.

The scope behind a pipeline-triggered run As of 2026-09-14
  • The target, in writing. One scan is one application or target, so a pipeline that deploys three applications is three scopes rather than one task run three times.
  • The delivery model. Fully autonomous is the one shaped like a pipeline: scope sign-off happens once and nothing after it waits on a person. Expert-verified and human-led cover the same eleven classes and carry a senior auditor’s signature, which is a separate question from what the gate does.
  • The credential set and the environment the pipeline will point at, including whether a review environment that exists for an hour is inside the scope or outside it.
  • The severity threshold, which lives on the task rather than in the agreement — so it moves at the speed of a commit instead of at the speed of a contract change.
  • The region the data is held in: India, the European Union, the United States, or Singapore / Asia-Pacific. You choose, and the choice is made here rather than per run.

Deliberately excluded

  • Physical, hardware and wireless testing, which sit outside the platform in every coverage class.
  • Denial of service. A pipeline pointed at a shared environment makes this question come up sooner, and the answer does not change.
  • Anything the scope does not name. A trigger is not an authorisation, and a run that reaches the edge of its scope stops and reports rather than continuing.

Run one scan for $500, then wire it into the pipeline

One scan is one application or target. The card flow covers web applications, mobile apps, APIs, thick clients and secure code review, with a paid trial at $299 for one scan on one target. Cloud, network and Active Directory scopes start with a scoping call.