Back to blog

Empowered QA: Finding Security Bugs Beyond Functional Testing

What if QA could surface a security bug outside its test plan and bring engineering a fix to review? The profession is gaining a wider reach.

Security bugs. QA can find and fix. A magnifier reveals a security flaw beneath functional checks, connected to a fix and tests for engineering review.

What if a QA engineer had flagged the PHP2Shell bug in January 2025, when the change that introduced it was still fresh?

Imagine the conversation. A diagnostic improvement is being reviewed. The intended behavior makes sense: preserve a backtrace when a fatal error occurs. But QA brings a finding to the team: after the request ends, the backtrace can still point to memory that has already been freed. A later request may reach it.

Then imagine QA bringing more than the finding. Alongside the affected path is a fix for engineering to review and a test intended to exercise the failure.

That is a thought experiment, not what happened in January 2025. It asks a useful question about the future of the profession: what changes when QA can uncover a defect it did not already know to test for and bring engineering a fix?

The answer reaches beyond adding more test cases. It changes the kinds of problems QA can bring into the release conversation, and how far the team can take them toward resolution.

Empowered QA means expanding both what the team can uncover and what it can deliver: security findings beyond existing test scenarios, and fix pull requests with tests for engineering review.

Revisit the January 2025 change

In January 2025, a PHP diagnostic change introduced a dangerous memory lifetime. A fatal-error backtrace could remain referenced after the request memory holding it had been released. A later request could reach that stale value before normal initialization reset it.

In plain terms, the system kept an address for information whose storage was no longer valid. Exercising a normal request would not necessarily expose the interaction between request cleanup, a retained backtrace, and a later error.

In a targeted retrospective analysis after disclosure, Early flagged the unsafe memory lifetime behind the PHP2Shell case. External researchers established the broader exploit. The finding identified a specific question for investigation: what clears this reference before another request can use it?

Now return to the imagined QA conversation. The engineer receiving that finding has a concrete path to examine. QA can help establish the affected conditions, bring in the appropriate specialist, and track the investigation through repair and validation. The team has a starting point that does not depend on a QA engineer independently recognizing the memory-lifetime mechanism.

Read the PHP2Shell Case File for the evidence and the historical analysis for the technical detail.

The profession gains a wider reach

QA already does much more than execute a predefined checklist. Exploratory testing, risk assessment, negative testing, and investigation all depend on asking good questions about a system. The constraint is often knowing which unexpected question to ask.

A team can test an error message without investigating the lifetime of the memory behind it. It can test authentication without inspecting every place the credential travels afterward. These are different views of the same software, and expertise in one does not automatically expose failures in another.

Analysis that finds these defects expands the material QA can work with. A finding can put memory safety, credential handling, or an interaction across components on the team’s agenda before a visible failure in the expected user journey does.

For engineering leaders, the opportunity is to widen security discovery without expecting every QA engineer to become a security specialist. QA can bring a concrete finding and repair into the conversation, with engineering and security expertise focused on assessing, validating, and resolving it.

A real discovery in Pydantic AI

The PHP example looks backward. A finding in Pydantic AI shows a previously unreported defect discovered in current code.

An AI agent authenticates to a remote MCP server. The request works. Content capture is disabled. Yet the authentication token and request headers appear in OpenTelemetry traces, where people or systems with trace access can read them.

The serializer copied the tool configuration, including its credentials. The privacy setting removed prompt and message content but did not remove those configuration fields.

Once the finding exists, the QA question becomes concrete: does an authenticated operation keep its credentials out of telemetry while continuing to work? A team investigating that behavior could use a synthetic credential and inspect the emitted traces. It now knows which boundary to examine.

Early discovered the defect while analyzing later changes. It created a fix with a test and reported the issue privately. Pydantic confirmed the issue and shipped its own broader fix. The discovery shows that analysis can uncover existing defects, not only bugs introduced by the current change.

The Pydantic security Case File and technical article document the finding, repair, and maintainer resolution. For QA, the significance is the expanded scope: a successful authenticated request can still contain a security defect outside the behavior the team set out to test.

Results summary: in a historical PHP2Shell replay, Early flagged a reference to freed memory. In Pydantic AI, Early found an unreported credential leak into traces and created a fix with tests.

Two routes to a concrete finding: replaying a historical memory-lifetime bug and discovering a previously unreported credential leak.

Turn a finding into a QA decision

Functional, exploratory, negative, and security testing all remain useful. Analysis adds another source of findings, including mechanisms that require specialist knowledge to recognize. The practical change is that QA can start with a concrete defect rather than a general instruction to “test security.”

For each security-relevant finding, a QA lead can organize the next step around four questions:

  • Does the affected path exist in our use of the software? Check the version, configuration, integration, and conditions described in the finding.
  • What is exposed or put at risk? A credential reaching telemetry calls for a different investigation from a reference to freed memory. Bring the appropriate engineering or security owner into the assessment.
  • What would demonstrate the defect and its correction? Agree on a safe reproduction and the expected behavior. In the credential example, check both that traces exclude secrets and that authentication continues to work.
  • What remains unresolved before release? Record the repair status, checks actually completed, and any remaining investigation so the release decision has a clear basis.

These questions give QA an active role in moving a finding toward resolution. They do not require the QA lead to become the specialist who originally recognized every low-level failure mechanism.

Bring a repair into the conversation

Finding a bug is only part of the work. A report still leaves someone to understand the path, implement a repair, and write the test that exercises it.

QA can bring engineering a fix pull request with tests and the finding that motivated it. Engineers review, amend, validate, and control the merge.

That changes the handoff from describing work to delivering a change the team can evaluate. QA carries the affected conditions and expected behavior into that review, then checks whether the repair addresses the original problem without disrupting the intended operation.

Key takeaways for QA and engineering leaders

  • Expand security discovery. QA can uncover risks beyond existing test scenarios without every engineer becoming a security specialist.
  • Bring a fix, not only a ticket. A finding can lead to a fix pull request with tests for engineering review.
  • Keep expert judgment central. QA establishes relevance and affected conditions. Engineering and security assess the risk, validate the repair, and control acceptance.
On this page

Continue reading

Could Early Have Flagged the PHP2Shell Bug in January 2025?
Could Early Have Flagged the PHP2Shell Bug in January 2025?
A historical PHP change, an unsafe memory lifetime, and a Fix PR engineers can inspect.
Early Found an Unreported Security Bug in Pydantic AI
Early Found an Unreported Security Bug in Pydantic AI
Not a replay of a known bug. Early Release Guard found an unreported security bug, we disclosed it privately, and Pydantic fixed it and published advisory GHSA-xv4x-g8mx-ch56.
Engineering Got Faster. How Does QA Keep Up?
Engineering Got Faster. How Does QA Keep Up?
More changes arrive. The release date stays. QA needs more than a bug count to decide what deserves attention and whether the release is ready.