Common Preparation · The assumed floor

The Baseline You Need First

The Certified DevSecOps Professional does not teach you Linux, Git, Docker, HTTP, or cloud IAM. It assumes them, then hands you five broken systems and starts a clock. Practical DevSecOps' own stated prerequisite is deliberately modest — basic Linux command knowledge and a foundational grasp of application security concepts such as the OWASP Top 10, with no prior Dev or DevOps experience described as necessary. Every candidate who has published a first-hand account of sitting the exam describes a materially higher effective floor. This page is that effective floor, written out concretely: what each prerequisite actually has to mean when the exam is hands-on, how to check whether you really have it, and which page of this course to go to for each gap you find. It ends with a two-tier self-test and a hard question set with a full answer key, so you find the gaps here rather than at hour four of six.

☺ Explain it like I'm 10

Imagine signing up for a class called "How to keep a restaurant kitchen safe." The class is all about thermometers, allergy labels, and spotting a dirty station. What it never covers is how to hold a knife, read a recipe, or turn the oven on — it just assumes you already can. Then the exam locks you in a kitchen for six hours with five things wrong with it and says "fix them, and write down exactly what you did." Knife skills are what this page is about. Nobody grades them directly, and not having them is what makes everything else feel twice as hard.

🦉🐢Your hosts for this topic: Professor Owl & Timmy the Turtle — Owl maps the floor the exam is built on and never mentions, and Timmy is the one who refuses to let you mark a skill "known" until you have actually proved it at a keyboard, under a clock, without a browser tab open.

Two prerequisite lists, and the gap between them

☺ Like you're 10: The people selling the course say you need very little. The people who have actually taken the exam say you need more. Both are telling the truth about different things.

Practical DevSecOps publishes a prerequisite line on the CDP's own page, and it is a short one: basic Linux command knowledge, a foundational understanding of application security concepts like the OWASP Top 10, and — stated explicitly — no prior experience with Dev or DevOps tools required. Read on its own, that is an encouraging sentence. It is also, in a narrow sense, accurate: the vendor's package bundles a large set of guided browser-based lab exercises, and a guided lab genuinely can walk someone through their first docker build.

Now read what candidates wrote afterwards. Sanjeev Jaiswal, reviewing the course and exam in 2020, recommended arriving with Docker, GitLab CI/CD, SSH and DevSecOps basics already in hand. Vinit Patil, writing in 2023, listed the surface his exam actually touched: GitLab CI/CD, SCA, SAST and DAST tooling, Docker, Ansible, InSpec, Linux hardening, and DefectDojo. And Tess Sluijter, in 2021, drew the sharpest line of all — she declined to describe the exam's contents, citing the non-disclosure agreement, but did say to expect scanning tools other than the ones used in the labs, more advanced features of the tools that were used, and programming languages the labs never covered. She compared the required mindset to the OSCP: the concepts match what you were taught, and you will still have to research on the spot.

That is the gap this page exists to close, and it has a clean explanation. The vendor's prerequisite line is a true statement about the course. It is a weaker statement about the exam. A guided lab hands you a working environment and a set of instructions; a graded challenge hands you a broken environment and a goal. The first tolerates a thin baseline because the scaffolding carries you. The second removes the scaffolding, changes the tools, and starts a clock.

Prerequisite areaWhat the vendor's page statesWhat published accounts describe
Linux"Basic Linux command knowledge"Working over SSH for hours, plus hardening a host — which means reading service configs, permissions and users fluently, not just cd and ls
Dev / DevOps toolingNot necessaryDocker, a CI platform and its YAML, Ansible and InSpec all named by name across independent accounts
Application securityFoundational, e.g. the OWASP Top 10Finding and fixing real instances in real code, in languages the labs did not use
Tooling breadthThe course's own tool setExpect tools you did not train on, and deeper features of the ones you did
WritingNot listed as a prerequisite at allA graded written report, due on its own clock, containing commands, configs, screenshots and machine-readable scanner output
◆ Key idea

A vendor prerequisite line answers the question "can I buy this course?" A baseline page answers a different one: "will the course's own material make sense to me at the speed it is delivered, and will the exam's format punish anything I am still translating?" Those are not the same question, and only the second one predicts your score. Treat the official line as the floor for enrolment and this page as the floor for passing.

⚠ Verify this before you book

Every figure on this page that describes the exam — the prerequisite wording, the number of challenges, the length of the challenge window, the passing score, the report window, the price — comes from Practical DevSecOps' own published pages, not from this site, and vendor certification pages change with little notice. Before you plan around any of them, confirm the current values at the source: ↗ Practical DevSecOps — CDP

Why the clock makes this a speed floor, not a reading floor

☺ Like you're 10: Knowing a thing and being able to do a thing fast are different. This exam only measures the second one.

The CDP's published shape is five challenges inside a six-hour window, scored out of 100 with 80 required to pass, followed by a separate 24-hour window to submit a written report. That is the whole of the arithmetic you need, and it is unforgiving: roughly seventy minutes per challenge, and the evidence you will need for the report has to be captured inside the same six hours, because the environment does not wait for you. Divide seventy minutes by the number of times you would normally open a browser tab to check a flag, and you have the argument for this entire page.

⚠ Do not budget from the published write-ups

This is the single most expensive mistake available to a CDP candidate right now, and it is almost invisible. Every first-hand account published between 2020 and mid-2024 describes a twelve-hour hands-on window. Jaiswal, Joshua Jebaraj, Ishaq Mohammed, Najib Radzuan, Ayoub Najim, Patil, Mikayel Mardanyan Petrosyan and Diogo Pereira all describe twelve. The vendor's current specification says six. The format appears to have been shortened after mid-2024 — the same official page still advertises 36 CPE credits, which is exactly the old twelve-plus-twenty-four arithmetic left behind. The techniques in those write-ups transfer intact. The time budgets in them are double the real one. Confirm the current window on the vendor's page and plan from that number, not from a blog post.

