Skip to content

fix(security): update dependencies [SECURITY] - #397

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/security
Open

renovate[bot] wants to merge 1 commit into
mainfrom
renovate/security

Conversation

@renovate

@renovate renovate Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
pylint (changelog) 4.0.8 → 4.0.9 age confidence
setuptools (changelog) 84.0.0 → 84.1.0 age confidence

Pylint: Arbitrary code execution via pickle deserialization of the stats cache in PYLINT_HOME

CVE-2026-114608 / GHSA-22qq-2fwx-7p67

More information

Details

Impact

Since 2006 / pylint 0.15.2, pylint caches its stats as pickles in PYLINT_HOME and reload them on the next run with pickle.load. Someone without access to the configuration or linted code, but with access to the cache directory (predictable PYLINT_HOME on a multi-user host) can write a crafted pickle that will runs arbitrary code when pylint access its stat cache.

Patches

From pylint 4.0.9, the result cache is now stored as JSON instead of pickle, preventing code-execution.

Workarounds

Until upgrading do not point PYLINT_HOME to an untrusted, shared, or group-writable directory. The default value, ~/.cache/pylint, is writable only by the user running pylint.

Credits
  • Reported privately via Tidelift coordinated disclosure (Dan Lenz).

Severity

  • CVSS Score: 5.4 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:L/AC:H/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

References

This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).


setuptools: Windows path escape via namespace_packages.txt during legacy wheel installation Description

GHSA-xmj3-9gf7-h52w

More information

Details

Summary

On Windows, attacker-controlled content in a wheel's
.dist-info/namespace_packages.txt can cause setuptools' legacy wheel
installation path to create an __init__.py outside the requested
destination_eggdir.

The attacker can influence the destination path, but not the contents of
the created file.

Details

Tested setuptools commit:

6ead555c5fb29bc57fe6105b1bffc163f56fd558

Relevant source:

setuptools/wheel.py

SHA-256:

359b7e0d5dd8c3135653abe08a8ed5dc0352eadfd7df22cb5e2b5303b7c3cafd

The relevant call path is:

Wheel(wheel_path).install_as_egg(destination)
→ _install_as_egg
→ _convert_metadata
→ _fix_namespace_packages

A wheel can provide attacker-controlled content in:

<distribution>.dist-info/namespace_packages.txt

The namespace value is eventually used approximately as:

mod_dir = os.path.join(destination_eggdir, *mod.split('.'))
mod_init = os.path.join(mod_dir, '__init__.py')

If mod is a Windows drive-qualified absolute path containing no dots,
mod.split('.') preserves it as a single component.
On Windows, os.path.join(destination_eggdir, absolute_component) discards
the original base directory and resolves to the attacker-supplied absolute
path.
The existing wheel filename and ZIP traversal checks do not validate this
metadata value before it is subsequently interpreted as a filesystem path.

```markdown

##### PoC

The reproduction was performed entirely inside a disposable temporary
directory.

Layout:

```text
sandbox/
    destination/
    outside/
    input/
    canary.txt

A synthetic wheel was created containing:

demo_pkg-1.0.dist-info/namespace_packages.txt

whose content was the absolute path of:

sandbox\outside

The real acquired setuptools implementation was then invoked:

setuptools.wheel.Wheel(synthetic_wheel).install_as_egg(
    sandbox_destination
)

The operation completed without exception.

Expected metadata was created under:

sandbox\destination\EGG-INFO

but setuptools also created:

sandbox\outside\__init__.py

The file did not exist before execution.

Its contents were:

__import__('pkg_resources').declare_namespace(__name__)

The unrelated canary remained byte-identical.

The sandbox was deleted after recording the evidence.


##### Impact

A crafted wheel can cause setuptools to create a fixed-content
`__init__.py` outside the intended installation directory at a
filesystem path influenced by the wheel, with the permissions of the
process performing the installation.

The demonstrated reproduction required the target parent directory to
already exist.

#### Severity
- CVSS Score: 1.0 / 10 (Low)
- Vector String: `CVSS:4.0/AV:L/AC:H/AT:P/PR:L/UI:A/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N`

