CVE-2024-10330
Executive Summary
CVE-2024-10330 is a missing authorization vulnerability in lunary-ai/lunary version 1.5.6. The /v1/evaluators/ endpoint fails to enforce proper access controls, allowing any authenticated user associated with a project to retrieve all evaluator data, regardless of their assigned role. This flaw enables low-privilege users (e.g., viewers or contributors) to access potentially sensitive evaluation data that should be restricted to administrators or project owners. The vulnerability has a CVSS score of 6.5 (Medium) and a low EPSS score of 0.0%, indicating limited active exploitation at the time of analysis. No public proof-of-concept or patch is currently available.
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 open-source project, which is distributed as a Python package via PyPI. Organizations using lunary in their AI/LLM evaluation pipelines should verify their deployment version and restrict network access to the /v1/evaluators/ endpoint until a patch is applied.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – The endpoint is accessible over the network.
- Attack Complexity (AC): Low (L) – No special conditions are required to exploit.
- Privileges Required (PR): Low (L) – An attacker needs a valid low-privilege account.
- User Interaction (UI): None (N) – No user action is needed.
- Scope (S): Unchanged (U) – The vulnerability does not cross trust boundaries.
- Confidentiality (C): High (H) – Sensitive evaluator data is exposed.
- Integrity (I): None (N) – No data modification is possible.
- Availability (A): None (N) – No denial-of-service impact.
Threat Level: Medium. While the CVSS score is 6.5, the low EPSS score and lack of public exploits reduce immediate risk. However, the ease of exploitation (low privileges, no user interaction) makes it a credible threat for organizations using lunary with untrusted users.
Deep Dive & Mechanics
The vulnerability resides in the /v1/evaluators/ API endpoint of lunary version 1.5.6. The endpoint is designed to return evaluator data (e.g., evaluation results, metrics, and configurations) for a given project. The flaw is a classic Missing Authorization (CWE-862): the endpoint does not verify whether the requesting user has the appropriate role (e.g., admin, owner) to access all evaluator records. Instead, it only checks that the user is associated with the project, allowing any project member to enumerate and retrieve all evaluator data.
The likely root cause is that the backend code uses a simple membership check (e.g., user.project_id == project.id) without enforcing role-based access control (RBAC) on the evaluator resource. This means a user with a "viewer" or "contributor" role can access data intended only for "admin" or "owner" roles.
Vulnerable vs. Patched Code
Vulnerable Code (lunary 1.5.6):
# Hypothetical vulnerable implementation
@app.route('/v1/evaluators/', methods=['GET'])
def get_evaluators():
project_id = request.args.get('project_id')
user = get_current_user()
# Only checks project membership, not role
if not user.is_member_of(project_id):
return jsonify({'error': 'Forbidden'}), 403
evaluators = db.query(Evaluator).filter_by(project_id=project_id).all()
return jsonify([e.to_dict() for e in evaluators])
Patched Code (Expected fix):
# Patched implementation with role check
@app.route('/v1/evaluators/', methods=['GET'])
def get_evaluators():
project_id = request.args.get('project_id')
user = get_current_user()
# Enforce role-based access: only admin/owner can view all evaluators
if not user.has_role(project_id, ['admin', 'owner']):
return jsonify({'error': 'Forbidden'}), 403
evaluators = db.query(Evaluator).filter_by(project_id=project_id).all()
return jsonify([e.to_dict() for e in evaluators])
Exploitation & Lab Setup
Red Team
Prerequisites:
- A valid low-privilege account (e.g., viewer) on a lunary instance.
- Network access to the lunary API endpoint.
Exploitation Steps:
- Authenticate as a low-privilege user and obtain a session token or API key.
- Send a GET request to the
/v1/evaluators/endpoint with the target project ID:curl -X GET "https://lunary-instance.example.com/v1/evaluators/?project_id=123" \ -H "Authorization: Bearer <low_priv_token>" - If successful, the response will contain all evaluator data for the project, including sensitive evaluation results and configurations.
Expected Output:
[
{
"id": "eval_001",
"name": "LLM Response Quality",
"results": { "accuracy": 0.95, "hallucination_rate": 0.02 },
"config": { "model": "gpt-4", "prompt_template": "..." }
}
]
Blue Team
Detection:
- Monitor API logs for repeated GET requests to
/v1/evaluators/from low-privilege users. - Alert on any user with a role other than "admin" or "owner" accessing the evaluator endpoint.
Mitigation:
- Immediately restrict access to the
/v1/evaluators/endpoint using a reverse proxy or WAF rule until a patch is applied. - Implement temporary RBAC checks in the application code (see patched code example).
- Audit all project memberships and remove unnecessary low-privilege users.
Indicators of Compromise (IOCs)
- Network: HTTP GET requests to
/v1/evaluators/with aproject_idparameter from non-admin users. - Logs: API access logs showing
GET /v1/evaluators/with HTTP 200 responses for users with role != admin/owner. - User Agent: No specific UA; any standard HTTP client (curl, requests, browser).
Detection Engineering
YARA Rule
rule Detect_Lunary_Evaluator_Exposure {
meta:
description = "Detects potential exploitation of CVE-2024-10330 by identifying unauthorized access to /v1/evaluators/ endpoint"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2024-10330"
strings:
$endpoint = "/v1/evaluators/"
$project_param = "project_id="
$response = "evaluator"
condition:
all of them
}
Sigma Rule
title: Unauthorized Access to Lunary Evaluators Endpoint
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects GET requests to /v1/evaluators/ from users with low privileges
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: GET
cs-uri-stem: "/v1/evaluators/"
cs-uri-query: "project_id=*"
condition: selection
falsepositives:
- Legitimate admin access
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2024-10330 - Unauthorized Access to Lunary Evaluators"; flow:to_server; http.method; content:"GET"; http.uri; content:"/v1/evaluators/"; http.uri; content:"project_id="; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
- Immediate: Restrict access to
/v1/evaluators/via firewall or reverse proxy to only trusted IPs or admin users. - Short-term: Apply the patched code example above to enforce RBAC on the evaluator endpoint.
- Long-term: Upgrade to a patched version of lunary once available. Monitor the official repository for updates.
- Compensating Controls: Implement additional logging and alerting for all API access to sensitive endpoints. Conduct a role audit to ensure least privilege.
Report generated by Valters IT DevSecOps & CTI Division
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.