CVE-2025-62275

5.3 MEDIUM

📋 TL;DR

This vulnerability allows remote attackers to view images in blog entries without proper permission checks in Liferay Portal and DXP. Attackers can access restricted images via crafted URLs. Affected users include organizations running vulnerable Liferay versions with blogs containing permission-protected images.

💻 Affected Systems

Products:
  • Liferay Portal
  • Liferay DXP
Versions: Liferay Portal 7.4.0 through 7.4.3.111 and older unsupported versions; Liferay DXP 2023.Q4.0 through 2023.Q4.10, 2023.Q3.1 through 2023.Q3.10, 7.4 GA through update 92 and older unsupported versions
Operating Systems: All platforms running Liferay
Default Config Vulnerable: ⚠️ Yes
Notes: Only affects blog entries with images that should have permission restrictions. Older unsupported versions are also vulnerable but not officially maintained.

📦 What is this software?

⚠️ Risk & Real-World Impact

🔴

Worst Case

Sensitive images containing confidential information, personal data, or intellectual property could be exposed to unauthorized users, potentially leading to data breaches, privacy violations, or competitive harm.

🟠

Likely Case

Unauthorized users can view images that should be restricted to specific user groups, violating intended access controls and potentially exposing non-critical but sensitive visual content.

🟢

If Mitigated

With proper network segmentation and access controls, impact is limited to unauthorized viewing of images within already accessible systems, preventing lateral movement or data exfiltration.

🌐 Internet-Facing: HIGH
🏢 Internal Only: MEDIUM

🎯 Exploit Status

Public PoC: ✅ No
Weaponized: UNKNOWN
Unauthenticated Exploit: ⚠️ Yes
Complexity: LOW

Exploitation requires knowledge of image URLs but no authentication. Attackers need to craft or guess URLs to protected images.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: Liferay Portal 7.4.3.112+, Liferay DXP 2023.Q4.11+, 2023.Q3.11+, 7.4 update 93+

Vendor Advisory: https://liferay.dev/portal/security/known-vulnerabilities/-/asset_publisher/jekt/content/CVE-2025-62275

Restart Required: Yes

Instructions:

1. Download appropriate patch from Liferay customer portal. 2. Backup current installation. 3. Apply patch following Liferay's patching guide. 4. Restart Liferay server. 5. Verify fix by testing image access controls.

🔧 Temporary Workarounds

Web Server URL Filtering

all

Configure web server (Apache/Nginx) to block direct access to blog image URLs or require authentication for image paths.

# Example Nginx location block for blog images
location ~ ^/documents/.*/blogs/.*\.(jpg|jpeg|png|gif)$ {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Disable Blog Image Uploads

all

Temporarily disable image uploads in blog entries through Liferay configuration to prevent exposure of new images.

# Modify portal-ext.properties
blogs.image.allowed.file.extensions=

🧯 If You Can't Patch

  • Implement network-level access controls to restrict access to Liferay servers from untrusted networks
  • Enable detailed logging for image access attempts and monitor for unauthorized access patterns

🔍 How to Verify

Check if Vulnerable:

1. Create a blog entry with an image restricted to specific user roles. 2. Attempt to access the image URL directly without authentication or proper permissions. 3. If image loads, system is vulnerable.

Check Version:

# Check Liferay version
cat $LIFERAY_HOME/tomcat-*/webapps/ROOT/WEB-INF/liferay-plugin-package.properties | grep "version"

Verify Fix Applied:

1. Repeat the vulnerable test after patching. 2. Direct image access should now require proper authentication and return appropriate error for unauthorized users.

📡 Detection & Monitoring

Log Indicators:

  • Multiple 200 OK responses to direct image URLs from unauthorized IPs
  • Access to /documents/*/blogs/* image paths without preceding authentication logs

Network Indicators:

  • Direct HTTP GET requests to blog image URLs without session cookies or authentication headers

SIEM Query:

source="liferay_access.log" AND (uri_path="/documents/*/blogs/*" AND status=200) AND NOT (user!="anonymous")

🔗 References

📤 Share & Export