☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Django logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N 🐛 CWE-639
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2026-61663

CVE-2026-61663 Vulnerability in Django
📅 PUBLISHED: 2026-08-20 00:00 UTC 🔄 UPDATED: 2026-08-26 10:10 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.20%
👁️
0.20% probability
5.0× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
🥷 MITRE: T1190
👁️
MITRE ATT&CK Tactic - Describes the strategy hackers use to execute this attack.
Country: USA License: Open Source
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS VECTOR BREAKDOWN 4.3
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: L Privileges Required Low
UI: N User Interaction None
S: U Scope Unchanged
C: L Confidentiality Low
I: N Integrity None
A: N Availability None
4.3
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2026-61663 is an authorization bypass vulnerability in django CMS, an open-source enterprise content management system built on Django. Affecting all versions prior to 5.0.9, the flaw resides in render_object_structure, which fails to properly authorize non-PageContent objects that utilize PlaceholderRelationField. An authenticated staff user lacking the cms.use_structure permission—or model-level view/change permissions—can enumerate and extract sensitive structural metadata from the CMS, including placeholder slot names, plugin trees, plugin identifiers, labels, and object existence. The vulnerability carries a CVSS score of 4.3 (Medium), requires low-privilege authentication, and has no known public exploit, though the attack surface is trivial to exercise once authenticated.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Technical Analysis

The vulnerability exists in the django CMS admin endpoint //admin/cms/placeholder/object/<content_type_id>/structure/<object_id>/. This endpoint is designed to render the structure board for a given object—a visual representation of placeholders and plugins arranged in a tree—used by content editors to manage page layouts. The endpoint accepts two path parameters: content_type_id (a numeric identifier mapping to a registered Django content type) and object_id (the primary key of the target object instance).

The core flaw is an incomplete authorization check in the render_object_structure view handler. During request processing, the handler distinguishes between two branches: objects that are instances of PageContent (the primary content model for pages in django CMS) and all other objects (non-PageContent). The PageContent branch implements proper permission verification—checking that the requesting user possesses cms.use_structure permission or has appropriate model-level view/change permissions. However, the non-PageContent branch—which handles any frontend-editable object that uses PlaceholderRelationField to attach placeholder data—skips these authorization checks entirely. This means any authenticated staff user can invoke the endpoint for arbitrary non-PageContent objects without any permission validation.

The endpoint's response leaks sensitive configuration data: placeholder slot names (e.g., template-defined regions like "content" or "sidebar"), the full plugin tree structure (hierarchical arrangements of content plugins), plugin identifiers (class paths or registered plugin IDs), human-readable labels, and a boolean signal confirming whether the targeted object exists. The object existence oracle is particularly notable—by probing different content_type_id and object_id combinations, an attacker can enumerate valid objects across the CMS.

The root cause maps to CWE-639 (Authorization Bypass Through User-Controlled Key) because the content_type_id and object_id parameters are attacker-controlled and are not accompanied by server-side authorization checks for the non-PageContent branch. The fix applied in version 5.0.9 introduces user_can_view_placeholder_source to the non-PageContent branch, ensuring the requesting user has at least view-level permission on the target object. Crucially, the fix preserves read-only behavior for view-only users, meaning users granted view permission can still see the structure board content but cannot modify it—the write path remains guarded by edit permissions.

The attack surface is the Django admin interface, which is network-exposed in many enterprise deployments (often at /admin/). No special tooling is required; a standard HTTP client capable of authenticated requests suffices. The vulnerability class is insecure direct object reference (IDOR) combined with missing function-level authorization.

Exploitation Scenarios

Step 1 — Reconnaissance/Target Identification:
The attacker must be an authenticated staff user (i.e., having a valid account with is_staff=True). Staff accounts are typically issued to content editors, approvers, or other non-privileged administrative roles. The attacker identifies the target django CMS instance (version < 5.0.9) and confirms that the admin interface is reachable. The attacker may also enumerate installed apps/content types to narrow down viable content_type_id values—Django content types are sequentially numbered integers registered in the django_content_type table, often explorable via the admin's own model listings if any model-level view permission exists, or guessable based on common django CMS plugin/extension patterns.

Step 2 — Triggering the Flaw:
The attacker crafts an HTTP GET request to the vulnerable endpoint:
//admin/cms/placeholder/object/<content_type_id>/structure/<object_id>/
with guessed or enumerated content_type_id and object_id values targeting a non-PageContent object that uses PlaceholderRelationField (for example, objects from third-party django CMS extension apps such as blogs, event listings, or custom content modules). The request is made while authenticated as the low-privilege staff user. Because the non-PageContent branch lacks authorization checks, the server processes the request and returns the structure board data without error.

