CVE-2026-34912 Overview
CVE-2026-34912 is a broken access control vulnerability in Revive Adserver 6.0.6 and earlier. The flaw resides in the zone-include.php script and the corresponding API endpoint. A low-privileged authenticated user can link their own zones to banners or campaigns owned by other managers on the same instance. The application fails to validate ownership before establishing the relationship between zones and ad objects. This results in inconsistent ownership relationships across tenants sharing the same Revive Adserver deployment. The issue is tracked under CWE-284: Improper Access Control.
Critical Impact
Authenticated low-privileged users can manipulate ownership relationships between zones and banners or campaigns belonging to other managers, breaking tenant isolation on shared Revive Adserver instances.
Affected Products
- Revive Adserver versions 6.0.6 and earlier
- Revive Adserver web interface (zone-include.php)
- Revive Adserver API endpoints handling zone linking operations
Discovery Timeline
- 2026-06-23 - CVE-2026-34912 published to NVD
- 2026-06-23 - Last updated in NVD database
Technical Details for CVE-2026-34912
Vulnerability Analysis
The vulnerability is a missing authorization check in the zone-to-banner and zone-to-campaign linking workflow of Revive Adserver. When a manager links a banner or campaign to a zone, the application processes the request through zone-include.php or the equivalent API method. The code path verifies that the requesting user owns the target zone but omits verification that the same user owns the banner or campaign being linked. This asymmetric check allows a manager account with valid credentials to reference banners and campaigns belonging to other manager accounts on the same instance.
The impact is limited to integrity rather than confidentiality. The vulnerability does not expose the contents of foreign banners or campaigns directly. It does, however, allow an attacker to bind foreign creatives to their own zones, producing inconsistent ownership records that violate the multi-tenant boundary expected in shared deployments.
Root Cause
The root cause is a missing ownership validation step. The fix introduces a check that ensures banners and campaigns can only be linked to zones managed by the same account. Prior to the patch, the linking logic treated banner and campaign identifiers as trusted parameters once the caller was authenticated, without confirming the caller's authority over those specific objects.
Attack Vector
Exploitation requires network access and a low-privileged authenticated account on the Revive Adserver instance. No user interaction from the victim is required. An attacker submits a crafted request to zone-include.php or the corresponding API endpoint, supplying identifiers of banners or campaigns owned by other managers along with identifiers of zones they themselves control. Because the server processes the linkage without verifying banner or campaign ownership, the unauthorized relationship is persisted. Technical details are documented in HackerOne Report #3650504.
Detection Methods for CVE-2026-34912
Indicators of Compromise
- Database records in Revive Adserver showing zones linked to banners or campaigns owned by a different account_id than the zone owner
- HTTP requests to zone-include.php containing banner or campaign identifiers that do not belong to the authenticated session user
- API calls invoking zone linking methods with cross-account object references
- Unexpected appearance of foreign creatives in a manager's zone delivery logs
Detection Strategies
- Audit the ad_zone_assoc and related linkage tables for ownership inconsistencies between linked banners, campaigns, and zones
- Inspect web server access logs for POST requests to zone-include.php originating from low-privileged manager accounts
- Correlate API authentication events with subsequent linking operations to identify cross-tenant references
- Review application audit logs for zone modification events that reference foreign banner or campaign IDs
Monitoring Recommendations
- Enable verbose logging on the Revive Adserver application layer to capture all zone, banner, and campaign linking events
- Forward Revive Adserver web and application logs to a centralized log analytics platform for cross-account correlation
- Establish alerts on database queries that surface linkage rows where the zone owner and banner or campaign owner differ
- Monitor authentication patterns for manager accounts performing high volumes of zone configuration changes
How to Mitigate CVE-2026-34912
Immediate Actions Required
- Upgrade Revive Adserver to a version newer than 6.0.6 that includes the ownership validation fix
- Review existing zone-banner and zone-campaign linkages for cross-account references and remove unauthorized associations
- Rotate API keys and credentials for manager accounts on shared instances if abuse is suspected
- Restrict access to the Revive Adserver management interface to trusted networks where feasible
Patch Information
The vendor has added ownership validation to ensure that banners and campaigns can only be linked to zones managed by the same account. The fix is documented in HackerOne Report #3650504. Administrators should apply the patched release published by Revive Adserver and validate that the linking endpoints now enforce ownership checks for both the zone and the linked object.
Workarounds
- Limit manager account creation on shared instances until the patched version is deployed
- Segregate tenants onto separate Revive Adserver instances to eliminate cross-account linking exposure
- Implement a reverse proxy rule that restricts access to zone-include.php to trusted administrator IP ranges
- Periodically run database integrity checks comparing zone ownership against linked banner and campaign ownership
# Configuration example: identify cross-account linkages for review
SELECT az.zone_id, az.ad_id, z.account_id AS zone_owner, b.account_id AS banner_owner
FROM ad_zone_assoc az
JOIN zones z ON az.zone_id = z.zone_id
JOIN banners b ON az.ad_id = b.bannerid
WHERE z.account_id <> b.account_id;
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