The consequence for your baseline is direct, and it is worth stating plainly before you read another section. Najim describes burning roughly three and a half hours on his first challenge and finishing the remainder under pressure; Patil planned a little over two hours per challenge and actually spent four on the first. Both of those stories end in a pass — because they had twelve hours. Under a six-hour clock, four hours on challenge one is the entire exam gone, and the only thing that reliably prevents it is not having to think about the substrate. If you are recalling chmod's octal digits, or working out why your YAML will not parse, or reading a manual page for jq, you are spending challenge-one time on material this page exists to make automatic.

The exam · 5 challenges · 6 hours · 80 / 100 then a separate 24-hour window for the written report Taught: the CDP course material SAST · SCA · DAST · IaC hardening · compliance as code · triage this course's nine blueprint chapters Assumed, and taught by nobody: the effective floor the shell & SSH · Git and its history · containers & registries HTTP and the web-app model · the AppSec vocabulary · cloud IAM YAML, JSON and jq · writing evidence as you go ← this page Stated: the vendor's prerequisite line basic Linux commands · foundational AppSec, e.g. the OWASP Top 10

How this page differs from the blueprint's first chapter

There is a page in this course that sounds like this one and is not: DevOps Foundations & the CDP Toolchain, which combines chapters 1 and 2 of the exam blueprint. That page is a fluency gate on the exam's specific toolchain and vocabulary — CAMS, continuous delivery versus continuous deployment, blue-green against canary against rolling, and the six tool categories the exam expects your hands to know. It assumes you can already drive a computer and teaches you the words the exam uses.

This page sits one layer below that. It is about the general skill the blueprint page itself takes for granted: not "which Ansible module makes this idempotent" but "can you read the file it wrote, own it correctly, and prove the service actually restarted." Read this one first if any row in the table above made you uncomfortable; read the blueprint chapter first if none of them did.

The map — what to check, and where to fix it

☺ Like you're 10: Eight areas. Skim this table, spot the ones that make you wince, and read those sections properly.

Every section below carries a one-line ⚖ Why the CDP leans on it marker, so you can triage before you read. Here is the whole map at a glance:

Baseline areaWhy a hands-on exam leans on itIf it is shaky, go to
Linux & the shellCritical. The only prerequisite the vendor names, and the medium every challenge is delivered throughThis section, then the command & tool reference
Git & its historyHigh. Every challenge starts from a repository, and secrets detection is a history problemSecrets management, gitleaks
Pipeline YAMLCritical. "Add a gate" is the single most repeated shape of task in this disciplineSecurity in CI/CD
Containers & registriesCritical. Nearly every scanner you will run is distributed as an imageContainer & supply-chain security
HTTP & the web-app modelHigh. DAST reports symptoms in HTTP; without it, every finding is a mysterySAST, DAST & SCA, API security
The AppSec vocabularyCritical. Named in the vendor's own prerequisite; triage is impossible without itVulnerability management & triage
Cloud IAM & identityMedium–high. Where pipeline credentials live, and where they leak fromWorkload identity & pipeline IAM
YAML, JSON & jqHigh. The format layer under every config you edit and every result you reportThis section — nothing else in the course covers it directly
Writing evidenceCritical. A graded report, on its own clock, from a lab you can no longer reachCompliance & governance, the exam guide

Linux and the shell

☺ Like you're 10: The exam happens inside a terminal. If the terminal itself is the hard part, nothing else gets a fair chance.

⚖ Why the CDP leans on it — Critical. This is the one prerequisite Practical DevSecOps names explicitly, and "basic" is doing a lot of work in that sentence. Patil's account names Linux hardening among the topics his exam touched, and you cannot harden a host you cannot read.

Here is a usable definition of the real bar, because "basic Linux" is not one. You should be able to sit down at an unfamiliar Linux host over SSH and, without documentation, answer four questions: what is running, as whom, listening on what, and what changed. Everything below is in service of those four.

Files, ownership and permissions

Permissions are where most security findings physically live, and where most candidates are slowest. You need the octal notation as a reflex, not a derivation — 644 and 600 and 755 should read as words, and chmod 777 should make you flinch before you have finished typing it. You also need the three things beyond the basic bits that scanners and hardening benchmarks care about: the setuid bit, world-writable files, and ownership drift after a deployment writes something as the wrong user.

# read a permission line without translating it in your head
ls -l /etc/shadow          # -rw-r----- root shadow  → owner rw, group r, world nothing
stat -c '%a %U %G %n' /etc/ssh/sshd_config

# the three hardening greps you should not have to look up
find / -perm -4000 -type f 2>/dev/null          # setuid binaries
find / -xdev -type f -perm -0002 2>/dev/null    # world-writable files
find /home -name '.*history' -o -name 'id_rsa'  # things that should not be readable

chmod 600 ~/.ssh/id_ed25519      # the ssh client refuses a private key any wider
chown -R app:app /srv/app        # ownership drift after a deploy is a real finding
umask 027                        # what new files inherit

Processes, services and logs

Nearly every "it does not work" moment in a hands-on exam resolves to one of three things: the service is not running, it is running as the wrong user, or it is not listening where you think. Being able to check all three in under ten seconds is worth more than any single tool flag you will memorise.

# what is running, and as whom
systemctl status nginx
ps -eo user,pid,cmd --sort=user | grep -v '\[' | head -30
id www-data

# what is listening
ss -tlnp                       # TCP, listening, numeric, with process
curl -sS -o /dev/null -w '%{http_code}\n' http://localhost:8080/

# what changed, and why it broke
journalctl -u nginx --since '10 min ago' --no-pager
journalctl -xe --no-pager | tail -40
systemctl daemon-reload && systemctl restart nginx && systemctl is-active nginx
⚠ Watch out

The most common self-inflicted wound in a hardening task is a change that works and does not persist. Editing a running process's behaviour, exporting an environment variable in your own shell, or changing a file that a config-management run will overwrite all produce a fix that evaporates the moment anything restarts — and a grader that checks state after a restart will score it as not done. Make the change in the file the service actually reads, reload the unit, and then verify from a fresh shell. That last step is the one people skip.

Text surgery, transfer and session survival

Scanner output is text, log files are text, and configuration is text. The four tools below cover almost all of it, and the fifth entry on this list is the one nobody thinks to practise until they lose two hours of work to a dropped SSH connection.