#### References
- [https://github.com/pypa/setuptools/security/advisories/GHSA-xmj3-9gf7-h52w](https://redirect.github.com/pypa/setuptools/security/advisories/GHSA-xmj3-9gf7-h52w)
- [https://github.com/pypa/setuptools/pull/5329](https://redirect.github.com/pypa/setuptools/pull/5329)
- [https://github.com/pypa/setuptools/commit/6d07b8d17890dda58d944ac51e58f54af92d52af](https://redirect.github.com/pypa/setuptools/commit/6d07b8d17890dda58d944ac51e58f54af92d52af)
- [https://github.com/pypa/setuptools](https://redirect.github.com/pypa/setuptools)
- [https://github.com/pypa/setuptools/releases/tag/v84.1.0](https://redirect.github.com/pypa/setuptools/releases/tag/v84.1.0)

This data is provided by [OSV](https://osv.dev/vulnerability/GHSA-xmj3-9gf7-h52w) and the [GitHub Advisory Database](https://redirect.github.com/github/advisory-database) ([CC-BY 4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
</details>

---

### Release Notes

<details>
<summary>pylint-dev/pylint (pylint)</summary>

### [`v4.0.9`](https://redirect.github.com/pylint-dev/pylint/releases/tag/v4.0.9)

[Compare Source](https://redirect.github.com/pylint-dev/pylint/compare/v4.0.8...v4.0.9)

## What's new in Pylint 4.0.9?

Release date: 2026-09-23

## Security Fixes

- Someone without access to the configuration or linted code, but with access
  to the cache directory (predictable `PYLINT_HOME` on a multi-user host) can no
  longer write a crafted pickle that will runs arbitrary code when pylint access its
  stat cache. The result cache is now stored as JSON instead of pickle,
  preventing code-execution. The workaround is upgrading or not pointing `PYLINT_HOME`
  to an untrusted, shared, or group-writable directory. The default value, `~/.cache/pylint`,
  is writable only by the user running pylint. (CVE with the same information pending)

## False Positives Fixed

- Fixed a false positive for `no-self-use` on a method that only uses
  `self` before a locally defined class (or other nested method), because
  the checker's could-be-a-function tracking state was not restored after
  visiting the nested method.

  Closes [#&#8203;3705](https://redirect.github.com/pylint-dev/pylint/issues/3705)

- Fix a false positive for :ref:`not-callable` when calling functions constructed with
  `types.FunctionType` or `types.LambdaType`.

  Closes [#&#8203;7500](https://redirect.github.com/pylint-dev/pylint/issues/7500)

- Fix a false positive for `unnecessary-direct-lambda-call` when a directly called
  lambda in a class body wraps a comprehension containing an assignment expression.
  PEP 572 makes that a `SyntaxError` without the lambda's scope, so following the
  message produced code that would not compile.

  Closes [#&#8203;9294](https://redirect.github.com/pylint-dev/pylint/issues/9294)

- Fix a false positive for :ref:`unnecessary-ellipsis` when an ellipsis is the
  sole body statement of a method defined on a `Protocol`.

  Closes [#&#8203;9319](https://redirect.github.com/pylint-dev/pylint/issues/9319)

- Fix a false positive for :ref:`bad-exception-cause` when the bases of the class
  being raised from cannot be inferred, such as an exception deriving from a
  C extension class. :ref:`raising-non-exception` and
  :ref:`catching-non-exception` already guard the same `inherit_from_std_ex`
  helper with `has_known_bases`.

  Refs [#&#8203;11399](https://redirect.github.com/pylint-dev/pylint/issues/11399)

## False Negatives Fixed

- `method-hidden` is no longer silenced when the hidden method shares its name with
  a builtin function or with a function defined at module level. Only members of the
  ancestor classes themselves can excuse the method now.

  Refs [#&#8203;11361](https://redirect.github.com/pylint-dev/pylint/issues/11361)

## Other Bug Fixes

- Fix a block-scoped `# pylint: disable=` directive placed inside an `if`
  body leaking into sibling `elif`/`else` blocks for messages such as
  `stop-iteration-return`, which default to a line-based (rather than
  node-based) message scope.

  Closes [#&#8203;3136](https://redirect.github.com/pylint-dev/pylint/issues/3136)

- Fix a false positive for `declare-non-slot` when a class variable is
  annotated with `ClassVar` without an initial value.

  Closes [#&#8203;9950](https://redirect.github.com/pylint-dev/pylint/issues/9950)

- Fix a crash in the `no-member` checker when attribute lookup raises an
  `InferenceError`.

  Closes [#&#8203;11356](https://redirect.github.com/pylint-dev/pylint/issues/11356)

- Fix a crash in the `unnecessary-default-type-args` check when a `Generator`
  or `AsyncGenerator` subscript holds an empty tuple, such as `Generator[()]`.

  Closes [#&#8203;11357](https://redirect.github.com/pylint-dev/pylint/issues/11357)

- Fix a crash in `method-hidden` when a method shadows a name that `builtins`
  binds to a node without a statement, such as `help` or `license`. Every class
  inherits from `object`, which lives in the `builtins` module, so no base class
  was needed to trigger it.

  Closes [#&#8203;11361](https://redirect.github.com/pylint-dev/pylint/issues/11361)
  Closes [#&#8203;8079](https://redirect.github.com/pylint-dev/pylint/issues/8079)

</details>

<details>
<summary>pypa/setuptools (setuptools)</summary>

### [`v84.1.0`](https://redirect.github.com/pypa/setuptools/compare/v84.0.0...v84.1.0)

[Compare Source](https://redirect.github.com/pypa/setuptools/compare/v84.0.0...v84.1.0)

</details>

---

### Configuration

📅 **Schedule**: (in timezone UTC)

- Branch creation
  - "before 4am"
- Automerge
  - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/ansible-community/molecule-plugins).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODAuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE4OC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJjaG9yZSIsImRlcGVuZGVuY2llcyIsImZpeCJdfQ==-->

@renovate
renovate Bot force-pushed the renovate/security branch from 356f916 to d213a0f Compare October 27, 2026 23:00

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants