CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-27457

Lost in Translation: Exposing Secrets via Weblate's Addon API

Alon Barad
Alon Barad
Software Engineer

Feb 26, 2026·5 min read·46 visits

Executive Summary (TL;DR)

A broken access control vulnerability in Weblate's API allowed low-privileged users to list all system addons. This exposed sensitive configuration data, including API keys for translation services and repository credentials. Fixed in version 5.16.1.

In the world of automated localization, Weblate is a heavyweight champion, managing translations for thousands of open-source and commercial projects. However, a lapse in access control logic within its REST API turned the platform into an open book. CVE-2026-27457 identifies a critical Missing Authorization vulnerability where the `AddonViewSet` endpoint failed to filter results based on user permissions. This oversight allowed any authenticated user—and in some configurations, anonymous users—to query the full configuration of installed addons. Because these addons often handle integrations with third-party services like DeepL, OpenAI, or git repositories, the leakage included high-value secrets: API keys, authentication tokens, and webhook URLs. It is a classic case of 'default to open' in Django REST Framework usage.

The Hook: Secrets in the Translation Layer

Localization tools are often overlooked by security teams. They sit quietly in the CI/CD pipeline, taking strings in English and spitting them out in French, German, or Klingon. But tools like Weblate are not just dictionaries; they are integration hubs. To automate translations, Weblate connects to everything: Git repositories, machine translation providers (DeepL, Google Translate), and AI models (OpenAI, Anthropic).

To make these connections work, Weblate uses "Addons." These are modular components that need configuration. And what does configuration require? Secrets. API keys, personal access tokens, and webhook signing secrets.

CVE-2026-27457 isn't about memory corruption or complex buffer overflows. It's about a simple question: If I ask the API for a list of all these addons, should it give them to me? The answer should be "only if you own them." The answer Weblate gave was "Sure, here's everything."

The Flaw: The 'Default to Open' Trap

The vulnerability lies deep within the Django REST Framework (DRF) implementation in weblate/api/views.py. DRF is a powerful toolkit, but it has a massive foot-gun: if you define a queryset but don't explicitly filter it based on the request context, it defaults to returning every record in the table.

The developers defined the AddonViewSet with a fatal simplicity:

class AddonViewSet(viewsets.ModelViewSet):
    queryset = Addon.objects.all()
    # ... serialization logic ...

That line—queryset = Addon.objects.all()—is the smoking gun. When a user hits GET /api/addons/, DRF looks at the queryset, sees all(), and serializes the entire database table of addons.

While Weblate had a perm_check method, it was primarily effective for write operations (POST, PUT, DELETE). The read operations (GET) fell through to the default behavior. It's the digital equivalent of locking the front door (write access) but leaving the back wall completely missing (read access).

The Code: Analysis of the Patch

The fix required two attempts to get right, highlighting how tricky permission scoping can be. The initial patch (Commit 3f58f9a4152bc0cbdd6eff5954f9c7bc4d9f0af9) moved from a static queryset to a dynamic one.

The Vulnerable Code (Simplified):

class AddonViewSet(WebletViewSet):
    queryset = Addon.objects.all()  # <--- The root of all evil
    serializer_class = AddonSerializer

The Fix (Commit 3f58f9a4 + 7802c9b1):

class AddonViewSet(WebletViewSet):
    # Default to nothing to be safe
    queryset = Addon.objects.none()
 
    def get_queryset(self):
        # Dynamically filter based on user privileges
        if self.request.user.is_superuser:
            return Addon.objects.all()
            
        # Restrict to projects the user actually manages
        return Addon.objects.filter(
            component__project__in=self.request.user.managed_projects
        )

Notice the shift from allowed_projects to managed_projects in the final polish. Originally, they restricted it to projects a user could access. But a translator shouldn't see the API keys just because they can translate a string. The final fix tightened this to project administrators (managed_projects) only.

They also changed the error behavior. Accessing an ID you don't own used to return 403 Forbidden (which confirms existence). Now it returns 404 Not Found, preventing enumeration attacks.

The Exploit: Harvesting API Keys

Exploiting this is trivially easy. You don't need Metasploit; you need curl. The attack assumes you have a low-privileged account on the Weblate instance. If the instance has REQUIRE_LOGIN = False, you don't even need that.

Step 1: Authenticate (Optional) Grab your API token from your user profile.

Step 2: The Harvest

curl -H "Authorization: Token <YOUR_TOKEN>" \
     -H "Content-Type: application/json" \
     https://weblate.target.corp/api/addons/ | jq

Step 3: Parse the Loot The response will be a JSON array containing every addon configuration. You are looking for fields like configuration.

{
    "count": 5,
    "results": [
        {
            "id": 42,
            "name": "weblate.addons.machine.deepl",
            "configuration": {
                "api_key": "sk-decafbad-1234-5678-secret-key",
                "url": "https://api-free.deepl.com"
            },
            "component": "marketing/website"
        }
    ]
}

Just like that, you have the organization's paid DeepL API key. If they use the OpenAI addon for context improvement, you now have their OpenAI key. You can now use their quota to generate poetry or fine-tune your own models on their dime.

The Impact: Why 'Medium' Severity is a Lie

The CVSS score is 4.3 (Medium). This is technically accurate based on the calculator (Confidentiality: Low), but practically absurd. The scoring assumes that the data exposed is "limited."