# find the needle
grep -rn --include='*.py' -E '(password|secret|api[_-]?key)\s*=' .
grep -c 'CRITICAL' scan.txt

# reshape a line
awk -F: '$3 >= 1000 {print $1, $7}' /etc/passwd     # real users and their shells
sed -i.bak 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
cut -d, -f1,3 findings.csv | sort | uniq -c | sort -rn

# move things around
scp -i key.pem report.md user@host:/tmp/
tar -czf evidence.tar.gz screenshots/ scan-output/
base64 -w0 small.png                                # when scp is not available

# survive a six-hour session
tmux new -s cdp        # detach with ctrl-b d, reattach with tmux attach -t cdp
script -a ~/cdp-session.log    # record everything you type and everything you see
🐢 Timmy's drill · 20 min

On any throwaway VM or container, do all of this without opening a manual page or a browser tab, and time yourself. Create a user, give it a home directory and no login shell. Find every setuid binary on the box. Turn off SSH password authentication and prove it took effect from a fresh connection. Find which process is holding port 80 and stop it cleanly. Then answer, from the logs alone, what time it last restarted and why. If any one of those five sent you to a search engine, that is not a gap in your DevSecOps knowledge — it is a gap under it, and it is the cheapest one on this page to close.

Git, and why history is the security surface

☺ Like you're 10: Deleting a secret from a file does not delete it from Git. Git remembers everything, forever, on purpose.

⚖ Why the CDP leans on it — High. Challenges start from a repository, pipeline configuration lives in one, and the secrets-detection category is fundamentally a question about history rather than about the current checkout.

You do not need to be a Git expert. You need to hold one model in your head clearly enough that a whole category of findings stops being surprising: a commit is an immutable snapshot, a branch is just a moving pointer to one, and nothing you commit is ever really removed by a later commit that deletes it. That single fact explains why gitleaks and TruffleHog scan history rather than the working tree, why "I removed the key in the next commit" is not a remediation, and why the correct answer to a leaked credential is always rotate first — history rewriting is cleanup, not containment. The full treatment is in secrets management; the drill is in the leaked-credential triage drill.

# the shape of the repository, fast
git log --oneline --graph --decorate -20
git status --short --branch
git diff HEAD~1 -- .gitlab-ci.yml

# the pickaxe: every commit where this string appeared or disappeared
git log -p -S 'AKIA' --all
git log --all --full-history -- 'config/secrets.yml'

# search every blob ever committed, not just the checkout
git rev-list --all | xargs git grep -n 'BEGIN RSA PRIVATE KEY' 2>/dev/null

# what a specific commit actually did
git show a1b2c3d --stat
git blame -L 40,60 src/auth.py
◆ Key idea

Two sentences that answer most secrets questions on any exam, in any format. A secret in Git history is a compromised secret from the moment it was pushed, regardless of what happened to it afterwards. And: rewriting history changes what the repository shows, not what an attacker already copied — so the remediation order is rotate, then revoke, then rewrite, then add the detection that would have caught it. Getting that order backwards is a graded mistake in exactly the kind of scenario the CDP builds challenges from.

One practical note from a published account rather than from theory. Sluijter's advice to CDP candidates was to clone the exam-related repository locally and pull updates regularly rather than relying on the browser view — a reminder that in a hands-on environment, your comfort with the plain command-line client is what you actually get to use. If your Git fluency currently lives entirely inside a graphical client or an IDE panel, that is a gap worth closing before you sit anything hands-on.

Pipeline YAML — the gate is the exit code

☺ Like you're 10: A scanner that runs and never stops a bad build is not a guard. It is a spectator with a clipboard.

⚖ Why the CDP leans on it — Critical. "Wire this scanner into the pipeline so it actually blocks" is the most repeated shape of task in this whole discipline, and it is a YAML-authoring skill before it is a security skill.

The blueprint's chapter 1 covers CI/CD terminology; this section covers the mechanics underneath it. Whichever platform you meet, five concepts carry everything: a stage orders work, a job is a unit that runs somewhere, an image decides what tools that job has available, artifacts carry files between jobs and out to you, and — the one that matters most — the job's exit code is the gate. A job that always exits zero cannot fail a build, no matter what it printed.

GitLab CI is the platform named most often across published CDP accounts, and Radzuan's description of the report he submitted specifically mentions including GitLab CI/CD YAML as evidence. Confirm the current lab platform against the vendor's syllabus rather than assuming, but learn the mechanics in a way that transfers: the names differ between platforms, the five concepts do not.

# .gitlab-ci.yml — a scanner wired as a real gate, not a spectator
stages: [build, test, security]

sca:
  stage: security
  image: aquasec/trivy:latest
  script:
    # --exit-code 1 is the entire difference between a gate and a report
    - trivy fs --exit-code 1 --severity HIGH,CRITICAL --format json -o trivy.json .
  artifacts:
    when: always          # keep the evidence even when the job fails
    paths: [trivy.json]
    expire_in: 1 week
  allow_failure: false    # the default, and worth writing down deliberately
# the same idea in GitHub Actions — different nouns, identical mechanics
jobs:
  sast:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: semgrep
        run: |
          docker run --rm -v "$PWD:/src" semgrep/semgrep \
            semgrep --config=auto --error --json --output /src/semgrep.json /src
      - uses: actions/upload-artifact@v4
        if: always()
        with: { name: semgrep, path: semgrep.json }
⚠ Watch out

Three habits turn a working gate into a decorative one, and all three appear in real pipelines constantly. allow_failure: true (or continue-on-error) makes a red job cosmetic. A trailing || true in the script swallows the exit code before the runner ever sees it. And a scanner invoked without its own failure flag — trivy without --exit-code, semgrep without --error — exits zero however many findings it printed. If a task asks you to make a scan block, the graded artefact is the non-zero exit, not the presence of the job. Prove it by pushing something that should fail and watching the pipeline go red.

Two more mechanics are worth having cold because they cost time when they surprise you. Secrets come from the platform's secret store, injected as masked variables — never from the YAML file, which is committed, and never from a build argument, which lands in the image history. And running Docker inside a CI job is either a mounted socket or a Docker-in-Docker service, and the mounted-socket version hands the job root on the host it runs on. That trade-off is covered properly in security in CI/CD; you only need to recognise it on sight.

