summaryrefslogtreecommitdiff
path: root/security
diff options
context:
space:
mode:
authorHolger Dengler <dengler@linutronix.de>2016-04-27 13:44:37 +0200
committerHolger Dengler <dengler@linutronix.de>2016-05-02 10:24:57 +0200
commit76beb263c506d48b17f648fb7e84eb99afc3066d (patch)
tree23a0607a42ec18c861ce49de762bf8de02d6e286 /security
parent30b7693f952706d6e4279b596b022ab6815fe8ed (diff)
sec: Add capability slides
Signed-off-by: Holger Dengler <dengler@linutronix.de>
Diffstat (limited to 'security')
-rw-r--r--security/advanced/Makefile1
-rw-r--r--security/advanced/frm_capabilities.tex269
-rw-r--r--security/advanced/pres_advanced_sec.tex3
-rw-r--r--security/advanced/pres_capability.tex20
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}