Skip to content
Heist/ feed
Back to feed
MediumFix available

Contao: Improper access control in the preview links module

Type: advisorySources: OSV

`core-bundle/config/services.yaml` registers the preview access voter with the class `Contao\CoreBundle\Security\Voter\DataContainer\PreviewAccessVoter`, but the class shipped on disk is named `PreviewVoter`. Symfony resolves the class with `getReflectionClass($class, false)`, gets `null`, silently skips the interface based autoconfiguration that would have tagged it as a voter, and the now untagged private service is removed when the container is compiled. The application boots without a warning, and the ownership rule in `PreviewVoter::hasAccess()` is never executed. `tl_preview_link` has no compensating SQL filter on `createdBy`, so any non administrator back end user whose group holds the `preview_link` module reads every preview link on the installation and lifts the already signed share URLs straight out of the list. Following one grants front end preview of the target page, with `showUnpublished` and with no page permission check, to anyone at all. ### Impact A non administrator back end user reads every preview link on the installation, including links created by administrators, and lifts the already signed share URLs out of the list. Following one grants front end preview of the target page with `showUnpublished` and with no page permission check at all, so unpublished or embargoed content becomes readable by a user who has no rights on those pages, and by anyone that user forwards the URL to. **Honesty caveat, stated because it bounds the severity.** `UpdateAction`

Products
contao/core-bundle
Affected versions
5.7.1, 5.7.10, 5.7.11, 5.7.2, 5.7.3, 5.7.4, 5.7.5, 5.7.6, 5.7.7, 5.7.8, 5.7.9
Fixed versions
5.7.12
CVEs
CVE-2026-107850
Confirmed fixed CVEs
Not specified
Updated in this feed
28 Oct 2026, 13:04 UTC · Revision 1

Source evidence

Contao: Improper access control in the preview links module

core-osv · Original source

Published 9 Oct 2026, 20:53 UTC

`core-bundle/config/services.yaml` registers the preview access voter with the class `Contao\CoreBundle\Security\Voter\DataContainer\PreviewAccessVoter`, but the class shipped on disk is named `PreviewVoter`. Symfony resolves the class with `getReflectionClass($class, false)`, gets `null`, silently skips the interface based autoconfiguration that would have tagged it as a voter, and the now untagged private service is removed when the container is compiled. The application boots without a warning, and the ownership rule in `PreviewVoter::hasAccess()` is never executed. `tl_preview_link` has no compensating SQL filter on `createdBy`, so any non administrator back end user whose group holds the `preview_link` module reads every preview link on the installation and lifts the already signed share URLs straight out of the list. Following one grants front end preview of the target page, with `showUnpublished` and with no page permission check, to anyone at all. ### Impact A non administrator back end user reads every preview link on the installation, including links created by administrators, and lifts the already signed share URLs out of the list. Following one grants front end preview of the target page with `showUnpublished` and with no page permission check at all, so unpublished or embargoed content becomes readable by a user who has no rights on those pages, and by anyone that user forwards the URL to. **Honesty caveat, stated because it bounds the severity.** `UpdateAction`

osv:GHSA-q6wp-fr43-gm9v

contao/core-bundle

Fixed versions: 5.7.12

Complete source record
{
  "id": "ce7607298af679ccad97b201778dceb32143fb1472e08b0d33f1717f45a7b6c0",
  "url": "https://osv.dev/vulnerability/GHSA-q6wp-fr43-gm9v",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "Contao: Improper access control in the preview links module",
    "summary": "`core-bundle/config/services.yaml` registers the preview access voter with the class `Contao\\CoreBundle\\Security\\Voter\\DataContainer\\PreviewAccessVoter`, but the class shipped on disk is named `PreviewVoter`. Symfony resolves the class with `getReflectionClass($class, false)`, gets `null`, silently skips the interface based autoconfiguration that would have tagged it as a voter, and the now untagged private service is removed when the container is compiled. The application boots without a warning, and the ownership rule in `PreviewVoter::hasAccess()` is never executed. `tl_preview_link` has no compensating SQL filter on `createdBy`, so any non administrator back end user whose group holds the `preview_link` module reads every preview link on the installation and lifts the already signed share URLs straight out of the list. Following one grants front end preview of the target page, with `showUnpublished` and with no page permission check, to anyone at all. ### Impact A non administrator back end user reads every preview link on the installation, including links created by administrators, and lifts the already signed share URLs out of the list. Following one grants front end preview of the target page with `showUnpublished` and with no page permission check at all, so unpublished or embargoed content becomes readable by a user who has no rights on those pages, and by anyone that user forwards the URL to. **Honesty caveat, stated because it bounds the severity.** `UpdateAction` ",
    "evidence": "osv:GHSA-q6wp-fr43-gm9v",
    "products": [
      {
        "name": {
          "value": "contao/core-bundle",
          "evidence": "/affected/0/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "5.7.12",
            "evidence": "/affected/0/ranges"
          }
        ],
        "affected_versions": [
          {
            "value": "5.7.1",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.10",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.11",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.2",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.3",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.4",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.5",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.6",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.7",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.8",
            "evidence": "/affected/0/versions"
          },
          {
            "value": "5.7.9",
            "evidence": "/affected/0/versions"
          }
        ]
      }
    ],
    "severity": "medium",
    "structured": {
      "id": "GHSA-q6wp-fr43-gm9v",
      "aliases": [
        "CVE-2026-107850",
        "GHSA-q6wp-fr43-gm9v"
      ],
      "metrics": [
        {
          "type": "CVSS_V3",
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "type": "ECOSYSTEM",
              "events": [
                {
                  "introduced": "5.7.1"
                },
                {
                  "fixed": "5.7.12"
                }
              ]
            }
          ],
          "package": {
            "name": "contao/core-bundle",
            "purl": "pkg:composer/contao/core-bundle",
            "ecosystem": "Packagist"
          },
          "versions": [
            "5.7.1",
            "5.7.10",
            "5.7.11",
            "5.7.2",
            "5.7.3",
            "5.7.4",
            "5.7.5",
            "5.7.6",
            "5.7.7",
            "5.7.8",
            "5.7.9"
          ],
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-q6wp-fr43-gm9v/GHSA-q6wp-fr43-gm9v.json"
          }
        }
      ],
      "modified": "2026-10-09T21:00:14.820578239Z",
      "provider": "osv",
      "references": [
        "https://github.com/contao/contao/security/advisories/GHSA-q6wp-fr43-gm9v",
        "https://github.com/contao/contao/commit/6b483d380a4b2dc61432c4c697e411508f93bf91",
        "https://github.com/contao/contao",
        "https://github.com/contao/contao/releases/tag/5.7.12"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-639",
          "CWE-862"
        ],
        "severity": "MODERATE",
        "github_reviewed": true,
        "nvd_published_at": null,
        "github_reviewed_at": "2026-10-09T20:53:46Z"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-107850",
        "evidence": "/aliases"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 124206,
  "published_at": "2026-10-09T20:53:46+00:00"
}