From cae041727d0812a41455d54efa1df9ade134af43 Mon Sep 17 00:00:00 2001 From: Stefan Junker Date: Fri, 29 Sep 2017 18:09:13 +0200 Subject: [PATCH] proper format; strip unfinished content --- src/code/stack_handling.rs/src/main.rs | 54 +-- src/docs/abstract.tex | 7 +- src/docs/affidavit.tex | 26 ++ src/docs/cover.tex | 26 ++ src/docs/gfx/htwg-logo.pdf | Bin 0 -> 43925 bytes src/docs/gfx/llvm-number-paper-pa.png | Bin 0 -> 8482 bytes src/docs/gfx/rust-compiler-flow.png | Bin 0 -> 32996 bytes src/docs/parts/context/context.tex | 339 ++++++++---------- .../research_and_development.tex | 117 +++--- src/docs/thesis.tex | 53 +-- 10 files changed, 291 insertions(+), 331 deletions(-) create mode 100644 src/docs/affidavit.tex create mode 100644 src/docs/cover.tex create mode 100644 src/docs/gfx/htwg-logo.pdf create mode 100644 src/docs/gfx/llvm-number-paper-pa.png create mode 100644 src/docs/gfx/rust-compiler-flow.png diff --git a/src/code/stack_handling.rs/src/main.rs b/src/code/stack_handling.rs/src/main.rs index 71db1d8..d47839e 100644 --- a/src/code/stack_handling.rs/src/main.rs +++ b/src/code/stack_handling.rs/src/main.rs @@ -79,54 +79,6 @@ fn passthrough(a: isize) -> isize { } #[inline(never)] -fn caller() { - let a = passthrough(1); - let b = a * 2; - printer(&a, &b); -} - -#[inline(never)] -fn printer(a: &isize, b: &isize) { - println!("2*{}={}", a, b) -} - -#[inline(never)] -fn modifier() { - let v: usize = 0; - let v_addr = (&v as *const usize) as usize; - unsafe { - *((v_addr + 1 * 8) as *mut usize) = simple_printer as usize; - } -} - -#[naked] -fn simple_printer() { - eprint!("I wonder who called me?"); -} - -#[inline(never)] -fn huge_stack() { - const SLICE_LENGTH: usize = 0x100000000; - let slice: [u64; SLICE_LENGTH] = [0xdeadbeef; SLICE_LENGTH]; - let slice_start_addr = &slice[0] as *const u64; - let slice_end_addr = &slice[SLICE_LENGTH - 1] as *const u64; - println!("{:?} - {:?} = {:?}", - slice_start_addr, - slice_end_addr, - (slice_end_addr as usize - slice_start_addr as usize) / std::mem::size_of::()); -} - -// fn recurse(n: u64) { - // recurse(n + 1); -// } - -fn a() { a(); } -fn main() { a(); } - - - -// fn main() { - // // modifier(); - // huge_stack(); - // println!("main exiting") -// } \ No newline at end of file +fn r(); + println!("main exiting") +} \ No newline at end of file diff --git a/src/docs/abstract.tex b/src/docs/abstract.tex index 1e5f7ca..0e705fb 100644 --- a/src/docs/abstract.tex +++ b/src/docs/abstract.tex @@ -1,3 +1,4 @@ +% // vim: set ft=tex: \begin{center} {\Large \textbf{Abstract}} \end{center} @@ -13,9 +14,9 @@ Supervisors: & \supervisorOne \\[.5ex] & \supervisorTwo\\ & \\ - Submition: & \submitdate \\ + Submission: & \submitdate \\ & \\ - Buzzwords: & \buzzwords \\ + Categories: & \buzzwords \\ & \\ \end{tabular} \end{center} @@ -23,4 +24,4 @@ \bigskip \noindent -TODO: abstract goes here +\abstract diff --git a/src/docs/affidavit.tex b/src/docs/affidavit.tex new file mode 100644 index 0000000..3700552 --- /dev/null +++ b/src/docs/affidavit.tex @@ -0,0 +1,26 @@ +% // vim: set ft=tex: + +\chapter*{Ehrenwörtliche Erklärung} + +Hiermit erkläre ich, {\authorOne}, geboren am {\authorOneBirthDate} in {\authorOneBirthCity}, + +\begin{enumerate} + \item{ + dass ich meine Masterarbeit mit dem Titel: + + {"\topic"} + + in der Fakultät Informatik unter Anleitung von Professor {\supervisorOne} und ohne fremde Hilfe angefertigt habe und keine anderen als die angeführten Hilfen benutzt habe; + } + \item{ + dass ich die Übernahme wörtlicher Zitate, von Tabellen, Zeichnungen, Bildern und Programmen aus der Literatur oder anderen Quellen (Internet) sowie die Verwendung der Gedanken anderer Autoren an den entsprechenden Stellen innerhalb der Arbeit gekennzeichnet habe; + } + \item{ + dass die eingereichten Abgabe-Exemplare in Papierform und im PDF-Format vollständig übereinstimmen. + } +\end{enumerate} + +Ich bin mir bewusst, dass eine falsche Erklärung rechtliche Folgen haben wird. + +\vspace{4cm} +Konstanz, 29.9.2017\hspace{5cm} \authorOne diff --git a/src/docs/cover.tex b/src/docs/cover.tex new file mode 100644 index 0000000..a4e0825 --- /dev/null +++ b/src/docs/cover.tex @@ -0,0 +1,26 @@ +\begin{titlepage} + +\vspace*{-1.0cm} + +\begin{centering} + \includegraphics[width=\textwidth]{gfx/htwg-logo.pdf} +\end{centering} + +\vspace{1.5cm} + +\begin{center} + \huge{ + \textbf{\topic} \\[4cm] + } + \Large{ + \textbf{\authorOne}} \\[5.5cm] + \large{ + \textbf{Konstanz, \submitdate} \\[2.3cm] + } + + \Huge{ + \textbf{{\textsf Masterarbeit}} + } +\end{center} + +\end{titlepage} diff --git a/src/docs/gfx/htwg-logo.pdf b/src/docs/gfx/htwg-logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e7dfc76c6b015c07455ed5ffd33a98ab22f9e615 GIT binary patch literal 43925 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 literal 0 HcmV?d00001 diff --git a/src/docs/gfx/llvm-number-paper-pa.png b/src/docs/gfx/llvm-number-paper-pa.png new file mode 100644 index 0000000000000000000000000000000000000000..54d3b614e20328a4499fc56b96b8949bf215d61a GIT binary patch literal 8482 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 literal 0 HcmV?d00001 diff --git a/src/docs/gfx/rust-compiler-flow.png b/src/docs/gfx/rust-compiler-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0d140e8d1bad4543343511134903a6f4425ad5 GIT binary patch literal 32996 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\columncolor{YellowGreen}}c | l } +% \multicolumn{1}{r}{RBP offset} & \multicolumn{1}{c}{Content} & \\ +% $\uparrow$ & \cellcolor{white} & \\ +% & \cellcolor{white} \dots \textit{beyond current stack} \dots & \\ +% \hhline{~-~} +% 0 & \textit{Previous RSP} & $\leftarrow$ RBP \\ +% \hhline{~-~} +% \vdots & \dots~~\textit{local variables}~~\dots & \\ +% \hhline{~-~} +% -0x30 & 3rd arg & \\ +% \hhline{~|-|~} +% -0x38 & 2nd arg & \\ +% \hhline{~-~} +% -0x40 & 1st arg & \\ +% \hhline{~-~} +% \vdots & \dots~~\textit{local variables}~~\dots & \\ +% \hhline{~-~} +% -0x60 & rdi & \\ +% \hhline{~-~} +% & \dots~~\textit{local variables}~~\dots & \\ +% \hhline{~-~} +% $RBP-RSP$ & \textit{unknown} & $\leftarrow$ RSP \\ +% \hhline{~-~} +% & \cellcolor{white} & \\ +% $\downarrow$ & \cellcolor{white} & \\ +% \end{tabular} +% \end{table} +% +% \cref{code::context::examples::func-prologue} shows \textit{sum}'s prologue. +% The corresponding epilogue is displayed in \cref{code::context::examples::func-epilogue}. +% The comments explain the code line by line, please read them to understand what exactly happens at each instruction. -\cref{code::context::examples::func-callee-rust} shows the \gls{Rust} source code of the function \textit{sum}. - -% \subsubsection{Top-Level Page Table Self-Reference} -% \subsubsection{Caching Lookups} -% \subsubsection{Full Example} -% * http://taptipalit.blogspot.de/2013/10/theory-recursive-mapping-page.html -% * https://www.coresecurity.com/blog/getting-physical-extreme-abuse-of-intel-based-paging-systems-part-2-windows - -\begin{listing}[htb] - \tikzset{/minted/basename=callee-rust} - \begin{minted}[autogobble,linenos,breaklines=true]{rust} - TODO - \end{minted} - \caption{Procedure Call Example: Callee in Rust} - \label{code::context::examples::func-callee-rust} -\end{listing} - -\begin{listing}[htb] - \tikzset{/minted/basename=callee-rust} - \begin{minted}[autogobble,linenos,breaklines=true]{nasm} - TODO - \end{minted} - \caption{Procedure Call Example: Callee in Assembly} - \label{code::context::examples::func-callee-assembly} -\end{listing} - -\Cref{code::context::examples::func-caller-asm} shows a snippet of the calling function. -It stores the arguments within the registers according to the calling convention. -The caller doesn't alter the stack-frame pointer (RBP) or the stack pointer (RSP) registers before call, hence the called function must restore these if it alters them. - -\begin{listing} - \begin{minted}[escapeinside=??,highlightlines={},autogobble,linenos,breaklines=true]{nasm} - TODO - \end{minted} - \caption{Procedure Call Example: Caller Assembly} - \label{code::context::examples::func-caller-asm} -\end{listing} - -\begin{listing} - \begin{minted}[escapeinside=??,highlightlines={},autogobble,linenos,breaklines=true]{rust} - \end{minted} - TODO - \caption{Procedure Call Example: Caller in Rust} - \label{code::context::examples::func-caller-rust} -\end{listing} - -% \balloon{comment}{ - -% RDI, RSI, RDX, RCX, R8, R9, XMM0–7 - -\begin{table}[ht!] - \centering - \begin{tabular}{ r | >{\columncolor{YellowGreen}}c | l } - \multicolumn{1}{r}{RBP offset} & \multicolumn{1}{c}{Content} & \\ - $\uparrow$ & \cellcolor{white} & \\ - & \cellcolor{white} \dots \textit{beyond current stack} \dots & \\ - \hhline{~-~} - 0 & \textit{Previous RSP} & $\leftarrow$ RBP \\ - \hhline{~-~} - \vdots & \dots~~\textit{local variables}~~\dots & \\ - \hhline{~-~} - -0x30 & 3rd arg & \\ - \hhline{~|-|~} - -0x38 & 2nd arg & \\ - \hhline{~-~} - -0x40 & 1st arg & \\ - \hhline{~-~} - \vdots & \dots~~\textit{local variables}~~\dots & \\ - \hhline{~-~} - -0x60 & rdi & \\ - \hhline{~-~} - & \dots~~\textit{local variables}~~\dots & \\ - \hhline{~-~} - $RBP-RSP$ & \textit{unknown} & $\leftarrow$ RSP \\ - \hhline{~-~} - & \cellcolor{white} & \\ - $\downarrow$ & \cellcolor{white} & \\ - \end{tabular} -\end{table} - -\cref{code::context::examples::func-prologue} shows \textit{sum}'s prologue. -The corresponding epilogue is displayed in \cref{code::context::examples::func-epilogue}. -The comments explain the code line by line, please read them to understand what exactly happens at each instruction. +\Cref{code::context::examples::func-prologue,code::context::examples::func-epilogue} show assembly code of a callee's procedure pro- and epilogue. +Respectively, they show how the arguments are copied from the CPU registers onto the stack on entry, and the return value copied from the stack to the CPU register before return. \begin{listing}[ht!] \begin{minted}[escapeinside=??,linenos=false,breaklines=true]{nasm} @@ -797,17 +767,18 @@ $74f7: ret ; return to the caller, following the add \caption{Function Epilogue} \label{code::context::examples::func-epilogue} \end{listing} - -\cref{fig:proc-call-example-mem} displays - -\begin{figure} -\centering -\includegraphics[width=0.95\textwidth]{gfx/call-procedure-memory-content.png} -\caption{Memory Layout Throughout The Procedure Call Steps} -\label{fig:proc-call-example-mem} -\end{figure} \FloatBarrier +%\cref{fig:proc-call-example-mem} displays +% +%\begin{figure} +%\centering +%\includegraphics[width=0.95\textwidth]{gfx/call-procedure-memory-content.png} +%\caption{Memory Layout Throughout The Procedure Call Steps} +%\label{fig:proc-call-example-mem} +%\end{figure} +%\FloatBarrier + \section{Stack And Heap: Combined Usage} \label{context::os-dev-concepts::stackheap-combined} \Glspl{program} combine the usage of \gls{stack} and \gls{heap} use them for different purposes. @@ -1457,7 +1428,7 @@ From today's perspective it appears to be clearly inferior to younger \gls{os} l \section{LLVM: C and Rust} The \glsentrydesc{llvm} has become popular since it was introduced. -To demonstrate this, \cref{fig:llvm-research-papers-since-2002}\footnote{\url{TODO https://llvm.org/pubs/}} shows a statistic on how many research papers have been published yearly since 2002. +To demonstrate this, \cref{fig:llvm-research-papers-since-2002}\footnote{\url{https://llvm.org/pubs/}} shows a statistic on how many research papers have been published yearly since 2002. \begin{figure}[ht!] \centering diff --git a/src/docs/parts/research_and_development/research_and_development.tex b/src/docs/parts/research_and_development/research_and_development.tex index c5b3429..4732c63 100644 --- a/src/docs/parts/research_and_development/research_and_development.tex +++ b/src/docs/parts/research_and_development/research_and_development.tex @@ -349,10 +349,11 @@ The results are summarized in \cref{enc}. \section{Porting \glsentrytext{C} Vulnerabilities} \label{rnd::weakness-mitig-prev::porting-c-vulns} -In this chapter, the weakness manifestations given in \cref{context::weaknesses-mem-safety::manifestations} are rewritten in \gls{Rust} to examine if these are mitigated just by porting them. -This is done incrementally by first porting the vulnerability to unsafe Rust, followed by a rewrite to drop all unsafe code but keeping the intended functionality. +Unlike originally anticipated, the vulnerabilities were not manually ported to Rust. +Instead, the investigation of \cnameref{rnd::weakness-mitig-prev::stack-protection} and \cnameref{rnd::imezzos-preemptive-multitasking} was extended. + +However, \citeauthor{Beingessner2015} was able to identify an underlying pattern of the violation of implicitly trusted invariants a common cause for same-type weaknesses as listed in \cnameref{context::weaknesses-mem-safety::manifestations::cwe-ex}. -- TODO official CWE-119 examples \section{Stack Protection} \label{rnd::weakness-mitig-prev::stack-protection} @@ -432,14 +433,15 @@ ret \label{code::context::examples::sf-modification-simple-c-asm} \end{figure} -\Cref{TODO-callstack-manipulation} is an attempt to visualize what happens in memory and with the \gls{stack} and the \gls{cpu}'s RIP {64-Bit Instruction Pointer} register. - -\begin{figure} - \includegraphics[width=\textwidth]{gfx/TODO-callstack-manipulation} - \caption{TODO-callstack-manipulation} - \label{TODO-callstack-manipulation} -\end{figure} -\FloatBarrier +% \Cref{fig:callstack-manipulation} is an attempt to visualize what happens in memory and with the \gls{stack} and the \gls{cpu}'s RIP {64-Bit Instruction Pointer} register. +% +% \begin{figure} +% TODO +% \includegraphics[width=\textwidth]{gfx/TODO-callstack-manipulation} +% \caption{fig:callstack-manipulation} +% \label{fig:callstack-manipulation} +% \end{figure} +% \FloatBarrier \paragraph{Compiler Hardening - Placing A Canary Value} The manipulation can be mitigated on \gls{C} using the \code{-fstack-protection-all} option with the \gls{clang}. @@ -795,11 +797,11 @@ This one includes the previous findings and suggestions on how this information Dynamically sized stack variables have been omitted from the table since they are irrelevant. On stack variable-length-arrays and variadic arguments are not supported by \gls{Rust}, and there is no indication of other use-cases. -\chapter{\glsentrytext{LX} Modules Written In \glsentrytext{Rust}} -The numerous \gls{LX} vulnerabilities are a great motivator for using \gls{Rust} for \gls{LX} drivers. -This chapter presents the attempt to use \gls{Rust} for a simple buffer that is presented to userspace as a character device. - -- TODO: explain the difficulty to use the Kernel's C Macros, which are required to expose a character device +% \chapter{\glsentrytext{LX} Modules Written In \glsentrytext{Rust}} +% The numerous \gls{LX} vulnerabilities are a great motivator for using \gls{Rust} for \gls{LX} drivers. +% This chapter presents the attempt to use \gls{Rust} for a simple buffer that is presented to userspace as a character device. +% +% - TODO: explain the difficulty to use the Kernel's C Macros, which are required to expose a character device \chapter{Existing \glsentrytext{os}-Development Projects Based On Rust} \label{rnd::existing-os-dev-with-rust} @@ -811,49 +813,43 @@ In addition to presenting their content, the author's tangible influence on the As Rust is a relatively young language, the selection of research papers relevant for this study is limited. This is likely due to the fact that Rust hasn't been stabilized until May 15, 2015\footnote{\url{May 15, 2015}}, and relied on a runtime gargabe-collector for a long time of it's pre-stable existence. -\subsection{ - \citetitle{Levy2015a} -% \cite{Levy2015a} -} -\citeauthor{Levy2015a} have been using Rust to develop a new embedded system \gls{os} for microcontrollers called Tock. -They describe to find Rust's ownership model restricting by preventing safe resource sharing in embedded-typical event-based scenarios. -They made suggestions to extend the langauge with Execution Contexts, which would "allow programs to mutably borrow values multiple times as long as those borrows are never shared between threads. Execution contexts allow the compiler to distinguish such sharing from actual errors using only local analysis." - -On their website the authors recently made the following statement: -"After feedback from the Rust developers and the community, we were able to overcome those challanges without modifications to the language. We also learned that we understated how disruptive some of the changes we proposed would be to the language and do not believe they are worthwhile. This has been discussed extensively now in the Rust community. You should read this paper critically, not as conclusive scientific findings, but as the perspectives of the authors during a particular point in the development of Tock."\cite[/papers]{TockOS} - -\subsection{ - \citetitle{Beingessner2015} -% \cite{Beingessner2015} -} -Covered in \cref{rnd::rust} - -\subsection{ - \citetitle{Reed2015} -% \cite{Reed2015} -} -\subsection{ - \citetitle{Getreu2016} - \cite{Getreu2016} -} -\subsection{ - \citetitle{Balasubramanian2017} -% \cite{Balasubramanian2017} -} -\subsubsection{Software Fault Isolation} -- TODO: content from \cite{Balasubramanian2017} -\subsection{ - \citetitle{Nilsson2017} -% \cite{Nilsson2017} -} +It was decided not to summarize the references, but rather explain the gained insight in particular detail at each relevant occurence. -\section{Libraries} +% \subsection{ +% \citetitle{Levy2015a} +% \cite{Levy2015a} +% } -\subsection{Libfringe} -% TODO: https://github.com/edef1c/libfringe +% \paragraph{ +% \citetitle{Beingessner2015} +% \cite{Beingessner2015} +% } +% +% \paragraph{ +% \citetitle{Reed2015} +% \cite{Reed2015} +% } +% \paragraph{ +% \citetitle{Getreu2016} +% \cite{Getreu2016} +% } +% \paragraph{ +% \citetitle{Balasubramanian2017} +% \cite{Balasubramanian2017} +% } +% \paragraph{ +% \citetitle{Nilsson2017} +% \cite{Nilsson2017} +% } +% \section{Libraries} +% +% \subsection{Libfringe} +% % TODO: https://github.com/edef1c/libfringe +% +% \section{Systems} Most of the presented systems target the \gls{amd64} architecture; Tock OS, which is targeted towards an ARM variant, is the only exception. The interesting parts of each \gls{os} are their origin, intentions, their current state, the level of memory-safety, and what design or language features made this level possible. @@ -986,8 +982,15 @@ The main author of Redox OS has become an active contributor to the Rust languag The biggest achievement from the perspective of this study is the successful integration into Rust's libstd, which happened continuously and cannot be referenced easily. This allows programmers to use Rust with all it's features to develop programs for Redox OS. -% \subsection{Tock OS} -% Tock OS is "an embedded operating system designed for running multiple concurrent, mutually distrustful applications on low-memory and low-power microcontrollers."\cite{TockOS} +\subsection{Tock OS} +Tock OS is "an embedded operating system designed for running multiple concurrent, mutually distrustful applications on low-memory and low-power microcontrollers."\cite{TockOS} + +\citeauthor{Levy2015a} have been using Rust to develop a new embedded system \gls{os} for microcontrollers called Tock. +They describe to find Rust's ownership model restricting by preventing safe resource sharing in embedded-typical event-based scenarios. +They made suggestions to extend the langauge with Execution Contexts, which would "allow programs to mutably borrow values multiple times as long as those borrows are never shared between threads. Execution contexts allow the compiler to distinguish such sharing from actual errors using only local analysis." + +On their website the authors recently made the following statement: +"After feedback from the Rust developers and the community, we were able to overcome those challanges without modifications to the language. We also learned that we understated how disruptive some of the changes we proposed would be to the language and do not believe they are worthwhile. This has been discussed extensively now in the Rust community. You should read this paper critically, not as conclusive scientific findings, but as the perspectives of the authors during a particular point in the development of Tock."\cite[/papers]{TockOS} % % \subsubsection{Task Model} % \subsubsection{Memory Management} @@ -1095,7 +1098,7 @@ Any stack overflowing task is not scheduled anymore. The stack size is statically defined and is allocated globally by the compiler. The implementation uses no dynamic memory allocations, thus there was no experience gathered with managing dynamic memory within the \gls{os}. -The global state references might be accessed by any defined task, e.g. allowing TODO +The global state references might be accessed by any defined task, and require prohibition of unwanted access by at least making them \code{unsafe} mandatory. \section{System Clock Driver} diff --git a/src/docs/thesis.tex b/src/docs/thesis.tex index 789952f..8b3ee16 100644 --- a/src/docs/thesis.tex +++ b/src/docs/thesis.tex @@ -1,6 +1,8 @@ +% // vim: set ft=tex: \documentclass[12pt,a4paper]{report} -\overfullrule=5mm +%\overfullrule=5mm +\overfullrule=1cm \usepackage[utf8]{inputenc} @@ -78,6 +80,18 @@ \newcommand{\startdate}{2017/4/1} \newcommand{\submitdate}{2017/9/29} \newcommand{\buzzwords}{memory-safety, operating system development, rust, static software analysis, software vulnerability} +\renewcommand{\abstract}{% +This study evaluated Rust's guarantees on memory safety in the OS through static analysis. +Static analysis was identified as a requirement due to the assumption that humans tend to make mistakes and C was found to be an error prone language. +Rust, as an affine-typed borrow- and lifetime-checked systems language that is equipped with an ownership model, is considered a viable candidate for replacing C for today's OS development. +After identifying common weaknesses of memory vulnerabilities and their manifestations, the choice of programming language was verified as the most effective mitigation attempt. +Rust was chosen to act as a new candidate, and was found to be effective against common errors in buffer handling due to its ownership model and strong type system. +The language shown to be less error prone in memory intensive tasks like buffer handling, which has been identified as a common cause in software vulnerabilities. +After experimentation with various stack protection scenarios and implementing preemptive multitasking on top of interemezzOS, the downside was discovered that Rust cannot statically detect stack overflows of any type. +Implementing this detection was considered beyond scope, although requirements could be identified for future reference. +It was concluded that Rust's static checks of all kinds are a big improvement in OS development, where object orientation and other paradigms are not simple to manage. +Despite the failed hypotheses of guaranteeing full memory-safety in OS development, Rust is suggested as the language for today's and future OS development. +} % Numbered Subsubsections \setcounter{secnumdepth}{3} @@ -232,55 +246,22 @@ \makeatother \include{glossary} -\overfullrule=1cm \begin{document} - %TODO: \include{cover} + \include{cover} \pagestyle{front} \include{title} \pagestyle{preamble} \include{abstract} - %TODO: \include{affidavit} + \include{affidavit} \cleardoublepage \newcounter{roman_pagenumbers} % save page number \setcounter{roman_pagenumbers}{\value{page}} \pagestyle{main} %TODO \include{acknowledgments} - %TODO abstract - - \chapter*{Preface} - This thesis is original, unpublished, independent work by me, \authorOne. - I strongly believe in openness and collaboration in the development of new technology, therefore the development will be based solely on Open-Source software. - The source of this document and the code I have worked on will be freely available on my personal Gitlab site\footnote{https://gitlab.com/steveeJ/msc-thesis} once the academic process of this project is complete. - - \section*{Ehrenwörtliche Erklärung} - - Hiermit erkläre ich, {\authorOne}, geboren am {\authorOneBirthDate} in {\authorOneBirthCity}, - - \begin{enumerate} - \item{ - dass ich meine Masterarbeit mit dem Titel: - - {"\topic"} - - in der Fakultät Informatik unter Anleitung von Professor {\supervisorOne} und ohne fremde Hilfe angefertigt habe und keine anderen als die angeführten Hilfen benutzt habe; - } - \item{ - dass ich die Übernahme wörtlicher Zitate, von Tabellen, Zeichnungen, Bildern und Programmen aus der Literatur oder anderen Quellen (Internet) sowie die Verwendung der Gedanken anderer Autoren an den entsprechenden Stellen innerhalb der Arbeit gekennzeichnet habe; - } - \item{ - dass die eingereichten Abgabe-Exemplare in Papierform und im PDF-Format vollständig übereinstimmen. - } - \end{enumerate} - - Ich bin mir bewusst, dass eine falsche Erklärung rechtliche Folgen haben wird. - - \vspace{4cm} - Konstanz, 29.9.2017\hspace{5cm} \authorOne - \tableofcontents