==============
Highlights
----------
+ It is now possible to use GDB, Strace, or any other program based on
"ptrace" under PRoot. This was not the case previously because it
is not possible to stack ptracers on Linux, so an emulation layer
was developed in order to bypass this limitation. This has required
a lot of changes in PRoot, hence the major number version bumping.
It was mostly tested on x86_64, and partially tested on x86 and ARM.
This ptrace emulation support is still experimental, and there are a
couple of known issues, but feel free to report unexpected behaviors
if you need a fix.
+ A new command-line option is available: "-S". It is similar to the
"-R" option expect it enables the "-0" option and binds only a
minimal set of paths that are known to not be updated by package
installations, to avoid unexpected changes on host files. This
option is useful to safely create and install packages into the
guest rootfs. For example:
$ proot -S ubuntu-14.04-rootfs/ apt-get install samba
or:
$ proot -S ubuntu-14.04-rootfs/
# apt-get install samba
If "-0 -R" is used instead of "-S", the same command fails since it
tries to update "/etc/group", which is bound to the host system and
is not writable (assuming PRoot is ran without privileges):
$ proot -0 -R ubuntu-14.04-rootfs/
# apt-get install samba
[...]
Adding group `sambashare' (GID 105) ...
Permission denied
+ The fake_id0 extension can now fake any user and group identifiers.
That means, when "-0" is specified, PRoot-ed processes can change
their real, effective and saved identifiers, with respect to the
rules described in setuid, setfsuid, setreuid, setresuid, and
setfsuid manuals. Also, the new command-line option "-i" was added
to change explicitly the identifiers to the specified values. This
option will be used by CARE to re-execute with the same initial
identifiers, but it could also be useful to threaten your teammates
;). Note that the "-0" option is actually the same as "-i 0:0".
+ The old command-line interface is not supported anymore. That means
it is now impossible to specify the path to the guest rootfs without
using -r or -R. Also, -Q and -B options are definitively gone,
instead the -R option must be specified, respectively with and
without -q. See PRoot v3.1 release notes for details.
Fixes
-----
+ getcwd(2) and chdir(2) now return the correct error code when,
respectively, the current directory does not exist anymore and the
target directory doesn't have the "search" permission.
+ Named file descriptors (ie. links in /proc/<pid>/fd/*) are not
dereferenced anymore since they may point to special objects like
pipes, sockets, inodes, ... Such objects do not exist on the
file-system name-space, so dereferencing them used to cause
unexpected errors.
+ Extensions now see every component of canonicalized paths. An
optimization in the canonicalization loop used to skip the first
part of a path if it was known to be already canonicalized, sadly
this short-cut may confuse some extensions, like -0.
+ Temporary files and directories created by PRoot for its own purpose
are now automatically deleted when PRoot exits.
Miscellaneous
-------------
+ PRoot does not rely on GCC C extensions anymore, like nested
functions. That means its stack does not have to be executable
(this is required for hardened Linux systems), and it can now be
compiled with Clang.
+ The ASLR (Address Space Layout Randomization) is not disabled
anymore, and the heap is now emulated on all architectures.
Internal changes
----------------
This section is dedicated to developers.
+ PRoot now remembers the parent of all tracees, it is similar to a
traced process tree. This was required for the ptrace emulation
support, but this could be useful to some extensions.
+ It is now possible to restart a tracee with any ptrace restart mode:
single-step, single-block, ...
+ Functions {peek,poke}_mem were replaced with functions
{peek,poke}_{,u}int{8,16,32,64}. These new functions performs type
conversion and fetch only the necessary amount of data in target
tracee's memory to avoid invalid accesses.
+ There is a new interface to handle ELF auxiliary vectors. See
ptrace emulation, kompat and fake_id0 extensions for usage examples.
+ There is a new interface to create temporary files and directories
that are automatically deleted on exit. See CARE extension, glue
and auxv support for usage examples.
+ When built with GCC function instrumentation support, PRoot prints
the currently called function on standard error stream (stderr).
Thanks
------
Thanks go to Stephen McCamant, Oren Tirosh, Jérôme Audu, and Carlos
Hernan Prada Rojas for their bug reports and tests; and to Rémi
Duraffort for his contributions.
Validation
----------
==================== ================= ============== ================= =========
testsuite host distro guest distro configurations comments
==================== ================= ============== ================= =========
proot-v4.0 OBS */x86_64 none N/A a
proot-v4.0 OBS */x86 none N/A b
proot-v4.0 Ubuntu-10.10/arm none N/A a
proot-v4.0 Slack-14.1/x86_64 none N/A a
proot-v4.0/memcheck Slack-14.1/x86_64 none N/A a
proot-v4.0/asan Slack-14.1/x86_64 none N/A a
proot-v4.0/talleak Slack-14.1/x86_64 none N/A a
proot-v4.0 Slack-14.1/x86_64 none no-seccomp a
proot-v4.0/memcheck Slack-14.1/x86_64 none no-seccomp a
proot-v4.0/asan Slack-14.1/x86_64 none no-seccomp a
proot-v4.0/talleak Slack-14.1/x86_64 none no-seccomp a
libuv-0.10.27 Slack-14.1/x86_64 same as host none a
libuv-0.10.27 Slack-14.1/x86_64 same as host kompat, fake_id0 c
libuv-0.10.27 Slack-14.1/x86_64 Slack-14.0/x86 none a
libuv-0.10.27 Slack-14.1/x86_64 Slack-14.0/x86 kompat, fake_id0 c
ltp-syscall-20130904 Slack-14.1/x86_64 same as host none d
ltp-syscall-20130904 Slack-14.1/x86_64 same as host kompat, fake_id0 d,e
ltp-syscall-20130904 Slack-14.1/x86_64 Slack-14.0/x86 none d,f
ltp-syscall-20130904 Slack-14.1/x86_64 Slack-14.0/x86 kompat, fake_id0 d,e,f
ltp-opt-20130904 Slack-14.1/x86_64 same as host none g
ltp-opt-20130904 Slack-14.1/x86_64 same as host kompat, fake_id0 g,h
ltp-opt-20130904 Slack-14.1/x86_64 Slack-14.0/x86 none g,i
ltp-opt-20130904 Slack-14.1/x86_64 Slack-14.0/x86 kompat, fake_id0 g,h,i,j
perl-5.18.1 Slack-14.1/x86_64 same as host none k
perl-5.18.1 Slack-14.1/x86_64 same as host kompat, fake_id0 k,l
perl-5.18.1 Slack-14.1/x86_64 Slack-14.0/x86 none k
perl-5.18.1 Slack-14.1/x86_64 Slack-14.0/x86 kompat, fake_id0 k,l
gdb-7.6.1 Slack-14.1/x86_64 same as host none m
gdb-7.6.1 Slack-14.1/x86_64 same as host kompat, fake_id0 m,n
gdb-7.6.1 Slack-14.1/x86_64 Slack-14.0/x86 none m,o
proot-v3.2.2 Slack-14.1/x86_64 same as host none p
proot-v3.2.2 Slack-14.1/x86_64 same as host fake_id0 p
proot-v3.2.2 Slack-14.1/x86_64 Slack-14.0/x86 none p
proot-v3.2.2 Slack-14.1/x86_64 Slack-14.0/x86 fake_id0 p
perl-5.16.1 Slack-14.1/x86_64 Ubuntu-14.10/ARM qemu-2.1-rc0 q
coreutils-8.19 Slack-14.1/x86_64 Ubuntu-14.10/ARM qemu-2.1-rc0 k,r
performance Slack-14.1/x86_64 none none NTR
Coverity Scan Travis-CI N/A N/A NTR
Clang 3.3 Slack-14.1/x86_64 N/A N/A NTR
==================== ================= ============== ================= =========
a: is OK or has same failures as native
b: fails on some AMD CPUs. No explanations yet.
c: failures = signal_multiple_loops, fs_chown
d: failures = brk01, creat07, execve04, mremap03, msync03, madvise01,
madvise03, madvise04, pwrite03, pwrite03_64, rmdir02
skipped = msgctl10, msgctl11
e: too many failures to be listed here. These failures are mostly
related to the fake_id0 extensions but are not unexpected.
f: failures = bdflush01, modify_ldt01, semctl01, semctl03, semctl05,
socketcall01
g: failures = timer_getoverrun_2-3
h: failures = fork_1-1 sem_unlink_3-1 sigaction_4-52 sigaction_4-32
i: failures = mmap_31-1
j: failures = mlock_12-1, sem_unlink_3-1
k: failures = op/magic.t
l: failures = File-Path/t/Path.t Net-Ping/t/110_icmp_inst.t
Net-Ping/t/500_ping_icmp.t Net-Ping/t/520_icmp_ttl.t
m: failures = break-interp, checkpoint, foll-exec, info-os, jit
skipped = foll-fork, foll-vfork, watch_thread_num, attach-twice
n: failures = fileio
o: failures = call-sc callfuncs find-unmapped finish float interrupt
return-nodebug return return2 siginfo-obj siginfo-thread signals
sigstep varargs ext-attach server-exec-info
p: failures = test-092c5e26
q: failures = rm/deep-2 misc/env misc/printenv split/fail dd/skip-seek
dd/skip-seek-past-file du/long-from-unreadable install/basic-1
mkdir/p-3
r: failures = HTTP-Tiny/t/002_croakage.t HTTP-Tiny/t/003_agent.t