| ======================================================== | |
| Linux Security Modules: General Security Hooks for Linux | |
| ======================================================== | |
| :Author: Stephen Smalley | |
| :Author: Timothy Fraser | |
| :Author: Chris Vance | |
| .. note:: | |
| The APIs described in this book are outdated. | |
| Introduction | |
| ============ | |
| In March 2001, the National Security Agency (NSA) gave a presentation | |
| about Security-Enhanced Linux (SELinux) at the 2.5 Linux Kernel Summit. | |
| SELinux is an implementation of flexible and fine-grained | |
| nondiscretionary access controls in the Linux kernel, originally | |
| implemented as its own particular kernel patch. Several other security | |
| projects (e.g. RSBAC, Medusa) have also developed flexible access | |
| control architectures for the Linux kernel, and various projects have | |
| developed particular access control models for Linux (e.g. LIDS, DTE, | |
| SubDomain). Each project has developed and maintained its own kernel | |
| patch to support its security needs. | |
| In response to the NSA presentation, Linus Torvalds made a set of | |
| remarks that described a security framework he would be willing to | |
| consider for inclusion in the mainstream Linux kernel. He described a | |
| general framework that would provide a set of security hooks to control | |
| operations on kernel objects and a set of opaque security fields in | |
| kernel data structures for maintaining security attributes. This | |
| framework could then be used by loadable kernel modules to implement any | |
| desired model of security. Linus also suggested the possibility of | |
| migrating the Linux capabilities code into such a module. | |
| The Linux Security Modules (LSM) project was started by WireX to develop | |
| such a framework. LSM was a joint development effort by several security | |
| projects, including Immunix, SELinux, SGI and Janus, and several | |
| individuals, including Greg Kroah-Hartman and James Morris, to develop a | |
| Linux kernel patch that implements this framework. The work was | |
| incorporated in the mainstream in December of 2003. This technical | |
| report provides an overview of the framework and the capabilities | |
| security module. | |
| LSM Framework | |
| ============= | |
| The LSM framework provides a general kernel framework to support | |
| security modules. In particular, the LSM framework is primarily focused | |
| on supporting access control modules, although future development is | |
| likely to address other security needs such as sandboxing. By itself, the | |
| framework does not provide any additional security; it merely provides | |
| the infrastructure to support security modules. The LSM framework is | |
| optional, requiring `CONFIG_SECURITY` to be enabled. The capabilities | |
| logic is implemented as a security module. | |
| This capabilities module is discussed further in | |
| `LSM Capabilities Module`_. | |
| The LSM framework includes security fields in kernel data structures and | |
| calls to hook functions at critical points in the kernel code to | |
| manage the security fields and to perform access control. | |
| It also adds functions for registering security modules. | |
| An interface `/sys/kernel/security/lsm` reports a comma separated list | |
| of security modules that are active on the system. | |
| The LSM security fields are simply ``void*`` pointers. | |
| The data is referred to as a blob, which may be managed by | |
| the framework or by the individual security modules that use it. | |
| Security blobs that are used by more than one security module are | |
| typically managed by the framework. | |
| For process and | |
| program execution security information, security fields are included in | |
| :c:type:`struct task_struct <task_struct>` and | |
| :c:type:`struct cred <cred>`. | |
| For filesystem | |
| security information, a security field is included in :c:type:`struct | |
| super_block <super_block>`. For pipe, file, and socket security | |
| information, security fields are included in :c:type:`struct inode | |
| <inode>` and :c:type:`struct file <file>`. | |
| For System V IPC security information, | |
| security fields were added to :c:type:`struct kern_ipc_perm | |
| <kern_ipc_perm>` and :c:type:`struct msg_msg | |
| <msg_msg>`; additionally, the definitions for :c:type:`struct | |
| msg_msg <msg_msg>`, struct msg_queue, and struct shmid_kernel | |
| were moved to header files (``include/linux/msg.h`` and | |
| ``include/linux/shm.h`` as appropriate) to allow the security modules to | |
| use these definitions. | |
| For packet and | |
| network device security information, security fields were added to | |
| :c:type:`struct sk_buff <sk_buff>` and | |
| :c:type:`struct scm_cookie <scm_cookie>`. | |
| Unlike the other security module data, the data used here is a | |
| 32-bit integer. The security modules are required to map or otherwise | |
| associate these values with real security attributes. | |
| LSM hooks are maintained in lists. A list is maintained for each | |
| hook, and the hooks are called in the order specified by CONFIG_LSM. | |
| Detailed documentation for each hook is | |
| included in the `security/security.c` source file. | |
| The LSM framework provides for a close approximation of | |
| general security module stacking. It defines | |
| security_add_hooks() to which each security module passes a | |
| :c:type:`struct security_hooks_list <security_hooks_list>`, | |
| which are added to the lists. | |
| The LSM framework does not provide a mechanism for removing hooks that | |
| have been registered. The SELinux security module has implemented | |
| a way to remove itself, however the feature has been deprecated. | |
| The hooks can be viewed as falling into two major | |
| categories: hooks that are used to manage the security fields and hooks | |
| that are used to perform access control. Examples of the first category | |
| of hooks include the security_inode_alloc() and security_inode_free() | |
| These hooks are used to allocate | |
| and free security structures for inode objects. | |
| An example of the second category of hooks | |
| is the security_inode_permission() hook. | |
| This hook checks permission when accessing an inode. | |
| LSM Capabilities Module | |
| ======================= | |
| The POSIX.1e capabilities logic is maintained as a security module | |
| stored in the file ``security/commoncap.c``. The capabilities | |
| module uses the order field of the :c:type:`lsm_info` description | |
| to identify it as the first security module to be registered. | |
| The capabilities security module does not use the general security | |
| blobs, unlike other modules. The reasons are historical and are | |
| based on overhead, complexity and performance concerns. |