Step 3 — Payload/Execution Method:
No injection payload is required; this is a pure authorization-bypass via direct object reference. The attacker iterates through content_type_id values (1 to N) and object_id values (1 to M), sending repeated requests. The response body reveals placeholder slot names, plugin trees, plugin identifiers, and labels. HTTP status codes serve as an object-existence oracle: existing objects return 200 with data; non-existent objects return an error (typically 404 or an empty structure board). This enumeration is low-cost—each request is a simple GET with no computationally expensive payloads—allowing rapid automated sweeping of the entire object space.

Step 4 — Post-Exploitation Impact:
With the harvested data, the attacker gains:

  • Content reconnaissance: Knowledge of all frontend-editable objects, their placeholder layouts, and the plugin configurations used across the site. This reveals site architecture, content types in use, and potentially sensitive unpublished drafts.
  • Plugin intelligence: Plugin identifiers expose which third-party plugins are deployed, enabling targeted vulnerability research against those plugins (possible secondary attacks).
  • Object enumeration: Confirmation of object existence and IDs facilitates targeted strikes against any other IDOR vulnerabilities or crafting precise requests to other admin endpoints that may have weaker access controls.
  • Lateral reconnaissance: Understanding of the CMS's content model aids in planning further attacks against the CMS or the underlying Django application.

While the direct impact is limited to information disclosure (CVSS confidentiality subscore: Low), the data gathered materially lowers the barrier for subsequent, more severe attacks.

Impact Assessment

Business Impact: This vulnerability enables information disclosure of CMS structural metadata. The leaked data—placeholder layouts, plugin trees, plugin identifiers, and object existence—is not customer PII or financial data in most deployments, but it does expose internal architecture and content strategy. For organizations hosting sensitive editorial content (e.g., pre-publication drafts, confidential announcements, or treaty/regulatory content under embargo), the object-existence oracle combined with plugin-tree visibility could expose the existence of unreleased content. The threat model assumes an authenticated insider (staff user) or a compromised low-level staff account; the impact is therefore most severe in environments where multiple third-party staff accounts are provisioned (e.g., agencies managing client sites, multi-tenant CMS installations).

Affected Systems: All django CMS deployments running versions prior to 5.0.9. The PlaceholderRelationField is a widely used field type in django CMS—it is the standard mechanism for attaching placeholder data to non-page models, making most real-world django CMS installations with frontend-editable content modules vulnerable. Also affected are any third-party plugins that rely on PlaceholderRelationField.

Blast Radius: The vulnerability requires authentication (CVSS AV:N/AC:L/PR:L), limiting exploitation to authenticated users. However, staff accounts in CMS platforms are often provisioned broadly (marketing teams, external agencies, contractors), expanding the practical attacker pool. The exploit is trivial to execute (no special skills or tooling), and the information disclosed can be harvested at scale via simple scripting.

CVSS Reference: The CVSS vector is CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N (score 4.3). Key takeaways: Network attack vector with low attack complexity, requires low-privilege authentication, no user interaction, unbounded scope, low confidentiality impact, no integrity or availability impact.

Detection Guidance

Detection of CVE-2026-61663 exploitation is challenging because the vulnerability manifests as legitimate-looking authenticated requests to an admin endpoint. The attack pattern is characterized by high-volume sequential probing of the endpoint with varying content_type_id and object_id path parameters from a single authenticated session. The following detection rules focus on identifying this enumeration pattern and anomalous access to the vulnerable endpoint by users lacking the cms.use_structure permission.

Sigma Rule

title: Django CMS Object Structure IDOR Enumeration
id: 8c4d611a-4f3e-4b8a-9d2e-2f5a6b7c8d9e
status: experimental
description: Detects enumeration attempts against the django CMS render_object_structure endpoint by low-privileged staff users, indicative of CVE-2026-61663 exploitation.
references:
    - https://nvd.nist.gov/vuln/detail/CVE-2026-61663
author: Threat Intelligence Team
date: 2026/07/15
logsource:
    category: webserver
    product: nginx   # Adjust per environment (apache, iis, etc.)
    definition: Web server access logs capturing the admin interface traffic.
detection:
    selection_endpoint:
        cs-method: GET
        c-uri|contains: '/admin/cms/placeholder/object/'
    selection_enumeration:
        c-uri|re: '/admin/cms/placeholder/object/\d+/structure/\d+/'
    filter_authorized_users:
        c-username: cms_structure_editors   # Adjust to allowlist of users with legitimate use_structure permission
    condition: selection_endpoint and selection_enumeration and not filter_authorized_users
    timeframe: 5m
    aggregation:
        - c-username
        - c-ip
