GitHub Copilot security review for QA gives testers an early way to inspect in-flight code changes for likely vulnerabilities. GitHub introduced the /security-review command in the Copilot app as a public-preview workflow that reports focused findings with severity, confidence, and suggested action. It is useful before a pull request is merged, but it is not proof that a build is secure. This tutorial turns the AI output into a repeatable QA workflow built around reproduction, tests, and independent scanners.
What the security review does—and does not do
Run /security-review from a Copilot app project containing your current changes. The documented security-review agent analyzes changes for high-confidence vulnerability candidates and does not modify code. GitHub highlights common classes such as injection, cross-site scripting, insecure data handling, path traversal, and weak cryptography.
That scope is valuable but bounded. The review may miss a vulnerability, misunderstand business authorization, or suggest a fix that changes behavior. Keep existing static analysis, dependency scanning, secret scanning, API security tests, and human review. Think of Copilot as a fast additional reviewer whose claims need evidence.
Prepare a small, reviewable change
Start with a clean branch and a narrow diff. Run the normal test suite first and save its result. Then identify the trust boundary touched by the change: user input, file paths, authentication, database queries, redirects, or rendered HTML. A small diff makes both AI review and human validation easier.
For this example, imagine an Express endpoint changed to accept a report filename. The unsafe draft joins user input directly to a storage path:
app.get('/reports/:name', async (req, res) => {
const file = path.join(REPORT_DIR, req.params.name);
res.sendFile(file);
});
Do not use production secrets or customer data in prompts, logs, screenshots, or test fixtures. Use a local test repository and synthetic values.
Run GitHub Copilot security review for QA
- Open the project in the GitHub Copilot app and confirm the intended branch and changed files.
- Enter
/security-review. If the interface accepts an optional prompt, narrow it to the changed endpoint and its trust boundary. - Let the review complete, then capture each finding’s file, line, vulnerability class, severity, confidence, and proposed remediation.
- Do not apply a suggestion immediately. Convert the finding into a testable hypothesis.
Try This Prompt
/security-review Focus on the changed report-download endpoint.
For every finding, identify the untrusted input, vulnerable sink,
expected exploit path, and a safe verification step. Do not edit files.
This prompt reflects the queue’s practical angle: inspect a security-relevant change, preserve a read-only review step, and ask for evidence that a QA engineer can challenge.
Triage severity and confidence with evidence
Create one row per finding. Record the claim, affected build, reproduction status, observed result, and disposition. Severity estimates impact; confidence estimates how certain the reviewer is. Neither replaces reproduction.
| Check | QA question |
|---|---|
| Reachability | Can an untrusted user reach the changed path? |
| Control | Which input can the user influence? |
| Impact | What data or action becomes exposed? |
| Existing control | Is validation, authorization, encoding, or sandboxing already present? |
| Reproduction | Can a safe local test demonstrate the behavior? |
For the report endpoint, test valid filenames, nested paths, encoded traversal characters, missing files, and unauthorized users. Use only a disposable fixture directory. A strong test asserts both the response and the absence of access outside that directory. If the behavior cannot be reproduced, document why; do not silently mark the finding fixed.
Add a focused regression test
Once the issue is confirmed, add a test that fails on the vulnerable build. Keep the assertion observable and specific:
test('rejects report paths outside the allowed directory', async () => {
const response = await request(app).get('/reports/..%2Fsecret.txt');
expect(response.status).toBe(400);
expect(response.body.error).toBe('Invalid report name');
});
The application fix might allow only a known filename pattern, resolve the final path, verify it remains inside the approved directory, and enforce authorization. Choose controls that match your architecture. Review the proposed patch manually, run formatting and lint checks, then run the focused test and the broader suite.
Reverify before merge
- Run the original safe reproduction against the patched build.
- Run the new regression test and related endpoint tests.
- Run the repository’s SAST, dependency, and secret-scanning checks.
- Run
/security-reviewagain and compare the result with the first report. - Ask a human reviewer to inspect the trust boundary and test evidence.
A clean second AI review is supporting evidence, not the release gate. The meaningful result is that the exploit path is blocked, authorized behavior still works, automated checks pass, and the human reviewer understands the change.
Common mistakes
- Scanning a huge diff: unrelated changes make findings harder to validate.
- Trusting severity labels: business context can raise or lower real impact.
- Applying a patch before reproducing: you may hide the symptom without proving the root cause.
- Testing only the malicious input: valid report downloads and authorization must still work.
- Replacing security tools: AI review complements deterministic scanners and specialist review.
- Sharing sensitive material: redact secrets, tokens, customer records, and private logs.
Best practices for QA teams
Define a lightweight review template with finding ID, source, severity, confidence, reproduction, fix commit, regression test, scanner results, and reviewer. Keep the AI session linked to the pull request when policy allows. Prefer small commits so findings map cleanly to code. Most importantly, measure useful outcomes: confirmed defects found before merge, false positives, escaped issues, and time to verify—not the number of AI findings.
Screenshot checklist
- Copilot app showing the selected project, branch, and narrow changed-file list.
- The entered
/security-reviewrequest with no sensitive data visible. - One finding showing file context, severity, confidence, and recommendation.
- The failing regression test on the vulnerable local build.
- The passing focused test and broader test summary after the fix.
- The second security review plus existing scanner results before merge.
FAQ
Does Copilot security review replace SAST?
No. Use it as an additional early review layer alongside SAST, dependency scanning, secret scanning, targeted tests, and human review.
Should QA automatically apply its fix?
No. Reproduce the issue first, review the proposed change, add a regression test, and verify intended behavior after the patch.
What if a high-severity finding cannot be reproduced?
Record the environment, inputs, and controls checked. Escalate uncertain high-impact claims to a security reviewer instead of dismissing them.
Can the command review uncommitted changes?
GitHub describes it as reviewing in-flight or current workstream changes. Confirm the displayed scope before relying on the result.
Conclusion
GitHub Copilot security review for QA is most useful when it starts an evidence loop: narrow the diff, run the review, reproduce each credible claim, add a focused test, apply a reviewed fix, and reverify with independent checks. That workflow helps QA engineers find security regressions earlier without confusing an AI opinion with a release decision.
References
- GitHub Changelog: Security reviews in the Copilot app
- GitHub Copilot CLI command reference
- Responsible use of GitHub Copilot agents
- Review AI-generated code
