Lory case study one: 26 findings in 39 minutes across six engagements and twelve applications

Case study one: six engagements, twelve applications, 38 findings.

Lory, the Lorikeet Security AI pentester

Lory is the AI pentester inside Talon. She runs scoped engagements rather than scans: you define what is in and out of scope per asset, she works the target, and a human reviews every finding before it reaches you.

Most AI security tooling is sold with adjectives. We would rather show you the finding list.

Over six engagements we pointed Lory at twelve deliberately vulnerable applications, and then at our own production platform. This post contains what she found, how she reached four of the more interesting conclusions, and, because it matters more than the headline number, an honest account of what these results do not prove.

6Engagements
12Applications
38Findings
10Critical
11High
10Medium

The single longest engagement produced 26 findings in 39 minutes and 40 seconds, unattended, across seven applications. That is roughly one confirmed finding every ninety seconds.

The Setup


The targets were a set of deliberately vulnerable training applications, the kind used for hands-on security education, with names like mr-robot, splinter, abbys-lab and shuttle-booking. The bugs in them are planted. That matters, and we will come back to it.

Coverage was not limited to web applications. The same engine also produced findings against an Android manifest and an internal network host, which is the point of running one agent with a shared toolbelt rather than a different scanner per asset class.

On scope. Every engagement runs inside a boundary you set per asset: explicitly in-scope and explicitly out-of-scope entries. Lory works the target inside that boundary. This is not a nice-to-have for an autonomous agent; it is the thing that makes an autonomous agent safe to point at production.

The 39 Minutes


This is the actual discovery timeline from the longest run, straight out of the engagement record. Times are the moment each finding was confirmed and written.

02:47:28CriticalUnauthenticated RCE via exposed web shell
02:48:40CriticalUnauthenticated RCE via base64-decoded shell_exec
02:49:50CriticalUnauthenticated RCE via system() with unsanitised POST
02:51:04HighAuthenticated RCE via shell_exec() in ping form
02:52:19HighXXE injection: file read via POST body
02:53:31CriticalSQL injection in login: unsanitised WHERE clause
02:54:42CriticalSQL injection in change-password: uid in UPDATE
02:55:52HighIDOR: arbitrary account password change
02:57:07CriticalSSTI via Twig createTemplate() on DB post body
02:58:24CriticalCommitted OpenSSH private key in repository
02:59:42HighHardcoded OS user credentials in Dockerfiles
03:00:57HighHardcoded database credentials in PHP source
03:02:10MediumReflected XSS: unescaped GET parameters
03:03:23HighPlaintext password storage and comparison
03:04:36MediumProduction debug mode enabled
03:05:49MediumApache directory listing enabled
03:07:01MediumSQL injection in auth middleware: sessionID in WHERE
03:08:15HighBroken authentication: loose session check bypass
03:09:28LowSensitive employee notes committed to repository
03:10:44MediumWeak file type validation on upload
03:14:14MediumWeak password hashing: SHA-512 without salt
03:15:29MediumHardcoded MySQL root credentials in docker-compose
03:18:58CriticalRCE via open redirect chain to unauthenticated shell
03:22:25CriticalSQL injection: sanitiser does not prevent SQLi
03:24:45CriticalSQL injection in login: concatenated credentials
03:27:08HighSession fixation: attacker-controlled session_id

Two things are worth noticing in that list beyond the pace. The first is that the findings get harder as the run goes on. The early entries are direct, unauthenticated code execution, while the last four are the ones that required reading code and reasoning about it. The second is the gap between 03:10 and 03:14. That is not idle time; it is the agent working a problem that did not resolve in one step.

Lory

Run this against your own assets

Lory tests your in-scope assets autonomously and files findings straight into your dashboard.

Start an AI pentest

Four Findings Worth Reading


The count is the least interesting part of this. What separates an engagement from a scan is how a finding is reached, and four of these are worth walking through properly:

Each of those is a case where a signature-based tool has a specific, explainable reason to produce the wrong answer. We pulled them apart with the real code and remediation in part two of this series.

What The Numbers Say


Across the lab set, findings clustered where you would expect from applications written to be broken, but the distribution is still informative.

ApplicationFindingsCriticalHigh
marketer621
abbys-lab522
blogger411
backdrop311
shuttle-booking311
mr-robot312
splinter220

The most common weakness classes, by CWE, were information disclosure (CWE-200), SQL injection (CWE-89), protection mechanism failure (CWE-693), improper access control (CWE-284) and OS command injection (CWE-78). The full class list across the set:

Then We Pointed It At Ourselves


Finding planted bugs in training applications proves method. It does not prove the agent is useful against software written by people trying to get it right. So before asking anyone to trust Lory, we ran her against our own production platform, where nothing was planted and where we did not get to choose the outcome.

She found real issues, including a server-side request forgery flaw and a cross-session access-control bug. Both are remediated. That engagement, and what we deliberately are not publishing about it, is part three.

What This Does Not Prove


We would rather make the small honest claim than the large vague one, so:

Deliberately vulnerable applications are deliberately vulnerable. The bugs were meant to be found. A high finding count against training targets is a demonstration of method, not a measure of difficulty, and anyone quoting "26 findings in 39 minutes" as a capability benchmark, including us, should say what the targets were in the same breath.

Speed is not the interesting variable. Ninety seconds per finding sounds impressive and mostly reflects that these targets are dense with bugs. On real software the rate collapses, and it should. What survives from this run is the shape of the reasoning: the sanitiser analysis, the chain, the stored-input trace.

A human still reviews every finding. Nothing in this post reached a report unreviewed. That is a deliberate product decision and not a temporary state of affairs. An agent that files directly to a client is an agent that files its false positives directly to a client.

This is one agent on one set of targets. It is a case study, not a benchmark. We have published what an external review found wrong with this same engine, and we would encourage the same scepticism here.

How To Try It


Lory runs inside Talon, our client platform. You add an asset, set your scope rules (explicitly in, explicitly out) and start an engagement. Findings land in your dashboard alongside your human pentest and incident-response findings, with severity, age against your remediation SLA, and one-click push into Jira, GitHub, GitLab or Azure Boards.

If you would rather drive it yourself, Lory exposes an MCP server, so you can run engagements from your own agents with a bearer token.

See what Lory finds in your stack

Set the scope. She works the target. A human reviews every finding before it reaches you.

Start an AI pentest Explore Talon

The Lory case study series

Notes on method

  1. All figures are taken directly from the engagement records in our platform: 6 engagements, 12 applications, 38 findings, of which 10 critical, 11 high, 10 medium, 2 low and 5 informational.
  2. The 39-minute run is engagement timestamps from 02:47:28 to 03:27:08, producing 26 findings across 7 applications.
  3. Code excerpts are simplified for readability. The behaviour and the line references are as recorded in the findings.
  4. Findings against our own production platform are described in general terms only, and have been remediated.