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.
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.
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 area | What the vendor's page states | What 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 tooling | Not necessary | Docker, a CI platform and its YAML, Ansible and InSpec all named by name across independent accounts |
| Application security | Foundational, e.g. the OWASP Top 10 | Finding and fixing real instances in real code, in languages the labs did not use |
| Tooling breadth | The course's own tool set | Expect tools you did not train on, and deeper features of the ones you did |
| Writing | Not listed as a prerequisite at all | A graded written report, due on its own clock, containing commands, configs, screenshots and machine-readable scanner output |
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.
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.
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.
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 area | Why a hands-on exam leans on it | If it is shaky, go to |
|---|---|---|
| Linux & the shell | Critical. The only prerequisite the vendor names, and the medium every challenge is delivered through | This section, then the command & tool reference |
| Git & its history | High. Every challenge starts from a repository, and secrets detection is a history problem | Secrets management, gitleaks |
| Pipeline YAML | Critical. "Add a gate" is the single most repeated shape of task in this discipline | Security in CI/CD |
| Containers & registries | Critical. Nearly every scanner you will run is distributed as an image | Container & supply-chain security |
| HTTP & the web-app model | High. DAST reports symptoms in HTTP; without it, every finding is a mystery | SAST, DAST & SCA, API security |
| The AppSec vocabulary | Critical. Named in the vendor's own prerequisite; triage is impossible without it | Vulnerability management & triage |
| Cloud IAM & identity | Medium–high. Where pipeline credentials live, and where they leak from | Workload identity & pipeline IAM |
| YAML, JSON & jq | High. The format layer under every config you edit and every result you report | This section — nothing else in the course covers it directly |
| Writing evidence | Critical. A graded report, on its own clock, from a lab you can no longer reach | Compliance & 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 nginxThe 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 seeOn 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
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 }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:
| Concept | What you must be able to say | Why the exam cares |
|---|---|---|
| Image vs container | An image is an immutable stack of layers; a container is a running instance with a writable top layer | Changes made inside a running container vanish with it — a "fix" applied via docker exec is not a fix |
| Tag vs digest | A 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 context | Every instruction adds a layer, and deleting a file in a later layer does not remove it from the image | The container equivalent of Git history — a secret COPY'd in and then rm'd is still recoverable |
| Multi-stage builds | Build in a fat stage, copy only the artefact into a minimal final stage | The standard remediation for "the image ships a compiler and your source tree" |
USER | Without it, the container's process is root — inside the container, and often as far as the kernel is concerned | One of the most reliably graded hardening findings there is |
| ENTRYPOINT vs CMD | ENTRYPOINT is the thing that runs; CMD supplies default arguments to it | Getting 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"]
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 response headers that are findings in themselves — a missing
Strict-Transport-Security, an absent or permissiveContent-Security-Policy, aSet-CookiewithoutSecure,HttpOnlyor a saneSameSite, an over-broad CORSAccess-Control-Allow-Origin, aServerbanner advertising an exact version. These are the bulk of any baseline DAST run and they are all configuration, not code — which is precisely why static analysis cannot see them. - How the application knows who you are — session cookie, bearer token, JWT, basic auth, or an OAuth-issued token. You do not need to implement any of them; you need to be able to capture one, replay it, and reason about what happens when you replay it as somebody else. That last move is how broken access control is demonstrated, and broken access control is the category that automated scanners are worst at and graders like most.
- Status codes as evidence — a
403where you expected200proves an authorisation control exists; a200where you expected403is a finding you can write up in one line. A302to a login page is not the same as a denial, and treating it as one is a classic false-negative. - The proxy model — that ZAP and Burp work by sitting between client and server, and that "the scanner could not reach the app" is nearly always a proxy, TLS-trust or network-path problem rather than a scanner defect.
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
| Term | What it is | What it is not |
|---|---|---|
| CWE | A class of weakness — CWE-89 is SQL injection as a category, in any product | Not tied to a product or a version |
| CVE | One specific vulnerability in a specific product and version range | Not a severity, and not evidence that you are affected |
| CVSS | A 0–10 score plus a vector string describing intrinsic characteristics | Not risk. It knows nothing about your deployment, your data or your exposure |
| EPSS | A probability, published by FIRST, that a CVE will be exploited in the near term | Not a severity, and not a substitute for reachability analysis |
| KEV | CISA's catalogue of vulnerabilities confirmed exploited in the wild | Not exhaustive — absence from it proves nothing |
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 category | What it looks like in a codebase |
|---|---|
| A01 Broken Access Control | An endpoint that trusts an ID from the request without checking who is asking |
| A02 Cryptographic Failures | Plaintext transport, a hardcoded key, a fast hash used for passwords, a home-grown cipher |
| A03 Injection | User input concatenated into SQL, a shell command, a template, or an LDAP filter |
| A04 Insecure Design | A missing control that no amount of correct implementation would supply — the threat-modeling category |
| A05 Security Misconfiguration | Default credentials, verbose errors, an open bucket, a debug flag in production |
| A06 Vulnerable and Outdated Components | The SCA category — see Equifax |
| A07 Identification and Authentication Failures | Weak session handling, no rate limiting, credential stuffing left unblocked |
| A08 Software and Data Integrity Failures | Unsigned artefacts, an unverified update channel — see SolarWinds |
| A09 Security Logging and Monitoring Failures | Nothing recorded the event, or something did and nobody was watching |
| A10 Server-Side Request Forgery | The server fetches a URL an attacker controls — see Capital One |
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:
| Idea | AWS | Azure | Google Cloud |
|---|---|---|---|
| The thing acting | Principal — user, role, or service | Security principal / managed identity | Member — user or service account |
| The permissions | Policy (identity- or resource-based) | Role definition | Role (primitive, predefined, custom) |
| Attaching them | Attach policy to role/user/group | Role assignment over a scope | IAM binding on a resource |
| Short-lived credentials | sts:AssumeRole | Managed identity token | Service account impersonation |
Four things matter more than the naming:
- Least privilege is a list of actions, not an attitude.
"Action": "s3:*"and"Resource": "*"are the two strings a reviewer scans for first, and a wildcard on either is a finding you can name in one sentence. - A role has two policies and people conflate them. The permission policy says what the role may do; the trust policy says who may assume it. An over-broad trust policy is the more dangerous of the two and the less frequently reviewed.
- The right way for a pipeline to authenticate is federation, not a stored key. The CI platform presents a short-lived OIDC token, the cloud exchanges it for temporary credentials, and there is no long-lived secret to leak. Long-lived access keys pasted into CI variables are the pattern this replaces — the reasoning is in workload identity & pipeline IAM.
- Instance metadata is a credential endpoint. A server-side request forgery that reaches the metadata service can read the machine's role credentials, which is the mechanism behind the Capital One breach. Session-oriented metadata (IMDSv2 on AWS, and its equivalents elsewhere) exists specifically to break that chain, and "enforce the session-oriented version" is a remediation you should be able to state without hedging.
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:
- Tabs are illegal for indentation. If your editor inserts them, YAML will not parse, and the message will not say "tab."
- Unquoted
no,yes,on,offandymay be read as booleans in parsers following the older YAML 1.1 rules — the reason a country code ofNOcan silently becomefalse. Quote anything that is meant to be a string and happens to look like something else, and quote version numbers too, since1.10is a number and1.10.2is not. - Block scalars differ:
|keeps newlines,>folds them into spaces. Using the wrong one in a multi-linescript:block produces one enormous shell command. - A list of maps needs its dashes lined up with the key, and a stray extra space turns a sibling into a child. This is the single most common "why is my pipeline not seeing this job" cause.
# 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.csvThink 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.
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 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:
- Production-grade programming. You need to read code in several languages well enough to see where untrusted input reaches something dangerous, and to apply a fix pattern. You do not need to build applications. Sluijter's warning that the exam may use languages the labs did not is a warning about reading breadth, not about writing depth — a competent reader of Python, JavaScript and one JVM or Go codebase can triage almost anything, because vulnerability patterns rhyme across syntax.
- Exploit development. The OSCP comparison Sluijter drew is about mindset — being willing to research something unfamiliar mid-task — not about writing exploits. Nothing in the published accounts describes needing offensive tooling skill of that kind. If you want the offensive perspective anyway, offensive security for DevSecOps is there, but do not treat it as a gate.
- Deep Kubernetes. Practical DevSecOps offers container and Kubernetes security as separate credentials in the same family, which points to the CDP being pipeline-centred. Treat that as a reasonable inference and confirm it against the current syllabus rather than as a settled fact — and if your own work is cluster-heavy, the Kubernetes security deep dive and the CKS are the right places for it, not this page.
- Memorising CVE numbers, tool version numbers or the vendor's slide decks. Petrosyan's critical review of the CDP describes the material as heavily operational and light on theory. Whatever else that says about the course, it tells you something useful about preparation: the exam rewards what you can do, and time spent memorising catalogue numbers is time not spent at a keyboard.
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
- ① System & shell
- ② Git & the supply chain
- ③ Pipelines
- ④ AppSec & the web
- ⑤ Identity & formats
- ⑥ Evidence
Tier 2 — the keyboard floor
- ⑦ On a host, no documentation
- ⑧ Repository & pipeline
- ⑨ Containers & scanners
- ⑩ Output & evidence
What your score means
Count the unticked boxes in each tier separately. The gaps are the signal; the totals are not comparable across tiers.
| Unticked | Tier 1 — recognition | Tier 2 — keyboard |
|---|---|---|
| 0–3 | Start the course material now — begin at blueprint chapter 1 | You are ready for timed practice — go to the practice challenge bank |
| 4–9 | One focused week. Re-read the matching sections here, then take the self-check and re-run this test | Two 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 one | Do not book the exam yet. Build something real: the capstone lab track takes one pipeline end to end, then re-test |
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.
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
- 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.
- Three independent mechanisms. (a) The scanner was not asked to fail: no
--exit-code 1on Trivy, no--erroron Semgrep, so it exits 0 having printed everything. (b) The job is marked non-blocking:allow_failure: truein GitLab,continue-on-error: truein Actions — the job goes red and the pipeline does not. (c) The script swallows the code — a trailing|| true, or a pipeline intoteewithoutset -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). - 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.
- 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. - 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. - 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.
- 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.
- 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@tsvor@csv; and separately produce a per-severity count withgroup_byso 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. - 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.
- 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 habits | The command & tool reference, then the triage playbook |
| Git history, secrets, rotation | Secrets management, gitleaks, static analysis & secrets detection |
| Pipelines and gating | Security in CI/CD, secure SDLC gates & DSOMM |
| Containers, images, registries | Container & supply-chain security, Trivy, SBOMs |
| HTTP, DAST, APIs | SAST, DAST & SCA, OWASP ZAP, API security in depth |
| Vulnerability vocabulary and triage | Vulnerability management & triage, SCA in depth |
| Cloud IAM and pipeline identity | Workload identity & pipeline IAM, cloud security posture |
| Policy, compliance and evidence | IaC security & policy as code, compliance as code at scale, InSpec |
| Exam logistics and the two clocks | The 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.
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.
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
- 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?"
- What is running, as whom, listening on what, and what changed. In practice:
systemctl statusandps;idand the process owner column;ss -tlnp; andjournalctlplus a look at file modification times. Nearly every "it does not work" moment in a hands-on task resolves to one of those four. - 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.
- 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.
- 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.
- 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.