Secure code review interview questions
Code review interviews almost always include a live snippet. What is graded is how you navigate unfamiliar code, whether you find the bug for the right reason, and how you would communicate it to the engineer who wrote it without derailing their week.
Commonly asked for: Application Security Engineer, Security Code Reviewer, Product Security Engineer.
What is being tested
What the interviewer is really checking
- Do you have a strategy for a codebase you have never seen?
- Do you trace untrusted input to a dangerous sink rather than skim for keywords?
- Can you tell a real finding from tool noise?
- Can you write a finding a developer can act on immediately?
Questions and answers
5 questions with model answers
Rewrite each answer in your own words before the loop — interviewers can tell a memorized paragraph from one you can defend under a follow-up.
- Question 1
How do you approach reviewing a codebase you have never seen?
I map the attack surface before reading logic: entry points such as routes, handlers, message consumers, and scheduled jobs, plus where authentication and authorization are enforced. Then I work sink-first — query builders, template rendering, deserialization, file and process operations, outbound HTTP — and trace backwards to see whether untrusted input can reach them, because that is far faster than reading files in order. I check the cross-cutting layers next: dependency versions, secrets in configuration or history, error handling and what gets logged, and how sessions and tokens are managed. Throughout I note what the code assumes — that a caller already checked permissions, that an internal service is trusted — because broken assumptions are where the interesting bugs live.
- Question 2
What do you look for when reviewing a single pull request?
First, whether the change moves a trust boundary: new endpoint, new parameter, new external call, or a change to who can invoke something. Then authorization specifically, since new endpoints routinely inherit authentication but forget the ownership check. I look at how input is validated and where it ends up, whether errors leak internal detail, whether anything sensitive is now being logged, and whether a new dependency was pulled in. Because a diff hides context, I make a point of reading the surrounding function rather than only the changed lines — plenty of vulnerabilities are introduced by a change that is fine in isolation and wrong given what the caller does.
- Question 3
Your SAST tool reports four hundred findings. What now?
I do not hand that list to developers. I triage by rule class first, because a handful of noisy rules usually generate most of the volume, and I validate a sample of each class to judge precision before deciding whether to keep, tune, or disable the rule. Findings with genuine data flow from an untrusted source to a dangerous sink get priority over pattern matches on a function name. Then I fix at the source: many findings share one root cause, such as a helper that builds SQL by concatenation, so one change closes dozens. Going forward I would gate builds only on high-confidence rules, keep the rest as informational, and treat the false-positive rate as a metric I own — because a scanner that developers learn to ignore is worse than no scanner.
- Question 4
How do you write a finding the developer will actually fix?
Lead with the evidence — file, line, and the path untrusted input takes to the dangerous operation — so it is verifiable rather than asserted. State the impact in terms of this application, not a generic description of the bug class: what an attacker gets, with what access, and against which data. Give a concrete fix, ideally as the code shape you want rather than a link to a standard, and note the tradeoff if the fix affects behavior or performance. Set severity honestly and be explicit about what you did not verify. Tone matters more than people admit: reviewing the code rather than the author is what keeps engineers reporting things to you instead of routing around you.
- Question 5
What bug classes will a scanner never find for you?
Anything that depends on intent. Broken authorization is the biggest one — a tool cannot know that this endpoint should only be callable by the resource owner — and it is consistently the highest-impact web bug class. Business logic flaws are the same story: negative quantities, repeated redemption of a one-time discount, or a workflow step that can be skipped all look like correct code. Race conditions and time-of-check to time-of-use issues need concurrency reasoning tools rarely do well, and insecure design cannot be found in an implementation at all. That is the argument for human review and threat modeling alongside tooling, and it is usually the point the interviewer is fishing for.
Practice
Practice the reasoning, not the wording
Find flaws in synthetic code snippets defensively. The secure code review mission track puts you in front of those scenarios and makes you commit to a finding, which is the same move the interview asks for.
Guest missions
Four missions are playable with no account and no setup, including a proxy investigation and a cloud IAM misconfiguration.
Open /trySecure Code Review missions
The full library groups missions by domain, so you can work the Review track end to end. Requires an account.
Open the mission libraryInterview Lab
Answer scenario prompts in your own words and get scored on structure — evidence, impact, remediation, tradeoff.
Open the Interview LabOther domains