Containers, from the outside in

☺ Like you're 10: Almost every security tool you will use comes packaged as a container. If containers are unfamiliar, every tool is unfamiliar too.

⚖ Why the CDP leans on it — Critical. Not because the CDP is a container-security exam — Practical DevSecOps sells container and Kubernetes security as separate credentials in the same family, which suggests the CDP's centre of gravity is the pipeline rather than the cluster; check the current syllabus rather than taking that as settled. It is critical because containers are the delivery mechanism for the toolchain. Trivy, Semgrep, gitleaks, ZAP and Conftest are all things you will most often run as docker run.

There is one command shape that recurs so often it is worth committing to muscle memory on its own, because it is how you run any containerised scanner against code that lives on your machine:

# the canonical shape: bind-mount the work directory, scan it, throw the container away
docker run --rm -v "$PWD:/src" -w /src <scanner-image> <scanner-args> .

# three real instances of exactly that shape
docker run --rm -v "$PWD:/src" -w /src aquasec/trivy:latest fs --severity HIGH,CRITICAL .
docker run --rm -v "$PWD:/repo" zricethezav/gitleaks:latest detect --source /repo -v
docker run --rm -v "$PWD:/src" semgrep/semgrep semgrep --config=auto /src

Beyond that, the concepts you need are few and they are all about identity and reproducibility rather than about orchestration:

ConceptWhat you must be able to sayWhy the exam cares
Image vs containerAn image is an immutable stack of layers; a container is a running instance with a writable top layerChanges made inside a running container vanish with it — a "fix" applied via docker exec is not a fix
Tag vs digestA tag is a mutable label; a digest (@sha256:…) names exactly one image forever:latest is not reproducible, so a scan of :latest does not prove anything about what deployed
Layers & build contextEvery instruction adds a layer, and deleting a file in a later layer does not remove it from the imageThe container equivalent of Git history — a secret COPY'd in and then rm'd is still recoverable
Multi-stage buildsBuild in a fat stage, copy only the artefact into a minimal final stageThe standard remediation for "the image ships a compiler and your source tree"
USERWithout it, the container's process is root — inside the container, and often as far as the kernel is concernedOne of the most reliably graded hardening findings there is
ENTRYPOINT vs CMDENTRYPOINT is the thing that runs; CMD supplies default arguments to itGetting it backwards is why your hardened image will not start, at minute forty of a challenge
# the shape you should be able to write from a blank file
FROM golang:1.22 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app ./cmd/app

FROM gcr.io/distroless/static-debian12@sha256:...   # pinned by digest, not by tag
COPY --from=build /out/app /app
USER 65532:65532                                     # nonroot, numerically
ENTRYPOINT ["/app"]
⚠ Watch out

docker run -v /var/run/docker.sock:/var/run/docker.sock is a normal-looking line in CI examples across the internet, and it is equivalent to giving that container root on the host. Recognise it on sight, because it appears both as a convenience you might be tempted to use under time pressure and as a finding you might be asked to remediate. The same applies to --privileged, and to a build that passes a credential as --build-arg — build arguments are visible in the image's own history.

The full treatment — signing, provenance, SBOMs, dependency confusion — is Pip and Benny's territory in container & supply-chain security, with the runtime side in container runtime security. For this page, the bar is only that none of the six rows above requires a lookup.

HTTP and the web-application model

☺ Like you're 10: A dynamic scanner tells you what a website did when it was poked. If you cannot read the poke or the reply, the report is just a list of scary words.

⚖ Why the CDP leans on it — High. Dynamic analysis is one of the categories the exam guide expects to see represented, and the ZAP baseline run is named in this course's own toolchain. A DAST tool's entire output is a description of HTTP behaviour.

The fluency test here is simple: could you reproduce a scanner's finding by hand with curl? If yes, you can triage it, judge whether it is a false positive, and write it up. If no, you are relaying a tool's opinion, which is exactly what a grader is trying to distinguish you from.

# see the whole exchange, not just the body
curl -isS https://target.example/login | head -30

# just the headers a security scanner will comment on
curl -sS -D - -o /dev/null https://target.example/ \
  | grep -iE 'strict-transport|content-security-policy|x-frame|set-cookie|server'

# reproduce an authenticated finding by hand
curl -sS -X POST https://target.example/api/login \
  -H 'Content-Type: application/json' \
  -d '{"user":"alice","pass":"..."}' -c jar.txt
curl -sS -b jar.txt https://target.example/api/orders/1042    # now try 1043

# is this endpoint reachable at all, and from where?
curl -sS -o /dev/null -w '%{http_code} %{time_total}s %{url_effective}\n' -L http://target.example/

Four clusters of knowledge sit behind those commands, and all four show up in scanner findings:

The category-by-category treatment lives in SAST, DAST & SCA, the API-specific version in API security in depth.

The application-security vocabulary

☺ Like you're 10: There are five different words for "this software has a problem," and they mean genuinely different things. Mixing them up makes your write-up wrong even when your fix is right.

⚖ Why the CDP leans on it — Critical. This is the half of the vendor's own prerequisite line that carries real weight, and it is the vocabulary your written report will be graded in.

The five identifiers, and what each one is not

TermWhat it isWhat it is not
CWEA class of weakness — CWE-89 is SQL injection as a category, in any productNot tied to a product or a version
CVEOne specific vulnerability in a specific product and version rangeNot a severity, and not evidence that you are affected
CVSSA 0–10 score plus a vector string describing intrinsic characteristicsNot risk. It knows nothing about your deployment, your data or your exposure
EPSSA probability, published by FIRST, that a CVE will be exploited in the near termNot a severity, and not a substitute for reachability analysis
KEVCISA's catalogue of vulnerabilities confirmed exploited in the wildNot exhaustive — absence from it proves nothing
◆ Key idea

The sentence that separates a triage answer from a scanner readout: severity is a property of the vulnerability, risk is a property of your system. A CVSS 9.8 in a package you import but never call, on an internal service with no untrusted input, may be genuinely lower priority than a 6.5 on your public login path. A grader asking you to triage is asking you to demonstrate exactly that distinction — which is why "I fixed everything Critical" is a weaker answer than "here is why these three came first." The method is in vulnerability management & triage.

