Skip to main content

Python bindings for libpathrs, a safe path resolution library for Linux.

Project description

python-pathrs

This is a basic Python wrapper around libpathrs, a safe path resolution library for Linux. For more details about the security protections provided by libpathrs, see the main README.

In order to use this library, you need to have libpathrs.so installed on your system. Your distribution might already have a libpathrs package. If not, you can install libpathrs from source.

Examples

libpathrs allows you to operate on a container root filesystem safely, without worrying about an attacker swapping components and tricking you into operating on host files.

import pathrs

# Get a handle to the root filesystem.
with pathrs.Root("/path/to/rootfs") as root:
    # Get an O_PATH handle to a path we want to operate on.
    with root.resolve("/etc/passwd") as passwd:
        # Upgrade the handle to one you can do regular IO on.
        with root.reopen("r") as f:
            for line in f:
                print(line.rstrip("\n"))

Aside from just opening files, libpathrs also allows you to do most common filesystem operations:

import pathrs

# <fcntl.h>
RENAME_EXCHANGE = 0x2

with pathrs.Root("/path/to/rootfs") as root:
    # symlink
    root.symlink("foo", "bar") # foo -> bar
    # link
    root.hardlink("a", "b") # a -> b
    # rename(at2)
    root.rename("foo", "b", flags=RENAME_EXCHANGE) # foo <-> b
    # open(O_CREAT)
    with root.creat("newfile", "w+") as f:
        f.write("Some contents.")

It also supports operations like mkdir -p and rm -f, which are a little tricky to implement safely.

import pathrs

with pathrs.Root("/path/to/rootfs") as root:
    # rm -r
    root.remove_all("/tmp/foo")
    # mkdir -p
    root.mkdir_all("/tmp/foo/bar/baz/bing/boop", 0o755)

In addition, libpathrs provides a safe procfs API, to allow for privileged programs to operate on /proc in a way that detects a maliciously-configured mount table. This is a somewhat esoteric requirement, but privileged processes that have to operate in untrusted mount namespaces need to handle this properly or risk serious security issues.

from pathrs import procfs

# readlink("/proc/thread-self/fd/0")
stdin_path = procfs.readlink(procfs.PROC_THREAD_SELF, "fd/0")

# readlink("/proc/self/exe")
exe_path = procfs.readlink(procfs.PROC_SELF, "exe")

# Read data from /proc/cpuinfo.
with procfs.open(procfs.PROC_ROOT, "cpuinfo", "r") as cpuinfo:
    for line in cpuinfo:
        print(line.rstrip("\n"))

For more information about the libpathrs API and considerations you should have when using libpathrs, please see the Rust documentation.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pathrs-0.2.1.tar.gz (20.9 kB view details)

Uploaded Source

File details

Details for the file pathrs-0.2.1.tar.gz.

File metadata

  • Download URL: pathrs-0.2.1.tar.gz
  • Upload date:
  • Size: 20.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pathrs-0.2.1.tar.gz
Algorithm Hash digest
SHA256 6a03ff6869529ecb29df95c8871644b73997d814e9712a276e5dd2344845bbd2
MD5 ef8706a6dcf522ce5332230399eb5fa6
BLAKE2b-256 7d0553fa38621b2d764afb35bf29480be33adbe35ba1994d220c17b441ac6e1d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pathrs-0.2.1.tar.gz:

Publisher: bindings-python.yml on cyphar/libpathrs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page