#
2d741f33 |
| 16-Apr-2021 |
Kyle Evans <kevans@FreeBSD.org> |
kern: ether_gen_addr: randomize on default hostuuid, too
Currently, this will still hash the default (all zero) hostuuid and potentially arrive at a MAC address that has a high chance of collision i
kern: ether_gen_addr: randomize on default hostuuid, too
Currently, this will still hash the default (all zero) hostuuid and potentially arrive at a MAC address that has a high chance of collision if another interface of the same name appears in the same broadcast domain on another host without a hostuuid, e.g., some virtual machine setups.
Instead of using the default hostuuid, just treat it as a failure and generate a random LA unicast MAC address.
Reviewed by: bz, gbe, imp, kbowling, kp MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D29788
show more ...
|
#
b6be9566 |
| 14-May-2021 |
Colin Percival <cperciva@FreeBSD.org> |
Fix buffer overflow in preloaded hostuuid cleaning
When a module of type "hostuuid" is provided by the loader, prison0_init strips any trailing whitespace and ASCII control characters by (a) adjusti
Fix buffer overflow in preloaded hostuuid cleaning
When a module of type "hostuuid" is provided by the loader, prison0_init strips any trailing whitespace and ASCII control characters by (a) adjusting the buffer length, and (b) zeroing out the characters in question, before storing it as the system's hostuuid.
The buffer length adjustment was correct, but the zeroing overwrote one byte higher in memory than intended -- in the typical case, zeroing one byte past the end of the hostuuid buffer. Due to the layout of buffers passed by the boot loader to the kernel, this will be the first byte of a subsequent buffer.
This was *probably* harmless; prison0_init runs after preloaded kernel modules have been linked and after the preloaded /boot/entropy cache has been processed, so in both cases having the first byte overwritten will not cause problems. We cannot however rule out the possibility that other objects which are preloaded by the loader could suffer from having the first byte overwritten.
Since the zeroing does not in fact serve any purpose, remove it and trim trailing whitespace and ASCII control characters by adjusting the buffer length alone.
Fixes: c3188289 Preload hostuuid for early-boot use Reviewed by: kevans, markj MFC after: 3 days
show more ...
|
#
330f110b |
| 15-May-2021 |
Colin Percival <cperciva@FreeBSD.org> |
Fix 'hostuuid: preload data malformed' warning
If the preloaded hostuuid value is invalid and verbose booting is enabled, a warning is printed. This printf had two bugs:
1. It was missing a traili
Fix 'hostuuid: preload data malformed' warning
If the preloaded hostuuid value is invalid and verbose booting is enabled, a warning is printed. This printf had two bugs:
1. It was missing a trailing \n character. 2. The malformed UUID is printed with %s even though it is not known to be NUL-terminated.
This commit adds the missing \n and uses %.*s with the (already known) length of the preloaded UUID to ensure that we don't read past the end of the buffer.
Reported by: kevans Fixes: c3188289 Preload hostuuid for early-boot use MFC after: 3 days
show more ...
|
Revision tags: release/13.0.0 |
|
#
f187d6df |
| 16-Mar-2021 |
Kyle Evans <kevans@FreeBSD.org> |
base: remove if_wg(4) and associated utilities, manpage
After length decisions, we've decided that the if_wg(4) driver and related work is not yet ready to live in the tree. This driver has larger
base: remove if_wg(4) and associated utilities, manpage
After length decisions, we've decided that the if_wg(4) driver and related work is not yet ready to live in the tree. This driver has larger security implications than many, and thus will be held to more scrutiny than other drivers.
Please also see the related message sent to the freebsd-hackers@ and freebsd-arch@ lists by Kyle Evans <kevans@FreeBSD.org> on 2021/03/16, with the subject line "Removing WireGuard Support From Base" for additional context.
show more ...
|
#
74ae3f3e |
| 15-Mar-2021 |
Kyle Evans <kevans@FreeBSD.org> |
if_wg: import latest fixup work from the wireguard-freebsd project
This is the culmination of about a week of work from three developers to fix a number of functional and security issues. This patc
if_wg: import latest fixup work from the wireguard-freebsd project
This is the culmination of about a week of work from three developers to fix a number of functional and security issues. This patch consists of work done by the following folks:
- Jason A. Donenfeld <Jason@zx2c4.com> - Matt Dunwoodie <ncon@noconroy.net> - Kyle Evans <kevans@FreeBSD.org>
Notable changes include: - Packets are now correctly staged for processing once the handshake has completed, resulting in less packet loss in the interim. - Various race conditions have been resolved, particularly w.r.t. socket and packet lifetime (panics) - Various tests have been added to assure correct functionality and tooling conformance - Many security issues have been addressed - if_wg now maintains jail-friendly semantics: sockets are created in the interface's home vnet so that it can act as the sole network connection for a jail - if_wg no longer fails to remove peer allowed-ips of 0.0.0.0/0 - if_wg now exports via ioctl a format that is future proof and complete. It is additionally supported by the upstream wireguard-tools (which we plan to merge in to base soon) - if_wg now conforms to the WireGuard protocol and is more closely aligned with security auditing guidelines
Note that the driver has been rebased away from using iflib. iflib poses a number of challenges for a cloned device trying to operate in a vnet that are non-trivial to solve and adds complexity to the implementation for little gain.
The crypto implementation that was previously added to the tree was a super complex integration of what previously appeared in an old out of tree Linux module, which has been reduced to crypto.c containing simple boring reference implementations. This is part of a near-to-mid term goal to work with FreeBSD kernel crypto folks and take advantage of or improve accelerated crypto already offered elsewhere.
There's additional test suite effort underway out-of-tree taking advantage of the aforementioned jail-friendly semantics to test a number of real-world topologies, based on netns.sh.
Also note that this is still a work in progress; work going further will be much smaller in nature.
MFC after: 1 month (maybe)
show more ...
|
#
589e4c1d |
| 26-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Add safety around prison_deref() flags.
do_jail_attach() now only uses the PD_XXX flags that refer to lock status, so make sure that something else like PD_KILL doesn't slip through.
Add a KA
jail: Add safety around prison_deref() flags.
do_jail_attach() now only uses the PD_XXX flags that refer to lock status, so make sure that something else like PD_KILL doesn't slip through.
Add a KASSERT() in prison_deref() to catch any further PD_KILL misuse.
show more ...
|
#
108a9384 |
| 26-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Fix locking on an early jail_set error.
I had locked allprison_lock without immediately setting PD_LIST_LOCKED.
|
#
c861373b |
| 25-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: re-commit 811e27fa3c44 with fixes
Make sure PD_KILL isn't passed to do_jail_attach, where it might end up trying to kill the caller's prison (even prison0).
Fix the child jail loop in prison_
jail: re-commit 811e27fa3c44 with fixes
Make sure PD_KILL isn't passed to do_jail_attach, where it might end up trying to kill the caller's prison (even prison0).
Fix the child jail loop in prison_deref_kill, which was doing the post-order part during the pre-order part. That's not a system- killer, but make jails not always die correctly.
show more ...
|
#
ddfffb41 |
| 25-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: back out 811e27fa3c44 until it doesn't break Jenkins
Reported by: arichardson
|
#
0a2a96f3 |
| 23-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Don't allow jails under dying parents
If a jail is created with jail_set(...JAIL_DYING), and it has a parent currently in a dying state, that will bring the parent jail back to life. Restrict
jail: Don't allow jails under dying parents
If a jail is created with jail_set(...JAIL_DYING), and it has a parent currently in a dying state, that will bring the parent jail back to life. Restrict that to require that the parent itself be explicitly brought back first, and not implicitly created along with the new child jail.
Differential Revision: https://reviews.freebsd.org/D28515
show more ...
|
#
701d6b50 |
| 23-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Fix a LOR introduced in 1158508a8086
|
#
811e27fa |
| 22-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Add PD_KILL to remove a prison in prison_deref().
Add the PD_KILL flag that instructs prison_deref() to take steps to actively kill a prison and its descendents, namely marking it PRISON_STATE
jail: Add PD_KILL to remove a prison in prison_deref().
Add the PD_KILL flag that instructs prison_deref() to take steps to actively kill a prison and its descendents, namely marking it PRISON_STATE_DYING, clearing its PR_PERSIST flag, and killing any attached processes.
This replaces a similar loop in sys_jail_remove(), bringing the operation under the same single hold on allprison_lock that it already has. It is also used to clean up failed jail (re-)creations in kern_jail_set(), which didn't generally take all the proper steps.
Differential Revision: https://reviews.freebsd.org/D28473
show more ...
|
#
1158508a |
| 21-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Add pr_state to struct prison
Rather that using references (pr_ref and pr_uref) to deduce the state of a prison, keep track of its state explicitly. A prison is either "invalid" (pr_ref == 0)
jail: Add pr_state to struct prison
Rather that using references (pr_ref and pr_uref) to deduce the state of a prison, keep track of its state explicitly. A prison is either "invalid" (pr_ref == 0), "alive" (pr_uref > 0) or "dying" (pr_uref == 0).
State transitions are generally tied to the reference counts, but with some flexibility: a new prison is "invalid" even though it now starts with a reference, and jail_remove(2) sets the state to "dying" before the user reference count drops to zero (which was prviously accomplished via the PR_REMOVE flag).
pr_state is protected by both the prison mutex and allprison_lock, so it has the same availablity guarantees as the reference counts do.
Differential Revision: https://reviews.freebsd.org/D27876
show more ...
|
#
ee9b37ae |
| 21-Feb-2021 |
Mateusz Guzik <mjg@FreeBSD.org> |
jail: fix build after the previous commit
Noted by: Michael Butler <imb protected-networks.net>
|
#
f7496dca |
| 21-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Change the locking around pr_ref and pr_uref
Require both the prison mutex and allprison_lock when pr_ref or pr_uref go to/from zero. Adding a non-first or removing a non-last reference remai
jail: Change the locking around pr_ref and pr_uref
Require both the prison mutex and allprison_lock when pr_ref or pr_uref go to/from zero. Adding a non-first or removing a non-last reference remain lock-free. This means that a shared hold on allprison_lock is sufficient for prison_isalive() to be useful, which removes a number of cases of lock/check/unlock on the prison mutex.
Expand the locking in kern_jail_set() to keep allprison_lock held exclusive until the new prison is valid, thus making invalid prisons invisible to any thread holding allprison_lock (except of course the one creating or destroying the prison). This renders prison_isvalid() nearly redundant, now used only in asserts.
Differential Revision: https://reviews.freebsd.org/D28419 Differential Revision: https://reviews.freebsd.org/D28458
show more ...
|
#
6e1d1bfc |
| 20-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Improve locking when removing prisons
Change the flow of prison_deref() so it doesn't let go of allprison_lock until it's completely done using it (except for a possible drop as part of an upg
jail: Improve locking when removing prisons
Change the flow of prison_deref() so it doesn't let go of allprison_lock until it's completely done using it (except for a possible drop as part of an upgrade on its first try).
Differential Revision: https://reviews.freebsd.org/D28458 MFC after: 3 days
show more ...
|
#
d4380c0c |
| 19-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Change both root and working directories in jail_attach(2)
jail_attach(2) performs an internal chroot operation, leaving it up to the calling process to assure the working directory is inside
jail: Change both root and working directories in jail_attach(2)
jail_attach(2) performs an internal chroot operation, leaving it up to the calling process to assure the working directory is inside the jail.
Add a matching internal chdir operation to the jail's root. Also ignore kern.chroot_allow_open_directories, and always disallow the operation if there are any directory descriptors open.
Reported by: mjg Approved by: markj, kib MFC after: 3 days
show more ...
|
#
cc7b7306 |
| 16-Feb-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Handle a possible race between jail_remove(2) and fork(2)
jail_remove(2) includes a loop that sends SIGKILL to all processes in a jail, but skips processes in PRS_NEW state. Thus it is possib
jail: Handle a possible race between jail_remove(2) and fork(2)
jail_remove(2) includes a loop that sends SIGKILL to all processes in a jail, but skips processes in PRS_NEW state. Thus it is possible the a process in mid-fork(2) during jail removal can survive the jail being removed.
Add a prison flag PR_REMOVE, which is checked before the new process returns. If the jail is being removed, the process will then exit. Also check this flag in jail_attach(2) which has a similar issue.
Reported by: trasz Approved by: kib MFC after: 3 days
show more ...
|
#
c050ea80 |
| 29-Jan-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Handle a parent jail when a child is added to it
It's possible when adding a jail that its dying parent comes back to life. Only allow that to happen when JAIL_DYING is specified. And if it
jail: Handle a parent jail when a child is added to it
It's possible when adding a jail that its dying parent comes back to life. Only allow that to happen when JAIL_DYING is specified. And if it does happen, call PR_METHOD_CREATE on it.
show more ...
|
#
195cd6ae |
| 22-Jan-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: fix dangling reference bug from 6754ae2572eb
The change to use refcounts for pr_uref was mishandled in prison_proc_free, so killing a jail's last process could add an extra reference, leaving
jail: fix dangling reference bug from 6754ae2572eb
The change to use refcounts for pr_uref was mishandled in prison_proc_free, so killing a jail's last process could add an extra reference, leaving it an unkillable zombie.
show more ...
|
#
39c8ef90 |
| 22-Jan-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: A jail could be removed without calling OSD methods
Fix a long-standing bug where setting nopersist on a process-less jail would remove it without calling the the OSD PR_METHOD_REMOVE methods.
|
#
6754ae25 |
| 21-Jan-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Use refcount(9) for prison references.
Use refcount(9) for both pr_ref and pr_uref in struct prison. This allows prisons to held and freed without requiring the prison mutex. An exception to
jail: Use refcount(9) for prison references.
Use refcount(9) for both pr_ref and pr_uref in struct prison. This allows prisons to held and freed without requiring the prison mutex. An exception to this is that dropping the last reference will still lock the prison, to keep the guarantee that a locked prison remains valid and alive (provided it was at the time it was locked).
Among other things, this honors the promise made in a comment in crcopy(9), that it will not block, which hasn't been true for two decades.
show more ...
|
#
effad35e |
| 19-Jan-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Clean up some function placement and improve comments.
Move prison_hold, prison_hold_locked ,prison_proc_hold, and prison_proc_free to a more intuitive part of the file (together with with pri
jail: Clean up some function placement and improve comments.
Move prison_hold, prison_hold_locked ,prison_proc_hold, and prison_proc_free to a more intuitive part of the file (together with with prison_free and prison_free_locked), and add or improve comments to these and others, to better describe what's going in the prison reference cycle.
No functional changes.
show more ...
|
#
83bc72a0 |
| 19-Jan-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Fix a stray mutex from 76ad42abf9d4.
|
#
76ad42ab |
| 18-Jan-2021 |
Jamie Gritton <jamie@FreeBSD.org> |
jail: Add prison_isvalid() and prison_isalive()
prison_isvalid() checks if a prison record can be used at all, i.e. pr_ref > 0. This filters out prisons that aren't fully created, and those that ar
jail: Add prison_isvalid() and prison_isalive()
prison_isvalid() checks if a prison record can be used at all, i.e. pr_ref > 0. This filters out prisons that aren't fully created, and those that are either in the process of being dismantled, or will be at the next opportunity. While the check for pr_ref > 0 is simple enough to make without a convenience function, this prepares the way for other measures of prison validity.
prison_isalive() checks not only validity as far as the useablity of the prison structure, but also whether the prison is visible to user space. It replaces a test for pr_uref > 0, which is currently only used within kern_jail.c, and not often there.
Both of these functions also assert that either the prison mutex or allprison_lock is held, since it's generally the case that unlocked prisons aren't guaranteed to remain useable for any length of time. This isn't entirely true, for example a thread can assume its own prison is good, but most exceptions will exist inside of kern_jail.c.
show more ...
|