The OWASP Top 10, and the honest caveat about editions

The OWASP Top 10 is a broad awareness document, revised on a multi-year cycle. The 2021 edition is the one most tooling, compliance mappings and training material have historically been built against, and its ten categories are worth being able to name and — more importantly — recognise in code:

2021 categoryWhat it looks like in a codebase
A01 Broken Access ControlAn endpoint that trusts an ID from the request without checking who is asking
A02 Cryptographic FailuresPlaintext transport, a hardcoded key, a fast hash used for passwords, a home-grown cipher
A03 InjectionUser input concatenated into SQL, a shell command, a template, or an LDAP filter
A04 Insecure DesignA missing control that no amount of correct implementation would supply — the threat-modeling category
A05 Security MisconfigurationDefault credentials, verbose errors, an open bucket, a debug flag in production
A06 Vulnerable and Outdated ComponentsThe SCA category — see Equifax
A07 Identification and Authentication FailuresWeak session handling, no rate limiting, credential stuffing left unblocked
A08 Software and Data Integrity FailuresUnsigned artefacts, an unverified update channel — see SolarWinds
A09 Security Logging and Monitoring FailuresNothing recorded the event, or something did and nobody was watching
A10 Server-Side Request ForgeryThe server fetches a URL an attacker controls — see Capital One
⚠ Check which edition you are citing

OWASP revises the Top 10 periodically, and category numbering shifts between editions — items merge, split and get renamed, so A04 does not mean the same thing across releases. Before you cite a category number in an exam report, in an interview, or in a ticket, confirm which edition is current at owasp.org/www-project-top-ten and say which edition you mean. "Broken Access Control, A01 in the 2021 edition" is always safe; a bare "A01" is only safe until the next release.

The deeper point is that the Top 10 is a vocabulary, not a checklist. It exists so that you and a grader can name the same thing the same way. Being able to look at a diff and say "that is injection because untrusted input reaches an interpreter, and the fix is parameterisation, not escaping" is the actual skill — see secure coding patterns for the fixes themselves.

Cloud IAM and identity

☺ Like you're 10: Who is allowed to do what, and how does a robot prove it is the robot it says it is?

⚖ Why the CDP leans on it — Medium–high, and hard to pin down precisely. How deep the CDP goes into any one cloud provider is not something the vendor publishes a domain weighting for, and this course's exam guide is explicit that no official percentage breakdown exists. What is not in doubt is that pipeline credentials have to come from somewhere, and IAM is where they come from and where they leak from.

The vocabulary is broadly consistent across providers even though the nouns differ, and you should be able to move between them without stalling:

IdeaAWSAzureGoogle Cloud
The thing actingPrincipal — user, role, or serviceSecurity principal / managed identityMember — user or service account
The permissionsPolicy (identity- or resource-based)Role definitionRole (primitive, predefined, custom)
Attaching themAttach policy to role/user/groupRole assignment over a scopeIAM binding on a resource
Short-lived credentialssts:AssumeRoleManaged identity tokenService account impersonation

Four things matter more than the naming:

Posture scanning across a whole account — Prowler, ScoutSuite and the rest — is Sol's territory. For this page, the bar is that an IAM policy document is something you can read at a glance rather than something you have to decode.

YAML, JSON and jq — the format layer nobody lists

☺ Like you're 10: Everything you edit is YAML and everything a scanner gives back is JSON. Being fast at both is a real skill, and nobody puts it on a prerequisite list.

⚖ Why the CDP leans on it — High, and invisible. Pipeline config, policy config, Ansible, InSpec profiles and Kubernetes manifests are YAML. Scanner output is JSON, SARIF or XML. Radzuan's account of the report he submitted explicitly describes including configuration files and machine-readable output alongside the screenshots — so the format layer is not just how you work, it is part of what gets graded.

The YAML failures that cost minutes

YAML is indentation-sensitive and the error messages are unhelpful, which is a bad combination under a clock. Four failure modes account for most of it:

# validate before you push — three seconds, saves a pipeline round trip
python3 -c 'import sys,yaml; yaml.safe_load(open(sys.argv[1]))' .gitlab-ci.yml && echo OK
yamllint -d relaxed .gitlab-ci.yml
docker run --rm -v "$PWD:/w" -w /w mikefarah/yq '.stages' .gitlab-ci.yml

jq, and turning scanner noise into a report table

This is the highest-leverage single skill in this section. A raw scanner JSON file is unreadable; three lines of jq turn it into the summary table your report needs, and doing that live is far faster than screenshotting a wall of terminal output and hoping.

# Trivy: every HIGH and CRITICAL, as a tab-separated table
jq -r '.Results[]?.Vulnerabilities[]?
       | select(.Severity=="HIGH" or .Severity=="CRITICAL")
       | [.VulnerabilityID, .PkgName, .InstalledVersion, .FixedVersion // "none", .Severity]
       | @tsv' trivy.json

# ...and the counts, which is what a summary paragraph actually needs
jq -r '[.Results[]?.Vulnerabilities[]?.Severity] | group_by(.)
       | map({sev: .[0], n: length}) | .[] | "\(.sev)\t\(.n)"' trivy.json

# Semgrep: rule, file and line, sorted
jq -r '.results[] | [.check_id, .path, (.start.line|tostring)] | @tsv' semgrep.json | sort

# SARIF is a shared format across many tools — learn this shape once
jq -r '.runs[].results[]
       | [.ruleId, .level, .locations[0].physicalLocation.artifactLocation.uri] | @tsv' out.sarif

# anything, straight into the report as a CSV
jq -r '.Results[]?.Vulnerabilities[]? | [.VulnerabilityID,.PkgName,.Severity] | @csv' trivy.json > findings.csv
◆ Key idea

Think of your report as a data-reduction exercise, not a writing exercise. The grader does not want six hundred lines of scanner output; they want the handful of findings you acted on, why those, and proof. jq is the tool that gets you from the first to the second in under a minute — which means it buys back report time from inside the challenge window, where time is scarcest. Aggregating findings across tools is the same idea at a larger scale, which is what DefectDojo exists to do.

The prerequisite nobody calls a prerequisite: writing evidence

☺ Like you're 10: Fixing it is only half the exam. Proving you fixed it — after the computer is switched off — is the other half.

⚖ Why the CDP leans on it — Critical, and structurally different from every other exam most candidates have sat. The CDP's published shape includes a separate window after the challenges close for submitting a written report. This is not paperwork appended to a score you already earned; it is part of how the work is assessed.

Three published accounts converge on the same warning, from different angles. Mohammed's review contains the sharpest single operational note anyone has written about this exam: the lab environment is gone when your window closes, so take backups, screenshots and saved output as you go rather than planning to collect them afterwards. Sluijter's advice was the same instruction as a habit — document while you work, not at the end. And Radzuan described what the report itself needed to contain: step-by-step instructions, the configuration files themselves, screenshots, and machine-readable scanner output. Pereira's contribution is the preparation side of it — build your own cheatsheets of commands and snippets before the exam, so the writing during it is assembly rather than composition.

⚠ Watch out

Terminal scrollback, an unsaved screenshot buffer and "I will remember what I did" all die at the same moment: the instant lab access ends. Everything that will appear in your report has to be written to a file, or captured as an image, or copied out to your own machine while the environment still exists. Candidates who solve every challenge and cannot evidence three of them do not get three challenges' worth of marks for having solved them.

The reason this belongs on a baseline page rather than an exam-day page is that it cannot be switched on for six hours. It is a habit, and habits need weeks. Start now, in your own lab work, with a four-line entry written the moment each thing is fixed:

### Finding 2 — SCA gate does not block on CRITICAL

**What was wrong.** The `sca` job ran Trivy and always exited 0, so a
CRITICAL in the base image did not fail the pipeline.

**How I found it.** `git show HEAD:.gitlab-ci.yml` — no `--exit-code`,
and `allow_failure: true` on the job.

**What I changed.** `.gitlab-ci.yml`, `sca` job:
`trivy fs --exit-code 1 --severity HIGH,CRITICAL .` and removed
`allow_failure`. Full file at `evidence/gitlab-ci.after.yml`.

**How I proved it.** Pushed a commit reintroducing the vulnerable
dependency; pipeline failed at the `security` stage.
Job log: `evidence/pipeline-failed.txt`. Screenshot: `evidence/02-red.png`.
Re-ran after the fix: passed. Log: `evidence/pipeline-green.txt`.
🐿️ Nutty's drill · every lab, from today

Nutty's whole job in this course is burying evidence where it can be dug up later, and this is the drill. From your next lab exercise onward, do not close a task until you have written the four lines above and saved the artefacts they reference into an evidence/ folder. Two habits make it nearly free: run script -a session.log at the start of every session so the terminal records itself, and pipe anything important through tee so it lands in a file as well as on screen. Do this for four weeks and the exam's report window stops being a second exam and becomes an hour of tidying up.

What is not on this floor

☺ Like you're 10: A list of things people worry about that are not actually the problem — so you can stop spending time on them.

A baseline page that keeps adding requirements stops being useful. Four things get worried about and should not be:

◆ Key idea

Read that list one more way and it is a single rule for the whole page. The floor is breadth at the keyboard, not depth in any one specialism. Nine areas you can move through without stalling beats two you could teach — because a six-hour window across five different challenges punishes narrow expertise exactly as hard as it punishes a shallow baseline.

Score yourself — the baseline self-test

☺ Like you're 10: Tick only what you could genuinely do right now, with no browser tab open. The empty boxes are the useful part.

Two tiers, and they measure different things. Tier 1 is recognition — can you explain it, spot it, name it correctly in a report. Tier 2 is the keyboard floor, and every item has an implied stopwatch, because on a hands-on exam everything does. Read each item as a literal instruction. Your progress is saved in this browser.

Tier 1 — recognition

Tier 2 — the keyboard floor

What your score means

Count the unticked boxes in each tier separately. The gaps are the signal; the totals are not comparable across tiers.

UntickedTier 1 — recognitionTier 2 — keyboard
0–3Start the course material now — begin at blueprint chapter 1You are ready for timed practice — go to the practice challenge bank
4–9One focused week. Re-read the matching sections here, then take the self-check and re-run this testTwo to three weeks of reps. Work the command & tool reference and Know It Cold until they are automatic
10+Do the foundations properly first — what DevSecOps is, the secure SDLC, the glossary — and treat CDP study as a next-quarter plan, not a next-week oneDo not book the exam yet. Build something real: the capstone lab track takes one pipeline end to end, then re-test
◆ Key idea

The two tiers can legitimately diverge, and the direction tells you what to do. Strong Tier 1, weak Tier 2 is the reviewer or architect profile — you can explain everything and produce nothing under a clock, which is the profile a hands-on exam punishes hardest. Spend your entire runway at a keyboard. Strong Tier 2, weak Tier 1 is the operator profile — you can fix it but not name it, which is survivable during the challenges and expensive in the report, where a grader reads your vocabulary. Fix it with the glossary and flashcards, not with more lab time.

Ten questions a checklist cannot ask

☺ Like you're 10: Ticking a box is easy to fake, even to yourself. Answering out loud is not.

Answer each of these out loud, from memory, in a couple of sentences, before opening the key. The point is not to score them; it is to notice which ones came out thin. A thin answer here is a slow challenge there.

✓ Self-check

1. A candidate removes a hardcoded API key from config.py, commits, and pushes. What is still wrong, and what is the correct remediation order? 2. A scanner job is present in the pipeline, prints CRITICAL findings, and the build goes green. Give three different mechanisms that could each cause that, and how you would tell them apart. 3. Explain the difference between a CVSS score and your risk, and give one example where a 9.8 is lower priority than a 6.5. 4. You have hardened sshd_config and the change works. What must you do before you can honestly write "done"? 5. A DAST report says a cookie is missing HttpOnly. Why could no SAST tool have found this, and how do you verify it by hand in one command? 6. What is the practical difference between an image tag and a digest, and what does that mean for the sentence "we scanned the image before deploying"? 7. Your pipeline needs to deploy to a cloud account. Compare a stored long-lived access key with OIDC federation, in terms of what an attacker gets from a compromised runner. 8. A scanner emits four thousand lines of JSON. Describe, concretely, how you get from that to two paragraphs and a table in your report. 9. Why is "document as you go" a prerequisite rather than an exam-day tip? 10. Every published first-hand CDP account describes a twelve-hour hands-on window. What should you actually do with those accounts, and what must you not take from them?

Check your answers
  1. The key is still in Git history and is therefore compromised from the moment it was pushed — anyone with clone access, at any point since, could have taken a copy. Removing it from the working tree changes nothing about that. Correct order: rotate the credential at the provider so the leaked value is worthless, revoke the old one and check the provider's access logs for use, then rewrite history if the repository's exposure warrants it, and finally add detection — a pre-commit hook and a history scan in CI — so the next one is caught before it is pushed. Rewriting first feels like fixing it and protects nobody.
  2. Three independent mechanisms. (a) The scanner was not asked to fail: no --exit-code 1 on Trivy, no --error on Semgrep, so it exits 0 having printed everything. (b) The job is marked non-blocking: allow_failure: true in GitLab, continue-on-error: true in Actions — the job goes red and the pipeline does not. (c) The script swallows the code — a trailing || true, or a pipeline into tee without set -o pipefail, so the runner sees the exit status of the last command rather than the scanner's. Tell them apart by reading the job definition first (b is visible immediately), then the script line (c), then running the scanner locally and echoing $? (a).
  3. CVSS describes intrinsic characteristics of the vulnerability — attack vector, complexity, privileges required, impact. It knows nothing about whether you deploy the affected component, whether the vulnerable code path is reachable, whether the service is internet-facing, or what data it holds. Example in one direction: a 9.8 remote-code-execution CVE in a library function your application imports but never calls, on an internal batch job with no untrusted input, versus a 6.5 broken-access-control issue on your public login endpoint that any user can trigger today. Example in the other: a "medium" in a widely exposed component that appears in CISA's KEV catalogue outranks a theoretical critical nobody has ever exploited.
  4. Prove it survives a restart, from a new connection. Reload or restart the service, confirm it came back (systemctl is-active), and then open a fresh session and demonstrate the new behaviour — because the risk is that you edited the wrong file, edited a file something else overwrites, or changed only the running process. Then capture that proof: the command, its output, and ideally the config diff. "It worked when I ran it" is not what a grader checks, and it is not what an auditor accepts either.
  5. Because the cookie's flags are set at runtime by the server's configuration or framework settings, not necessarily anywhere in the source the analyser reads — there is no code pattern to match against, and the same source can emit a correctly flagged cookie on one deployment and an unflagged one on another. It is an observable property of the running system, which is exactly the class DAST exists for. Verify by hand with a single request and read the header: curl -sS -D - -o /dev/null https://target/ | grep -i set-cookie.
  6. A tag is a mutable label that can be repointed at a different image at any time; a digest is a content hash that names exactly one image forever. So "we scanned the image before deploying" is only a meaningful claim if the thing you scanned and the thing you deployed are identified by the same digest. If both refer to a tag, the registry may have served different content to the scanner and to the deployment, and the scan proves nothing about what actually ran. This is why signing and provenance work on digests.
  7. With a stored long-lived key, compromising the runner gives the attacker a credential that keeps working after they leave — usable from anywhere, until somebody notices and rotates it. With OIDC federation, the runner holds no standing secret: at job time the CI platform issues a short-lived identity token, the cloud validates it against a trust policy scoped to a specific repository and often a specific branch or environment, and returns temporary credentials that expire within the hour. A compromised runner still yields whatever that job could do while it ran, so this is not immunity — but it removes the persistent, portable secret, which is the difference between an incident and a long-lived backdoor. The trust policy's scoping is what does the work, which is why an over-broad one undoes the whole benefit.
  8. Filter, aggregate, then narrate. Filter to the severities you acted on with jq ... | select(.Severity=="HIGH" or .Severity=="CRITICAL"); project only the fields a reader needs — identifier, package, installed version, fixed version — with @tsv or @csv; and separately produce a per-severity count with group_by so the summary paragraph has real numbers in it. The table goes in the report, the raw JSON goes in the evidence folder and is referenced by filename, and the two paragraphs say what you found, why you prioritised what you prioritised, and how you proved the fix. What must not happen is a screenshot of four thousand lines of terminal.
  9. Because it is a habit, and habits cannot be adopted on the day. The specific mechanism: the lab environment ends with the challenge window, taking your scrollback, your unsaved screenshots and your ability to re-run anything with it, while the report is due afterwards — so the capture has to happen while you are still working, interleaved with the technical work you are already time-pressured on. Someone who has practised it barely notices the overhead; someone doing it for the first time under a clock loses challenge time to it and still ends up with gaps. That is a preparation problem, which is why it is on a baseline page.
  10. Read them for technique and discard their arithmetic. What transfers: read all the challenges before starting because they interconnect; document as you go because access ends with the clock; expect tools and languages beyond the labs; pre-build your own cheatsheets; watch for the first challenge becoming a time sink. What does not transfer: every hour-by-hour plan in them, because they were written against a twelve-hour window and the current published specification is six. A candidate who copies a published time budget has planned for double the time they will get. Confirm the current window on the vendor's own page and build your plan from that number.

Closing the gaps you found

☺ Like you're 10: You now have a short list of wobbly bits. Fix those. Do not start over from the beginning.

Resist re-reading everything. You have a specific list, and specific lists are closed with specific drills — a recognition gap and a keyboard gap need genuinely different treatment.

Recognition gaps: explain it, then check yourself

Take the unticked Tier 1 item, explain it out loud from memory in one paragraph, then read the section above and mark what you got thin. That retrieval loop is the entire method. The glossary and flashcards handle the vocabulary items you keep dropping, and the self-check will tell you honestly whether the explanation stuck.

Keyboard gaps: reps against a clock, on something real

Speed is built one way only. Take the unticked Tier 2 item, do it ten times on a throwaway VM or container, and time the tenth. Then stop drilling in the abstract and put it in service of something: the capstone lab track takes a single pipeline through threat modeling, SAST and secrets, an SCA gate, container hardening and signing, IaC policy, a DAST run and compliance evidence — every motion on this page appears in it, attached to a reason. The leaked-credential triage, broken Terraform and dependency fire drills are the shorter, sharper version.

Where each area is actually taught

If this was your gap……go here next
Linux, shell, or verification habitsThe command & tool reference, then the triage playbook
Git history, secrets, rotationSecrets management, gitleaks, static analysis & secrets detection
Pipelines and gatingSecurity in CI/CD, secure SDLC gates & DSOMM
Containers, images, registriesContainer & supply-chain security, Trivy, SBOMs
HTTP, DAST, APIsSAST, DAST & SCA, OWASP ZAP, API security in depth
Vulnerability vocabulary and triageVulnerability management & triage, SCA in depth
Cloud IAM and pipeline identityWorkload identity & pipeline IAM, cloud security posture
Policy, compliance and evidenceIaC security & policy as code, compliance as code at scale, InSpec
Exam logistics and the two clocksThe CDP exam guide, then the CDP study plan

Then, and only then, start the exam material

Once these boxes are ticked, everything downstream gets cheaper — because an SCA gate becomes "a container, a flag and an exit code," a hardening task becomes "a config file, a reload and a proof," and a report becomes "the four lines I already wrote, tidied." That is the whole return on this work: not new knowledge, but the disappearance of the constant background translation cost that makes a six-hour window feel like four. The next stop is blueprint chapter 1, and the schedule that holds it all together is the CDP study plan.

🎬 At the Shift-Left Squad
🦫

Benny: Right, I've booked the CDP. Six weeks out. I've read every blueprint chapter twice, so I reckon I'm basically there.

🐢

Timmy: Good. Quick one, then. Find me every setuid binary on that box. No searching.

🦫

Benny: Easy — it's find, obviously, and then the permission flag is... is it -perm 4000, or does it need the dash in front? Hang on, let me just —

🐢

Timmy: That's the exam, Benny. Five challenges, six hours. You just spent forty seconds on a flag, and you haven't started the actual task yet.

🦊

Foxy: Hold on though — the write-ups I read all say twelve hours. Plenty of room for a bit of searching.

🦉

Professor Owl: Every one of those was written before the format changed. The vendor's current page says six. Same five challenges, half the clock. Read those posts for the technique, never for the timings.

🦊

Foxy: ...so every hour-by-hour plan I've been building my prep around is double.

🦉

Professor Owl: Exactly double. Which is why the vendor's prerequisite line — basic Linux, a bit of OWASP — is the floor for buying the course, not the floor for passing the exam.

🐿️

Nutty: And whatever you do, don't leave the write-up for afterwards. The lab is gone when the clock stops. Your scrollback goes with it, your screenshots go with it, and "I definitely fixed that one" is worth nothing.

🦫

Benny: So the write-up is... part of the work, not after the work.

🐿️

Nutty: Four lines, the moment you fix a thing. What was wrong, how you found it, what you changed, how you proved it. Do it for a month and the report window becomes an hour of tidying.

🐢

Timmy: And Benny — the self-test on this page took you twenty minutes. Finding that find gap at hour four would have cost you a challenge. That's not a bad result. That's a study plan.

🐢 Timmy's checkpoint

These deliberately do not re-ask the ten questions above. They test whether the page's argument landed, not its facts. 1. Why is the vendor's stated prerequisite line true about the course and weak about the exam? 2. Name the four questions you should be able to answer on an unfamiliar Linux host without documentation. 3. What is the difference in scope between this page and blueprint chapter 1, and which should you read first? 4. Tess Sluijter warned that the exam may use tools and languages the labs did not. What does that imply about how you prepare — and what does it specifically not imply? 5. The two tiers of the self-test can diverge. What does each direction of divergence tell you to do with your remaining time? 6. Which of this page's nine areas is not taught anywhere else in this course?

Check your answers
  1. Because the course is scaffolded and the exam is not. Practical DevSecOps' package includes a large set of guided lab exercises, and a guided lab genuinely can carry someone through their first container build — so "no prior DevOps experience necessary" is a fair statement about enrolling. The graded challenges remove the instructions, change the tools, and start a clock; at that point a thin baseline stops being carried and starts costing challenges. The line answers "can I buy this?", not "will I pass?"
  2. What is running, as whom, listening on what, and what changed. In practice: systemctl status and ps; id and the process owner column; ss -tlnp; and journalctl plus a look at file modification times. Nearly every "it does not work" moment in a hands-on task resolves to one of those four.
  3. Chapter 1 is a fluency gate on the exam's own toolchain and vocabulary — CAMS, delivery versus deployment, blue-green against canary, the six tool categories. This page is the layer below it: the general computing and application-security skill that chapter itself assumes. Read this page first if any row in the opening comparison table made you uncomfortable; go straight to chapter 1 if none of them did.
  4. It implies your preparation should build transferable skill rather than tool-specific recall — understand what a class of tool does and how to read its output, so an unfamiliar scanner is a manual page rather than a wall, and practise reading vulnerability patterns across more than one language. It specifically does not imply that you need offensive or exploit-development skill. Sluijter's comparison to the OSCP was about the willingness to research something unfamiliar mid-task, not about writing exploits — treating it as a demand for offensive tooling depth sends you off to prepare for a different exam.
  5. Strong Tier 1, weak Tier 2 is the reviewer or architect profile — you can explain everything and produce nothing under a clock, which is exactly what a hands-on exam punishes hardest. Spend the whole remaining runway at a keyboard, on real reps, not on more reading. Strong Tier 2, weak Tier 1 is the operator profile — you can fix it but not name it correctly, which is survivable during the challenges and expensive in the report, where a grader reads your vocabulary. Fix that one with the glossary and flashcards, not with more lab time.
  6. The format layer — YAML's failure modes, and reading scanner output with jq. Every other area on this page has a dedicated page or chapter elsewhere in the course; that one is assumed everywhere and taught nowhere, which is exactly why it is the section most worth drilling if you skimmed it.