python / python/cpython

venv module not respecting ACLs

Open
#127,172 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

stdlib topic-venv type-bug
Dominant language
Python
Stars
77.2k
Forks
35.9k
PR merge metrics
PR metrics pending

Description

Bug report

Bug description:

First, let's do some setup.

$ docker run -it --rm python:3.13.0 bash

root@45d8ebf9ee61:~# apt-get update     
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8789 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2468 B]
Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [204 kB]
Fetched 9250 kB in 5s (1721 kB/s)                        
Reading package lists... Done

root@45d8ebf9ee61:~# apt-get install acl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  acl
0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded.
Need to get 61.2 kB of archives.
After this operation, 215 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bookworm/main amd64 acl amd64 2.3.1-3 [61.2 kB]
Fetched 61.2 kB in 1s (45.6 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package acl.
(Reading database ... 23969 files and directories currently installed.)
Preparing to unpack .../archives/acl_2.3.1-3_amd64.deb ...
Unpacking acl (2.3.1-3) ...
Setting up acl (2.3.1-3) ...

I've got the same result on my RHEL9.4 machine, the docker here is just to produce a minimal example.
Now, let's grab a control sample:

root@45d8ebf9ee61:~# mkdir foo
root@45d8ebf9ee61:~# python -m venv foo/.venv
root@45d8ebf9ee61:~# touch foo/.venv/bin/bar
root@45d8ebf9ee61:~# ls -Al foo/.venv/bin/
total 36
-rw-r--r-- 1 root root 9031 Nov 12 06:08 Activate.ps1
-rw-r--r-- 1 root root 2045 Nov 22 18:54 activate
-rw-r--r-- 1 root root  904 Nov 22 18:54 activate.csh
-rw-r--r-- 1 root root 2183 Nov 22 18:54 activate.fish
-rw-r--r-- 1 root root    0 Nov 22 18:54 bar
-rwxr-xr-x 1 root root  231 Nov 22 18:54 pip
-rwxr-xr-x 1 root root  231 Nov 22 18:54 pip3
-rwxr-xr-x 1 root root  231 Nov 22 18:54 pip3.13
lrwxrwxrwx 1 root root   21 Nov 22 18:54 python -> /usr/local/bin/python
lrwxrwxrwx 1 root root    6 Nov 22 18:54 python3 -> python
lrwxrwxrwx 1 root root    6 Nov 22 18:54 python3.13 -> python

Now, let's enable some ACLs, and repeat the experiment.

root@45d8ebf9ee61:~# rm -rf -- foo/
root@45d8ebf9ee61:~# mkdir foo
root@45d8ebf9ee61:~# setfacl -d -m group::rwx -m other::rw foo/
root@45d8ebf9ee61:~# python -m venv foo/.venv
root@45d8ebf9ee61:~# touch foo/.venv/bin/bar
root@45d8ebf9ee61:~# ls -Al foo/.venv/bin/
total 36
-rw-r--r-- 1 root root 9031 Nov 12 06:08 Activate.ps1
-rw-r--r-- 1 root root 2045 Nov 22 18:55 activate
-rw-r--r-- 1 root root  904 Nov 22 18:55 activate.csh
-rw-r--r-- 1 root root 2183 Nov 22 18:55 activate.fish
-rw-rw-rw- 1 root root    0 Nov 22 18:55 bar
-rwxrwxrwx 1 root root  231 Nov 22 18:55 pip
-rwxrwxrwx 1 root root  231 Nov 22 18:55 pip3
-rwxrwxrwx 1 root root  231 Nov 22 18:55 pip3.13
lrwxrwxrwx 1 root root   21 Nov 22 18:55 python -> /usr/local/bin/python
lrwxrwxrwx 1 root root    6 Nov 22 18:55 python3 -> python
lrwxrwxrwx 1 root root    6 Nov 22 18:55 python3.13 -> python

As one may notice, the access bits on bar and pip* differ (as expected they got the g+w bit). Unfortunately, the bit is missing from the activate* files which is unexpected.

CPython versions tested on:

3.13

Operating systems tested on:

Linux

Linked PRs
  • gh-154850

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the python -m venv entry point and reproduce the ACL setup from the issue on Linux, comparing permissions on activate, activate.csh, activate.fish, and Activate.ps1 with pip* and bar. Review linked PR gh-154850 for the work already underway; done means the activate files preserve the expected inherited ACL bits.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
operating-systems
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.