Zero-Day
12 min read
March 17, 2026

Ping Me and I’ll Tell You Who You Are. A Double IDOR in CVAT Webhooks (CVE-2024-45393)

Ping Me and I’ll Tell You Who You Are. A Double IDOR in CVAT Webhooks (CVE-2024-45393)

In a pentester’s life it sometimes happens that you hit a great bug, rub your hands together, write the report, and then find out… someone else got to it just before you. The vulnerabilities I reported in the Computer Vision Annotation Tool (CVAT) platform turned out to be a duplicate, but significant enough to be tied to the official security advisory GHSA-p3c9-m7jr-jxxj and ultimately captured in CVE-2024-45393.

The flaw received a score of 6.4 (Moderate) with the vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N. Let’s look at how, once again, predictable identifiers and missing authorization on secondary endpoints enabled data theft and even created a DoS risk.

TL;DR - Key takeaways

  • Webhooks Under the Microscope
  • Vector 1: A Malicious Ping and the DoS Risk
  • Vector 2: Delivery History
  • How to Patch Such Bugs? (Remediation)

Webhooks Under the Microscope

CVAT lets users create projects and attach webhooks to them. It’s a useful feature: when something happens in a project, the application sends a notification to a URL of our choice.

The application (in the tested versions, including Server: 2.16.3) has two interesting endpoints for managing webhooks:

Both of these features concealed a classic Insecure Direct Object Reference (IDOR) and Horizontal Privilege Escalation flaw.

  • One for testing (pinging) a webhook.
  • One for checking the delivery history.
CVE-2024-45393
6.4Medium
Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
Exploitability Metrics
Attack Vector (AV)
Network (N)Adjacent (A)Local (L)Physical (P)
Attack Complexity (AC)
Low (L)High (H)
Privileges Required (PR)
None (N)Low (L)High (H)
User Interaction (UI)
None (N)Required (R)
Scope (S)
Unchanged (U)Changed (C)
Impact Metrics
Confidentiality Impact (C)
None (N)Low (L)High (H)
Integrity Impact (I)
None (N)Low (L)High (H)
Availability Impact (A)
None (N)Low (L)High (H)

Vector 1: A Malicious Ping and the DoS Risk

When you create a webhook, the application sends a POST request to check whether the supplied URL responds. This traffic goes to the endpoint:

POST /api/webhooks/<ID>/ping

The <ID> parameter is, of course… a plain integer (e.g. 765). All it took was intercepting this request in Burp Suite and changing the ID to one belonging to another user. The result?

Instead of a 403 error, the server obediently "pinged" someone else’s webhook and returned a juicy JSON response. It leaked, among other things:

  • target_url (often containing internal corporate addresses or tokens in the URLs),
  • project_id and organization,
  • Owner data: username, first_name, last_name.

The DoS Risk

Since the identifiers are plain numbers, you can use Intruder and iterate webhook_id thousands of times. Beyond mass data theft (a data leak), this forces the CVAT server to send thousands of HTTP requests to third-party servers. Using parallelized requests (e.g. from a botnet), we could exhaust the application’s resources, triggering a classic Denial of Service (DoS) condition.

Normal use
POST/api/webhooks/765/ping
Ty
Your webhook
You ping your own webhook
IDOR Attack
POST/api/webhooks/766/ping
Attacker
Another user's webhook
Victim data
{
"target_url": "https://internal...",
"username": "jan.kowalski",
"project_id": 42
}
No ACL &rarr; Another user’s webhook data leaks!
Diagram of data leakage through manipulation of the webhook ping endpoint
Instead of denying access, the server obediently pings someone else’s webhook and returns sensitive data.

Vector 2: Delivery History

The second problem was in the webhook log history. It was served by the endpoint:

GET /api/webhooks/<ID>/deliveries

GET /api/webhooks/<webhook_ID>/deliveries/<delivery_ID>

As with the ping, changing the <ID> allowed reading someone else’s event history. What’s most interesting about this vector, though, are the nested endpoints.

The application allowed querying a specific delivery, where both identifiers (webhook_ID and delivery_ID) are sequential numbers.

A Pentester’s Aside

It often happens that, after an IDOR report, developers patch the main endpoint (e.g. listing /deliveries) but forget to apply an Access Control List (ACL) to the nested endpoint querying a specific item (/deliveries/<delivery_ID>). Being able to guess (or brute-force) the delivery_ID, an attacker could still get at the data!

Nested endpoints: a double IDOR
Level 1: Delivery listIDOR
GET/api/webhooks/766/deliveries
Change the webhook ID &rarr; the full history of another user’s events
Level 2: A specific deliveryIDOR
GET/api/webhooks/766/deliveries/310
Even after the main endpoint is patched, the nested one may remain without an ACL!
Intruder iterating delivery_ID:12...310...500
Burp Suite screenshot with a GET request to the deliveries endpoint
Nested endpoints are a frequent source of overlooked IDOR vulnerabilities.

How to Patch Such Bugs? (Remediation)

Even though the report turned out to be a duplicate, the lesson from this vulnerability (now officially patched under CVE-2024-45393) is universal:

  • Consistent Access Control (ACL): Verifying the session alone is not enough. On every request the server must check the rule: "Does user X have the right to access resource Y?" And it must do so on every endpoint, from the main /webhooks to the deeply nested /webhooks/ID/deliveries/ID.
  • No more sequential identifiers: If CVAT used long, random strings (e.g. UUID v4) instead of values like 784 or 310, mass resource scanning with Burp Intruder would simply be impossible. It’s a perfect example of applying a defense-in-depth mechanism. Even if the ACL logic fails, the attacker still cannot guess the identifier of someone else’s resource.
Always remember: in security there are no insignificant endpoints. Sometimes a little "Ping" can make a big noise.
Marcin Motwicki, CEO of PWNONE
Vulnerable
/api/jobs/1
/api/jobs/2
/api/jobs/3

Sequential IDs = trivial to guess (brute-force)

Secure
/api/jobs/a3f7c8d1-...
/api/jobs/9e2b4f6a-...
/api/jobs/d5c1e839-...

UUID v4 = 2122 possible values (Defense-in-depth)

Summary

CVE-2024-45393 is a double IDOR in the webhook mechanism of the CVAT platform. The first vector allowed pinging other users’ webhooks and stealing sensitive data (target_url, username, project_id), and under mass exploitation it created a DoS risk. The second vector allowed reading other users’ delivery history, including the nested endpoints. The flaw was responsibly disclosed and patched; the key lesson is the need to implement consistent access control on all endpoints and to abandon sequential identifiers.

Bibliography

1
CVE-2024-45393 - NIST National Vulnerability Database

The official NIST NVD entry describing the double IDOR vulnerability in CVAT webhooks, rated CVSS 6.4.

2
GHSA-p3c9-m7jr-jxxj - GitHub Security Advisory

The security advisory published on GitHub by the CVAT team, containing details of the vulnerability and information about the fix.

3
OWASP API Security Top 10 - API1:2023 Broken Object Level Authorization

The OWASP category describing vulnerabilities related to improper object-level access control — exactly the type of flaw exploited in CVE-2024-45393.

4
CVAT - Computer Vision Annotation Tool (GitHub)

The open-source repository of the CVAT data-annotation tool for machine learning and Computer Vision projects.

Your webhooks may reveal more than you think.

IDOR vulnerabilities in nested endpoints are among the most commonly overlooked flaws. Our pentesters check every corner of your API, from the main routes to the nested endpoints of webhooks, callbacks, and integrations.

Order an API penetration test