fields:
    - c-username
    - c-ip
    - c-uri
    - sc-status
falsepositives:
    - Legitimate content editors with cms.use_structure permission accessing the structure board normally.
level: medium

YARA Rule

rule Django_CMS_Structure_IDOR_Enumeration
{
    meta:
        author = "Threat Intelligence Team"
        description = "Detects HTTP request patterns associated with enumeration of the django CMS render_object_structure endpoint (CVE-2026-61663)."
        cve = "CVE-2026-61663"
        date = "2026-07-15"
        reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-61663"
    strings:
        $endpoint = "/admin/cms/placeholder/object/"
        $structure_suffix = "/structure/" ascii nocase
        $get_method = "GET " ascii
        $http_version = " HTTP/" ascii
    condition:
        # All HTTP request line strings must be present
        $get_method and $http_version and $endpoint and $structure_suffix and
        # The request must contain the numeric content_type_id and object_id path segments
        # Pattern: /admin/cms/placeholder/object/<digits>/structure/<digits>/
        # We approximate with a regex on the full URI
        for any i in (1..#endpoint) : (
            # Extract URI portion after method; check digit pairs around structure
            # This is a simplified heuristic — full URI regex validation below
            $endpoint and #endpoint >= 1
        ) and
        # Additional regex check for the two-digit-segment structure
        # Note: YARA regex requires string-based scanning; use a byte-level regex
        # The following matches the URI pattern with numeric IDs
        (
            for any i in (1..10) : (
                # Approximation: look for the structure path with adjacent slash-delimited numeric segments
                # This is a byte-level approximation; in production use a proper HTTP log parser
                # and combine with the above conditions.
                uint8(0) >= 0  // placeholder — real detection should parse access logs
            )
        )
    // Note: This rule is designed for HTTP access logs or pcap reassembly where the full
    // request line is available as a contiguous string.
}

Suricata IDS Rule

alert http any any -> $EXTERNAL_NET any (
    msg:"ET EXPLOIT Django CMS Object Structure IDOR Enumeration (CVE-2026-61663)";
    flow:established,to_server;
    http.method;
    content:"GET";
    http.uri;
    content:"/admin/cms/placeholder/object/";
    pcre:"/\/admin\/cms\/placeholder\/object\/\d+\/structure\/\d+\//Ui";
    threshold:type both, track by_src, count 10, seconds 60;
    reference:cve,2026-61663;
    reference:url,https://nvd.nist.gov/vuln/detail/CVE-2026-61663;
    classtype:attempted-recon;
    sid:202661663;
    rev:1;
    metadata:created_at 2026-07-15;
)

This rule flags HTTP GET requests matching the vulnerable endpoint pattern with numeric IDs. The threshold clause (10 events in 60 seconds from the same source) reduces false positives from legitimate editors while catching automated enumeration.

Elastic Detection

// EQL query for Elasticsearch (Elastic SIEM)
// Detection: High-frequency requests to the object structure endpoint from a single user

sequence by user.name, source.ip with maxspan=5m
  [any where process.name == "httpd" or process.name == "nginx" // adjust per web server
   and url.path : "/admin/cms/placeholder/object/*/structure/*"
   and http.request.method == "GET"]
  [any where process.name == "httpd" or process.name == "nginx"
   and url.path : "/admin/cms/placeholder/object/*/structure/*"
   and http.request.method == "GET"]
  [any where process.name == "httpd" or process.name == "nginx"
   and url.path : "/admin/cms/placeholder/object/*/structure/*"
   and http.request.method == "GET"]
  [any where process.name == "httpd" or process.name == "nginx"
   and url.path : "/admin/cms/placeholder/object/*/structure/*"
   and http.request.method == "GET"]
  [any where process.name == "httpd" or process.name == "nginx"
   and url.path : "/admin/cms/placeholder/object/*/structure/*"
   and http.request.method == "GET"]

This EQL sequence detects 5 or more requests to the vulnerable endpoint within a 5-minute window from the same user and source IP—a strong indicator of automated enumeration rather than casual browsing.

Splunk SPL Query

index=web*
sourcetype=access_combined
| where like(uri, "/admin/cms/placeholder/object/%/structure/%")
| rex field=uri "/admin/cms/placeholder/object/(?<content_type_id>\d+)/structure/(?<object_id>\d+)/"
| stats count as request_count, values(uri) as urls, values(content_type_id) as ctypes, values(object_id) as objids by user, src_ip
| where request_count > 10
| eval risk_score = request_count * 2
| table _time, user, src_ip, request_count, risk_score, urls
| sort - risk_score

