CVE-2025-12747

5.3 MEDIUM

📋 TL;DR

The Tainacan WordPress plugin exposes private uploaded files to unauthenticated users due to inadequate access controls. This vulnerability allows attackers to access sensitive files marked as private by directly requesting them from the wp-content directory. All WordPress sites using Tainacan versions up to 1.0.0 are affected.

💻 Affected Systems

Products:
  • Tainacan WordPress plugin
Versions: All versions up to and including 1.0.0
Operating Systems: Any OS running WordPress
Default Config Vulnerable: ⚠️ Yes
Notes: Only affects WordPress installations with the Tainacan plugin enabled and private files uploaded through the plugin.

⚠️ Manual Verification Required

This CVE does not have specific version information in our database, so automatic vulnerability detection cannot determine if your system is affected.

Why? The CVE database entry doesn't specify which versions are vulnerable (no version ranges provided by the vendor/NVD).

🔒 Custom verification scripts are available for registered users. Sign up free to download automated test scripts.

Recommended Actions:
  1. Review the CVE details at NVD
  2. Check vendor security advisories for your specific version
  3. Test if the vulnerability is exploitable in your environment
  4. Consider updating to the latest version as a precaution

⚠️ Risk & Real-World Impact

🔴

Worst Case

Sensitive documents containing personal data, financial information, or intellectual property are exposed to the public internet, leading to data breaches, regulatory fines, and reputational damage.

🟠

Likely Case

Attackers discover and download private files containing user information, internal documents, or other sensitive content that administrators believed were protected.

🟢

If Mitigated

Files remain protected with proper access controls, preventing unauthorized access even if attackers attempt to enumerate or request them directly.

🌐 Internet-Facing: HIGH
🏢 Internal Only: MEDIUM

🎯 Exploit Status

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

Exploitation requires knowing or guessing file paths, which could be discovered through enumeration or other information leakage.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: 1.0.1

Vendor Advisory: https://github.com/tainacan/tainacan/compare/1.0.0...1.0.1

Restart Required: No

Instructions:

1. Log into WordPress admin panel. 2. Navigate to Plugins → Installed Plugins. 3. Find Tainacan plugin. 4. Click 'Update Now' if update is available. 5. Alternatively, download version 1.0.1+ from WordPress repository and replace the plugin files.

🔧 Temporary Workarounds

Restrict access to wp-content/tainacan-private directory

linux

Add .htaccess rules to block direct access to private files directory

echo 'Deny from all' > /path/to/wp-content/tainacan-private/.htaccess

Move private files outside web root

all

Configure Tainacan to store private files in a directory not accessible via web

🧯 If You Can't Patch

  • Disable the Tainacan plugin until patching is possible
  • Remove all private files uploaded through Tainacan and store them in a secure location

🔍 How to Verify

Check if Vulnerable:

Check if Tainacan plugin version is 1.0.0 or lower in WordPress admin panel or by examining the plugin's readme.txt file.

Check Version:

grep -i 'version' /path/to/wp-content/plugins/tainacan/readme.txt

Verify Fix Applied:

After updating, verify the plugin version shows 1.0.1 or higher and test that private files return 403/404 errors when accessed directly by unauthenticated users.

📡 Detection & Monitoring

Log Indicators:

  • Multiple 200 OK responses to direct file requests in wp-content/tainacan-private directory
  • Unusual file download patterns from non-authenticated IP addresses

Network Indicators:

  • Direct HTTP requests to private file paths without authentication headers
  • File enumeration attempts against tainacan-private directory

SIEM Query:

source="web_access_logs" AND (uri CONTAINS "/wp-content/tainacan-private/" OR uri CONTAINS "tainacan_private_file") AND status=200 AND NOT (user_agent CONTAINS "WordPress" OR user_agent CONTAINS "admin")

🔗 References

📤 Share & Export