diff options
| author | Holger Dengler <dengler@linutronix.de> | 2016-04-27 13:44:37 +0200 |
|---|---|---|
| committer | Holger Dengler <dengler@linutronix.de> | 2016-05-02 10:24:57 +0200 |
| commit | 76beb263c506d48b17f648fb7e84eb99afc3066d (patch) | |
| tree | 23a0607a42ec18c861ce49de762bf8de02d6e286 /security | |
| parent | 30b7693f952706d6e4279b596b022ab6815fe8ed (diff) | |
sec: Add capability slides
Signed-off-by: Holger Dengler <dengler@linutronix.de>
Diffstat (limited to 'security')
| -rw-r--r-- | security/advanced/Makefile | 1 | ||||
| -rw-r--r-- | security/advanced/frm_capabilities.tex | 269 | ||||
| -rw-r--r-- | security/advanced/pres_advanced_sec.tex | 3 | ||||
| -rw-r--r-- | security/advanced/pres_capability.tex | 20 |
4 files changed, 293 insertions, 0 deletions
diff --git a/security/advanced/Makefile b/security/advanced/Makefile index f6ab95b..a388a9d 100644 --- a/security/advanced/Makefile +++ b/security/advanced/Makefile @@ -1 +1,2 @@ obj-$(CONFIG_SECURITY_ADV) += pres_advanced_sec.pdf +obj-$(CONFIG_SECURITY_ADV) += pres_capability.pdf diff --git a/security/advanced/frm_capabilities.tex b/security/advanced/frm_capabilities.tex new file mode 100644 index 0000000..7e514df --- /dev/null +++ b/security/advanced/frm_capabilities.tex @@ -0,0 +1,269 @@ +% ---------------------------- +\subsubsection{Basics} + +% ---------------------------- +\begin{frame}[fragile] +\frametitle{What is a Linux Capability?} +\begin{itemize} +\item Syscalls + \begin{itemize} + \item Application Programming Interface (API) to the Kernel + \item some Syscalls need special privileges (EPERM) + \end{itemize} +\item User Privileges + \begin{itemize} + \item root (UID == 0): all privileges + \item users (UID > 0): no privileges + \end{itemize} +\item Capability + \begin{itemize} + \item single privilege + \item can be raised or dropped + \end{itemize} +\end{itemize} +\end{frame} + +% ---------------------------- +\subsubsection{How it works} +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Control Flow} + \begin{figure}[h] + \centering + \includegraphics[width=8cm]{images/syscall_flow.png} + \end{figure} +\end{frame} + +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Type of Syscalls} +\begin{itemize} +\item unprivileged Syscalls: + \begin{itemize} + \item sys\_gethostname() + \item sys\_read() / sys\_write() + \item sys\_getuid() / sys\_getgid() + \item \dots + \end{itemize} +\item privileged Syscalls: + \begin{itemize} + \item sys\_sethostname() + \item sys\_open() + \item sys\_setuid() / sys\_setgid() + \item \dots + \end{itemize} +\end{itemize} +\end{frame} + +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Capabilities} +\begin{columns}[onlytextwidth] + \begin{column}{0.5\textwidth} + \begin{itemize} + \item CAP\_MKNOD + \item CAP\_KILL + \item CAP\_SETGID + \item CAP\_SETUID + \item CAP\_SETPCAP + \item CAP\_SYS\_BOOT + \item CAP\_SYS\_NICE + \item CAP\_SYS\_TIME + \end{itemize} + \end{column} + \begin{column}{0.5\textwidth} + \begin{itemize} + \item CAP\_SYS\_MODULE + \item CAP\_SYS\_RAWIO + \item CAP\_SYS\_PTRACE + \item CAP\_NET\_BIND\_SERVICE + \item CAP\_NET\_BROADCAST + \item CAP\_NET\_RAW + \item CAP\_SYS\_ADMIN + \item CAP\_NET\_ADMIN + \end{itemize} + \end{column} +\end{columns} +Full list: \\ +Kernel Source: include/uapi/capability.h \\ +Distribution: /usr/include/linux/capability.h +\end{frame} + +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Process and File} +\begin{itemize} +\item Process/Task + \begin{itemize} + \item Capability bitfields in task context: + \begin{itemize} + \item Permitted + \item Effective + \item Inheritable + \end{itemize} + \end{itemize} +\item File + \begin{itemize} + \item Bitfields in file-attributes (xattr) + \begin{itemize} + \item Permitted + \item Inheritable + \item Auto-load Effective (single bit) + \end{itemize} + \end{itemize} +\end{itemize} +\end{frame} + +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Capability Bitfields} +\begin{figure}[h] +\centering +\includegraphics[width=7cm]{images/cap_bitfields.png} +\end{figure} +\end{frame} + +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Capability transition during execve()} +\begin{figure}[h] +\centering +\includegraphics[width=8cm]{images/cap_trans_execve.png} +\end{figure} +\end{frame} + +% ---------------------------- +\subsubsection{Capabilities in Applications} +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Capability Handling in Applications (libcap)} +\begin{columns}[onlytextwidth] + \begin{column}{0.45\textwidth} + \begin{beamerboxesrounded}[shadow=true]{Capability Set Handling} + \begin{tiny} + \begin{verbatim} +#include <sys/capability.h> + +int list_n = 1; +cap_t caps; +cap_value_t list[list_n]; + +caps = cap_get_proc(); + +/* Capability Bitfield Modifications */ + +cap_set_proc(caps); + +/* Continue with modified privileges */ + +cap_free(caps); + \end{verbatim} + \end{tiny} + \end{beamerboxesrounded} + \end{column} + \begin{column}{0.45\textwidth} +Capability Bitfield Modifications + \begin{beamerboxesrounded}[shadow=true]{gain (temp):} + \begin{tiny} + \begin{verbatim} +list[0] = CAP_NET_BIND_SERVICE; +cap_set_flag(caps, CAP_EFFECTIVE, + list_n, list, CAP_SET); +cap_set_proc(caps); + \end{verbatim} + \end{tiny} + \end{beamerboxesrounded} + \begin{beamerboxesrounded}[shadow=true]{drop (temp):} + \begin{tiny} + \begin{verbatim} +list[0] = CAP_NET_BIND_SERVICE; +cap_set_flag(caps,CAP_EFFECTIVE, + list_n, list,CAP_CLEAR); +cap_set_proc(caps); + \end{verbatim} + \end{tiny} + \end{beamerboxesrounded} + \begin{beamerboxesrounded}[shadow=true]{drop (finally):} + \begin{tiny} + \begin{verbatim} +list[0] = CAP_NET_BIND_SERVICE; +cap_set_flag(caps,CAP_PERMITTED, + list_n, list,CAP_CLEAR); +cap_set_proc(caps); + \end{verbatim} + \end{tiny} + \end{beamerboxesrounded} + \end{column} +\end{columns} +\end{frame} + +% % ---------------------------- +\begin{frame}[fragile] +\frametitle{Capability scenario} +Scenario for dropping capabilities in suid-root processes +\begin{enumerate} +\item Run process with effective UID == 0 +\item use libcap to drop not required capabilities + \begin{itemize} + \item effective: drop all + \item permitted: keep only required + \end{itemize} +\item set SEC\_KEEP\_CAPS (prctl(PR\_SET\_KEEPCAPS)) +\item set all UIDs to non-zero +\item raise capability in effecive set before calling a privileged syscall +\item drop capability from effective set after syscall +\end{enumerate} +\end{frame} + +% ---------------------------- +\subsubsection{Tooling \& Documentation} +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Tooling for Capabilities} +\begin{itemize} +\item capsh\\ +Modify security properties of a task (including capabilities) +\item getcap/setcap\\ +Modify file capability settings +\item libpam-cap\\ +Preset users inheritable capabilities during login +\end{itemize} +\end{frame} + +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Further Information about Capabilities} +\begin{itemize} +\item cat /proc/<pid>/status +\item Man-Pages (man 7 capabilities, ff.) +\item The Linux Programming Interface (Michael Kerisk),\\ + ISBN 978-1-59327-220-3 +\end{itemize} +\end{frame} + +% ---------------------------- +\subsubsection{Summary} +% ---------------------------- +\begin{frame}[fragile] +\frametitle{Summary} +\begin{itemize} +\item A Capability allows to use a privileged syscall +\item Task-Capabilities: + \begin{itemize} + \item 3 bitfields + \item permitted, effective, inheritable + \end{itemize} +\item File Capabilities: + \begin{itemize} + \item File extended attributes + \item 2 bitfields, 1 flag + \item permmitted, inheritable, effecitve (flag) + \end{itemize} +\item Capability transition for fork() and execve() +\item Conclusion\\ + \begin{itemize} + \item root/non-root: all or nothing\\ + \item Capabilities: fine grain privileges + \end{itemize} +\end{itemize} +\end{frame} diff --git a/security/advanced/pres_advanced_sec.tex b/security/advanced/pres_advanced_sec.tex index 1a8c0b6..ccbf05e 100644 --- a/security/advanced/pres_advanced_sec.tex +++ b/security/advanced/pres_advanced_sec.tex @@ -247,6 +247,9 @@ rm: cannot remove `/home/franz/.bash_history': Operation not permitted \end{frame} % ---------------------------- +\input{security/advanced/frm_capabilities.tex} + +% ---------------------------- \subsubsection{Process} \begin{frame}[fragile] diff --git a/security/advanced/pres_capability.tex b/security/advanced/pres_capability.tex new file mode 100644 index 0000000..cb4cf0e --- /dev/null +++ b/security/advanced/pres_capability.tex @@ -0,0 +1,20 @@ +\input{configpres} + +% ---------------------------- +\subsection{Linux Capabilities} + +\title{Linux Capabilities} +\maketitle + +% ---------------------------- +\begin{frame} +\frametitle{Overview} +\tableofcontents +\end{frame} + +% ---------------------------- +\input{security/advanced/frm_capabilities.tex} + +% ---------------------------- +\subsection*{} +\input{tailpres} |
