summaryrefslogtreecommitdiff
path: root/community/gsoc/project_ideas/libcap/details.mdwn
diff options
context:
space:
mode:
Diffstat (limited to 'community/gsoc/project_ideas/libcap/details.mdwn')
-rw-r--r--community/gsoc/project_ideas/libcap/details.mdwn766
1 files changed, 0 insertions, 766 deletions
diff --git a/community/gsoc/project_ideas/libcap/details.mdwn b/community/gsoc/project_ideas/libcap/details.mdwn
deleted file mode 100644
index 85695978..00000000
--- a/community/gsoc/project_ideas/libcap/details.mdwn
+++ /dev/null
@@ -1,766 +0,0 @@
-[[!meta copyright="Copyright © 2010 Free Software Foundation, Inc."]]
-
-[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
-id="license" text="Permission is granted to copy, distribute and/or modify this
-document under the terms of the GNU Free Documentation License, Version 1.2 or
-any later version published by the Free Software Foundation; with no Invariant
-Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license
-is included in the section entitled [[GNU Free Documentation
-License|/fdl]]."]]"""]]
-
-[[!meta title="Details on implementing libcap"]]
-
-
-This is the proposal submitted by David Hedberg for GSoC 2010 (who opted
-to go with another mentoring organization), adapted from an initial
-proposal and several amendments into a single document, but the idea
-is to further adapt it to a more neutral design document over time.
-
-
-# The proposal
-
-### Quick description of POSIX capabilities
-
-The original suggestion can be found [[here|libcap]].
-POSIX capabilities never actually entered the POSIX standard but was
-left as a draft. Linux has nevertheless implemented this draft, and
-there are reasons for doing the same in the Hurd - a more fine grained
-control of rights leading to increased security being one of them.
-
-POSIX capabilities are give on a per-process basis, and basically allows
-splitting up those rights usually granted to root into smaller and more
-specific rights. Examples of capabilities are CAP_CHOWN and CAP_KILL,
-overriding certain restrictions on chown and allowing the process to
-kill processes with different UID's, respectively.
-
-Each process is given three sets with capabilities: the Permitted set
-(P), the Effective set (E) and the Inheritable set (I). The effective
-set contains the capabilities that are currently active. The permitted
-set contains the capabilities that the process has the right to use.
-The inheritable set contains the capabilities that can be inherited
-by children to the process. A process can drop capabilities from its
-permitted set, but not set them. The effective set and the inheritable
-set can be changed freely as long as they stay subsets of the permitted
-set.
-
-Capabilities can also be set on executables. When executed, the resulting
-process is given the capabilities both as defined by the parent process
-and by the capabilities set on the file (formula below), resulting in
-what might be explained as a fine-grained setuid. Implementing this
-requires support for *xattr* or similar.
-
-Some applications that are currently using capabilities are samba, ntp,
-vsftp, pure-ftpd, proftpd, squid, asterisk and dovecot.
-
-
-### A quick description of capabilities in Linux
-
-Each process has a three bit fields representing each of the three
-sets (P, E and I). Each bit field is currently built up of two (32
-bit) integers to be able to hold the 33 currently defined capabilities
-(see linux/capability.h). Each process further has a bounding set which
-bounds the permitted set. Two [[system call]]s handles the setting and getting
-of capabilities; *capset* and *capget*. Some related functionality
-can also be controlled by calling *prctl*: the right to read/drop the
-bounding capabilities (PR_CAPBSET_READ/PR_CAPBSET_DROP) and whether
-or not the process should keep its capabilities when a change is made
-to the threads UID's (PR_SET_KEEPCAPS/PR_GET_KEEPCAPS). User space
-applications are expected(recommended?) to use libcap to take advantage
-of the functionality provided. Some applications also use libcap-ng
-which is "intended to make programming with POSIX capabilities much
-easier than the traditional libcap library". Most applications seem
-to be using the original libcap, however.
-
-
-## Implementing libcap
-
-The exercise for this assignment was to get the libcap used in
-Linux to compile under the Hurd. This was accomplished using the
-latest git version of libcap from (..), corresponding to libcap
-2.19. The changes were simple and amounted to simply removing the
-dependency on some Linux-specific headers and creating stubs for
-capset, capget and prctl described above. This suggests that porting
-this library to the Hurd once the proper functionality is in place
-could be relatively simple. The patch is available
-[here](https://alioth.debian.org/tracker/index.php?func=detail&aid=312442&group_id=30628&atid=410472 "Alioth").
-One could also consider implementing the three missing functions in the
-Hurd (or Hurd glibc) which would allow the usage of the Linux libcap
-without modifications. As the Linux libcap maintainer might or might
-not be interested in making libcap multi platform, this approach might
-be preferable.
-
-
-## Implementing POSIX capabilities in the Hurd
-
-As I am still reading up on how things fit together in the Hurd this is
-very likely to contain some misunderstandings and be at least partly off
-the mark. I intend to have grasped this by the time I start working on
-it however, if I were to be given the chance. Below are two possible
-approaches as I have understood them after some reading and discussions
-on #hurd@freenode.
-
-
-### The basics, Approach 1: Special UID's
-
-Let each capability be represented by a specific UID. One could imagine
-reserving a range of the possible uid_t's for this purpose. The euids
-vector in the authhandle struct could perhaps hold the effective set while
-the auids vector could hold the permitted set as these seem to roughly
-correspond to eachother in intent. This leaves the Inheritable set.
-One solution could be to store the inheritable set in the agids vector,
-but that does not seem to be a very natural nor nice solution. One could
-extend the authhandle struct with an additional vector, but one would then
-need to also extend the auth interface with RPC's to be able to modify
-and access it. Another possibility is to store all the capabilities
-in the same idvec and use separate defines for the the different sets
-(CAP_P_CHMOD, CAP_E_CHMOD, CAP_I_CHMOD). This does not seem like a
-good solution.
-
-Storing each capability in its own uid_t might also arguably be somewhat
-wasteful, although this is probably of secondary concern (if at all).
-One could also imagine that legacy applications might be confused,
-although I am not sure I can see any obvious problems. What happens
-when a process have only capability id's?
-
-
-### The basics, Approach 2: Extend the auth interface
-
-This approach would expand the auth interface and extend
-the auth server with another set of RPC's for capabilities
-(*auth_getcaps*, *auth_makecaps*, *auth_user_authenticate* and
-*auth_server_authenticate*), mirroring those currently declared for id's.
-This would obviously require changes to more parts of the Hurd for
-processes to be able to take advantage of capabilities, but as the logic
-behind handling capabilities and that behind handling user id's might
-not be completely comparable, this might make for a cleaner solution.
-It would also remove the problem of having to sensibly map all the
-three capability sets onto semantically differing sets of user/group
-ids, something that might be even more important if we were to also
-implement something like the bounding sets used in Linux or perhaps
-other related functionality. We are also not limited to having to store
-the capabilities as id vectors, although doing so would perhaps still
-make sense.
-
-
-### The individual capabilities
-
-Implementing the individual capabilities will probably have to be thought
-of on a case-by-case basis. Taking chown (in *libdiskfs*) as an example,
-the exact approach would differ slightly depending on how the approach
-taken to implement capabilities. If the first approach were to be taken,
-the UID's (and thus the capabilities) of the caller would already be
-available to the function through the *iouser* struct contained in the
-*protid* struct given as the first argument. Implementing capabilities
-would then simply be a matter of checking for the special UID's. If the
-second approach were to be taken, one would need to perhaps expand the
-iouser struct to contain information about the capabilities.
-
-Just like Linux has defined many Linux-specific capabilities - some of
-which could certainly be useful also applied to the Hurd - one could
-also imagine extending the POSIX capability system also for Hurd specific
-purposes.
-
-
-## Some applications using capabilities
-
-#### Samba 3
-
-Uses CAP_MKNOD and CAP_LEASE in smbd to only keep the necessary abilities.
-Documentation mentions CAP_LINUX_IMMUTABLE as a way to protect files
-from being deleted. Can also use a couple of IRIX specific capabilities
-(CAP_NETWORK_MGT and CAP_DEVICE_MGT) as alternatives to the Linux-specific
-ones if running on IRIX.
-
-
-#### ntpd
-
-Checks if capabilities are supported, more precisely if CAP_SYS_TIME,
-CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT and CAP_NET_BIND_SERVICE are
-supported. If they are supported, it uses prctl with PR_SET_KEEPCAPS
-to keep privileges across setuid() and then drops root. After done with
-CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT it drops every capability except
-CAP_SYS_TIME and, if needed, CAP_NET_BIND_SERVICE.
-
-
-#### vsftpd
-
-Uses CAP_CHOWN, CAP_NET_BIND_SERVICE when using the "one process"
-security model (typically disabled by default).
-
-
-#### proftpd-basic
-
-Provides support for capabilities from mod_cap. Uses CAP_USE_CHOWN,
-CAP_USE_DAC_OVERRIDE, CAP_USE_DAC_READ_SEARCH and CAP_USE_AUDIT_WRITE.
-Distribution contains README.capabilities with some explanations.
-Also ships with their own libcap for some reason, based on libcap 1.10.
-
-
-#### dovecot
-
-Keeps CAP_CHOWN, CAP_SYS_CHROOT, CAP_SETUID, CAP_SETGID,
-CAP_NET_BIND_SERVICE, CAP_DAC_OVERRIDE for proper operations, drops
-the rest.
-
-
-#### bind9
-
-Reasons for each capability are clearly noted in comments in update.c
-in linux_initialprivs() and linux_minprivs(). initialprivs drops all
-capabilities and proceeds to set CAP_NET_BIND_SERVICE, CAP_SYS_CHROOT,
-CAP_SETUID, CAP_SETGID, CAP_DAC_READ_SEARCH and CAP_CHOWN. minprivs only
-sets CAP_NET_BIND_SERVICE and CAP_SYS_RESOURCE.
-
-
-#### pulseaudio
-
-Mentions CAP_NICE (CAP_SYS_NICE), but does not appear to be using it
-(anymore?). Seems to use libcap to drop caps, however.
-
-
-#### pinentry
-
-Checks if CAP_IPC_LOCK is available and "uses it" to gain only the
-ability to lock memory when needed.
-
-
-#### zsh
-
-Comes with a module "caps" which contains "[b]uiltins for manipulating
-POSIX.1e (POSIX.6) capability (privilege) sets." Most useful here is the
-"cap" builtin, which makes it possible to change the shell's process
-capability sets. This might be useful for testing.
-
-
-#### inetutils (ping,traceroute)
-
-Does not use capabilities explicitly, but is nevertheless a useful
-example of how file capabilities could be used. ping and traceroute
-are currently installed suid root since they need to be able to open
-raw sockets. With file capabilities, this could be accomplished by
-instead setting the capability CAP_NET_RAW on the two executables,
-thus giving the utilities almost only the specific rights they need.
-
-
-## The capabilities
-
-The above might give some hint as to what capabilities should be
-prioritized. One assumption I have made is that the goal of this project
-is to implement, as far as possible, the same functionality as what is
-present in Linux. No effort has (so far) been made to look into possible
-applications specific to the Hurd.
-
-A few of the above mentioned applications also explicitly uses
-PR_SET_KEEPCAPS (through prctl()) to specify that capabilities should
-be passed on to children. This means that the implementation in the
-Hurd should take this into account.
-
-I have below done a preliminary classification of the capabilities
-as defined in Linux capability.h into four "classes": Network, File
-management, "glibc -> mach" and Other. There are also some capabilities
-that either depend on functionality not implemented or are too Linux
-specific. I have not described each capability in detail as looking
-at the comments in capability.h and reading in capabilities(7) are
-better sources.
-
-
-### The Networking Class
-
-These would mostly affect pfinet. The general picture seem to be that
-pfinet currently uses a boolean (int) isroot in struct sock_user to keep
-track of the credentials of the caller. This would need to be expanded
-somehow to keep track of the separate capabilities.
-
-CAP_NET_BIND_SERVICE: Allow binding to TCP/UDP sockets below 1024
-CAP_NET_RAW: Allow use of RAW and PACKET sockets.
-CAP_NET_BROADCAST: "Allow broadcasting, listen to multicast"
-CAP_NET_ADMIN: This seem to be a bit of a "catch-all" for network-related
-administration.
-
-
-### The Files Management Class
-
-The description of CAP_CHOWN in the original proposal should apply to
-(most of?) these. That is, modify the iouser struct. At least libdiskfs
-should be modified, but the same or similar modifications might need to
-be made to several servers (libnetfs..? The actual servers implementing
-the filesystem?)
-
-CAP_CHOWN: "Make arbitrary changes to file UIDs and GIDs"
-CAP_FOWNER: allow chmod, utime, .. for files not owned.
-CAP_FSETID: Don't clear setuid/setgid when a file is modified.
-CAP_DAC_OVERRIDE and
-CAP_DAC_READ_SEARCH: Bypasses file/directory read/write/execute permission
-checks. ( hurdexec.c, file-access.c, .. ? )
-CAP_MKNOD: allows usage of "the privileged aspects of mknod()". Does this
-one make sense in the Hurd?
-
-
-### The (glibc -> gnumach) Class
-
-These seem to be implemented in glibc by direct calls to gnumach.
-If they should be implemented, maybe a proxy in the Hurd is needed?
-
-CAP_SYS_TIME: manipulate the system clock, set real-time clock.
-CAP_IPC_LOCK: mlock, mlockall, mmap, shmctl
-CAP_KILL: No permission checks for killing processes
-CAP_SYS_NICE: setpriority/getpriority for arbitrary processes.
-
-
-### The Rest Class
-
-CAP_SYS_CHROOT: Allows usage of chroot().
-It's either really simple (not needed in the case of the Hurd) or really
-difficult. Needs some figuring out. One of the calls that should be
-high-priority.
-CAP_SYS_ADMIN: General administration rights. Seemingly sprinkled out
-into just about everything. Quick grep through the Linux sources gives
-440 hits in .c-files.
-CAP_SYS_BOOT: Allow use of reboot().
-glibc calls init:startup_reboot..
-CAP_SETGID: Allows usage of setgid,setgroups and "forged gids on socket
-credentials passing"
-CAP_SETUID: Allows usage of set*uid and "forged pids on socket credentials
-passing"
-CAP_SYS_TTY_CONFIG: vhangup, some other places. vhangup() is a stub in
-the Hurd, but maybe the console server is otherwise affected?
-CAP_SYS_RESOURCE: Override various limits. (quota, reserved space etc.
-on ext2, interrupt frequencies, consoles,...). According to "The Critique"
-mach performs no resource accounting so some of these might be moot to
-implement, while others still apply.
-CAP_SYS_RAWIO Allow raw input/output. Sprinkled in many places,
-device drivers among others. Many of these will probably be difficult
-to implement.
-CAP_SETPCAP: This one has (or had?) two different usages in Linux:
-If file capabilities are not supported it gives the right to grant
-or remove capabilities from the permitted set of arbitrary processes.
-If file capabilities are supported, it allows for removing capabilities
-from the bounding set of the current process. As the Hurd implementation
-won't have file capabilities initially it might make sense to implement
-this if possible. If bounding sets are implemented this should probably
-be the way provided to modify them.
-
-
-### Unimplementable
-
-*(At this point in time, as far as I can determine)*
-
-CAP_LINUX_IMMUTABLE: depends on chattr etc. working.
-CAP_SETFCAP: depends on xattr's
-CAP_SYS_PACCT: acct() missing in the Hurd.
-CAP_SYS_MODULE, CAP_SYS_PTRACE, CAP_MAC_OVERRIDE, CAP_MAC_ADMIN,
-CAP_AUDIT_WRITE, CAP_AUDIT_CONTROL, CAP_LEASE
-
-
-## Priority when implementing
-
-The two most used capabilities as unscientifically judged from
-the selection of applications above are CAP_NET_BIND_SERVICE and
-CAP_CHOWN, suggesting that implementing the "network class" and the
-"file management" class of capabilities as classified above might be a
-good start. These also, to me, seem to be easier classes to implement.
-CAP_NET_ADMIN might need some extra work.
-
-Second most common were CAP_SYS_CHROOT, CAP_SETGID and CAP_SETUID. I am
-not completely clear on how these should be handled.
-
-Assuming those are out of the way, CAP_IPC_LOCK, CAP_SYS_TIME, CAP_KILL
-and CAP_SYS_NICE might be a good choice to tackle if possible. This
-might, if I have understood things correctly, involve writing a proxy
-Hurd server for these calls in mach.
-
-CAP_SYS_ADMIN, CAP_SYS_RESOURCE and CAP_SYS_RAWIO. These contains a bit
-of "everything" (ADMIN being the worse one), meaning that experience
-and infrastructure gained from implementing the previous capabilities
-might come in handy. CAP_SYS_RAWIO might be difficult; it can be found
-inside many drivers in the Linux source.
-
-
-## Additional general details
-
-[This article](http://www.ibm.com/developerworks/library/l-posixcap.html)
-contains a good general description of how capabilities in Linux
-works. As there will be no file capabilities in the Hurd initially,
-an approach emulating the behavior Linux exhibits when SECURE_NOROOT
-and SECURE_NO_SETUID_FIXUP are *not* set seems to be a good start.
-This is called the "root-user-is-privileged" model in the article,
-and somewhat simplified it means that processes started by root, or
-setuid-root, is given all capabilities no matter what capabilities the
-parent might or might not hold at the time of execution. Quoting verbatim
-from the article:
-
-> * When SECURE_NOROOT is not set, then when a process executes a file,
-> the new capability sets may be calculated as though the file had some
-> file capability sets set fully populated. In particular:
->
-> * The file inheritable and permitted sets will be full on if the
-> process's real or effective uid is 0 (root) or the file is setuid
-> root.
->
-> * The file effective set will be full on if the process's effective
-> uid is root or the file is setuid root.
->
->
-> * When SECURE_NO_SETUID_FIXUP is not set, then when a process switches
-> its real or effective uids to or from 0, capability sets are further
-> shifted around:
->
-> * If a process switches its effective uid from 0 to non-0, then its
-> effective capability set is cleared.
->
-> * If a process switches its real, effective, or saved uids from at
-> least one being 0 to all being non-zero, then both the permitted
-> and effective capabilities are cleared.
->
-> * If a process sets its effective uid from non-zero to 0, then the
-> effective capabilities are set equal to the permitted capabilities.
-
-The capabilities of the resulting process are determined by the following
-formulas, again taken from the article, with p for Process and f for file:
-
-> pI' = pI
-> pP' = fP | (fI & pI)
-> pE' = pP' & fE
-
-The security under the above described model, being what at least some
-of the applications I listed in my last comment employs, is basically
-the following (also detailed somewhat in the same article):
-
-* Execute process as root (or setuid) to gain all capabilities.
-
-* Use the prctl [[system call]] to enable keepcaps for the process
- (same(?) effect as enabling SECURE_NO_SETUID_FIXUP for the process).
- keepcaps should be off by default.
-
-* setuid to a non-root user, and by doing so losing the possibility to
- regain capabilities by simply starting a new process.
-
-* Drop all the capabilities except those few actually needed.
-
-
-## Infrastructure details - Special UIDs approach
-
-The auth server must somehow keep track of three sets of capabilities.
-I suggest keeping these three sets in three additional idvec's in the
-authhandle struct, and will for the purpose of this description name
-these pcaps (permitted), ecaps (effective) and icaps (inheritable).
-This will simplify keeping track of the internal logic somewhat.
-In addition to this, there is a need to keep track of the "keepcaps" flag
-as described above. I suggest representing this with an int keepcaps
-in the same struct.
-
-1. Expand authhandle struct with three additional idvecs and one integer.
-Fix static functions handling the struct, such as destroy_authhandle.
-
-2. Implement the necessary logic in auth_makeauth to handle capabilities.
-
-Problems:
-Assume that all capabilities are mapped onto uids, given names on the form
-uid_<capability>, for example uid_cap_net_raw. Assume that the presence
-of an uid in euids suggest that the capability is in the effective set
-of the process, that the presence of this uid in auids suggests that it
-is in the permitted set of the process, and that the presence of this
-uid in aguids suggest that it is in the inheritable set of the process.
-That they are internally stored in separate idvec's can be ignored as
-an implementation detail.
-
-* The UID's have as it is different meanings depending on where in the
- array they are positioned, and certain clients seem to rely on this.
- The first UID in euids is the effective uid, and the first and second
- UIDs in auids are the real and saved UIDS respectively. At least
- some users of makeauth would need to made aware of capabilities,
- for example setuid in glibc.
-
-* Setting/getting the keepcaps-flag is also a bit of a problem. To avoid
- changing the auth interface yet another special UID could be used
- for this purpose, although that seems to be really stretching it.
- The cleaner solution would probably be to expand the interface with
- something along the lines of auth_setkeepcaps/auth_getkeepcaps.
- This interface would only be used by prctl.
-
-Another problem with this approach is that it seems a bit difficult
-to oversee the affects that using other RPC's like fsys_getroot and
-io_restrict_auth might have on capabilities.
-
-
-## Infrastructure details - "extend-interfaces" approach
-
-This approach has started to seem like the better way to me, as the
-usage of capabilities becomes more explicit through the entire "chain",
-perhaps making it somewhat more easy to understand all the interactions.
-
-I suggest something like the following new interface methods:
-
-***
-
-
-### The auth interface
-
- routine auth_getauth_caps (
- handle: auth_t;
- out euids: idarray_t;
- out auids: idarray_t;
- out egids: idarray_t;
- out agids: idarray_t;
- out ecaps: idarray_t;
- out pcaps: idarray_t;
- out icaps: idarray_t);
-
- routine auth_makeauth_caps (
- handle: auth_t;
- other_handles: portarray_t;
- euids: idarray_t;
- auids: idarray_t;
- egids: idarray_t;
- agids: idarray_t;
- ecaps: idarray_t;
- pcaps: idarray_t;
- icaps: idarray_t;
- flags: int; /* keepcaps.. ? */
- out newhandle: mach_port_make_send_t);
-
- routine auth_server_authenticate_caps (
- handle: auth_t;
- sreplyport reply: mach_port_poly_t;
- rendezvous: mach_port_send_t;
- newport: mach_port_poly_t;
- out euids: idarray_t;
- out auids: idarray_t;
- out egids: idarray_t;
- out agids: idarray_t;
- out ecaps: idarray_t;
- out pcaps: idarray_t;
- out icaps: idarray_t);
-
-
-### The io interface
-
- routine io_restrict_auth_caps (
- io_object: io_t;
- RPT
- out new_object: mach_port_send_t;
- uids: idarray_t SCP;
- gids: idarray_t SCP;
- ecaps: idarray_t SCP);
-
-
-### The fsys interface
-
- routine fsys_getroot_caps (
- fsys: fsys_t;
- RPT
- #ifdef FSYS_GETROOT_UREPLY
- ureplyport ureply: mig_reply_port_t;
- #endif
- dotdot_node: mach_port_send_t;
- gen_uids: idarray_t;
- gen_gids: idarray_t;
- out ecaps: idarray_t;
- out pcaps: idarray_t;
- out icaps: idarray_t;
- flags: int;
- out do_retry: retry_type;
- out retry_name: string_t;
- out file: mach_port_send_t);
-
-***
-
-These are meant to be able to replace the old methods with
-capability-aware methods, instead of merely complementing them.
-The replacing work could then be made a more gradual process. Steps:
-
-* Extend authhandle with the same data members as in the UID-case.
-
-* Implement new _caps-functions according to described interface
- extensions above, refactor code a bit to share common uid-handling
- logic. Both makeauth's should drop all capabilities if switching from
- uid 0 without having keepcaps. For example, keepcaps should be unset
- by default.
-
-* Fix glibc. Extend hurd_id_data in hurd/id.h to store capabilities,
- switch to capability aware functions where necessary.
-
-* io-reauthenticate. Fix implementations to use
- auth_server_authenticate_caps instead. For this we also need somewhere
- to save the caps, so it ties in with for example the extension of
- iouser as mentioned in the details.
-
-* fsys_getroot. Implement fsys_getroot_caps in libdiskfs, trans,
- libtreefs, libtrivs, libnetfs. Fix users of function in libdiskfs,
- libfshelp, settrans, libtreefs, clookup.
-
-* io_restrict_auth. Implement io_restrict_auth_caps in libdiskfs,
- libtreefs, libtrivfs, libnetfs, boot. Fix users in utils(symlink,
- firmlink), libtrivs, term, clookup
-
-Among the problems might be that there are a lot of arguments that
-needs to be passed around, and that it seems somewhat ugly to end up
-with function names referencing caps in particular.
-
-Below some more about the specific capabilities. This should in large
-be common to the two approaches above.
-
-
-## Actually handing out the capabilities to process
-
-This seems like a good job for the file_exec route in the fs interface.
-Quoting from the comments above the definition in fs.defs: "*Necessary
-initialization, including authentication changes associated with set[ug]id
-execution must be handled by the filesystem*". The capability-granting
-functionality should to be added in at least the implementations in
-libdiskfs and libnetfs as far as I can determine, and should be "easy
-enough" once the infrastructure for implementing the file-related
-capabilities (CAP_CHOWN etc.) are in place. This also seem to make
-sense considering the future possibility for file capabilities.
-
-
-## Some implementation details of individual capabilities.
-
-### Net-related capabilities.
-
-This turned out to be a bit less work than I had thought, as the
-imported Linux code already seem to contain all the necessary checks.
-What remains to do to implement all of these capabilities is mostly a
-matter of putting some infrastructure in place.
-
-* In struct sock_user (pfinet.h), change isroot for idvec
- caps. Alternatively, add idvec caps.
-
-* Change the function make_sock_user in socket.c to take an idvec caps
- as a parameter and properly set the given caps to the corresponding
- idvec in sock_user.
-
-* Fix users of make_sock_user: S_io_reauthenticate, S_io_restrict_auth,
- S_socket_create, S_socket_accept. This should be doable with the
- current infrastructure. For example, S_socket_create currently
- sets isroot in the new sock_user from the corresponding member in
- the trivfs_protid struct. This does not present a problem however,
- as the latter struct also provides access to an iouser (iohelp.h)
- from which the needed uids of the user should be available.
-
-* Fix up parts of source from Linux, modify task_struct add idvec,
- modify prepare_current to take the caps idvec instead of isroot.
- Re-implement the existing function capable(int cap) to actually check
- for the capability passed as an argument instead of just return isroot.
-
-* Change a few isroot's at 3 other places in the code to check for
- capabilities. Since these places all have access to isroot and thus by
- implication the sock_user, they also have access to the new capability
- information; no restructuring necessary.
-
-
-### File-related capabilities
-
-While there are a lot of servers in the Hurd, I am not sure all of these
-capabilities actually make sense to implement in all of them.
-
-
-#### CAP_CHOWN
-
-Implementing this in libdiskfs should take care of it where it makes
-sense. Servers using libdiskfs uses iouser from libiohelp to hold
-user credentials. As noted above, this struct is already capable of
-holding our capabilities as uid's or is otherwise extended to contain
-the necessary idvecs if using the second general approach. Adding a
-check along the lines of *idvec_contains(uid_cap_chown)* in function
-diskfs_S_file_chown (file-chown.c) should be all that's needed.
-
-In libnetfs, netfs_attempt_chown is declared as a function that the
-server using the library must implement. Any checks for chown rights
-are however most likely performed on the server side, suggesting that
-there is nothing we can do here to implement CAP_CHOWN. Even if we do
-need to add something, an iouser containing the necessary information
-to implement the checks in a manner analogous to that in libdiskfs seems
-to be passed to each important function.
-
-
-#### CAP_DAC_*
-
-These might actually make sense to implement in more servers, and the
-logic seems somewhat involved. Need to add the necessary checks to
-at least file_check_access, file_exec in libdiskfs. file_exec also in
-libnetfs, probably. Possibly changes also in other places.
-
-The main difficulties overall seem to lie in getting the infrastructure
-properly in place rather than implementing most of the individual
-capabilities, and I have updated the schedule a bit in an attempt to
-reflect this.
-
-
-## Schedule updating
-
-The more I look into this the less time it seems likely to take to
-do the work. Below is my best estimation at the moment, and I have
-basically adjusted everything to what I think is more likely estimations.
-If this is correct I would be more or less around midterm. I haven't
-gone completely to the individual level as that doesn't seem to make
-sense, but what is clustered together are either related capabilities
-or a collection of capabilities classified roughly with regards to how
-much I know about the area and how many different rights they control.
-It's not my intention to "slack off" or anything, so if this estimation
-were to be correct I could perhaps take a look at the xattrs-patch,
-or spend the rest of my time fixing PATH_MAX-issues. Then again, maybe
-there is some great difficulty hidden somewhere.
-
-
-#### Some justifications:
-
-Dummy libcap, more or less done.
-*1 day* (making sure it "fails gracefully" shouldn't really take longer than this)
-
-Application for testing, the beginnings of a fairly extensive "test suit" on Linux.
-*2 days*
-
-Basic infrastructure.
-*5 days*, depends on the chosen approach, but it is probably wise to
-reserve at least a bunch of days for this.
-
-Implementations of prctl/capset/capget in libshouldbeinlibc,
-or a port of libcap to the Hurd in any other way.
-*5 days*
-
-CAP_NET_BIND_SERVICE, CAP_NET_RAW, CAP_NET_BROADCAST, CAP_NET_ADMIN
-*4 days*, as noted above this should be easy, but it might uncover bugs
-in the newly implemented infrastructure for example.
-
-CAP_CHOWN,CAP_FOWNER,CAP_FSETID
-*2 days*, I think these only needs to be done in libdiskfs
-
-CAP_DAC_OVERRIDE,CAP_DAC_READ_SEARCH
-*4 days*, these might need changes to various servers
-
-CAP_SYS_TIME,CAP_IPC_LOCK,CAP_KILL
-CAP_SYS_NICE,CAP_SYS_CHROOT,CAP_SYS_BOOT
-*2 weeks*, these are varied and I'm not that sure exactly how each should
-be tackled so some research is needed.
-
-CAP_SETGID,CAP_SETUID,CAP_SYS_TTY_CONFIG
-*4 days*
-
-CAP_SYS_ADMIN,CAP_SYS_RESOURCE,CAP_SYS_RAWIO
-*2 weeks*, these too are pretty varied and some might need some individual
-researching
-
-CAP_SETPCAP
-*1 day*
-
-
-## Schedule
-
-24/5 Start coding
-25/5 Dummy libcap ready for use.
-27/5 The beginnings of a "test suite", written on Linux.
- 1/6 Basic infrastructure in place
- 6/6 Dummy libcap extended with real functionality to make use of
- implemented capability and infrastructure, or the Hurd adapted for
- compatibility with Linux libcap.
-10/6 The "network class" of capabilities implemented.
-12/6 CAP_CHOWN, CAP_FOWNER, CAP_FSETID
-16/6 CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH
-30/6 CAP_SYS_TIME, CAP_IPC_LOCK, CAP_KILL, CAP_SYS_NICE,
- CAP_SYS_CHROOT, CAP_SYS_BOOT
- 4/7 CAP_SETGID,CAP_SETUID,CAP_SYS_TTY_CONFIG
-12/7 "Mentors and students can begin submitting mid-term evaluations"
-16/7 GSoC Mid-term evaluations deadline.
-18/7 CAP_SYS_ADMIN, CAP_SYS_RESOURCE, CAP_SYS_RAWIO
-19/7 CAP_SETPCAP