Let's be real: Exposed API keys are rarely "low impact."

  1. Financial Impact: An attacker can drain the quota of connected services (OpenAI, DeepL, AWS Translate). This is direct financial theft.
  2. Supply Chain Risk: Some addons interact with version control systems. If an addon stores a GitHub Personal Access Token (PAT) with write access to push translations, an attacker could potentially retrieve that token.
  3. Lateral Movement: If the Weblate instance uses internal webhooks for post-commit triggers, the addon config reveals internal network topology and potentially internal authentication headers.

Don't let the "Medium" label fool you. In a production environment with paid integrations, this is a Critical leak.

The Fix: Closing the Door

The remediation is straightforward: Update to Weblate 5.16.1.

The patch introduces strict filtering. If you are a translator for the "Mobile App" project, querying /api/addons/ will now return an empty list or only the addons specifically attached to that project (and only if you are a manager).

If you cannot update immediately:

You must block the specific endpoint at your reverse proxy (Nginx/Apache/HAProxy).

Nginx Example:

location ~ ^/api/addons/ {
    deny all;
    return 403;
}

This will break functionality for managing addons via the API, but it stops the data bleeding until you can patch. Also, rotate any API keys that were stored in Weblate prior to the patch. Assume they have been read.

Official Patches

WeblateCommit 3f58f9a: Initial Access Control Fix
WeblateWeblate 5.16.1 Release Notes

Fix Analysis (2)

Technical Appendix

CVSS Score
4.3/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N

Affected Systems

Weblate < 5.16.1

Affected Versions Detail

Product
Affected Versions
Fixed Version
Weblate
WeblateOrg
< 5.16.15.16.1
AttributeDetail
CWECWE-862 (Missing Authorization)
CVSS v3.14.3 (Medium)
Attack VectorNetwork
Privileges RequiredLow (Authenticated)
ImpactInformation Disclosure (Sensitive API Keys)
Patch Commit3f58f9a4152bc0cbdd6eff5954f9c7bc4d9f0af9

MITRE ATT&CK Mapping

T1552Unsecured Credentials
Credential Access
T1068Exploitation for Privilege Escalation
Privilege Escalation
T1005Data from Local System
Collection
CWE-862
Missing Authorization

Vulnerability Timeline

Initial fix commit pushed (3f58f9a)
2026-02-19
Hardening fix pushed (7802c9b)
2026-02-26
Weblate 5.16.1 released
2026-02-26
GHSA Advisory Published
2026-02-26

References & Sources

  • [1]GHSA-wppc-7cq7-cgfv Advisory
  • [2]Refining Access Control Logic Commit

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•34 minutes ago•CVE-2026-107377
7.5

CVE-2026-107377: Arbitrary File Write and Overwrite via Protobuf Weak Import Path Traversal in datamodel-code-generator

A path traversal vulnerability in datamodel-code-generator allows remote attackers to write or overwrite arbitrary files on the local host filesystem via a manipulated Protobuf schema containing malicious weak import paths.

Amit Schendel
Amit Schendel
2 views•5 min read
•about 2 hours ago•CVE-2026-61431
6.8

CVE-2026-61431: Arbitrary Local File Read and Path Traversal in PraisonAI ContextGatherer

PraisonAI is vulnerable to an arbitrary local file read vulnerability prior to version 4.6.78. The flaw is in the ContextGatherer component, where validation checks are executed only after files are parsed and appended to the context bundle, bypassing security constraints.

Amit Schendel
Amit Schendel
6 views•6 min read
•about 3 hours ago•CVE-2026-107212
7.5

CVE-2026-107212: CPU Exhaustion Denial of Service via Look-Ahead Row Parsing in Excelize

An algorithmic complexity vulnerability (CWE-770) in the Excelize library allows remote attackers to cause resource exhaustion (100% CPU usage) via a crafted Microsoft Excel spreadsheet. This occurs because the look-ahead row index parsing in Rows.Columns() fails to enforce upper boundary limits, enabling an out-of-bounds row index to trigger an infinite seek loop inside the Rows iterator.

Alon Barad
Alon Barad
10 views•6 min read
•about 4 hours ago•CVE-2026-105647
4.0

CVE-2026-105647: Server-Side Request Forgery via Favicon Probing in Ghost CMS

An unauthenticated Server-Side Request Forgery (SSRF) vulnerability exists in Ghost CMS from version 6.54.1 to 6.65.0. The vulnerability stems from a validation bypass in the favicon resolution logic within the bookmark-fetching subsystem, which allows remote, unauthenticated attackers to trigger arbitrary HTTP requests to the local host and internal networks. This bypass circumvents the custom DNS-level IP blocklist controls configured globally in the application.

Alon Barad
Alon Barad
8 views•8 min read
•about 5 hours ago•CVE-2026-106450
5.3

CVE-2026-106450: Denial of Service via Eager Resource Allocation in lz4-java LZ4FrameInputStream

A resource allocation vulnerability (CWE-770) in lz4-java before version 1.11.4 allows an unauthenticated remote attacker to trigger CPU exhaustion and high garbage collection overhead by streaming empty concatenated LZ4 frames.

Alon Barad
Alon Barad
12 views•8 min read
•about 6 hours ago•CVE-2026-106449
3.7

CVE-2026-106449: Stack Overflow via Uncontrolled Recursion in yawkat lz4-java

A Denial of Service (DoS) vulnerability exists in the yawkat fork of lz4-java prior to version 1.11.4. Under specific non-default configurations (stopOnEmptyBlock = false), parsing crafted streams with a large sequence of contiguous empty LZ4 blocks triggers uncontrolled recursion inside the LZ4BlockInputStream.refill() method, causing stack exhaustion and thread termination.

Alon Barad
Alon Barad
8 views•6 min read