fix(deps): update module github.com/cyphar/filepath-securejoin to v0.6.0 #44
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v0.4.1->v0.6.0Release Notes
cyphar/filepath-securejoin (github.com/cyphar/filepath-securejoin)
v0.6.0: -- "By the Power of Greyskull!"Compare Source
While quite small code-wise, this release marks a very key point in the
development of filepath-securejoin.
filepath-securejoin was originally intended (back in 2017) to simply be a
single-purpose library that would take some common code used in container
runtimes (specifically, Docker's
FollowSymlinksInScope) and make it moregeneral-purpose (with the eventual goals of it ending up in the Go stdlib).
Of course, I quickly discovered that this problem was actually far more
complicated to solve when dealing with racing attackers, which lead to me
developing
openat2(2)and libpathrs. I had originally planned forlibpathrs to completely replace filepath-securejoin "once it was ready" but in
the interim we needed to fix several race attacks in runc as part of security
advisories. Obviously we couldn't require the usage of a pre-0.1 Rust library
in runc so it was necessary to port bits of libpathrs into filepath-securejoin.
(Ironically the first prototypes of libpathrs were originally written in Go and
then rewritten to Rust, so the code in filepath-securejoin is actually Go code
that was rewritten to Rust then re-rewritten to Go.)
It then became clear that pure-Go libraries will likely not be willing to
require CGo for all of their builds, so it was necessary to accept that
filepath-securejoin will need to stay. As such, in v0.5.0 we provided more
pure-Go implementations of features from libpathrs but moved them into
pathrs-litesubpackage to clarify what purpose these helpers serve.This release finally closes the loop and makes it so that pathrs-lite can
transparently use libpathrs (via a
libpathrsbuild-tag). This means thatupstream libraries can use the pure Go version if they prefer, but downstreams
(either downstream library users or even downstream distributions) are able to
migrate to libpathrs for all usages of pathrs-lite in an entire Go binary.
I should make it clear that I do not plan to port the rest of libpathrs to Go,
as I do not wish to maintain two copies of the same codebase. pathrs-lite
already provides the core essentials necessary to operate on paths safely for
most modern systems. Users who want additional hardening or more ergonomic APIs
are free to use
cyphar.com/go-pathrs(libpathrs's Go bindings).Breaking
MkdirAll,MkdirAllHandle,OpenInRoot,OpenatInRootandReopenwrappers have been removed. Please switch to usingpathrs-litedirectly.
Added
pathrs-litenow has support for using libpathrs as a backend.This is opt-in and can be enabled at build time with the
libpathrsbuildtag. The intention is to allow for downstream libraries and other projects to
make use of the pure-Go
github.com/cyphar/filepath-securejoin/pathrs-litepackage and distributors can then opt-in to using
libpathrsfor the entirebinary if they wish.
Signed-off-by: Aleksa Sarai [email protected]
v0.5.1: -- "Spooky scary skeletons send shivers down your spine!"Compare Source
Changed
openat2can return-EAGAINif it detects a possible attack in certainscenarios (namely if there was a rename or mount while walking a path with a
..component). While this is necessary to avoid a denial-of-service in thekernel, it does require retry loops in userspace.
In previous versions,
pathrs-litewould retryopenat232 times beforereturning an error, but we've received user reports that this limit can be
hit on systems with very heavy load. In some synthetic benchmarks (testing
the worst-case of an attacker doing renames in a tight loop on every core of
a 16-core machine) we managed to get a ~3% failure rate in runc. We have
improved this situation in two ways:
We have now increased this limit to 128, which should be good enough for
most use-cases without becoming a denial-of-service vector (the number of
syscalls called by the
O_PATHresolver in a typical case is within thesame ballpark). The same benchmarks show a failure rate of ~0.12% which
(while not zero) is probably sufficient for most users.
In addition, we now return a
unix.EAGAINerror that is bubbled up and canbe detected by callers. This means that callers with stricter requirements
to avoid spurious errors can choose to do their own infinite
EAGAINretryloop (though we would strongly recommend users use time-based deadlines in
such retry loops to avoid potentially unbounded denials-of-service).
v0.5.0: -- "Let the past die. Kill it if you have to."Compare Source
Breaking
The new API introduced in the 0.3.0 release has been moved to a new
subpackage called
pathrs-lite. This was primarily done to better indicatethe split between the new and old APIs, as well as indicate to users the
purpose of this subpackage (it is a less complete version of libpathrs).
We have added some wrappers to the top-level package to ease the transition,
but those are deprecated and will be removed in the next minor release of
filepath-securejoin. Users should update their import paths.
This new subpackage has also been relicensed under the Mozilla Public License
(version 2), please see COPYING.md for more details.
Added
Most of the key bits the safe
procfsAPI have now been exported and areavailable in
github.com/cyphar/filepath-securejoin/pathrs-lite/procfs. Atthe moment this primarily consists of a new
procfs.HandleAPI:OpenProcRootreturns a new handle to/proc, endeavouring to make itsafe if possible (
subset=pidto protect against mistaken write attacksand leaks, as well as using
fsopen(2)to avoid racing mount attacks).OpenUnsafeProcRootreturns a handle without attempting to create onewith
subset=pid, which makes it more dangerous to leak. Most usersshould use
OpenProcRoot(even if you need to useProcRootas the baseof an operation, as filepath-securejoin will internally open a handle when
necessary).
The
(*procfs.Handle).Open*family of methods lets you get a safeO_PATHhandle to subpaths within/procfor certain subpaths.For
OpenThreadSelf, the returnedProcThreadSelfCloserneeds to becalled after you completely finish using the handle (this is necessary
because Go is multi-threaded and
ProcThreadSelfreferences/proc/thread-selfwhich may disappear if we do notruntime.LockOSThread--ProcThreadSelfCloseris currently equivalentto
runtime.UnlockOSThread).Note that you cannot open any
procfssymlinks (most notably magic-links)using this API. At the moment, filepath-securejoin does not support this
feature (but libpathrs does).
ProcSelfFdReadlinklets you get the in-kernel path representation of afile descriptor (think
readlink("/proc/self/fd/...")), except that weverify that there aren't any tricky overmounts that could fool the
process.
Please be aware that the returned string is simply a snapshot at that
particular moment, and an attacker could move the file being pointed to.
In addition, complex namespace configurations could result in non-sensical
or confusing paths to be returned. The value received from this function
should only be used as secondary verification of some security property,
not as proof that a particular handle has a particular path.
The procfs handle used internally by the API is the same as the rest of
filepath-securejoin(for privileged programs this is usually a privatein-process
procfsinstance created withfsopen(2)).As before, this is intended as a stop-gap before users migrate to
libpathrs, which provides a far more extensive safe
procfsAPI and isgenerally more robust.
Previously, the hardened procfs implementation (used internally within
ReopenandOpen(at)InRoot) only protected against overmount attacks onsystems with
openat2(2)(Linux 5.6) or systems withfsopen(2)oropen_tree(2)(Linux 5.2) and programs with privileges to use them (withsome caveats about locked mounts that probably affect very few users). For
other users, an attacker with the ability to create malicious mounts (on most
systems, a sysadmin) could trick you into operating on files you didn't
expect. This attack only really makes sense in the context of container
runtime implementations.
This was considered a reasonable trade-off, as the long-term intention was to
get all users to just switch to libpathrs if they wanted to use the safe
procfsAPI (which had more extensive protections, and is what these newprotections in
filepath-securejoinare based on). However, as the APIis now being exported it seems unwise to advertise the API as "safe" if we do
not protect against known attacks.
The procfs API is now more protected against attackers on systems lacking the
aforementioned protections. However, the most comprehensive of these
protections effectively rely on
statx(STATX_MNT_ID)(Linux 5.8).On older kernel versions, there is no effective protection (there is some
minimal protection against non-
procfsfilesystem components but asufficiently clever attacker can work around those). In addition,
STATX_MNT_IDis vulnerable to mount ID reuse attacks by sufficientlymotivated and privileged attackers -- this problem is mitigated with
STATX_MNT_ID_UNIQUE(Linux 6.8) but that raises the minimum kernel versionfor more protection.
The fact that these protections are quite limited despite needing a fair bit
of extra code to handle was one of the primary reasons we did not initially
implement this in
filepath-securejoin(libpathrs supports all of this,of course).
Fixed
fsopen(2)but in some testing we've foundthat it has very bad (and very difficult to debug) performance issues, and so
we will explicitly refuse to use
fsopen(2)if the running kernel version ispre-5.2 and will instead fallback to
open("/proc").Thanks to the following contributors who made this release possible:
Signed-off-by: Aleksa Sarai [email protected]
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Renovate Bot.