CVE-2025-22138
Executive Summary
CVE-2025-22138 is an information disclosure vulnerability in Codidact QPixel, a Q&A-based community knowledge-sharing platform. The flaw allows unprivileged or anonymous users to view suggested edits within categories that have been set to private or limited-visibility via the admin tools. This bypasses the intended access controls, potentially exposing sensitive content that administrators believed to be restricted. As of the latest advisory, no patch or workaround is available, and the vendor recommends against using private categories for storing sensitive information.
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 @codidact/qpixel package. Since no patch is available, users of this package are at risk. The package is not hosted on a public registry like npm, but is available via the Codidact development repository. Organizations using QPixel should treat this as a high-priority supply chain risk and consider temporary mitigations such as disabling the suggested edit queue or implementing external access controls (e.g., reverse proxy authentication).
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
- Base Score: 5.3 (Medium)
- 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: Low (C:L) – Exposure of suggested edit content, which may contain sensitive information.
- Integrity Impact: None (I:N)
- Availability Impact: None (A:N)
Threat Level: Medium. The vulnerability is easy to exploit remotely without authentication, but the impact is limited to information disclosure. However, if private categories contain sensitive data (e.g., internal discussions, draft policies), the actual risk may be higher.
Deep Dive & Mechanics
The vulnerability resides in the suggested edit queue functionality of QPixel. When a category is configured as private or limited-visibility, the platform is supposed to restrict access to content within that category to authorized users only. However, the suggested edit queue does not enforce these category-level access controls. As a result, any user (including unauthenticated visitors) can view suggested edits that belong to restricted categories by accessing the /suggested-edits endpoint.
The root cause is likely a missing authorization check in the controller or view that renders the suggested edit queue. The code probably fetches all pending suggested edits without filtering based on the visibility of the associated category. This is a classic case of improper access control (CWE-200).
Vulnerable vs. Patched Code
Since no patch is available, we can only hypothesize the vulnerable code pattern and the expected fix.
Vulnerable Code (Hypothetical):
# app/controllers/suggested_edits_controller.rb
def index
@suggested_edits = SuggestedEdit.where(status: 'pending')
# Missing: filter by category visibility
end
Patched Code (Expected):
# app/controllers/suggested_edits_controller.rb
def index
@suggested_edits = SuggestedEdit.joins(:category)
.where(status: 'pending')
.where(categories: { visibility: 'public' })
# Or use a scope that respects user permissions
end
The fix would involve joining the categories table and filtering out suggested edits from non-public categories unless the current user has the appropriate permissions.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A running instance of QPixel with at least one private category and a pending suggested edit in that category.
- No authentication required.
Steps:
- Identify the QPixel instance (e.g.,
https://target.qpixel.com). - Navigate to the suggested edit queue:
https://target.qpixel.com/suggested-edits. - If the queue is paginated, iterate through pages to find edits from private categories.
- View the content of the suggested edit, which may include sensitive information.
Example Request:
GET /suggested-edits HTTP/1.1
Host: target.qpixel.com
User-Agent: Mozilla/5.0
Accept: text/html
Automation Script (Python):
import requests
target = "https://target.qpixel.com"
response = requests.get(f"{target}/suggested-edits")
if response.status_code == 200:
# Parse HTML to extract suggested edit IDs and content
print("Vulnerable: Access to suggested edits obtained.")
else:
print("Not vulnerable or access denied.")
Blue Team (Detection & Defense)
Detection:
- Monitor access logs for requests to
/suggested-editsfrom unauthenticated users. - Alert on unusual patterns, such as rapid pagination through the suggested edit queue.
Defense:
- Implement a reverse proxy (e.g., Nginx) to require authentication for the
/suggested-editspath. - Temporarily disable the suggested edit feature by modifying the application code or configuration.
- Use Web Application Firewall (WAF) rules to block access to
/suggested-editsfor unauthenticated users.
Nginx Rule Example:
location /suggested-edits {
satisfy any;
allow 192.168.1.0/24;
deny all;
# Or use auth_basic
}
Indicators of Compromise (IOCs)
- URL Pattern:
/suggested-editsaccessed by unauthenticated users. - Log Entries: HTTP 200 responses to
/suggested-editsfrom IPs not in the allowed user base. - User-Agent: Any standard browser User-Agent (no specific pattern).
- Timing: Requests may be spaced out to avoid rate limiting.
Detection Engineering
YARA Rule
rule CVE_2025_22138_SuggestedEdits_Access {
meta:
description = "Detects access to QPixel suggested edit queue by unauthenticated users"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2025-22138"
strings:
$url = "/suggested-edits"
$method = "GET"
condition:
$url and $method
}
Sigma Rule
title: CVE-2025-22138 - Unauthenticated Access to QPixel Suggested Edits
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects unauthenticated HTTP GET requests to /suggested-edits on QPixel instances.
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'GET'
cs-uri-stem: '/suggested-edits'
condition: selection
falsepositives:
- Legitimate unauthenticated users if the feature is intentionally public
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-22138 - QPixel Suggested Edit Queue Access"; flow:to_server; http.method; content:"GET"; http.uri; content:"/suggested-edits"; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the suggested edit feature if not critical to operations. This can be done by removing the route or modifying the controller to return a 403 for all requests.
- Implement access controls at the reverse proxy level (e.g., Nginx, Apache) to require authentication for
/suggested-edits. - Review private categories for any sensitive information that may have been exposed and rotate credentials or update content as needed.
Long-Term Fix:
- Monitor the Codidact development repository for a patch.
- Once a patch is released, apply it immediately and test the fix.
- Consider contributing a fix to the open-source project if you have the resources.
Workarounds:
- None officially provided. The vendor advises against using private categories for sensitive data.
Valters IT
Senior DevSecOps & Cyber Threat Intelligence Expert