moby/pkg
Cory Snider e9bbc41dd1 Remove local fork of archive/tar package
A copy of Go's archive/tar packge was vendored with a patch applied to
mitigate CVE-2019-14271. Vendoring standard library packages is not
supported by Go in module-aware mode, which is getting in the way of
maintenance. A different approach to mitigate the vulnerability is
needed which does not involve vendoring parts of the standard library.

glibc implements name service lookups such as users, groups and DNS
using a scheme known as Name Service Switch. The services are
implemented as modules, shared libraries which glibc dynamically links
into the process the first time a function requiring the module is
called. This is the crux of the vulnerability: if a process linked
against glibc chroots, then calls one of the functions implemented with
NSS for the first time, glibc may load NSS modules out of the chrooted
filesystem.

The API underlying the `docker cp` command is implemented by forking a
new process which chroots into the container's rootfs and writes a tar
stream of files from the container over standard output. It utilizes the
Go standard library's archive/tar package to write the tar stream. It
makes use of the tar.FileInfoHeader function to construct a tar.Header
value from an fs.FileInfo value. In modern versions of Go on *nix
platforms, FileInfoHeader will attempt to resolve the file's UID and GID
to their respective user and group names by calling the os/user
functions LookupId and LookupGroupId. The cgo implementation of os/user
on *nix performs lookups by calling the corresponding libc functions. So
when linked against glibc, calls to tar.FileInfoHeader after the
process has chrooted into the container's rootfs can have the side
effect of loading NSS modules from the container! Without any
mitigations, a malicious container image author can trivially get
arbitrary code execution by leveraging this vulnerability and escape the
chroot (which is not a sandbox) into the host.

Mitigate the vulnerability without patching or forking archive/tar by
hiding the OS-dependent file info from tar.FileInfoHeader which it needs
to perform the lookups. Without that information available it falls back
to populating the tar.Header with only the information obtainable
directly from the FileInfo value without making any calls into os/user.

Fixes #42402

Signed-off-by: Cory Snider <csnider@mirantis.com>
2022-02-18 13:40:19 -05:00
..
aaparser Also trim "~..." from AppArmor versions 2020-10-08 17:03:51 -07:00
archive Remove local fork of archive/tar package 2022-02-18 13:40:19 -05:00
authorization refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
broadcaster Various code-cleanup 2018-05-23 17:50:54 +02:00
capabilities Add more import comments 2019-04-10 16:59:33 +02:00
chrootarchive chrootarchive: don't create parent dirs outside of chroot 2021-10-05 09:57:04 +02:00
containerfs Remove local fork of archive/tar package 2022-02-18 13:40:19 -05:00
devicemapper Update to Go 1.17.0, and gofmt with Go 1.17 2021-08-24 23:33:27 +02:00
directory refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
dmesg Use Klogctl from x/sys/unix to read Linux kernel log 2019-08-22 08:25:13 +02:00
filenotify refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
fileutils Avoid platform-specific NewPatternMatcher function in TestCompile 2022-01-20 09:08:16 -08:00
fsutils refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
homedir Update to Go 1.17.0, and gofmt with Go 1.17 2021-08-24 23:33:27 +02:00
idtools refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
ioutils Merge pull request #42543 from rainrambler/patch-1 2021-09-01 13:26:30 +02:00
jsonmessage gosimple: S1039: unnecessary use of fmt.Sprintf 2021-06-10 13:03:27 +02:00
locker replace pkg/locker with github.com/moby/locker 2020-09-10 22:15:40 +02:00
longpath Add canonical import comment 2018-02-05 16:51:57 -05:00
loopback Update to Go 1.17.0, and gofmt with Go 1.17 2021-08-24 23:33:27 +02:00
mount Update to Go 1.17.0, and gofmt with Go 1.17 2021-08-24 23:33:27 +02:00
namesgenerator Merge pull request #43210 from tianon/frozen-names-generator 2022-02-10 20:38:44 +01:00
parsers refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
pidfile refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
platform Update to Go 1.17.0, and gofmt with Go 1.17 2021-08-24 23:33:27 +02:00
plugingetter Move plugin client to separate interface 2018-05-30 15:22:10 -04:00
plugins Merge pull request #41215 from cpuguy83/better_plugin_errors 2021-10-24 12:37:07 +09:00
pools bump gotest.tools v3.0.1 for compatibility with Go 1.14 2020-02-11 00:06:42 +01:00
progress refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
pubsub docker stats: fix 'panic: close of closed channel' 2020-10-24 11:48:56 +08:00
reexec Update to Go 1.17.0, and gofmt with Go 1.17 2021-08-24 23:33:27 +02:00
signal pkg/signal: remove DefaultStopSignal const 2021-08-11 10:31:29 +02:00
stack refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
stdcopy refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
streamformatter bump gotest.tools v3.0.1 for compatibility with Go 1.14 2020-02-11 00:06:42 +01:00
stringid Entropy cannot be saved 2019-06-07 11:54:45 +01:00
symlink replace pkg/symlink with github.com/moby/sys/symlink 2020-11-03 11:17:12 +01:00
sysinfo Merge pull request #42796 from thaJeztah/containerd_seccomp_check 2021-08-29 03:05:59 +09:00
system pkg/system: rewrite IsWindowsClient() using golang.org/x/sys/windows 2022-01-26 13:39:03 +01:00
tailfile refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
tarsum refactor: move from io/ioutil to io and os package 2021-08-27 14:56:57 +08:00
term Update to Go 1.17.0, and gofmt with Go 1.17 2021-08-24 23:33:27 +02:00
truncindex Entropy cannot be saved 2019-06-07 11:54:45 +01:00
urlutil Be explicit about github.com prefix being a legacy feature 2018-05-30 11:09:14 +02:00
useragent Add canonical import comment 2018-02-05 16:51:57 -05:00
README.md Rename a few docker to moby 2017-10-25 13:56:12 +02:00

pkg/ is a collection of utility packages used by the Moby project without being specific to its internals.

Utility packages are kept separate from the moby core codebase to keep it as small and concise as possible. If some utilities grow larger and their APIs stabilize, they may be moved to their own repository under the Moby organization, to facilitate re-use by other projects. However that is not the priority.

The directory pkg is named after the same directory in the camlistore project. Since Brad is a core Go maintainer, we thought it made sense to copy his methods for organizing Go code :) Thanks Brad!

Because utility packages are small and neatly separated from the rest of the codebase, they are a good place to start for aspiring maintainers and contributors. Get in touch if you want to help maintain them!