This query ingests web server access logs, filters for requests matching the vulnerable endpoint URI pattern, extracts the numeric parameters via regex, and groups by user/source IP. The filter request_count > 10 within the default search window isolates suspicious enumeration behavior.

Wazuh OSSEC Rule

<group name="web_admin_idor,">
  <rule id="100661" level="10">
    <decoded_as>web</decoded_as>
    <match>"/admin/cms/placeholder/object/"</match>
    <regex>"/admin/cms/placeholder/object/\d+/structure/\d+/"</regex>
    <description>Django CMS object structure IDOR enumeration attempt (CVE-2026-61663)</description>
    <group>authentication_failures,</group>
    <mitre>
      <id>T1190</id>
    </mitre>
    <info type="cve">CVE-2026-61663</info>
    <frequency>10</frequency>
    <timeframe>60</timeframe>
    <same_source_ip/>
    <same_user/>
    <alert_level>medium</alert_level>
    <options>no_full_log</options>
  </rule>
</group>

This Wazuh rule triggers when 10 or more matching requests occur within 60 seconds from the same source IP and user, correlating to automated enumeration patterns. The rule correlates to MITRE ATT&CK T1190 (Exploit Public-Facing Application).

Mitigation & Patch Guidance

Patch Confidence: 2/4 — CLAIMED — single source (OSV) claims patch; not independently confirmed.

  1. Immediate Mitigations (if unable to patch immediately):

    • Restrict admin interface exposure: Use network-level access control (firewall rules, VPN requirements) to limit access to the Django admin URL (/admin/) to trusted IP ranges or internal networks only. This prevents external attackers from reaching the vulnerable endpoint.
    • Audit staff accounts: Review all active staff user accounts. Remove or downgrade accounts that do not require admin access. The vulnerability requires an authenticated staff user; shrinking that population reduces the attack surface.
    • Enable Django admin logging: Ensure django.contrib.admin logging is active and monitor for anomalous access to the /admin/cms/placeholder/object/ endpoint.
    • Web Application Firewall (WAF) rules: If a WAF fronts the application, add a rule to rate-limit or block requests matching the /admin/cms/placeholder/object/*/structure/* URI pattern from non-allowlisted users.
  2. Patch/Upgrade Steps:

    • Upgrade django CMS to version 5.0.9 or later. This is the only confirmed fix. The patch adds user_can_view_placeholder_source to the non-PageContent branch of render_object_structure, restoring proper authorization checks.
    • Before upgrading, verify the django CMS version via pip show django-cms or by checking the version in settings.py / your requirements file.
    • Upgrade in a staging environment first to verify compatibility with your current Django version and third-party plugins, particularly any plugins that use PlaceholderRelationField.
    • After deployment, verify the fix by attempting to access the endpoint as a low-privilege staff user—the request should now return an authorization error (403) for objects the user cannot view.
    • Validate the patch independently, given the patch confidence rating of 2/4. Check the official django CMS changelog and GitHub release notes for 5.0.9 to confirm the described fix.
  3. Long-Term Hardening:

    • Adopt least privilege: Minimize the number of staff accounts. Use Django's permission system granularly—revoke unnecessary model-level permissions and ensure cms.use_structure is granted only to users whose role requires structure editing.
    • Monitor all admin endpoint access: Implement logging and alerting for the Django admin interface—not just for this CVE, but as a general practice. The admin is a high-value target.
    • Regular patching cadence: Subscribe to django CMS security advisories and patch promptly. This CVE demonstrates that authorization flaws can exist in the admin surface, which is often overlooked relative to the public-facing site.
    • Secure content type enumeration: If feasible, avoid exposing the default Django content type IDs (content_type_id) in predictable sequences, though this is a platform-level constraint and may not be configurable without code changes.
    • Consider reducing PlaceholderRelationField usage: For custom applications, evaluate whether frontend-editable placeholders are necessary on all models. Reducing the surface area of frontend-editable objects reduces the scope of this vulnerability class.

References

Additional authoritative references:

Threat Actor Campaigns / Exploit-in-the-Wild Evidence: At the time of this report, there is no known active exploitation in the wild, no public proof-of-concept code, no Nuclei template, and no CISA KEV listing for this CVE. The vulnerability requires authenticated access, which historically lowers the likelihood of widespread automated exploitation compared to unauthenticated flaws. However, given the triviality of the exploit once authenticated (a simple HTTP GET), exploitation by insiders or via compromised staff credentials is considered a realistic near-term risk. Monitoring should continue as the CVE is still recent (published 2026-07); exploitation activity often emerges 1–4 weeks after disclosure as researchers and threat actors analyze the fix and reverse-engineer the vulnerability from the patch diff.

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2026-61663/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.