From 3a8bbc2a86980031f179258973c950f37d3860b8 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Tue, 17 Oct 2023 18:40:41 +0200 Subject: [PATCH 01/53] Adds seminar LMS instructions for first module --- modules/02-passwd/01-seminar.md | 14 ++++++++++++++ modules/02-passwd/02-seminar.md | 12 ++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 modules/02-passwd/01-seminar.md create mode 100644 modules/02-passwd/02-seminar.md diff --git a/modules/02-passwd/01-seminar.md b/modules/02-passwd/01-seminar.md new file mode 100644 index 0000000..756cd4f --- /dev/null +++ b/modules/02-passwd/01-seminar.md @@ -0,0 +1,14 @@ +The library will come and talk about tools to use for searching and how to do +literature reviews. + +**Participation**: Online in the class Zoom room. Working webcam and microphone +is required. + +**Preparation**: The assignments that you just did (all previous material). You +need a device that you can work with web tools on. + +**Seminar content**: The library will talk about different types of literature +reviews. They will also present some useful tools for searching for literature. +We'll use these tools to search for literature to answer some of the research +questions we've discussed in the preparation material. (That's why you need a +device to work on.) diff --git a/modules/02-passwd/02-seminar.md b/modules/02-passwd/02-seminar.md new file mode 100644 index 0000000..f5f43bd --- /dev/null +++ b/modules/02-passwd/02-seminar.md @@ -0,0 +1,12 @@ +**Participation**: Online in the class Zoom room. Working webcam and microphone +is required. + +**Preparation**: The assignments that you just did (all previous material from +last seminar until now). + +**Seminar content**: We will discuss the papers that you've worked with. + +Particularly, we'll discuss how they relate to the research questions that was +the origin of the discussion. What we're interested in is how well these papers +answer those research questions and, particularly, how we can answer *exactly* +those questions. From 401758c14605fc22a86b2bcd982a2774b6b906d0 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 31 Jan 2024 10:30:28 +0100 Subject: [PATCH 02/53] Adds slides to course overview --- course-design/contents.tex | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/course-design/contents.tex b/course-design/contents.tex index faae245..9dcdc32 100644 --- a/course-design/contents.tex +++ b/course-design/contents.tex @@ -531,7 +531,14 @@ \subsection{Format} \mode{% \begin{frame} - \begin{block}{Assessment} + \begin{block}{Teaching}<+> + \begin{itemize} + \item Reading material and watching videos. + \item Discuss and work with material at synchronous seminars. + \end{itemize} + \end{block} + + \begin{block}{Assessment}<+> \begin{itemize} \item A synchronous seminar to summarize all work and tie the sack. \end{itemize} @@ -728,6 +735,17 @@ \subsection{Final assessment} \end{question} \end{frame} +\begin{onlyenv} +\section{The material} + +\begin{frame}[fragile] + \begin{center} + \huge + Canvas + \end{center} +\end{frame} +\end{onlyenv} + %%% REFERENCES %%% From e69720ec94dc4468a0862c1648b90da6e01c9d35 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 31 Jan 2024 23:05:37 +0100 Subject: [PATCH 03/53] Improves 02-passwd slides for seminar --- modules/02-passwd/contents.tex | 99 ++++++++++++++++++++++++---------- modules/02-passwd/slides.tex | 2 +- 2 files changed, 71 insertions(+), 30 deletions(-) diff --git a/modules/02-passwd/contents.tex b/modules/02-passwd/contents.tex index 4aba4a6..85c8384 100644 --- a/modules/02-passwd/contents.tex +++ b/modules/02-passwd/contents.tex @@ -24,23 +24,19 @@ \clearpage -\section{Introduction} +\section
{Introduction} -\begin{frame} We've had passwords for about as long as we've had computers. Unfortunately, we still\footnote{As of \today.} haven't managed to do it right in practice. -\end{frame} So here we'll deal with the following question. -\begin{frame} - \begin{question}\label{RQ} - How can we know how secure our password-based authentication system will be? - \end{question} -\end{frame} +\begin{question}\label{RQ} + How can we know how secure our password-based authentication system will be? +\end{question} -\section{How do we know it's secure?} +\section[How do we know?]{How do we know it's secure?} \begin{frame} We have a system where users log in. @@ -48,16 +44,17 @@ \section{How do we know it's secure?} We've decided to use a password-based authentication system\footnote{% Yes, I know it's a bit of an oxymoron, but humor me. }. -\end{frame} -\begin{frame} \begin{exercise} - What do we need to know to try to answer \cref{RQ}? + What do we need to know to try to answer + \only
{\cref{RQ}}% + \only{how secure this will be}% + ? \end{exercise} \end{frame} -\section{What do we mean by secure?} +\section[Define secure?]{What do we mean by secure?} Well, first of all, we need to define what we mean by \enquote{being secure}. \Cref{RQ} asks us to estimate how secure a password-based authentication system @@ -123,23 +120,24 @@ \subsection{Literature reviews} \begin{frame} \begin{exercise} - We want to investigate the most common definitions of security for - authentication systems and for which types of authentication systems + We want to investigate \alert<2>{the most common} definitions of security + for authentication systems and for which types of authentication systems they're used. Which type of literature review should we do; systematic or non-systematic? Why? \end{exercise} -\end{frame} + \begin{onlyenv}
In this case, the goal is to get an overview of the literature. Since purpose is to research what definitions there are and how they're used, we must document our method of research. This means that we should do a systematic literature review. + \end{onlyenv} -\begin{frame} \begin{exercise} - We want to explore different definitions of security for authentication - systems to find a definition to use for our study. + We want to \alert<2>{explore \only<2>{\textins{some} }different} + definitions of security for authentication systems to find a definition to + use for our study. Which type of literature review should we do; systematic or non-systematic? Why? \end{exercise} @@ -279,14 +277,10 @@ \subsection{Deductive evaluation} \end{frame} A uniform distribution means that -\begin{frame} - all passwords are equally likely (\(\frac{1}{N^n}\)) -\end{frame} +all passwords are equally likely (\(\frac{1}{N^n}\)) and that -\begin{frame} - the Shannon entropy is maximized and equal to \(-\log \frac{1}{N^n} = n \log - {N}\), -\end{frame} +the Shannon entropy is maximized and equal to \(-\log \frac{1}{N^n} = n \log +{N}\), where \(N\) is the number of possible characters and \(n\) is the length of the password. @@ -306,6 +300,14 @@ \subsection{Deductive evaluation} Is it really secure, why or why not? How can we answer this question? \end{exercise} + + \begin{solution} + We can try forcing some user-generated passwords. + + We've assumed that the passwords are uniformly distributed. + But are they? + How can we find out? + \end{solution} \end{frame} \subsection{Empirical evaluation} @@ -328,10 +330,10 @@ \subsection{Empirical evaluation} So we should change the question into the following. \begin{frame} -\begin{question} +\begin{question}[Password distribution] How does different password policies affect the password distribution? \end{question} -\begin{question}\label{Guessability} +\begin{question}[Password distribution, guessability]\label{Guessability} How easily can we guess the passwords under different password policies? \end{question} \begin{exercise} @@ -349,6 +351,16 @@ \subsection{Empirical evaluation} We will explore these papers to see how they tried to answer these questions, so we'll return to them. +\begin{frame} + \begin{example}[Password distribution, guessability] + \fullcite{OfPasswordsAndPeople} + \end{example} + + \begin{example}[Guessability, usability] + \fullcite{CanLongPasswordsBeSecureAndUsable} + \end{example} +\end{frame} + However, we can do other estimates deductively too. For instance, we have the very famous \enquote{correct horse battery staple} from xkcd (\cref{xkcd936}). @@ -366,7 +378,13 @@ \subsection{Empirical evaluation} \end{figure} \end{frame} -\section{But is it even a good model to begin with?} +\begin{frame} + \begin{exercise} + Did any of the papers answer the question of how the passwords are chosen? + \end{exercise} +\end{frame} + +\section[Is it a good model?]{But is it even a good model to begin with?} \begin{frame} \begin{exercise} @@ -385,9 +403,23 @@ \section{But is it even a good model to begin with?} \begin{frame} \begin{question} Can the verifier be an adversary or is the verifier always benign? + What are the consequences of this? \end{question} \end{frame} +\begin{frame} + \begin{example} + \fullcite{WhyPhishingWorks} + \end{example} + + \pause + + \begin{example}[Consequences] + We need the zero-knowledge property in our security definition. + (We actually need \emph{malicious}, not honest, verifier zero-knowledge. + \end{example} +\end{frame} + Now this depends on the users. Can they tell a benign verifier from an adversary? Turns out they can't\autocite{WhyPhishingWorks}. @@ -416,6 +448,15 @@ \section{But is it even a good model to begin with?} answered this question. So we'll return to this paper later. + +\section{Conclusion} + +\begin{frame} + We might need a qualitative (\eg usability) study + \only{\newline}% + to inform our deductive (\eg cryptographic) choices. +\end{frame} + %\begin{frame} % \begin{question} % Are there more reasons? diff --git a/modules/02-passwd/slides.tex b/modules/02-passwd/slides.tex index 2287028..395cdf5 100644 --- a/modules/02-passwd/slides.tex +++ b/modules/02-passwd/slides.tex @@ -20,7 +20,7 @@ \end{beamercolorbox} } \setbeamercovered{transparent} -\setbeamertemplate{bibliography item}[text] +\setbeamertemplate{bibliography item}{\relax} \AtBeginSection[]{% \begin{frame} From 684dd0aed01a7c7be3e318cd8e506837e9d3df7e Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 29 Feb 2024 09:13:27 +0100 Subject: [PATCH 04/53] Adds WIP on anonymity module --- modules/04-anonymous/Makefile | 31 +++++++ modules/04-anonymous/abstract.tex | 30 +++++++ modules/04-anonymous/bibliography.bib | 0 modules/04-anonymous/contents.tex | 115 ++++++++++++++++++++++++++ modules/04-anonymous/notes.tex | 64 ++++++++++++++ modules/04-anonymous/preamble.tex | 55 ++++++++++++ modules/04-anonymous/seminar.md | 9 ++ modules/04-anonymous/slides.tex | 106 ++++++++++++++++++++++++ 8 files changed, 410 insertions(+) create mode 100644 modules/04-anonymous/Makefile create mode 100644 modules/04-anonymous/abstract.tex create mode 100644 modules/04-anonymous/bibliography.bib create mode 100644 modules/04-anonymous/contents.tex create mode 100644 modules/04-anonymous/notes.tex create mode 100644 modules/04-anonymous/preamble.tex create mode 100644 modules/04-anonymous/seminar.md create mode 100644 modules/04-anonymous/slides.tex diff --git a/modules/04-anonymous/Makefile b/modules/04-anonymous/Makefile new file mode 100644 index 0000000..3a73932 --- /dev/null +++ b/modules/04-anonymous/Makefile @@ -0,0 +1,31 @@ +.PHONY: all +all: notes.pdf slides.pdf + +LATEXFLAGS+= -shell-escape + +SRC+= preamble.tex +SRC+= abstract.tex contents.tex + +DEPENDS+= objectives.tex + +notes.pdf: notes.tex +notes.pdf: ${SRC} ${DEPENDS} ${FIGS} + +slides.pdf: slides.tex +slides.pdf: ${SRC} ${DEPENDS} ${FIGS} + +objectives.tex: ../../course-design/objectives.tex + +${DEPENDS}: + ${LN} $< $@ + + +.PHONY: clean +clean: + ${RM} notes.pdf slides.pdf + ${RM} ${DEPENDS} + ${MAKE} -C fig clean + + +INCLUDE_MAKEFILES=../../makefiles +include ${INCLUDE_MAKEFILES}/tex.mk diff --git a/modules/04-anonymous/abstract.tex b/modules/04-anonymous/abstract.tex new file mode 100644 index 0000000..ae4a777 --- /dev/null +++ b/modules/04-anonymous/abstract.tex @@ -0,0 +1,30 @@ +% What's the problem? +% Why is it a problem? Research gap left by other approaches? +% Why is it important? Why care? +% What's the approach? How to solve the problem? +% What's the findings? How was it evaluated, what are the results, limitations, +% what remains to be done? + +% XXX Summary +\emph{Summary:} +In this assignment we will explore the research methods used in the area of +anonymous communication systems, such as Tor. +This is interesting because it requires a wide range of methods. + +% XXX Motivation and intended learning outcomes +\emph{Intended learning outcomes:} +This assignment focuses on practice to +\begin{itemize} + \item \LOrelate; + \item \LOevaluate; + \item \LOapply; + \item \LOcomm. +\end{itemize} + +% XXX Prerequisites +\emph{Prerequisites:} +We need basic knowledge of security, corresponding to an introductory course in +the subject. +We also need a high-level overview of the breadth of research methods used in +the area of security, corresponding to the overview lecture \enquote{The +Scientific Method} given in the course. diff --git a/modules/04-anonymous/bibliography.bib b/modules/04-anonymous/bibliography.bib new file mode 100644 index 0000000..e69de29 diff --git a/modules/04-anonymous/contents.tex b/modules/04-anonymous/contents.tex new file mode 100644 index 0000000..2bc200c --- /dev/null +++ b/modules/04-anonymous/contents.tex @@ -0,0 +1,115 @@ +\title{% + How do you know it's secure? + Anonymous communication +} +\author{Daniel Bosk\thanks{% + This material is available under the Creative Commons + Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 international + license. + The material was written with some aid from GitHub Copilot. +}} +\institute{% + KTH EECS +} + +\begin{frame} + \maketitle +\end{frame} + +\mode* + +\begin{abstract} + \input{abstract.tex} +\end{abstract} + +\clearpage + +\section{Users get routed} + +\begin{frame} + \begin{question}[Users get routed] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item Why do we need to use empirical methods in this case? + \item What effect does data have on validity? + \end{itemize} + \end{question} +\end{frame} + +\section{Shadow: Running Tor in a box} + +\begin{frame} + \begin{question}[Shadow: Running Tor in a box] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item They evaluate the quality of a research tool. + \item What are the challenges in doing that? + \end{itemize} + \end{question} +\end{frame} + +\section{WF with Website Oracles} + +\begin{frame} + \begin{question}[WF with Website Oracles] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item What type of contribution do we get from this paper? + What is the Website Oracle? + \item How do they show WOs exist in reality? + \end{itemize} + \end{question} +\end{frame} + +\section{Evaluating WF in Real World} + +\begin{frame} + \begin{question}[Evaluating WF in Real World] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item They complained about the evaluation of WF in other papers. + What was the problem? + \item Are there any problems with this paper's approach? + \end{itemize} + \end{question} +\end{frame} diff --git a/modules/04-anonymous/notes.tex b/modules/04-anonymous/notes.tex new file mode 100644 index 0000000..49b372d --- /dev/null +++ b/modules/04-anonymous/notes.tex @@ -0,0 +1,64 @@ +\documentclass[a4paper,10pt,article,oneside]{memoir} +%%% Tufte %%% +\usepackage{marginfix} +%\setlength{\evensidemargin}{\oddsidemargin} +\marginparmargin{outer} +\setlrmarginsandblock{2.5cm}{8cm}{*} + +\footnotesinmargin + +\usepackage{ragged2e} +\renewcommand{\sidefootform}{\RaggedRight} +\renewcommand{\foottextfont}{\footnotesize\RaggedRight} + +\setmpjustification{\RaggedRight}{\RaggedRight} + +% margin figure and caption typeset ragged against text block +\setfloatadjustment{marginfigure}{\mpjustification} +\setmarginfloatcaptionadjustment{figure}{\captionstyle{\mpjustification}} + +% From https://tex.stackexchange.com/a/324757/17418 +% Palatino for main text and math +\usepackage[osf,sc]{mathpazo} + +% Helvetica for sans serif +% (scaled to match size of Palatino) +\usepackage[scaled=0.90]{helvet} + +% Bera Mono for monospaced +% (scaled to match size of Palatino) +\usepackage[scaled=0.85]{beramono} + +\setlxvchars\setxlvchars +\checkandfixthelayout + +\nouppercaseheads +%%% end tufte %%% +\let\subsubsection\subsection +\let\subsection\section +\let\section\chapter + +\input{preamble.tex} + +\usepackage[noamsthm,notheorems]{beamerarticle} +\setjobnamebeamerversion{slides} + +%\usepackage{authblk} +%\let\institute\affil + +\declaretheorem[style=theorem]{theorem} +\declaretheorem[style=definition]{definition} +\declaretheorem[style=definition]{assumption} +\declaretheorem[style=definition]{protocol} +\declaretheorem[style=example]{example} +\declaretheorem[style=remark]{remark} +\declaretheorem[style=remark]{idea} +\declaretheorem[style=exercise]{exercise} +\declaretheorem[style=exercise]{question} +\declaretheorem[style=solution]{solution} + +\begin{document} +\input{contents.tex} + +\printbibliography +\end{document} diff --git a/modules/04-anonymous/preamble.tex b/modules/04-anonymous/preamble.tex new file mode 100644 index 0000000..dce955a --- /dev/null +++ b/modules/04-anonymous/preamble.tex @@ -0,0 +1,55 @@ +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[british]{babel} +\usepackage{booktabs} + +\usepackage[% + natbib, + citestyle=verbose,singletitle=false, + style=verbose, + maxbibnames=99,% + isbn=false,doi=false,url=true +]{biblatex} +\addbibresource{bibliography.bib} + +\usepackage[all]{foreign} +\renewcommand{\foreignfullfont}{} +\renewcommand{\foreignabbrfont}{} + +\usepackage{import} + +\usepackage[strict]{csquotes} +\SetCiteCommand{\autocite} +\usepackage[single]{acro} +\acsetup{cite/cmd={\autocite}} + +\usepackage[noend]{algpseudocode} +\usepackage{xparse} + +\let\email\texttt + +\usepackage[outputdir=ltxobj]{minted} +\setminted{autogobble} + +\usepackage{pythontex} +\setpythontexoutputdir{.} +\setpythontexworkingdir{..} + +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{mathtools} +\usepackage{amsthm} +\usepackage{thmtools} +%\usepackage[unq]{unique} +\DeclareMathOperator{\powerset}{\mathcal{P}} + +\usepackage[binary-units]{siunitx} + +\usepackage{adjustbox} +\usepackage{lipsum} +\usepackage{multicol} +\usepackage{changepage} + +\usepackage[capitalize]{cleveref} + +\input{objectives.tex} diff --git a/modules/04-anonymous/seminar.md b/modules/04-anonymous/seminar.md new file mode 100644 index 0000000..cf03b91 --- /dev/null +++ b/modules/04-anonymous/seminar.md @@ -0,0 +1,9 @@ +We will talk about some methods used in researching Tor, this covers a variety +of methods ranging from deductive to empirical experiments to simulations. + +**Participation**: online in the class Zoom room. + +**Preparation**: The material in this module that precedes this page. + +**Seminar content**: Briefly discuss the methods and research questions. + diff --git a/modules/04-anonymous/slides.tex b/modules/04-anonymous/slides.tex new file mode 100644 index 0000000..395cdf5 --- /dev/null +++ b/modules/04-anonymous/slides.tex @@ -0,0 +1,106 @@ +\documentclass[ignoreframetext]{beamer} +\input{preamble.tex} + +\usetheme{Berlin} +\setbeamertemplate{footline}%{miniframes theme} +{% + \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} + \end{beamercolorbox} + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% + \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% + \hfill% + {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% + \end{beamercolorbox}% + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% + {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% + \end{beamercolorbox}% + \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} + \end{beamercolorbox} +} +\setbeamercovered{transparent} +\setbeamertemplate{bibliography item}{\relax} + +\AtBeginSection[]{% + \begin{frame} + \tableofcontents[currentsection] + \end{frame} +} + +\ProvideDocumentEnvironment{assumption}{o}{% + \IfValueTF{#1}{% + \begin{block}{Assumption: #1} + }{% + \begin{block}{Assumption} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{protocol}{o}{% + \IfValueTF{#1}{% + \begin{block}{Protocol: #1} + }{% + \begin{block}{Protocol} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{remark}{o}{% + \IfValueTF{#1}{% + \begin{alertblock}{Note: #1} + }{% + \begin{alertblock}{Note} + } +}{% + \end{alertblock} +} + +\ProvideDocumentEnvironment{idea}{o}{% + \IfValueTF{#1}{% + \begin{block}{Idea: #1} + }{% + \begin{block}{Idea} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{question}{o}{% + \setbeamercolor{block body}{bg=orange!15,fg=black} + \setbeamercolor{block title}{bg=orange,fg=white} + \setbeamercolor{local structure}{fg=orange} + \IfValueTF{#1}{% + \begin{block}{Question: #1} + }{% + \begin{block}{Question} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{exercise}{o}{% + \setbeamercolor{block body}{bg=yellow!10,fg=black} + \setbeamercolor{block title}{bg=yellow,fg=black} + \setbeamercolor{local structure}{fg=yellow} + \IfValueTF{#1}{% + \begin{block}{Exercise: #1} + }{% + \begin{block}{Exercise} + } +}{% + \end{block} +} + + +\begin{document} +\mode +\input{contents.tex} +\mode* + +\begin{frame}[allowframebreaks] + \printbibliography +\end{frame} +\end{document} From 182e947811f5009186b7fe623dedb11e82d79be4 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 29 Feb 2024 09:17:41 +0100 Subject: [PATCH 05/53] Adds empty fig/ and missing .gitignore --- modules/04-anonymous/.gitignore | 4 ++++ modules/04-anonymous/fig/.gitignore | 2 ++ modules/04-anonymous/fig/Makefile | 5 +++++ 3 files changed, 11 insertions(+) create mode 100644 modules/04-anonymous/.gitignore create mode 100644 modules/04-anonymous/fig/.gitignore create mode 100644 modules/04-anonymous/fig/Makefile diff --git a/modules/04-anonymous/.gitignore b/modules/04-anonymous/.gitignore new file mode 100644 index 0000000..85d632d --- /dev/null +++ b/modules/04-anonymous/.gitignore @@ -0,0 +1,4 @@ +notes.pdf +slides.pdf +objectives.tex +literature diff --git a/modules/04-anonymous/fig/.gitignore b/modules/04-anonymous/fig/.gitignore new file mode 100644 index 0000000..2bc47a4 --- /dev/null +++ b/modules/04-anonymous/fig/.gitignore @@ -0,0 +1,2 @@ +password_reuse.png +password_strength.png diff --git a/modules/04-anonymous/fig/Makefile b/modules/04-anonymous/fig/Makefile new file mode 100644 index 0000000..ea16ce9 --- /dev/null +++ b/modules/04-anonymous/fig/Makefile @@ -0,0 +1,5 @@ +.PHONY: all +all: + +.PHONY: clean +clean: From 182b4e4aadbc9812b014fcd54bda413a8a67ca4a Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 29 Feb 2024 16:35:19 +0100 Subject: [PATCH 06/53] Adds WIP on scientificity module --- modules/05-scientificity/.gitignore | 4 + modules/05-scientificity/Makefile | 31 +++++++ modules/05-scientificity/abstract.tex | 28 ++++++ modules/05-scientificity/bibliography.bib | 0 modules/05-scientificity/contents.tex | 48 ++++++++++ modules/05-scientificity/fig/Makefile | 5 + modules/05-scientificity/notes.tex | 64 +++++++++++++ modules/05-scientificity/preamble.tex | 55 +++++++++++ modules/05-scientificity/seminar.md | 11 +++ modules/05-scientificity/slides.tex | 106 ++++++++++++++++++++++ 10 files changed, 352 insertions(+) create mode 100644 modules/05-scientificity/.gitignore create mode 100644 modules/05-scientificity/Makefile create mode 100644 modules/05-scientificity/abstract.tex create mode 100644 modules/05-scientificity/bibliography.bib create mode 100644 modules/05-scientificity/contents.tex create mode 100644 modules/05-scientificity/fig/Makefile create mode 100644 modules/05-scientificity/notes.tex create mode 100644 modules/05-scientificity/preamble.tex create mode 100644 modules/05-scientificity/seminar.md create mode 100644 modules/05-scientificity/slides.tex diff --git a/modules/05-scientificity/.gitignore b/modules/05-scientificity/.gitignore new file mode 100644 index 0000000..85d632d --- /dev/null +++ b/modules/05-scientificity/.gitignore @@ -0,0 +1,4 @@ +notes.pdf +slides.pdf +objectives.tex +literature diff --git a/modules/05-scientificity/Makefile b/modules/05-scientificity/Makefile new file mode 100644 index 0000000..3a73932 --- /dev/null +++ b/modules/05-scientificity/Makefile @@ -0,0 +1,31 @@ +.PHONY: all +all: notes.pdf slides.pdf + +LATEXFLAGS+= -shell-escape + +SRC+= preamble.tex +SRC+= abstract.tex contents.tex + +DEPENDS+= objectives.tex + +notes.pdf: notes.tex +notes.pdf: ${SRC} ${DEPENDS} ${FIGS} + +slides.pdf: slides.tex +slides.pdf: ${SRC} ${DEPENDS} ${FIGS} + +objectives.tex: ../../course-design/objectives.tex + +${DEPENDS}: + ${LN} $< $@ + + +.PHONY: clean +clean: + ${RM} notes.pdf slides.pdf + ${RM} ${DEPENDS} + ${MAKE} -C fig clean + + +INCLUDE_MAKEFILES=../../makefiles +include ${INCLUDE_MAKEFILES}/tex.mk diff --git a/modules/05-scientificity/abstract.tex b/modules/05-scientificity/abstract.tex new file mode 100644 index 0000000..b2a93c6 --- /dev/null +++ b/modules/05-scientificity/abstract.tex @@ -0,0 +1,28 @@ +% What's the problem? +% Why is it a problem? Research gap left by other approaches? +% Why is it important? Why care? +% What's the approach? How to solve the problem? +% What's the findings? How was it evaluated, what are the results, limitations, +% what remains to be done? + +% XXX Summary +\emph{Summary:} +In this module we will try to overview the methodological state of security. + +% XXX Motivation and intended learning outcomes +\emph{Intended learning outcomes:} +This assignment focuses on practice to +\begin{itemize} + \item \LOrelate; + \item \LOevaluate; + \item \LOapply; + \item \LOcomm. +\end{itemize} + +% XXX Prerequisites +\emph{Prerequisites:} +We need basic knowledge of security, corresponding to an introductory course in +the subject. +We also need a high-level overview of the breadth of research methods used in +the area of security, corresponding to the overview lecture \enquote{The +Scientific Method} given in the course. diff --git a/modules/05-scientificity/bibliography.bib b/modules/05-scientificity/bibliography.bib new file mode 100644 index 0000000..e69de29 diff --git a/modules/05-scientificity/contents.tex b/modules/05-scientificity/contents.tex new file mode 100644 index 0000000..8e8915a --- /dev/null +++ b/modules/05-scientificity/contents.tex @@ -0,0 +1,48 @@ +\title{% + Scientificity in Security +} +\author{Daniel Bosk\thanks{% + This material is available under the Creative Commons + Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 international + license. + The material was written with some aid from GitHub Copilot. +}} +\institute{% + KTH EECS +} + +\begin{frame} + \maketitle +\end{frame} + +\mode* + +\begin{abstract} + \input{abstract.tex} +\end{abstract} + +\clearpage + +\section{How to design computer security experiments} + +\section{Dos and don'ts of machine learning in security} + +\begin{frame} + \begin{question} + \begin{itemize} + \item What can we actually say from these results, based on their method? + \end{itemize} + \end{question} +\end{frame} + +\section{Security as a scientific pursuit} + +\begin{frame} + \begin{question} + \begin{itemize} + \item How did they know that this is so? + \item What can we actually say from these results? + \end{itemize} + \end{question} +\end{frame} + diff --git a/modules/05-scientificity/fig/Makefile b/modules/05-scientificity/fig/Makefile new file mode 100644 index 0000000..ea16ce9 --- /dev/null +++ b/modules/05-scientificity/fig/Makefile @@ -0,0 +1,5 @@ +.PHONY: all +all: + +.PHONY: clean +clean: diff --git a/modules/05-scientificity/notes.tex b/modules/05-scientificity/notes.tex new file mode 100644 index 0000000..49b372d --- /dev/null +++ b/modules/05-scientificity/notes.tex @@ -0,0 +1,64 @@ +\documentclass[a4paper,10pt,article,oneside]{memoir} +%%% Tufte %%% +\usepackage{marginfix} +%\setlength{\evensidemargin}{\oddsidemargin} +\marginparmargin{outer} +\setlrmarginsandblock{2.5cm}{8cm}{*} + +\footnotesinmargin + +\usepackage{ragged2e} +\renewcommand{\sidefootform}{\RaggedRight} +\renewcommand{\foottextfont}{\footnotesize\RaggedRight} + +\setmpjustification{\RaggedRight}{\RaggedRight} + +% margin figure and caption typeset ragged against text block +\setfloatadjustment{marginfigure}{\mpjustification} +\setmarginfloatcaptionadjustment{figure}{\captionstyle{\mpjustification}} + +% From https://tex.stackexchange.com/a/324757/17418 +% Palatino for main text and math +\usepackage[osf,sc]{mathpazo} + +% Helvetica for sans serif +% (scaled to match size of Palatino) +\usepackage[scaled=0.90]{helvet} + +% Bera Mono for monospaced +% (scaled to match size of Palatino) +\usepackage[scaled=0.85]{beramono} + +\setlxvchars\setxlvchars +\checkandfixthelayout + +\nouppercaseheads +%%% end tufte %%% +\let\subsubsection\subsection +\let\subsection\section +\let\section\chapter + +\input{preamble.tex} + +\usepackage[noamsthm,notheorems]{beamerarticle} +\setjobnamebeamerversion{slides} + +%\usepackage{authblk} +%\let\institute\affil + +\declaretheorem[style=theorem]{theorem} +\declaretheorem[style=definition]{definition} +\declaretheorem[style=definition]{assumption} +\declaretheorem[style=definition]{protocol} +\declaretheorem[style=example]{example} +\declaretheorem[style=remark]{remark} +\declaretheorem[style=remark]{idea} +\declaretheorem[style=exercise]{exercise} +\declaretheorem[style=exercise]{question} +\declaretheorem[style=solution]{solution} + +\begin{document} +\input{contents.tex} + +\printbibliography +\end{document} diff --git a/modules/05-scientificity/preamble.tex b/modules/05-scientificity/preamble.tex new file mode 100644 index 0000000..dce955a --- /dev/null +++ b/modules/05-scientificity/preamble.tex @@ -0,0 +1,55 @@ +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[british]{babel} +\usepackage{booktabs} + +\usepackage[% + natbib, + citestyle=verbose,singletitle=false, + style=verbose, + maxbibnames=99,% + isbn=false,doi=false,url=true +]{biblatex} +\addbibresource{bibliography.bib} + +\usepackage[all]{foreign} +\renewcommand{\foreignfullfont}{} +\renewcommand{\foreignabbrfont}{} + +\usepackage{import} + +\usepackage[strict]{csquotes} +\SetCiteCommand{\autocite} +\usepackage[single]{acro} +\acsetup{cite/cmd={\autocite}} + +\usepackage[noend]{algpseudocode} +\usepackage{xparse} + +\let\email\texttt + +\usepackage[outputdir=ltxobj]{minted} +\setminted{autogobble} + +\usepackage{pythontex} +\setpythontexoutputdir{.} +\setpythontexworkingdir{..} + +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{mathtools} +\usepackage{amsthm} +\usepackage{thmtools} +%\usepackage[unq]{unique} +\DeclareMathOperator{\powerset}{\mathcal{P}} + +\usepackage[binary-units]{siunitx} + +\usepackage{adjustbox} +\usepackage{lipsum} +\usepackage{multicol} +\usepackage{changepage} + +\usepackage[capitalize]{cleveref} + +\input{objectives.tex} diff --git a/modules/05-scientificity/seminar.md b/modules/05-scientificity/seminar.md new file mode 100644 index 0000000..214c67f --- /dev/null +++ b/modules/05-scientificity/seminar.md @@ -0,0 +1,11 @@ +We will talk about scientificity in security. + +**Participation**: online in the class Zoom room. + +**Preparation**: The material in this module that precedes this page. + +**Seminar content**: Briefly discuss the methods and research questions of the +papers. Discuss the role of the scientific method in security and what doing +security in a scientific way means. + +We'll also introduce the final assignment. diff --git a/modules/05-scientificity/slides.tex b/modules/05-scientificity/slides.tex new file mode 100644 index 0000000..395cdf5 --- /dev/null +++ b/modules/05-scientificity/slides.tex @@ -0,0 +1,106 @@ +\documentclass[ignoreframetext]{beamer} +\input{preamble.tex} + +\usetheme{Berlin} +\setbeamertemplate{footline}%{miniframes theme} +{% + \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} + \end{beamercolorbox} + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% + \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% + \hfill% + {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% + \end{beamercolorbox}% + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% + {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% + \end{beamercolorbox}% + \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} + \end{beamercolorbox} +} +\setbeamercovered{transparent} +\setbeamertemplate{bibliography item}{\relax} + +\AtBeginSection[]{% + \begin{frame} + \tableofcontents[currentsection] + \end{frame} +} + +\ProvideDocumentEnvironment{assumption}{o}{% + \IfValueTF{#1}{% + \begin{block}{Assumption: #1} + }{% + \begin{block}{Assumption} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{protocol}{o}{% + \IfValueTF{#1}{% + \begin{block}{Protocol: #1} + }{% + \begin{block}{Protocol} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{remark}{o}{% + \IfValueTF{#1}{% + \begin{alertblock}{Note: #1} + }{% + \begin{alertblock}{Note} + } +}{% + \end{alertblock} +} + +\ProvideDocumentEnvironment{idea}{o}{% + \IfValueTF{#1}{% + \begin{block}{Idea: #1} + }{% + \begin{block}{Idea} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{question}{o}{% + \setbeamercolor{block body}{bg=orange!15,fg=black} + \setbeamercolor{block title}{bg=orange,fg=white} + \setbeamercolor{local structure}{fg=orange} + \IfValueTF{#1}{% + \begin{block}{Question: #1} + }{% + \begin{block}{Question} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{exercise}{o}{% + \setbeamercolor{block body}{bg=yellow!10,fg=black} + \setbeamercolor{block title}{bg=yellow,fg=black} + \setbeamercolor{local structure}{fg=yellow} + \IfValueTF{#1}{% + \begin{block}{Exercise: #1} + }{% + \begin{block}{Exercise} + } +}{% + \end{block} +} + + +\begin{document} +\mode +\input{contents.tex} +\mode* + +\begin{frame}[allowframebreaks] + \printbibliography +\end{frame} +\end{document} From 15d94bd7662b055a0eca5858b017d716b69c7354 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Fri, 5 Apr 2024 09:10:18 +0200 Subject: [PATCH 07/53] Clarifies the course overview --- course-design/contents.tex | 111 ++++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 25 deletions(-) diff --git a/course-design/contents.tex b/course-design/contents.tex index 9dcdc32..42b6b95 100644 --- a/course-design/contents.tex +++ b/course-design/contents.tex @@ -103,7 +103,7 @@ \section{Overview} The requirements for Master's level are set out in \citetitle{HEO2}~\autocite{HEO2}, namely: -\begin{frame}[fragile] +%\begin{frame}[fragile] \begin{block}{Master's goals: Knowledge and understanding~\autocite{HEO2}} \only
{\begin{enumerate}[label={(K\arabic*)},ref=K\arabic*]} \only{\begin{itemize}} @@ -117,9 +117,9 @@ \section{Overview} \only
{\end{enumerate}} \only{\end{itemize}} \end{block} -\end{frame} +%\end{frame} -\begin{frame}[fragile] +%\begin{frame}[fragile] \begin{block}{Master's goals: Competence and skills~\autocite{HEO2}} \only
{\begin{enumerate}[label={(C\arabic*)},ref=C\arabic*]} \only{\begin{itemize}} @@ -139,9 +139,9 @@ \section{Overview} \only{\end{itemize}} \only
{\end{enumerate}} \end{block} -\end{frame} +%\end{frame} -\begin{frame}[fragile] +%\begin{frame}[fragile] \begin{block}{Master's goals: Judgement and approach~\autocite{HEO2}} \only
{\begin{enumerate}[label={(J\arabic*)},ref=J\arabic*]} \only{\begin{itemize}} @@ -154,7 +154,7 @@ \section{Overview} \only{\end{itemize}} \only
{\end{enumerate}} \end{block} -\end{frame} +%\end{frame} \paragraph{Intended learning outcomes}\label{LearningOutcomes} @@ -184,7 +184,19 @@ \section{Overview} in order to be able to contribute to scientifically based development. \end{frame} -\subsection{Prerequisites} +There are also two learning outcomes related more to general skill, rather than +scientific method: +\begin{frame}[fragile] + After passing the course, the student should be able to + \begin{itemize} + \item plan and carry out assignments within given time frames and using + available resources, and + \item write short, clear and arguing texts based on own analysis as well as + given material. + \end{itemize} +\end{frame} + +\subsection
{Prerequisites} The course requires some prerequisites. In the area of cybersecurity, the student should be able to: @@ -312,6 +324,16 @@ \subsection{The goal} We can see this aspect in \ref{LOcomm} (and \ref{Ccomm}) and we will see this aspect as part of the assessment of the course later. +\begin{frame} + \begin{block}{Concrete goals} + \begin{itemize} + \item Ask good questions. + \item Use suitable methods to answer them. + \item Evaluate the suitability of proposed methods. + \end{itemize} + \end{block} +\end{frame} + \subsection{Teaching design} @@ -549,6 +571,7 @@ \subsection{Format} \begin{block}{Giving the course} \begin{enumerate} \item Given every period; yes, four times per year. + \item If you don't finish, you can try again next period. \end{enumerate} \end{block} \end{frame} @@ -645,17 +668,26 @@ \subsection{Contents} \end{frame} } -%\begin{frame} -% \begin{block}{Contents, part II} -% \begin{itemize} -% \item General introductions to various subfields. -% \item Which methods are used and why? -% \item Some exemplary papers? \alert<2>{Both good and bad!} -% \item How does a subfield fit into the holistic picture of Security? -% \end{itemize} -% \end{block} -%\end{frame} -% +\begin{frame} + \begin{block}{Contents, part II} + \begin{itemize} + \item General introductions to various subfields. + \item Which methods are used and why? + %\item Some exemplary papers? \alert<2>{Both good and bad!} + \item How does a subfield fit into the holistic picture of Security? + \item How can these methods fit into other situations? + \end{itemize} + \end{block} + + \begin{exercise} + \begin{itemize} + \item What is an area or problem that you're interested in (in security)? + \item Think of an interesting case that you can reflect on during the + course. + \end{itemize} + \end{exercise} +\end{frame} + %\begin{frame} % \begin{remark} % \begin{itemize} @@ -699,14 +731,43 @@ \subsection{Final assessment} LOrelate,LOcomm,LOplan,LOapply,LOevaluate% }. +\begin{frame} + \begin{block}{Final assessment} + \begin{itemize} + \item Design a research method for a given set of research questions. + \item Assess the suitability of the method. + \item Motivate the choices of methods. + \item Explain why the methods answer the questions. + \end{itemize} + \end{block} +\end{frame} + You'll do this by writing a report motivating your choices of methods and explaining why they answer the question. You'll also present this report at the final seminar. Someone else will review the report, and you will review someone else's report too. +\begin{frame} + \begin{block}{Final seminar and review} + \begin{itemize} + \item Present this at the final seminar. + \item Review someone else's report. + \end{itemize} + \end{block} +\end{frame} + The final assessment will be done in pairs. +\begin{frame} + \begin{remark} + \begin{itemize} + \item The final assessment will be done in pairs. + \item Up to three in a group is allowed. + \end{itemize} + \end{remark} +\end{frame} + %\begin{frame}[allowframebreaks] % \begin{block}{Assessment} % \begin{itemize} @@ -727,13 +788,13 @@ \subsection{Final assessment} % \end{block} %\end{frame} -\begin{frame} - \begin{question} - \begin{itemize} - \item Comments, questions, other thoughts? - \end{itemize} - \end{question} -\end{frame} +%\begin{frame} +% \begin{question} +% \begin{itemize} +% \item Comments, questions, other thoughts? +% \end{itemize} +% \end{question} +%\end{frame} \begin{onlyenv} \section{The material} From 5347596e6d75cd465ffdb62f79143079ef04663b Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Tue, 9 Apr 2024 13:51:01 +0200 Subject: [PATCH 08/53] Switches to didactic package with sidecaptions --- modules/02-passwd/2024-04-05-Note-14-56.xoj | Bin 0 -> 114749 bytes modules/02-passwd/contents.tex | 17 ++-- modules/02-passwd/notes.tex | 46 ---------- modules/02-passwd/preamble.tex | 1 + modules/02-passwd/slides.tex | 94 -------------------- 5 files changed, 11 insertions(+), 147 deletions(-) create mode 100644 modules/02-passwd/2024-04-05-Note-14-56.xoj diff --git a/modules/02-passwd/2024-04-05-Note-14-56.xoj b/modules/02-passwd/2024-04-05-Note-14-56.xoj new file mode 100644 index 0000000000000000000000000000000000000000..985fee87c08a2cee4689bacd478258729f46717e GIT binary patch literal 114749 zcmV)IK)k;niwFP!000001I)e4vLs1zrnkpa94W3@ZTAZWn0XCudw{~AWg1H_doyX_YV)IAKQ=X$CC2+;ky0H zAAb4cPyglr^oRcG=YRb7fBorCzkK}fAAkAjr;mU6<(Gf^KYsVSfBpS0|MKI%{^6G& zfBL6?|K0!n`+xuQ&;R}(zx&J2|NP7U{QaMQ`klYvcYpso+WNb{|F_@&_n$ug=O6y* zmw)+(A6CmhuKmNuzx?!v|Nbw({KF4@_aDo&H~+Wa|KtDo?^jcQ`lpXy{`23i4*%un zKmOsLe)#yupa1ytpa0>9|84)H{rl&Cwy*lnKVJ9$?T^3z!=HZm_}%r}KmPtdfBN(F z|6hLj^Uwd|r;lHL{`rsB{h$7He*NG6c(wjRbfWxN#z*>brt7lGb=l?P8n1j^a=I?1 zU6;DAOEcK=n@fs|o~z3)(=OdE)?V4sRI%rBwRbdoo4t4J>(cC!`*qQc)UJWZwf)%l z$5=n6t33nlV@!3?Krt}4KwAbz2I#Ri0NFt0&eg*UHTA|*1Gj-CL2Hl`2yLRF>rnBEI)1@yWTLbw-teFJm&Z@RY3iiSFabKf6Q%v zGH~^JC3~B|_*mt~)&=_fSk>mrz-%9@M{B!(tYO2K>-aHm18WLgKV6f)jUQ(*ph2AW z^jZwav>q790%O`^YY42Z2FAzV{r&HttnVkW^}z>eGJniQCgo5_9fxYxo69_p=ocbN zqrI|%u=0jvlMRE@R5h5EE=Eq*g1bIp3?nLmWxz)KfYb%XMGf7C;0E;(7Ya1H zW1TV3)xZ##Rqp{T5t_GlQOHGGdaV4IhLMxa#RabKxyWgDfol+E6$xJ8>geoRoflXl zCtC!q+TZ4~m1N+0`l6sb1m;Cf>PK$PR`*3gc?y(knj62l7C|<08eQP()kQ&rJF`0h z2u!1s($Ae`4CJ?xM%Hp-dTq^$PJisiBf8CYALr7~jU1O|6ktokSx`F!k&PCr(ZYH| z3$++CxP~j)>MO>WZg8!NhdX-A=<5PqpxEN6{+Nx!1umXp0Csdu?**!_{~}OWmtBAb zclFVLHL!g4jNa=OEiCcZcJ;WNdA&YKO?PN+Edv9Rnd*Tixf-jyfUyZC`2w5izgGUm zXN+gGZVc}NxeHv}_yRU1ZTwiO*b(63s28|c*l(X?EqGgNk2{Gi{ieUQGmS5ob{?tc z7v&4P(8IRV4rj^dlHOeMdHCi)FPHV)=X$y}zI18lQVt8#K6nNq8IxK@j>C4{izRBB z?IKQfQQx*@u1VMaH??;NR51YV6g?((vNW3=a#%+8w$mg5o7!PpW^UVFer-F}j|*J< z<^tP+=xI3+p{&Mlv>`2eaP11lPDZ@v+MNdPx#;rZEtMWzUw?tkZ?2JEEjoHFi3#*ocd)9g{>P{CkyMQtEt`WPK z`sU6x!En_xiGWDOp> z`gToY;f{$cY%3QS+GD)6Yc{VvM&0T5*-H%4KoRiwTx;R_&HC-)N9-~A@Q3}plwbJG zy=-fUDYjp-M3;#(!*-Us->+TU6SeO+rCp#ygSK@Za1DYz2Bj74*Mk*$J>a101qPrr zS{qJjJsL22;yqndGeqmgJuccPYR$gv0vFjCfEfKl-%zUpn0FfhadGN2esTl}Vozu6!S1W>k*0k6_(HDIjf0OKwQ$3uO! z2DU)%@t(dVfgtr70nqCuV6xWKtaizi7Z9tNF6r2M>%(O&drucXp4zz#2` zP->E(vK@%-O(eTOIg9NAO^aZ0XK9njbjS22=EtbJ8W_-U7BHo-t5?@9V>EevsqJP3 zX18tJmLzr?kfOcO$iRk5ccu@b8n7M=(Xlbr#lTl>p**&v?HNT~U~6-=9t>?9z5_B@ zF2yrhtHoov2P3u~R0C>Fs}ZJZy|yuMM!bzeE)Yw18t8x~71P#Amwaq0CPOs^v=vM- z{9!EQw=Z{OvX@Iga@u{VAy;8qkZxH+!rHcormd+qpXL8cA-jfaN;WodtwY<}hd|M0 zYHRiaS$8yT7h9CLW!vn~*iDJh2BubD0*n@F+2~H;#yAYrkmU_z7pwg-W0>B6B&^DB zY;vG4da$JGsc!P07J*}*_EB)~2SrUq;gvq+4#ih%^t)Dl9z(Mb(S!z^npLo4C%x;6lRTuR%8NfkFlRJ>Y19cKVfxRJNQ94M$CRL zk{{TW*CF9sgS*wtH`dMD?D=W{eYxCLtao=`Osg*n@w>~rUfp`H#0iN?A`T;oq7^rE zG2$@mUo~~ZNX%?}Qbf#}VjvkP+?jgJ6p;&D!qGLUo5#9-lX=Xf5JvO@*H2C1F)(b$ zGQFq?3^CHg9Rv@(N5Y6}r^cov9hgXR0c^5Y{{Asv1D&u(!vCw;w_NGI~$L& z3?`4U3@S~x89L4du0~C680uTbTypn%^3o{@33+QtUo`g5XPa4u&15Y}VpYp+E!Pcg zAuesL6E?ZvVM*L=Cu!RlleYwSV}(^<3fO?`Y>yek8v<85cBczm?9qN>ts&PTmv8Bd zlhN522_;Gx=*-U&*ivt8PB$i_P6N%>>y+Wxz%F4h*x0sYLom?9Bpi$!jO7AT%i2V_ z3tS!b?d*WTV+*0EJ>1dvbSXp!n4(hbz5(MH#Yp+LGl{JoN>68V)}-U9sP#ClVKH*!i5nl65rOgTU#=|0SRnc~|zq;h-OFBF5e!kp_ z-^=CJ`EJGU<rKmd^J*%GG*z7%lX0iB(_h3?60RkQwFbBcSt=JhBh7#J{Jt{T@Vsc6TNaBE;m1MS?I;>lOv1y~O}Hn7}hfDG?y z8nA6F{WmMo136SMocK$TQ`DX1Vv~WQZKVQQ_644az z^q4+tiCRh;v6m%*p*zLC2Sru%ZUE_OS_3lZ*(VHvjd*4aXad>g3~T|Ltej*aklD$= zk{{sWO(jb&o=kmKM^IP{^x+cpC$zlsMh1G3ZC;$pFRsA*a;u5;w4C2u#HQttmJDs} zJ-DXj12?nY+<&b#mON#b*WHqb_IAcSW3Nb>(k#2jl+n&WPUlWHon^`xV8D1Jvv>j1 zgCMHhBwff`Xu$3iCZWoPTdk)CY;lDrK%bjDHcf%tC5;6&e^ly5&vFWplgu~ z9vhO0Dot;#7`;a}XAFG?hV<4&uk&zW-T=FP>+z-7QZyjT9S8=t?kwxhly^Eayekv{ zd+AZjvH%O~+K5U?E_c``l;noXYlkT%yXDh3KoJ+7@Vb(N1AInoSPg?6QjTm>a-O5{ zmgDddu{{uAIfU8|LEk>6^5$~f|I{UDmMKC?cDknHq^Ct7&RVIGznmK#zGsSTrz3+$ov|Z=fWX0TMH~X0Yu7 z$C>s^19(z>1{?0qae&l#J+?)jomn4l>N9}%qVz)?vf=5ak{l~!v$EUc1h$*t)PU@9 z!<%kya1lXC=}$a1<;6Y@+OMILu$Df1$=`U91EHQv`SnZv>gAnq`Wr7_Z~p7u z_;mkdHM=kUdoH(Ot^WGuoyKrq-uTpw*F}4ysh3;8Vkr=1tk*I_8A;gpWO-t^ z!|H@>66|GCRu*BwR!5MAc@qB_xIX z*`hULLKZUno*6{8A^`nKgvA2y-7Q%cg7H#|?7T`yp&o|%#K8ylh}qn<5R^8;v>H*Vl1i`*s( z*sQ?1W3K#*2VLL32hImMHjOD@sqlO_%0(u3;(0jhg|}kBb6lc1G!&>Zscn6#KiSmX;#g z+)~gCT(q&pOG=eCzLh&ss+5W?=WMA8=Dxu-Vgafq*g-RP5FoZ18>$N!XZ80C@0<0Y z%A3Dsb|@Ej;p5CiSrt~fB}y0=Ek2=&yl-GLcfiwQHYEq_{a1I)VtRo|uL}+6<4oVL zvaep?+I7#?)0aZ{Ad1~dVE+*AmwXxKoNl;MDofyBUPg==r_q+?NI ze&*mk!vjYA&Ll{aX&m_8vH+o_W(~324Mme0!B(Q6Bs>}@$$hW}k}Q#WOqn19YecECm6^v^EGE?9p%h74A$r-6gWCIto zBQwH?+2bjJ)-7J}bR4pnPf)kDGV22A+%(UEW3 z;@g_QHH{Y#!D^a@B5rNbb_vY((hFRRWn@fB%Qh9_rwo+la<%b;so&UQDoPm|dYiG0 zYs3b&T@%QP0hyE(Avf^H6bTI7jgN{f>RNfmo-W#8%QJAzX?F{kgp;laZ`qgDN0+}( zb}WGo8@xWDPi(H+dTk+X&N{b&22%xO46xUTc4p3OhRJ{pyjgIIfxN}9ug-VPx!L=- zfO$5uf?#{Y38ZbcH#|>Ey{`C|WYX&rTjb1W20C7(YpgF&@vT(-MqUc(OTFUMk_-D1 zD>hEVYk^(BLT(U}U#4X}yRfC3Gq!*($T+xW8{Gs$H#1`dX4eF3!L2B_XqYi&vrviF=o8Uq9uRkh}U zYD2)JCtF}yAD1KxWqnUOA%z{kIx&g8oUlCx@kn94M5Or8lt`{CMrpkg5vYx@Bd0cb ze7e|^1jQk+B|};ds>ZrCe@vmy(VB~|MZcM3x?H;^*x8`5`Ms!oU_t`i+H0Tnn&jW!VI0#Yz)EZ-8ZHgLth*?wB}fOLKe>CZDgR zX%pOKH^_>X?^1?;yNP+^aBXc55^_J-+jz^Dpv&7+AzQ3$qWkIcVArf+(Rgurf7u8B zT?V#iD;qI!*0P*+3eHao&ff}$W8MRMs`kY$weztca&X3;)SOd zWteC}n|9?`$)yu@nBeg?B9+62wV}54Ov;nOwm<8hwAEo8opkOjC*q55=&P}b53Z*c zyh4ttTs|TnW=96Of>ZL)#n#=$0SA%JVswziP)3oV#uBq>FkT6=l?Lb3GRi`QMb-G7 zy?RLaFqA-rH>CCWq$6)L6HcAi-HK$OgJdcbsxlf_2Mu+?Uj27OBX{0sglvNMpw~@X z`QTn7+O^Y){c*CSGuF6yzQLj@r{X|t`B^_FT6@L_Hf7B)WTP|{>utyy^O&)$tuzz* z{E0j%d8cd4{I6s?zGP_Tvr8Q3H`$IO;9q!k9gYwWk!_6E`8xiW2)DJ5rZD2yj(*vY^umkD|t#201-sv0ukDPzqWg}0L( zZ-_}8`@Xj!b$(Y;WaU_!g{9>0D<0SnZ@L7KL|@#_zPRT`b6+qCxh1hED)!?rf&F%t z;epbmP$)nq#bW1@o-SnEkHZRjgs4rs)b_jumqFk?EVT^w(1{)SpoNXvR?J|fl|hU? zi9pfH7V9spgF(Vi!KO$&j;!Oz)!l97Q;X4mSBO1N^AW9bqxST>j-Pe^yq;!!SvZZxz(pA#|i%`W+ zG}w~u2UWbuIK-xvb@Pj=4Jx+s8@adX<=*CZywBv9>HZ~sv);#(+xwa1d-89Pvdd29 znE^MN=|&a*lK&3x;*Ivc-$3SCyuIPGLi(F6zE=J0sLcn}@`&2gz4G+C)F0pHzO~fv zxAW0NBN`H~WGAbzjakAACqIgN%t}daYPt2$59Hj*QQy2sK8&f;wqOu3-%J z2@|L*W+HPwC!sYXIn0oKA30zu>cNg8eWU8Xforak(J>a^SCLt$Ay6yHV+-3wjkkL% zD@FcU#vFS3($G5D!74V5pt=^q<>H=aQmJ-`>Ke&vw4!{G+*bp{==K!Vj6_+Jaz;&P z)5=O`AEdgGA(M(KTb`js6_fFJuYpV`b^oW$Eq0s4Ot%@ehhj}v1^?+ArgXc)Y}%r% zRF|3PpcPTT!v!iuiAdU$-!$E0O_h`jO-I<9YFmjM=u-63NFOD7?<9ZQ%KglvFjDU)d-_r9 z=XaeVKiqS>gme9gnYZ%xidAGnpKC@fmh1)2-10H8;WjyMMN6O3N={5Qmle_mT8RXb z7E;c`r5))?hQSmW$o;hx6pNUomPr33ibojr#!(}6sV)= zAV}nhu^4Js2dQ4?L^me&eX8hk41zS+S|yMxB!_z~0k3c%f`k0XB9~sCjzMNne9Y{2 z`;3vJ>9IFFIWvvXikCMsw2q`ZI&%qkbOVsfwxbi2(=eWNc#!A(L++Et$Z2S1Ws5;WsZixh;ka5s3d3{isnSbDfA8WU@>8pUWH&>Z)ZULC^Q#GT@XT&E{1$5HMd zc;%Wy;xY`*D8kVY2MRr_^DOSsqsGCa6|Za1oj6?p;9ed_0PqDiUDD{s+lxtiBT#KR zzY)E<`=t;HH%rO|fQp}J=CdJtsN3w(%0L{*{BB?sb{}yd7Og~+5xq_rsS2apxEGZn zc>87pl3?qFeg<2-L}blF7fpG z5*QMl<9NXU*Zw>`-6ziLHI5zediB=nrfUHwmaoJ8)R%+GxSt&Q=!s4+a2`#3K|__! z^!9O&?&RBjjwaMYrGPoZYMc0m3VAQSwqU>Z-|2nzGle$OqZx6884-_gI$6{;a@R2* z)sLtIeC$PEu2CYV?2GeO?p|@OJGoiD;bUKfzqH_7*qUTlI^v#8V@n;sZDGo&-!*)? z%3-guIT=&f6*ho#hzbW9?V>OdtrqGjk>MVe_U)E-Wh$%w0Z&@bHp`N53onNtTYjb* zf%^`+P{ucFOLoH|Je+>ROa`$VD*P-|_+7%25N~LYXySoTp$LR-_x^4axOg9gGtkj@ zJ=By5A079&lo&Jn<1WD)jFxwa5<&%(5DycrB-~^(-H7EySf*Bdr5=S#S1IZYNb=%+ z6Qm$jx;wpaL=D+aZ+AThD)c#WNzcdHEo~H>5OW?XOVF?=8CTvDCWO^tyDmeSn!Qf= z&1d8{DoGgarX8zC2437NM(8Rr!DXCFkLS{eB;hSYPj;9jRS6Pfmg z+hc>-oBa|G_eQS?irqoKittUiI>{$aDOQ#RkP(XIdz&HOgDqe%`JOo9N%_+z!NnNt#Tt-;vP^Rk7%VwWFdj^_8o6 z#T+uZQ7TA*a4IUqBsWwhMHMo*r+N&o4<%|nxTiQ#dxCt58)%rNRjxR?*!@@Yk+`>hbO1c3Mk&dE|FzDq#cGuxSHCPh%vD*=+MZLaufv4582b~xnOlb4G=;g8xZ@IbF_-gO(_Hyiu*yXgv znN;VBWoVZcckJsbB}E~t8t0Cfrb}$UFAvtT_=^O z)VnX8`6DYJyODqjLwN+xY}CYX4Ow(HLQfkxs$#eW!1I&NOuL>oD4sJhhfT%>9o6SH zQ;o~)XVlYZ$D5(wxy7*x<>Rl^+g(GhchBT8{De(C{q;ism4i5LwM|i_*U!{fEqDB#;&!Aj%YeSm zWu3p>CU;%hxs>ONbnRy|-a}N%y}P`~oT7?b)-BKbOg~$PF6CV6*@gDmN%Tc8@kiy& z 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 Z{^P&@>)-$O_ka1P{{!RvR>38y1px0FTHgQw literal 0 HcmV?d00001 diff --git a/modules/02-passwd/contents.tex b/modules/02-passwd/contents.tex index 85c8384..c022ece 100644 --- a/modules/02-passwd/contents.tex +++ b/modules/02-passwd/contents.tex @@ -370,11 +370,12 @@ \subsection{Empirical evaluation} \begin{frame} \begin{figure}[h] - \includegraphics[width=\linewidth]{fig/password_strength.png} - \caption{% - The famous xkcd \enquote{correct horse battery staple} comic. + \begin{sidecaption}[xkcd 936]{% + Illustrating the password policy of using a long passphrase. Image: xkcd.com/936/. - }\label{xkcd936} + }[xkcd936] + \includegraphics[width=\linewidth]{fig/password_strength.png} + \end{sidecaption} \end{figure} \end{frame} @@ -433,12 +434,14 @@ \subsection{Empirical evaluation} \begin{frame} \begin{figure} - \includegraphics[height=0.9\textheight]{fig/password_reuse.png} - \caption{% + \begin{sidecaption}[xkcd 792]{% Illustrating whether the benign verifier assumption is a good idea in practice. Image: xkcd.com/792/. - }\label{xkcd792} + }[xkcd792] + \flushscap + \includegraphics[height=0.9\textheight]{fig/password_reuse.png} + \end{sidecaption} \end{figure} \end{frame} diff --git a/modules/02-passwd/notes.tex b/modules/02-passwd/notes.tex index 49b372d..20e181f 100644 --- a/modules/02-passwd/notes.tex +++ b/modules/02-passwd/notes.tex @@ -1,39 +1,4 @@ \documentclass[a4paper,10pt,article,oneside]{memoir} -%%% Tufte %%% -\usepackage{marginfix} -%\setlength{\evensidemargin}{\oddsidemargin} -\marginparmargin{outer} -\setlrmarginsandblock{2.5cm}{8cm}{*} - -\footnotesinmargin - -\usepackage{ragged2e} -\renewcommand{\sidefootform}{\RaggedRight} -\renewcommand{\foottextfont}{\footnotesize\RaggedRight} - -\setmpjustification{\RaggedRight}{\RaggedRight} - -% margin figure and caption typeset ragged against text block -\setfloatadjustment{marginfigure}{\mpjustification} -\setmarginfloatcaptionadjustment{figure}{\captionstyle{\mpjustification}} - -% From https://tex.stackexchange.com/a/324757/17418 -% Palatino for main text and math -\usepackage[osf,sc]{mathpazo} - -% Helvetica for sans serif -% (scaled to match size of Palatino) -\usepackage[scaled=0.90]{helvet} - -% Bera Mono for monospaced -% (scaled to match size of Palatino) -\usepackage[scaled=0.85]{beramono} - -\setlxvchars\setxlvchars -\checkandfixthelayout - -\nouppercaseheads -%%% end tufte %%% \let\subsubsection\subsection \let\subsection\section \let\section\chapter @@ -46,17 +11,6 @@ %\usepackage{authblk} %\let\institute\affil -\declaretheorem[style=theorem]{theorem} -\declaretheorem[style=definition]{definition} -\declaretheorem[style=definition]{assumption} -\declaretheorem[style=definition]{protocol} -\declaretheorem[style=example]{example} -\declaretheorem[style=remark]{remark} -\declaretheorem[style=remark]{idea} -\declaretheorem[style=exercise]{exercise} -\declaretheorem[style=exercise]{question} -\declaretheorem[style=solution]{solution} - \begin{document} \input{contents.tex} diff --git a/modules/02-passwd/preamble.tex b/modules/02-passwd/preamble.tex index dce955a..43bbd69 100644 --- a/modules/02-passwd/preamble.tex +++ b/modules/02-passwd/preamble.tex @@ -50,6 +50,7 @@ \usepackage{multicol} \usepackage{changepage} +\usepackage{didactic} \usepackage[capitalize]{cleveref} \input{objectives.tex} diff --git a/modules/02-passwd/slides.tex b/modules/02-passwd/slides.tex index 395cdf5..a77bbb7 100644 --- a/modules/02-passwd/slides.tex +++ b/modules/02-passwd/slides.tex @@ -1,100 +1,6 @@ \documentclass[ignoreframetext]{beamer} \input{preamble.tex} -\usetheme{Berlin} -\setbeamertemplate{footline}%{miniframes theme} -{% - \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} - \end{beamercolorbox} - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% - \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% - \hfill% - {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% - \end{beamercolorbox}% - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% - {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% - \end{beamercolorbox}% - \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} - \end{beamercolorbox} -} -\setbeamercovered{transparent} -\setbeamertemplate{bibliography item}{\relax} - -\AtBeginSection[]{% - \begin{frame} - \tableofcontents[currentsection] - \end{frame} -} - -\ProvideDocumentEnvironment{assumption}{o}{% - \IfValueTF{#1}{% - \begin{block}{Assumption: #1} - }{% - \begin{block}{Assumption} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{protocol}{o}{% - \IfValueTF{#1}{% - \begin{block}{Protocol: #1} - }{% - \begin{block}{Protocol} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{remark}{o}{% - \IfValueTF{#1}{% - \begin{alertblock}{Note: #1} - }{% - \begin{alertblock}{Note} - } -}{% - \end{alertblock} -} - -\ProvideDocumentEnvironment{idea}{o}{% - \IfValueTF{#1}{% - \begin{block}{Idea: #1} - }{% - \begin{block}{Idea} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{question}{o}{% - \setbeamercolor{block body}{bg=orange!15,fg=black} - \setbeamercolor{block title}{bg=orange,fg=white} - \setbeamercolor{local structure}{fg=orange} - \IfValueTF{#1}{% - \begin{block}{Question: #1} - }{% - \begin{block}{Question} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{exercise}{o}{% - \setbeamercolor{block body}{bg=yellow!10,fg=black} - \setbeamercolor{block title}{bg=yellow,fg=black} - \setbeamercolor{local structure}{fg=yellow} - \IfValueTF{#1}{% - \begin{block}{Exercise: #1} - }{% - \begin{block}{Exercise} - } -}{% - \end{block} -} - - \begin{document} \mode \input{contents.tex} From eebf154d37907f87e0292640754df4bc90d2457d Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Tue, 9 Apr 2024 13:51:39 +0200 Subject: [PATCH 09/53] Improves passwd --- modules/02-passwd/contents.tex | 50 ++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/modules/02-passwd/contents.tex b/modules/02-passwd/contents.tex index c022ece..0e2bcc3 100644 --- a/modules/02-passwd/contents.tex +++ b/modules/02-passwd/contents.tex @@ -408,6 +408,16 @@ \subsection{Empirical evaluation} \end{question} \end{frame} +Now this depends on the users. +Can they tell a benign verifier from an adversary? +Turns out they can't\autocite{WhyPhishingWorks}. +\Citeauthor{WhyPhishingWorks} actually found that users might actually test +whether the verifier is benign or not by entering their password: +the reasoning was that if the is correct it will accept the password, otherwise +it will not (since it doesn't know the password)---which is a fallacy. +This tells us that we need to consider the verifier as an adversary, +consequently we need a zero-knowledge property in \cref{FormalSecurity}. + \begin{frame} \begin{example} \fullcite{WhyPhishingWorks} @@ -417,18 +427,10 @@ \subsection{Empirical evaluation} \begin{example}[Consequences] We need the zero-knowledge property in our security definition. - (We actually need \emph{malicious}, not honest, verifier zero-knowledge. + (We actually need \emph{malicious}, not honest, verifier zero-knowledge.) \end{example} \end{frame} -Now this depends on the users. -Can they tell a benign verifier from an adversary? -Turns out they can't\autocite{WhyPhishingWorks}. -\Citeauthor{WhyPhishingWorks} actually found that users might actually test -whether the verifier is benign or not by entering their password: -the reasoning was that if the is correct it will accept the password, otherwise -it will not (since it doesn't know the password)---which is a fallacy. - We can also again turn to the wisdom of xkcd for another argument against the benign verifier assumption, namely password reuse (\cref{xkcd792}). @@ -445,6 +447,13 @@ \subsection{Empirical evaluation} \end{figure} \end{frame} +%\begin{frame} +% \begin{question} +% Are there more reasons? +% Password re-use, incompetent service, malicious service. +% \end{question} +%\end{frame} + \paragraph{Case study} We will study the paper by \textcite{WhyPhishingWorks} to explore how they @@ -460,9 +469,20 @@ \section{Conclusion} to inform our deductive (\eg cryptographic) choices. \end{frame} -%\begin{frame} -% \begin{question} -% Are there more reasons? -% Password re-use, incompetent service, malicious service. -% \end{question} -%\end{frame} +\begin{frame} + \begin{question}[Is the opposite also true?] + Can deduction be a useful (necessary?) complement for empirical studies? + How? + \end{question} +\end{frame} + +For instance, using a deductive approach we can rule out all those approaches +to passwords that are \emph{provably} easy to guess. +There is no need to empirically test them, which takes time, if we already know +they're bad. + +\begin{frame} + \begin{exercise} + What other aspects didn't we consider? + \end{exercise} +\end{frame} From bbbbecd9dc56e399526553f17f5b7bb105cf9a9e Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Fri, 26 Apr 2024 15:02:43 +0200 Subject: [PATCH 10/53] Adda Arve's exercise on extending old software --- modules/03-formal-methods/extendoldsoft.md | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 modules/03-formal-methods/extendoldsoft.md diff --git a/modules/03-formal-methods/extendoldsoft.md b/modules/03-formal-methods/extendoldsoft.md new file mode 100644 index 0000000..ae25e2a --- /dev/null +++ b/modules/03-formal-methods/extendoldsoft.md @@ -0,0 +1,32 @@ +--- +title: Exercise: Extending old software +authors: + - Arve Gengelbach +--- +The goal of this exercise is to harden an old network-connected banking +software that is checked to be working correctly on input that is well-formed, +however on any other input anything could happen from simple shutdown +(availability) to leak of confidential data. Programmers that could program in +the system's programming language are not around anymore. + +To increase the assurance level the idea of this exercise is to discussing +formal-methods based hardening in this particular scenario. + +The approach to harden the system is in two steps, first by adding a filtering +software that drops any malformed network traffic before this traffic could +even enter the possibly partially broken banking software, and second by +checking that the filter works correctly. Well-formed input can be specified by +a regular expression for this program. + +Tasks: + +1. Formulate a security property that could be verified for each of the two: + + a. the interface between (the output of) the filter and (the input of) the + old banking application + + b. the application that does the filtering + +2. Discuss how to verify the security property: Which formal method should be + used for which scenario? What are the reasons? State any assumptions on + input/output. From 6c3cdd67a973dc8d26b99057489c77690a74422f Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Fri, 26 Apr 2024 15:09:45 +0200 Subject: [PATCH 11/53] Adds teaching material Still no links to the videos. Must be added later. --- modules/03-formal-methods/teaching.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 modules/03-formal-methods/teaching.md diff --git a/modules/03-formal-methods/teaching.md b/modules/03-formal-methods/teaching.md new file mode 100644 index 0000000..b62a6c2 --- /dev/null +++ b/modules/03-formal-methods/teaching.md @@ -0,0 +1,14 @@ +--- +title: Teaching material on formal methods +authors: + - Arve Gengelbach +--- +1. Lecture: Introduction to theorem proving +2. Lecture: Formal methods and interactive theorem proving +3. Lecture: Proving list-reverse correct (optional) +4. Lecture: Examples of what can be verified with interactive theorem provers +5. Lecture: Limitations of interactive theorem proving and conclusion +6. Article: Model checking: algorithmic verification and debugging +7. Lecture: Determining economic value of high assurance for commodity software + security +8. [Exercise: Extending old software](extendoldsoft.md) From 1afd9e5889ba727285edb5da627d3973798c4199 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Sat, 27 Apr 2024 09:16:25 +0200 Subject: [PATCH 12/53] Updates final assignment and seminar --- modules/final-seminar/contents.tex | 291 ++++++++++++++++------------- modules/final-seminar/notes.tex | 46 ----- modules/final-seminar/preamble.tex | 2 + modules/final-seminar/slides.tex | 94 ---------- 4 files changed, 159 insertions(+), 274 deletions(-) diff --git a/modules/final-seminar/contents.tex b/modules/final-seminar/contents.tex index 4307019..4ce9d67 100644 --- a/modules/final-seminar/contents.tex +++ b/modules/final-seminar/contents.tex @@ -36,6 +36,8 @@ \section{Introduction} \begin{frame} \begin{block}{Goal} \begin{itemize} + \item You should be able to evaluate a proposed method to answer a + question. \item You should be able to design a method to answer a research question. \item Security is multifaceted, you should be able to consider more than @@ -60,16 +62,12 @@ \section{Scenario and research question} The research question that you should answer is the following: \begin{frame} -\begin{question} - We want to develop a secure instant-messaging system\footnote{% - Think chat or SMS/text messages; something like Signal, WhatsApp, Telegram, - \etc - }. - How can we evaluate its security? -\end{question} +\begin{restatable}{question}{mainRQ}\label{mainRQ} + How secure is the Signal instant-messaging app? +\end{restatable} \end{frame} -\section{Assessment}\label{Assessment} +\section
{Assessment}\label{Assessment} In brief, what you should be able to do is to ask good questions and propose suitable ways of answering them. @@ -87,42 +85,52 @@ \subsection{Material you should produce} To be able to show that you can do that, you should \begin{frame} - \only{You should} \begin{itemize} \item write a report, and - \item make a presentation (10 minutes).\footnote{% - If you write your report in LaTeX, consider writing your slides in LaTeX - also using the \texttt{beamer} and \texttt{beamerarticle} packages. - } + \item review someone else's report. \end{itemize} -These should should contain the following sections: +\end{frame} + +The report should contain the following sections: +\begin{frame} \begin{enumerate} - \item Research question overview. - \only
{This section should give an overview of the research - question and outline any subquestions that you derive. - (This focuses on \cref{LOrelate}.)} - \item Methodology. - \only
{This section contains how you propose to answer the - questions from the previous section (methods used). - (This focuses on \cref{LOapply}.)} - \item Discussion. - \only
{In this section you discuss why those methods answer the - questions properly and any limitations that you see. - You can also discuss item alternative methods that you discarded (and - why). - (This focuses on \cref{LOevaluate}.)} + \item Related works. + \only
{% + This section should give an overview of the existing research literature + related to \cref{mainRQ}. + That is, you should find all papers that answers some aspect of it. + You should note what question each paper answers and summarize how they + do that. + (This focuses on \cref{LOevaluate}.)% + } + \item Missing aspects. + \only
{% + In this section, you pose questions that are also related to + \cref{mainRQ}, but has not been covered by the literature. + For each such question, you must propose a method that correctly provides + an answer\footnote{% + But remember, you don't have to actually perform any of these + methods. + }. + You must also discuss why this method is suitable to answer the question + and any limitations. + (This focuses on \cref{LOapply,LOevaluate}.)% + } \item Conclusion. - \only
{This section ties the sack. - Here you connect the questions and the types of answers gained (through the - methods) and piece them back into the original research question. - You also summarize how well you find the original question to be answered, - if there are any \enquote{holes that need filling}. - (This focuses on \cref{LOrelate,LOevaluate,LOcomm}.)} + \only
{% + This section ties the sack. + Here you connect the questions (yours and from related works) and the + types of answers gained (through the methods) and piece them back into + \cref{mainRQ}. + You also summarize how well you find \cref{mainRQ} to be answered, if + there are any \enquote{holes that need filling}. + (This focuses on \cref{LOrelate}.)% + } % \item your original plan for the course work, adaptations made and what you % learned. \end{enumerate} \end{frame} -This assesses \cref{LOrelate,LOevaluate,LOapply,LOcomm,LOplan}. +This assesses \cref{LOrelate,LOevaluate,LOapply,LOcomm}. %\paragraph{Feedback you should provide} % @@ -142,10 +150,10 @@ \subsection{Material you should produce} %\end{itemize} %This also assesses \cref{LOcomm}. -\subsection{Assessment criteria} +\subsection
{Assessment criteria} To assess the learning objectives -(\cref{LOrelate,LOevaluate,LOapply,LOplan,LOcomm}) +(\cref{LOrelate,LOevaluate,LOapply,LOcomm,LOplan}) we use the following criteria. These criteria are also included as a rubric in the assignment where you hand in your report. @@ -156,82 +164,76 @@ \subsection{Assessment criteria} You'll need a pass on all criteria to pass the assignment and the course. -\begin{frame}[fragile,allowframebreaks] - \RaggedRight - \begin{longtable} - {p{0.33\textwidth}p{0.33\textwidth}p{0.33\textwidth}p{0.33\textwidth}} - \toprule - \textbf{Learning objective} - & \textbf{Criteria} - & \textbf{Pass} - & \textbf{Fail} - \\* - \midrule - \endhead - \only
{\cref{LOrelate}:} - The student is able to \LOrelate - & The main research question is explored from relevant aspects? - & There might be more aspects to explore, but the most important ones are - covered. Motivate why no more aspect need to be explored. - & There is at least one aspect missing that can be motivated to be - important. Motivate which one. - For instance, do we need to ask another more detailed (research) question - to be able to answer the main research question in a meaningful way? Do - they address the question from just a single perspective? - \\* - \newpage - \only
{\cref{LOapply}:} - The student is able to \LOapply - & The methods are suitable to answer the questions? - & All questions have suggested methods that can actually answer the - question correctly. - Motivate why this is the case. - & There is at least one question that will not be answered correctly with - the suggested method. - State which one and why. - For instance, the method might only answer part of the question. - %Or not at all. - \\* - \newpage - \only
{\cref{LOevaluate}:} - The student is able to \LOevaluate - & Are all quality aspects considered in the discussion? - & The most important quality aspects are considered and discussed. - & At least one important quality aspect is missing. - State which one and motivate why it's important enough that it must be - treated. - \\* - & Are all ethical aspects considered? - & The most important ethical aspects are considered and discussed. - & At least one important ethical aspect is missing. - State which one and motivate why it's important enough that it must be - treated. - \\* - \newpage - \only
{\cref{LOcomm}:} - The student is able to \LOcomm - & Is the report written as short as possible? - & The report can probably be slightly shortened, but not by much. - & The report can be shortened considerably. - Give at least one example of where and how. - \\* - & Is the report clear and easy to understand? - & The report is easy to understand. - & Some parts of the report must be read more than once to understand. - (Or worse.) - Give at least one example. - \\* - & Are the arguments clearly stated and well motivated? - & All arguments are clearly stated and well motivated. - & At least one argument is not clearly stated or not well motivated. - State which one and motivate why it's not clear or well motivated. - \\* - \bottomrule - \end{longtable} -\end{frame} +{\RaggedRight +\begin{longtable} +{p{0.33\textwidth}p{0.33\textwidth}p{0.33\textwidth}p{0.33\textwidth}} +\toprule +\textbf{Learning objective} + & \textbf{Criteria} + & \textbf{Pass} + & \textbf{Fail} + \\* +\midrule +\endhead +\only
{\cref{LOrelate}:} +The student is able to \LOrelate + & The main research question is explored from relevant aspects? + & There might be more aspects to explore, but the most important ones are + covered. Motivate why no more aspect need to be explored. + & There is at least one aspect missing that can be motivated to be + important. Motivate which one. + For instance, do we need to ask another more detailed (research) question + to be able to answer the main research question in a meaningful way? Do + they address the question from just a single perspective? + \\* +\only
{\cref{LOapply}:} +The student is able to \LOapply + & The methods are suitable to answer the questions? + & All questions have suggested methods that can actually answer the + question correctly. + Motivate why this is the case. + & There is at least one question that will not be answered correctly with + the suggested method. + State which one and why. + For instance, the method might only answer part of the question. + %Or not at all. + \\* +\only
{\cref{LOevaluate}:} +The student is able to \LOevaluate + & Are all quality aspects considered in the discussion? + & The most important quality aspects are considered and discussed. + & At least one important quality aspect is missing. + State which one and motivate why it's important enough that it must be + treated. + \\* + & Are all ethical aspects considered? + & The most important ethical aspects are considered and discussed. + & At least one important ethical aspect is missing. + State which one and motivate why it's important enough that it must be + treated. + \\* +\only
{\cref{LOcomm}:} +The student is able to \LOcomm + & Is the report written as short as possible? + & The report can probably be slightly shortened, but not by much. + & The report can be shortened considerably. + Give at least one example of where and how. + \\* + & Is the report clear and easy to understand? + & The report is easy to understand. + & Some parts of the report must be read more than once to understand. + (Or worse.) + Give at least one example. + \\* + & Are the arguments clearly stated and well motivated? + & All arguments are clearly stated and well motivated. + & At least one argument is not clearly stated or not well motivated. + State which one and motivate why it's not clear or well motivated. + \\* +\bottomrule +\end{longtable}} -\only
{% -\subsection{Plagiarism} +\subsection
{Plagiarism} You work in the groups that you've signed up for. You may discuss with others, search the literature and use tools such as @@ -254,33 +256,54 @@ \subsection{Plagiarism} Not mentioning that you've used ChatGPT or discussed the topic with people outside the group is considered an attempt to deceive. -} \section{The final seminar} -\subsection{Structure} +During the final seminar we will discuss the questions and methods that you've +covered in the report and how well \cref{mainRQ} was covered. -\begin{frame} - \begin{block}{Structure} - \begin{enumerate} - \item Each group presents - \item After each presentation, I might ask for some more details. - \item When everyone has presented, we discuss what we've heard. - \end{enumerate} - \end{block} +For the seminar you should prepare slides. +Each slide should focus on a research question. +If the research question was covered by the literature, you should have a +reference to the paper on the slide. + +During the seminar, with the slide you should be able to explain the question +and your evaluation of how well the method answers the question. +(You can use more than one slide if it improves the presentation, but it +shouldn't be necessary.) + +The participants will take turn in presenting the question, method and +evaluation. +The we discuss jointly. +We will want to discuss closely related questions, try to group them by that in +the slide deck. + +\begin{frame} + \begin{activity}[Order] + \begin{itemize} + \item What order to present? + \item You'll have one minute to write \enquote{me!}. + \item The order in which you appear will be the order of presentation. + \end{itemize} + \end{activity} \end{frame} -\subsection{Questions for discussion} +\begin{frame} + \mainRQ* + \begin{activity} + \begin{itemize} + \item One aspect/subquestion at a time. + \end{itemize} + \end{activity} +\end{frame} -\begin{frame} - \begin{question} - What are the first thoughts while/after hearing the others present? - \end{question} - \begin{question} - What did you like the most from what you've heard? - \end{question} - \begin{question} - What would you like to improve/do differently/add to your own work - after hearing what the others did? - \end{question} +\begin{frame} + \begin{activity}[Any other aspects/questions?] + \begin{itemize} + \item Take a few minutes to reflect on holes that need filling to get + closer to fully answer the main question. + \item Just write the questions. + \end{itemize} + \end{activity} \end{frame} + diff --git a/modules/final-seminar/notes.tex b/modules/final-seminar/notes.tex index 30c6191..c8f6dae 100644 --- a/modules/final-seminar/notes.tex +++ b/modules/final-seminar/notes.tex @@ -1,39 +1,4 @@ \documentclass[a4paper,10pt,article,oneside]{memoir} -%%% Tufte %%% -\usepackage{marginfix} -%\setlength{\evensidemargin}{\oddsidemargin} -\marginparmargin{outer} -\setlrmarginsandblock{2.5cm}{8cm}{*} - -\footnotesinmargin - -\usepackage{ragged2e} -\renewcommand{\sidefootform}{\RaggedRight} -\renewcommand{\foottextfont}{\footnotesize\RaggedRight} - -\setmpjustification{\RaggedRight}{\RaggedRight} - -% margin figure and caption typeset ragged against text block -\setfloatadjustment{marginfigure}{\mpjustification} -\setmarginfloatcaptionadjustment{figure}{\captionstyle{\mpjustification}} - -% From https://tex.stackexchange.com/a/324757/17418 -% Palatino for main text and math -\usepackage[osf,sc]{mathpazo} - -% Helvetica for sans serif -% (scaled to match size of Palatino) -\usepackage[scaled=0.90]{helvet} - -% Bera Mono for monospaced -% (scaled to match size of Palatino) -\usepackage[scaled=0.85]{beramono} - -\setlxvchars\setxlvchars -\checkandfixthelayout - -\nouppercaseheads -%%% end tufte %%% \let\subsubsection\subsection \let\subsection\section \let\section\chapter @@ -46,17 +11,6 @@ %\usepackage{authblk} %\let\institute\affil -\declaretheorem[style=theorem]{theorem} -\declaretheorem[style=definition]{definition} -\declaretheorem[style=definition]{assumption} -\declaretheorem[style=definition]{protocol} -\declaretheorem[style=example]{example} -\declaretheorem[style=remark]{remark} -\declaretheorem[style=remark]{idea} -\declaretheorem[style=exercise]{exercise} -\declaretheorem[style=exercise]{question} -\declaretheorem[style=solution]{solution} - \usepackage[inline]{enumitem} \begin{document} diff --git a/modules/final-seminar/preamble.tex b/modules/final-seminar/preamble.tex index 0789d3b..f6f9822 100644 --- a/modules/final-seminar/preamble.tex +++ b/modules/final-seminar/preamble.tex @@ -41,6 +41,8 @@ \usepackage[binary-units]{siunitx} +\usepackage{didactic} + \usepackage[capitalize]{cleveref} \input{objectives.tex} diff --git a/modules/final-seminar/slides.tex b/modules/final-seminar/slides.tex index 2287028..a77bbb7 100644 --- a/modules/final-seminar/slides.tex +++ b/modules/final-seminar/slides.tex @@ -1,100 +1,6 @@ \documentclass[ignoreframetext]{beamer} \input{preamble.tex} -\usetheme{Berlin} -\setbeamertemplate{footline}%{miniframes theme} -{% - \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} - \end{beamercolorbox} - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% - \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% - \hfill% - {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% - \end{beamercolorbox}% - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% - {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% - \end{beamercolorbox}% - \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} - \end{beamercolorbox} -} -\setbeamercovered{transparent} -\setbeamertemplate{bibliography item}[text] - -\AtBeginSection[]{% - \begin{frame} - \tableofcontents[currentsection] - \end{frame} -} - -\ProvideDocumentEnvironment{assumption}{o}{% - \IfValueTF{#1}{% - \begin{block}{Assumption: #1} - }{% - \begin{block}{Assumption} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{protocol}{o}{% - \IfValueTF{#1}{% - \begin{block}{Protocol: #1} - }{% - \begin{block}{Protocol} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{remark}{o}{% - \IfValueTF{#1}{% - \begin{alertblock}{Note: #1} - }{% - \begin{alertblock}{Note} - } -}{% - \end{alertblock} -} - -\ProvideDocumentEnvironment{idea}{o}{% - \IfValueTF{#1}{% - \begin{block}{Idea: #1} - }{% - \begin{block}{Idea} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{question}{o}{% - \setbeamercolor{block body}{bg=orange!15,fg=black} - \setbeamercolor{block title}{bg=orange,fg=white} - \setbeamercolor{local structure}{fg=orange} - \IfValueTF{#1}{% - \begin{block}{Question: #1} - }{% - \begin{block}{Question} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{exercise}{o}{% - \setbeamercolor{block body}{bg=yellow!10,fg=black} - \setbeamercolor{block title}{bg=yellow,fg=black} - \setbeamercolor{local structure}{fg=yellow} - \IfValueTF{#1}{% - \begin{block}{Exercise: #1} - }{% - \begin{block}{Exercise} - } -}{% - \end{block} -} - - \begin{document} \mode \input{contents.tex} From 72ef210ab28dfabfbe619b33d21ebc078be35a47 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Tue, 28 May 2024 12:28:30 +0200 Subject: [PATCH 13/53] Improves scientificity module --- modules/05-scientificity/bibliography.bib | 39 ++++++++++ modules/05-scientificity/contents.tex | 44 +++++++++-- modules/05-scientificity/notes.tex | 46 ----------- modules/05-scientificity/preamble.tex | 2 + modules/05-scientificity/slides.tex | 94 ----------------------- 5 files changed, 77 insertions(+), 148 deletions(-) diff --git a/modules/05-scientificity/bibliography.bib b/modules/05-scientificity/bibliography.bib index e69de29..f25495c 100644 --- a/modules/05-scientificity/bibliography.bib +++ b/modules/05-scientificity/bibliography.bib @@ -0,0 +1,39 @@ +@article{HowToDesignComputerSecurityExperiments, + title = {How to design computer security experiments}, + author = {Peisert, Sean and Bishop, Matt}, + booktitle = {Fifth World Conference on Information Security Education, Proceedings of the IFIP TC11 WG 11.8, WISE 5, 19 to 21 June 2007, United States Military Academy, West Point, New York, USA}, + doi = {10.1007/978-0-387-73269-5_19}, + editor = {Futcher, Lynn and Dodge, Ronald}, + isbn = {978-0387732688}, + issn = {1868-4238}, + journal = {WISE}, + month = {6}, + pages = {141--148}, + publisher = {Springer Science+Business Media}, + url = {https://link.springer.com/content/pdf/10.1007%2F978-0-387-73269-5_19.pdf}, + volume = {237}, + year = {2007}, +} + +@inproceedings{DosAndDontsML, + title = {Dos and don'ts of machine learning in computer security}, + author = {Arp, Daniel and Quiring, Erwin and Pendlebury, Feargus and Warnecke, Alexander and Pierazzi, Fabio and Wressnegger, Christian and Cavallaro, Lorenzo and Rieck, Konrad}, + booktitle = {31st USENIX Security Symposium, USENIX Security 2022, Boston, MA, USA, August 10-12, 2022}, + editor = {Butler, Kevin R. B. and Thomas, Kurt}, + publisher = {USENIX Association}, + year = {2022}, +} + +@inproceedings{SoKScienceOfSecurity, + title = {SoK: Science, Security, and the Elusive Goal of Security as a +Scientific Pursuit}, + author = {Herley, Cormac and Van Oorschot, Paul C.}, + booktitle = {2017 IEEE Symposium on Security and Privacy, SP 2017, San Jose, CA, USA, May 22-26, 2017}, + doi = {10.1109/sp.2017.38}, + journal = {IEEE Symposium on Security and Privacy}, + month = {5}, + pages = {99--120}, + publisher = {IEEE Computer Society}, + url = {https://doi.org/10.1109/sp.2017.38}, + year = {2017}, +} diff --git a/modules/05-scientificity/contents.tex b/modules/05-scientificity/contents.tex index 8e8915a..9deeae7 100644 --- a/modules/05-scientificity/contents.tex +++ b/modules/05-scientificity/contents.tex @@ -5,7 +5,8 @@ This material is available under the Creative Commons Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 international license. - The material was written with some aid from GitHub Copilot. + GitHub Copilot was used to autocomplete parts of the source code for this + document. }} \institute{% KTH EECS @@ -23,26 +24,53 @@ \clearpage + \section{How to design computer security experiments} +\Textcite{HowToDesignComputerSecurityExperiments} gives a good overview of how +to design computer security experiments. +\begin{frame} + \begin{question} + But is that applicable in all parts of security research? + \end{question} +\end{frame} + \section{Dos and don'ts of machine learning in security} +\Textcite{DosAndDontsML} discusses how to and how not to use machine learning +in security. + \begin{frame} \begin{question} - \begin{itemize} - \item What can we actually say from these results, based on their method? - \end{itemize} + Based on this paper, what can we say about the use of machine learning in + the website fingerprinting papers? + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + What can we actually say from these results, based on their method? \end{question} \end{frame} \section{Security as a scientific pursuit} +\Textcite{SoKScienceOfSecurity} discusses security as a scientific pursuit. + +\begin{frame} + \begin{question} + How did they know that this is so? + What can we actually say from these results? + \end{question} +\end{frame} + \begin{frame} \begin{question} - \begin{itemize} - \item How did they know that this is so? - \item What can we actually say from these results? - \end{itemize} + What assurances can empirical experiments give about security? + \end{question} + + \begin{question} + What assurances can deductive reasoning give about security? \end{question} \end{frame} diff --git a/modules/05-scientificity/notes.tex b/modules/05-scientificity/notes.tex index 49b372d..20e181f 100644 --- a/modules/05-scientificity/notes.tex +++ b/modules/05-scientificity/notes.tex @@ -1,39 +1,4 @@ \documentclass[a4paper,10pt,article,oneside]{memoir} -%%% Tufte %%% -\usepackage{marginfix} -%\setlength{\evensidemargin}{\oddsidemargin} -\marginparmargin{outer} -\setlrmarginsandblock{2.5cm}{8cm}{*} - -\footnotesinmargin - -\usepackage{ragged2e} -\renewcommand{\sidefootform}{\RaggedRight} -\renewcommand{\foottextfont}{\footnotesize\RaggedRight} - -\setmpjustification{\RaggedRight}{\RaggedRight} - -% margin figure and caption typeset ragged against text block -\setfloatadjustment{marginfigure}{\mpjustification} -\setmarginfloatcaptionadjustment{figure}{\captionstyle{\mpjustification}} - -% From https://tex.stackexchange.com/a/324757/17418 -% Palatino for main text and math -\usepackage[osf,sc]{mathpazo} - -% Helvetica for sans serif -% (scaled to match size of Palatino) -\usepackage[scaled=0.90]{helvet} - -% Bera Mono for monospaced -% (scaled to match size of Palatino) -\usepackage[scaled=0.85]{beramono} - -\setlxvchars\setxlvchars -\checkandfixthelayout - -\nouppercaseheads -%%% end tufte %%% \let\subsubsection\subsection \let\subsection\section \let\section\chapter @@ -46,17 +11,6 @@ %\usepackage{authblk} %\let\institute\affil -\declaretheorem[style=theorem]{theorem} -\declaretheorem[style=definition]{definition} -\declaretheorem[style=definition]{assumption} -\declaretheorem[style=definition]{protocol} -\declaretheorem[style=example]{example} -\declaretheorem[style=remark]{remark} -\declaretheorem[style=remark]{idea} -\declaretheorem[style=exercise]{exercise} -\declaretheorem[style=exercise]{question} -\declaretheorem[style=solution]{solution} - \begin{document} \input{contents.tex} diff --git a/modules/05-scientificity/preamble.tex b/modules/05-scientificity/preamble.tex index dce955a..551ffc4 100644 --- a/modules/05-scientificity/preamble.tex +++ b/modules/05-scientificity/preamble.tex @@ -50,6 +50,8 @@ \usepackage{multicol} \usepackage{changepage} +\usepackage{didactic} + \usepackage[capitalize]{cleveref} \input{objectives.tex} diff --git a/modules/05-scientificity/slides.tex b/modules/05-scientificity/slides.tex index 395cdf5..a77bbb7 100644 --- a/modules/05-scientificity/slides.tex +++ b/modules/05-scientificity/slides.tex @@ -1,100 +1,6 @@ \documentclass[ignoreframetext]{beamer} \input{preamble.tex} -\usetheme{Berlin} -\setbeamertemplate{footline}%{miniframes theme} -{% - \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} - \end{beamercolorbox} - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% - \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% - \hfill% - {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% - \end{beamercolorbox}% - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% - {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% - \end{beamercolorbox}% - \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} - \end{beamercolorbox} -} -\setbeamercovered{transparent} -\setbeamertemplate{bibliography item}{\relax} - -\AtBeginSection[]{% - \begin{frame} - \tableofcontents[currentsection] - \end{frame} -} - -\ProvideDocumentEnvironment{assumption}{o}{% - \IfValueTF{#1}{% - \begin{block}{Assumption: #1} - }{% - \begin{block}{Assumption} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{protocol}{o}{% - \IfValueTF{#1}{% - \begin{block}{Protocol: #1} - }{% - \begin{block}{Protocol} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{remark}{o}{% - \IfValueTF{#1}{% - \begin{alertblock}{Note: #1} - }{% - \begin{alertblock}{Note} - } -}{% - \end{alertblock} -} - -\ProvideDocumentEnvironment{idea}{o}{% - \IfValueTF{#1}{% - \begin{block}{Idea: #1} - }{% - \begin{block}{Idea} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{question}{o}{% - \setbeamercolor{block body}{bg=orange!15,fg=black} - \setbeamercolor{block title}{bg=orange,fg=white} - \setbeamercolor{local structure}{fg=orange} - \IfValueTF{#1}{% - \begin{block}{Question: #1} - }{% - \begin{block}{Question} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{exercise}{o}{% - \setbeamercolor{block body}{bg=yellow!10,fg=black} - \setbeamercolor{block title}{bg=yellow,fg=black} - \setbeamercolor{local structure}{fg=yellow} - \IfValueTF{#1}{% - \begin{block}{Exercise: #1} - }{% - \begin{block}{Exercise} - } -}{% - \end{block} -} - - \begin{document} \mode \input{contents.tex} From 934e29b534a312096d510385ddf1e98cce1d2483 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Tue, 4 Jun 2024 13:19:48 +0200 Subject: [PATCH 14/53] Improves final seminar slides --- modules/final-seminar/contents.tex | 69 ++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/modules/final-seminar/contents.tex b/modules/final-seminar/contents.tex index 4ce9d67..84748f2 100644 --- a/modules/final-seminar/contents.tex +++ b/modules/final-seminar/contents.tex @@ -102,6 +102,13 @@ \subsection{Material you should produce} You should note what question each paper answers and summarize how they do that. (This focuses on \cref{LOevaluate}.)% + }% + \only{% + \begin{itemize} + \item Find all papers answering + some aspect. + \item What (sub)question does each paper answer and how? + \end{itemize} } \item Missing aspects. \only
{% @@ -115,6 +122,14 @@ \subsection{Material you should produce} You must also discuss why this method is suitable to answer the question and any limitations. (This focuses on \cref{LOapply,LOevaluate}.)% + }% + \only{% + \begin{itemize} + \item State relevant (sub)questions not asked by the literature. + Propose a method to answer each. + \item \alert<+>{Discuss why the method is suitable and any + limitations.} + \end{itemize} } \item Conclusion. \only
{% @@ -125,6 +140,12 @@ \subsection{Material you should produce} You also summarize how well you find \cref{mainRQ} to be answered, if there are any \enquote{holes that need filling}. (This focuses on \cref{LOrelate}.)% + }% + \only{% + \begin{itemize} + \item Connect the questions and answers back to \cref{mainRQ}. + \item \alert<+>{Discuss how well the main RQ is answered.} + \end{itemize} } % \item your original plan for the course work, adaptations made and what you % learned. @@ -150,7 +171,7 @@ \subsection{Material you should produce} %\end{itemize} %This also assesses \cref{LOcomm}. -\subsection
{Assessment criteria} +\subsection{Assessment criteria} To assess the learning objectives (\cref{LOrelate,LOevaluate,LOapply,LOcomm,LOplan}) @@ -164,9 +185,20 @@ \subsection{Material you should produce} You'll need a pass on all criteria to pass the assignment and the course. +\begin{frame} + \begin{block}{Assessment criteria} + \begin{itemize} + \item \alert<+>\LOrelate + \item \LOapply + \item \alert<+>\LOevaluate + \item \LOcomm + \end{itemize} + \end{block} +\end{frame} {\RaggedRight +\begin{fullwidth} \begin{longtable} -{p{0.33\textwidth}p{0.33\textwidth}p{0.33\textwidth}p{0.33\textwidth}} +{p{0.20\columnwidth}p{0.20\columnwidth}p{0.20\columnwidth}p{0.20\columnwidth}} \toprule \textbf{Learning objective} & \textbf{Criteria} @@ -229,9 +261,9 @@ \subsection{Material you should produce} & All arguments are clearly stated and well motivated. & At least one argument is not clearly stated or not well motivated. State which one and motivate why it's not clear or well motivated. - \\* -\bottomrule -\end{longtable}} +\end{longtable} +\end{fullwidth} +} \subsection
{Plagiarism} @@ -283,7 +315,7 @@ \section{The final seminar} \begin{itemize} \item What order to present? \item You'll have one minute to write \enquote{me!}. - \item The order in which you appear will be the order of presentation. + \item The last one to write \enquote{me!} goes first. \end{itemize} \end{activity} \end{frame} @@ -292,18 +324,19 @@ \section{The final seminar} \mainRQ* \begin{activity} \begin{itemize} - \item One aspect/subquestion at a time. + \item The presenter's favourite aspect/subquestion first. + \item Summarize the question and the method\footnote{% + Cite if from a paper. + }. + \item Discuss why you think this is good\footnote{% + Focuses on the weak points pointed out above. + }: + \begin{itemize} + \item Why does this method answer the question? + \item Why does the answer to the question help answering the main RQ. + \item What ethical aspects are there to consider? + \end{itemize} + \item What do the others think? \end{itemize} \end{activity} \end{frame} - -\begin{frame} - \begin{activity}[Any other aspects/questions?] - \begin{itemize} - \item Take a few minutes to reflect on holes that need filling to get - closer to fully answer the main question. - \item Just write the questions. - \end{itemize} - \end{activity} -\end{frame} - From d220c9ab98430a4ff6ef817cbed023c0c02f1068 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 4 Nov 2024 13:50:44 +0100 Subject: [PATCH 15/53] Moves course-design into modules/00-intro --- Makefile | 1 - {course-design => modules/00-intro}/.gitignore | 0 {course-design => modules/00-intro}/Makefile | 0 {course-design => modules/00-intro}/abstract.tex | 0 {course-design => modules/00-intro}/contents.tex | 0 {course-design => modules/00-intro}/figs/GHurl.png | Bin {course-design => modules/00-intro}/figs/NCOL.jpg | Bin .../00-intro}/figs/fbf-doc-annotate-instruction.png | Bin .../00-intro}/figs/fbf-doc-annotations.png | Bin .../figs/fbf-doc-interactive-instruction.png | Bin .../00-intro}/figs/fbf-doc-quiz-question.png | Bin .../00-intro}/figs/fbf-video-contrib.png | Bin .../00-intro}/figs/fbf-video-question.png | Bin .../00-intro}/figs/fbf-video-quiz.png | Bin .../00-intro}/figs/fbf-video-req-quiz.png | Bin .../00-intro}/figs/variatio-mater-studiorum.png | Bin {course-design => modules/00-intro}/notes.tex | 0 {course-design => modules/00-intro}/objectives.tex | 0 {course-design => modules/00-intro}/preamble.tex | 0 {course-design => modules/00-intro}/slides.tex | 0 modules/Makefile | 1 + 21 files changed, 1 insertion(+), 1 deletion(-) rename {course-design => modules/00-intro}/.gitignore (100%) rename {course-design => modules/00-intro}/Makefile (100%) rename {course-design => modules/00-intro}/abstract.tex (100%) rename {course-design => modules/00-intro}/contents.tex (100%) rename {course-design => modules/00-intro}/figs/GHurl.png (100%) rename {course-design => modules/00-intro}/figs/NCOL.jpg (100%) rename {course-design => modules/00-intro}/figs/fbf-doc-annotate-instruction.png (100%) rename {course-design => modules/00-intro}/figs/fbf-doc-annotations.png (100%) rename {course-design => modules/00-intro}/figs/fbf-doc-interactive-instruction.png (100%) rename {course-design => modules/00-intro}/figs/fbf-doc-quiz-question.png (100%) rename {course-design => modules/00-intro}/figs/fbf-video-contrib.png (100%) rename {course-design => modules/00-intro}/figs/fbf-video-question.png (100%) rename {course-design => modules/00-intro}/figs/fbf-video-quiz.png (100%) rename {course-design => modules/00-intro}/figs/fbf-video-req-quiz.png (100%) rename {course-design => modules/00-intro}/figs/variatio-mater-studiorum.png (100%) rename {course-design => modules/00-intro}/notes.tex (100%) rename {course-design => modules/00-intro}/objectives.tex (100%) rename {course-design => modules/00-intro}/preamble.tex (100%) rename {course-design => modules/00-intro}/slides.tex (100%) diff --git a/Makefile b/Makefile index d1ed36c..f5e3a4e 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,3 @@ -SUBDIR= course-design SUBDIR+= modules INCLUDE_MAKEFILES?= ./makefiles diff --git a/course-design/.gitignore b/modules/00-intro/.gitignore similarity index 100% rename from course-design/.gitignore rename to modules/00-intro/.gitignore diff --git a/course-design/Makefile b/modules/00-intro/Makefile similarity index 100% rename from course-design/Makefile rename to modules/00-intro/Makefile diff --git a/course-design/abstract.tex b/modules/00-intro/abstract.tex similarity index 100% rename from course-design/abstract.tex rename to modules/00-intro/abstract.tex diff --git a/course-design/contents.tex b/modules/00-intro/contents.tex similarity index 100% rename from course-design/contents.tex rename to modules/00-intro/contents.tex diff --git a/course-design/figs/GHurl.png b/modules/00-intro/figs/GHurl.png similarity index 100% rename from course-design/figs/GHurl.png rename to modules/00-intro/figs/GHurl.png diff --git a/course-design/figs/NCOL.jpg b/modules/00-intro/figs/NCOL.jpg similarity index 100% rename from course-design/figs/NCOL.jpg rename to modules/00-intro/figs/NCOL.jpg diff --git a/course-design/figs/fbf-doc-annotate-instruction.png b/modules/00-intro/figs/fbf-doc-annotate-instruction.png similarity index 100% rename from course-design/figs/fbf-doc-annotate-instruction.png rename to modules/00-intro/figs/fbf-doc-annotate-instruction.png diff --git a/course-design/figs/fbf-doc-annotations.png b/modules/00-intro/figs/fbf-doc-annotations.png similarity index 100% rename from course-design/figs/fbf-doc-annotations.png rename to modules/00-intro/figs/fbf-doc-annotations.png diff --git a/course-design/figs/fbf-doc-interactive-instruction.png b/modules/00-intro/figs/fbf-doc-interactive-instruction.png similarity index 100% rename from course-design/figs/fbf-doc-interactive-instruction.png rename to modules/00-intro/figs/fbf-doc-interactive-instruction.png diff --git a/course-design/figs/fbf-doc-quiz-question.png b/modules/00-intro/figs/fbf-doc-quiz-question.png similarity index 100% rename from course-design/figs/fbf-doc-quiz-question.png rename to modules/00-intro/figs/fbf-doc-quiz-question.png diff --git a/course-design/figs/fbf-video-contrib.png b/modules/00-intro/figs/fbf-video-contrib.png similarity index 100% rename from course-design/figs/fbf-video-contrib.png rename to modules/00-intro/figs/fbf-video-contrib.png diff --git a/course-design/figs/fbf-video-question.png b/modules/00-intro/figs/fbf-video-question.png similarity index 100% rename from course-design/figs/fbf-video-question.png rename to modules/00-intro/figs/fbf-video-question.png diff --git a/course-design/figs/fbf-video-quiz.png b/modules/00-intro/figs/fbf-video-quiz.png similarity index 100% rename from course-design/figs/fbf-video-quiz.png rename to modules/00-intro/figs/fbf-video-quiz.png diff --git a/course-design/figs/fbf-video-req-quiz.png b/modules/00-intro/figs/fbf-video-req-quiz.png similarity index 100% rename from course-design/figs/fbf-video-req-quiz.png rename to modules/00-intro/figs/fbf-video-req-quiz.png diff --git a/course-design/figs/variatio-mater-studiorum.png b/modules/00-intro/figs/variatio-mater-studiorum.png similarity index 100% rename from course-design/figs/variatio-mater-studiorum.png rename to modules/00-intro/figs/variatio-mater-studiorum.png diff --git a/course-design/notes.tex b/modules/00-intro/notes.tex similarity index 100% rename from course-design/notes.tex rename to modules/00-intro/notes.tex diff --git a/course-design/objectives.tex b/modules/00-intro/objectives.tex similarity index 100% rename from course-design/objectives.tex rename to modules/00-intro/objectives.tex diff --git a/course-design/preamble.tex b/modules/00-intro/preamble.tex similarity index 100% rename from course-design/preamble.tex rename to modules/00-intro/preamble.tex diff --git a/course-design/slides.tex b/modules/00-intro/slides.tex similarity index 100% rename from course-design/slides.tex rename to modules/00-intro/slides.tex diff --git a/modules/Makefile b/modules/Makefile index 6ce53d3..2737eef 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -1,3 +1,4 @@ +SUBDIR+= ./00-intro SUBDIR+= ./01-methods-overview SUBDIR+= ./02-passwd From 18a4bcd68afb9ea1b0ec39b8461ac74413fc0db4 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 7 Nov 2024 16:19:42 +0100 Subject: [PATCH 16/53] Adds didactic submodule --- .gitmodules | 3 +++ didactic | 1 + 2 files changed, 4 insertions(+) create mode 160000 didactic diff --git a/.gitmodules b/.gitmodules index 0909ae9..7502afb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "bibsp"] path = bibsp url = https://github.com/dbosk/bibsp.git +[submodule "didactic"] + path = didactic + url = https://github.com/dbosk/didactic.git diff --git a/didactic b/didactic new file mode 160000 index 0000000..6545bfb --- /dev/null +++ b/didactic @@ -0,0 +1 @@ +Subproject commit 6545bfb9ba1e2fd4cbaf42709ec8fc1d99f4b53d From a6d178ae0e6c2a28f25c729b19483223f2fcade2 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 7 Nov 2024 16:24:36 +0100 Subject: [PATCH 17/53] Fixes some minor cosmetic things in intro --- modules/00-intro/Makefile | 2 +- modules/00-intro/contents.tex | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/modules/00-intro/Makefile b/modules/00-intro/Makefile index 6bd55ec..fd0e99a 100644 --- a/modules/00-intro/Makefile +++ b/modules/00-intro/Makefile @@ -19,5 +19,5 @@ clean: ${RM} notes.pdf slides.pdf -INCLUDE_MAKEFILES=../makefiles +INCLUDE_MAKEFILES=../../makefiles include ${INCLUDE_MAKEFILES}/tex.mk diff --git a/modules/00-intro/contents.tex b/modules/00-intro/contents.tex index 42b6b95..09dae2c 100644 --- a/modules/00-intro/contents.tex +++ b/modules/00-intro/contents.tex @@ -55,20 +55,23 @@ \section{Overview} \begin{frame}[fragile] \begin{example}\label{SoKProblem1} - \textcquote[\S IV]{SecurityAsAScience}{\textins*{C}laims of necessary - conditions for real-world security are unfalsifiable. - Claims of necessary conditions for formally-defined security are - tautological restatements of the assumptions}. + \textcquote[\S IV]{SecurityAsAScience}{% + \textins*{C}laims of necessary conditions for real-world security are + unfalsifiable. + Claims of necessary conditions for formally-defined security are + tautological restatements of the assumptions.% + } \end{example} \pause \begin{example}\label{SoKProblem2} \textcquote{SecurityAsAScience}{% - Unfalsifiable claims are common in security---and they, along with circular - arguments, are used to justify many defensive measures \textelp{} - \textins{T}here are many ways to argue measures in, but no way to argue one - out. + Unfalsifiable claims are common in security---and they, along with + circular arguments, are used to justify many defensive measures + \textelp{} + \textins{T}here are many ways to argue measures in, but no way to argue + one out.% } \end{example} \end{frame} @@ -258,7 +261,7 @@ \subsection{The goal} \begin{frame} \begin{example}[\enquote{Provable security}] \begin{itemize} - \item A uniformly random string of length \(n\) is the most secure + \item A uniformly random string of length \(n\) is secure to use as a password. \item We can prove it will take millions of years to guess it. @@ -275,7 +278,7 @@ \subsection{The goal} \end{frame} \begin{example}[\enquote{Provable security}]\label{SecurePassword} - A uniformly random string of length \(n\) is the most secure password. + A uniformly random string of length \(n\) is secure to use as a password. We can prove it will take millions of years to guess it. \end{example} @@ -442,6 +445,7 @@ \subsection{Format} \begin{figure}[t] \begin{fullwidth} + \centering \subbottom[% An interactive document in FeedbackFruits where one can answer quiz questions posed in the document and ask questions about the content.% From 11303aba8714230a9fac2f1bca12cdf8afa9459a Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 7 Nov 2024 16:25:12 +0100 Subject: [PATCH 18/53] Switches intro to use didactic package --- modules/00-intro/notes.tex | 50 +----------------- modules/00-intro/preamble.tex | 2 + modules/00-intro/slides.tex | 95 ----------------------------------- 3 files changed, 3 insertions(+), 144 deletions(-) diff --git a/modules/00-intro/notes.tex b/modules/00-intro/notes.tex index 8a8020d..b5c9677 100644 --- a/modules/00-intro/notes.tex +++ b/modules/00-intro/notes.tex @@ -1,45 +1,10 @@ \documentclass[a4paper,10pt,article,oneside]{memoir} -%%% Tufte %%% -\usepackage{marginfix} -%\setlength{\evensidemargin}{\oddsidemargin} -\marginparmargin{outer} -\setlrmarginsandblock{2.5cm}{8cm}{*} - -\footnotesinmargin - -\usepackage{ragged2e} -\renewcommand{\sidefootform}{\RaggedRight} -\renewcommand{\foottextfont}{\footnotesize\RaggedRight} - -\setmpjustification{\RaggedRight}{\RaggedRight} - -% margin figure and caption typeset ragged against text block -\setfloatadjustment{marginfigure}{\mpjustification} -\setmarginfloatcaptionadjustment{figure}{\captionstyle{\mpjustification}} - -% From https://tex.stackexchange.com/a/324757/17418 -% Palatino for main text and math -\usepackage[osf,sc]{mathpazo} - -% Helvetica for sans serif -% (scaled to match size of Palatino) -\usepackage[scaled=0.90]{helvet} - -% Bera Mono for monospaced -% (scaled to match size of Palatino) -\usepackage[scaled=0.85]{beramono} - -\setlxvchars\setxlvchars -\checkandfixthelayout - -\nouppercaseheads -%%% end tufte %%% \let\subsubsection\subsection \let\subsection\section \let\section\chapter +\marginparmargin{outer} \newsubfloat{figure}% Allow subfloats in figure environment -\usepackage{fullwidth} \input{preamble.tex} @@ -51,19 +16,6 @@ \usepackage{authblk} \let\institute\affil -\declaretheorem[numbered=unless unique,style=theorem]{theorem} -\declaretheorem[numbered=unless unique,style=definition]{definition} -\declaretheorem[numbered=unless unique,style=definition]{assumption} -\declaretheorem[numbered=unless unique,style=definition]{protocol} -\declaretheorem[numbered=unless unique,style=example]{example} -%\declaretheorem[style=definition,numbered=unless unique, -% name=Example,refname={example,examples}]{example} -\declaretheorem[numbered=unless unique,style=remark]{remark} -\declaretheorem[numbered=unless unique,style=remark]{idea} -\declaretheorem[numbered=unless unique,style=exercise]{exercise} -\declaretheorem[numbered=unless unique,style=exercise]{question} -\declaretheorem[numbered=unless unique,style=solution]{solution} - \begin{document} \input{contents.tex} \end{document} diff --git a/modules/00-intro/preamble.tex b/modules/00-intro/preamble.tex index 091f6e0..1ae10c8 100644 --- a/modules/00-intro/preamble.tex +++ b/modules/00-intro/preamble.tex @@ -50,5 +50,7 @@ \usepackage{multicol} \usepackage{changepage} +\usepackage{didactic} + \usepackage[capitalize]{cleveref} \input{objectives.tex} diff --git a/modules/00-intro/slides.tex b/modules/00-intro/slides.tex index 2fbc768..06fcc1b 100644 --- a/modules/00-intro/slides.tex +++ b/modules/00-intro/slides.tex @@ -1,101 +1,6 @@ \documentclass[ignoreframetext]{beamer} \input{preamble.tex} -\usetheme{Berlin} -\setbeamertemplate{footline}%{miniframes theme} -{% - \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} - \end{beamercolorbox} - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% - \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% - \hfill% - {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% - \end{beamercolorbox}% - \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% - leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% - {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% - \end{beamercolorbox}% - \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} - \end{beamercolorbox} -} -\setbeamercovered{transparent} -%\setbeamertemplate{bibliography item}[text] -\setbeamertemplate{bibliography item}{} - -\AtBeginSection[]{% - \begin{frame} - \tableofcontents[currentsection] - \end{frame} -} - -\ProvideDocumentEnvironment{assumption}{o}{% - \IfValueTF{#1}{% - \begin{block}{Assumption: #1} - }{% - \begin{block}{Assumption} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{protocol}{o}{% - \IfValueTF{#1}{% - \begin{block}{Protocol: #1} - }{% - \begin{block}{Protocol} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{remark}{o}{% - \IfValueTF{#1}{% - \begin{alertblock}{Note: #1} - }{% - \begin{alertblock}{Note} - } -}{% - \end{alertblock} -} - -\ProvideDocumentEnvironment{idea}{o}{% - \IfValueTF{#1}{% - \begin{block}{Idea: #1} - }{% - \begin{block}{Idea} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{question}{o}{% - \setbeamercolor{block body}{bg=orange!15,fg=black} - \setbeamercolor{block title}{bg=orange,fg=white} - \setbeamercolor{local structure}{fg=orange} - \IfValueTF{#1}{% - \begin{block}{Question: #1} - }{% - \begin{block}{Question} - } -}{% - \end{block} -} - -\ProvideDocumentEnvironment{exercise}{o}{% - \setbeamercolor{block body}{bg=yellow!10,fg=black} - \setbeamercolor{block title}{bg=yellow,fg=black} - \setbeamercolor{local structure}{fg=yellow} - \IfValueTF{#1}{% - \begin{block}{Exercise: #1} - }{% - \begin{block}{Exercise} - } -}{% - \end{block} -} - - \begin{document} \mode \input{contents.tex} From 0012d40ce3dd8a1cd29e14d06d6c0ac0e8352738 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 7 Nov 2024 16:28:40 +0100 Subject: [PATCH 19/53] Adapts Makefiles to course-design being 00-intro --- modules/02-passwd/Makefile | 2 +- modules/04-anonymous/Makefile | 2 +- modules/05-scientificity/Makefile | 2 +- modules/final-seminar/Makefile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/02-passwd/Makefile b/modules/02-passwd/Makefile index 62fe324..6183e7b 100644 --- a/modules/02-passwd/Makefile +++ b/modules/02-passwd/Makefile @@ -16,7 +16,7 @@ notes.pdf: ${SRC} ${DEPENDS} ${FIGS} slides.pdf: slides.tex slides.pdf: ${SRC} ${DEPENDS} ${FIGS} -objectives.tex: ../../course-design/objectives.tex +objectives.tex: ../00-intro/objectives.tex ${DEPENDS}: ${LN} $< $@ diff --git a/modules/04-anonymous/Makefile b/modules/04-anonymous/Makefile index 3a73932..eff3e29 100644 --- a/modules/04-anonymous/Makefile +++ b/modules/04-anonymous/Makefile @@ -14,7 +14,7 @@ notes.pdf: ${SRC} ${DEPENDS} ${FIGS} slides.pdf: slides.tex slides.pdf: ${SRC} ${DEPENDS} ${FIGS} -objectives.tex: ../../course-design/objectives.tex +objectives.tex: ../00-intro/objectives.tex ${DEPENDS}: ${LN} $< $@ diff --git a/modules/05-scientificity/Makefile b/modules/05-scientificity/Makefile index 3a73932..eff3e29 100644 --- a/modules/05-scientificity/Makefile +++ b/modules/05-scientificity/Makefile @@ -14,7 +14,7 @@ notes.pdf: ${SRC} ${DEPENDS} ${FIGS} slides.pdf: slides.tex slides.pdf: ${SRC} ${DEPENDS} ${FIGS} -objectives.tex: ../../course-design/objectives.tex +objectives.tex: ../00-intro/objectives.tex ${DEPENDS}: ${LN} $< $@ diff --git a/modules/final-seminar/Makefile b/modules/final-seminar/Makefile index 553f2f0..ebdbaf2 100644 --- a/modules/final-seminar/Makefile +++ b/modules/final-seminar/Makefile @@ -14,7 +14,7 @@ notes.pdf: ${SRC} ${EXT_SRC} slides.pdf: slides.tex slides.pdf: ${SRC} ${EXT_SRC} -objectives.tex: ../../course-design/objectives.tex +objectives.tex: ../00-intro/objectives.tex ${EXT_SRC}: ${LN} $< $@ From f63bad3bf2aab7ed307df16002ceff285b810ab2 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 11 Nov 2024 14:41:33 +0100 Subject: [PATCH 20/53] Updates intro for v2024p2 --- modules/00-intro/contents.tex | 547 ++++++++++++++++++++-------------- modules/00-intro/notes.tex | 4 +- modules/00-intro/preamble.tex | 1 + 3 files changed, 333 insertions(+), 219 deletions(-) diff --git a/modules/00-intro/contents.tex b/modules/00-intro/contents.tex index 09dae2c..212b802 100644 --- a/modules/00-intro/contents.tex +++ b/modules/00-intro/contents.tex @@ -1,5 +1,5 @@ \title{% - A Science of Security Course: An Overview + A Science of Security Course: Introduction } \author{Daniel Bosk\thanks{% This material was authored by Daniel Bosk and is available under the @@ -29,6 +29,66 @@ \section{Overview} +Let's have a look at provable security, widely considered the epitome of +security research. + +\begin{frame} + \begin{example}[\enquote{Provable security}]\label{SecurePassword} + A uniformly random string of length \(n\) is secure to use as a password. + We can prove it will take millions of years to guess it. + \end{example} + + \pause + + \begin{onlyenv} + \begin{remark} + \begin{itemize} + \item Attackers still get in, weird \dots + \end{itemize} + \end{remark} + \end{onlyenv} +\end{frame} + +\begin{frame} + \begin{example}[Usability] + \begin{itemize} + \item Turns out people can't handle uniformly random passwords. + \item Particularly not with a unique such password for every service. + \item They can't generate uniformly random passwords either. + \end{itemize} + \end{example} + + \pause + + \begin{remark}[Several aspects] + \begin{itemize} + \item We want students to handle complex problems. + \item Should see there are several aspects. + \item Aspects must be approached differently. + \end{itemize} + \end{remark} +\end{frame} + +However, attackers still get in. +% XXX add refs to password literature +It turns out that humans can't handle long, uniformly random passwords. +Particularly not when they have to remember one such password \emph{per service +they use}. +And they can't generate uniformly random passwords either! +None of these results could be found through provable security, they're from +the usability area of security and the methods are from the usability and +human--computer interaction research field. + +By this we don't say that provable security is wrong or doesn't work. +The same can be said of the usability methods. +Both are needed, they complement each other in generating understanding of +security problems. +The goal of the course is that the students should be able to master the +variety of methods and combine them to answer questions about security +problems. +That includes being able to evaluate different approaches to answering +questions and choosing among the most suitable ones. + \only{\subsection{The goal}} The goal of the course is to give a holistic view of the Science of Security. @@ -255,67 +315,6 @@ \section{More concretely} \subsection{The goal} -Let's have a look at provable security, widely considered the epitome of -security research. - -\begin{frame} - \begin{example}[\enquote{Provable security}] - \begin{itemize} - \item A uniformly random string of length \(n\) is secure to use as a - password. - - \item We can prove it will take millions of years to guess it. - \end{itemize} - \end{example} - - \pause - - \begin{remark} - \begin{itemize} - \item Attackers still get in, weird \dots - \end{itemize} - \end{remark} -\end{frame} - -\begin{example}[\enquote{Provable security}]\label{SecurePassword} - A uniformly random string of length \(n\) is secure to use as a password. - We can prove it will take millions of years to guess it. -\end{example} - -\begin{frame} - \begin{example}[Usability] - \begin{itemize} - \item Turns out people can't handle uniformly random passwords. - \item Particularly not with a unique such password for every service. - \item They can't generate uniformly random passwords either. - \end{itemize} - \end{example} - - \pause - - \begin{remark}[Several aspects] - \begin{itemize} - \item We want students to handle complex problems. - \item Should see there are several aspects. - \item Aspects must be approached differently. - \end{itemize} - \end{remark} -\end{frame} - -However, attackers still get in. -% XXX add refs to password literature -It turns out that humans can't handle long, uniformly random passwords. -Particularly not when they have to remember one such password \emph{per service -they use}. -And they can't generate uniformly random passwords either! -None of these results could be found through provable security, they're from -the usability area of security and the methods are from the usability and -human--computer interaction research field. - -By this we don't say that provable security is wrong or doesn't work. -The same can be said of the usability methods. -Both are needed, they complement each other in generating understanding of -security problems. The goal of the course is that the students should be able to master the variety of methods [\ref{LOrelate}] and combine them to answer questions about security problems [\ref{LOapply}]. @@ -331,100 +330,13 @@ \subsection{The goal} \begin{block}{Concrete goals} \begin{itemize} \item Ask good questions. - \item Use suitable methods to answer them. + \item Propose suitable methods to answer them. \item Evaluate the suitability of proposed methods. \end{itemize} \end{block} \end{frame} -\subsection{Teaching design} - -The teaching design of the course is particularly interesting to describe in -this course, because it is highly relevant on the meta level. - -\begin{frame}[fragile] - \begin{block}{Teaching design} - \begin{itemize} - \item Have problems that must be explored using several - methods. - \item Work through enough problems to cover the entire spectrum. - \end{itemize} - \end{block} - - \begin{remark}[Learning theory] - \begin{columns}[T] - \begin{column}{0.6\columnwidth} - \centering - \includegraphics[width=0.8\columnwidth]{figs/variatio-mater-studiorum.png} - \end{column} - \begin{column}{0.4\columnwidth} - \includegraphics[height=0.55\textheight]{figs/NCOL.jpg} - \end{column} - \end{columns} - \end{remark} -\end{frame} - -The design of the course is based on the variation theory of learning~\cite[see -\eg][]{NecessaryConditionsOfLearning}. -The goal of the theory is to achieve learning that prepares for unknown -situations. -It aims for deep learning (as opposed to surface learning, -\cf~\cite{DeepSurfaceLearning}). -This fits very well with our learning outcomes (\cref{LearningOutcomes}). -In fact, \textcite{NecessaryConditionsOfLearning} makes a point that learning -(according to this theory), is in fact very aligned with science and research. -However, variation theory, according to me, tells us more than the scientific -method traditionally does; it tells us about the preconditions to scientific -discovery. - -But what does this mean for the course concretely? -Well, in a sense, we could say that the teaching will treat some situations and -the assessment will treat something \enquote{completely different}. -Of course, there is something in common, namely the essence of the course. -But the purpose of the assessment is to test if the student can use what -they've learned from the teaching to handle this unknown situation---because -that's what the thesis and the rest of their careers are about. -Now this also means that if a student adopts the approach of opening the -assignments and then try to find the correct answers in the teaching material, -that student will be very disappointed in the course. - -In essence, we will look at problems and work out suitable methods to answer -questions about the problem at hand. -(This is the pattern of variation called contrast, in terms of -\cite{NecessaryConditionsOfLearning}, and focuses on \ref{LOrelate}, it's the -first and crucial step of learning.) -Then we'll dive into each method to explore what kinds of questions it can help -answer. -(This is the pattern of variation called generalization, in terms of -\cite{NecessaryConditionsOfLearning}, and focuses on \ref{LOevaluate}. -Coincidentally, this pattern corresponds to what is called the scientific -method.) -Finally, we will combine the methods to answer more complex questions. -(This is the variation of fusion, in terms of -\cite{NecessaryConditionsOfLearning}, and focuses on \ref{LOapply}.) -The assessment will then be a new problem where the students must combine the -methods to answer more complex questions on their own. - -For the remaining learning objectives, \ref{LOplan} and \ref{LOcomm}, we will -use the students' own works as learning material. -The idea is as follows: -The students will review each others' works, so this concerns \ref{LOcomm}. -If the work is about arguing why a method answers a particular research -question, then another student's solution will provide a contrasting -perspective to one's own. -Even if the choice of method is the same, the phrasing of the arguments -provides contrast to one's own arguments and phrasing thereof. - -We allow for \ref{LOplan} by giving the teaching material, assignments and -their deadlines for participating in seminars in advance. -Since the course runs in every period, it's up to the student to make a plan -for when to complete the assignments and participate in the seminars. -It's fine if a plan needs adapting, life happens; the important thing is that -the students learn to deal with it. -The assessment of this learning outcome consists of evaluating the plan, how it -turned out and what the student learned. - \subsection{Format} We have the following division of credits in LADOK\footnote{% @@ -443,23 +355,31 @@ \subsection{Format} The idea is that you learn from the first few seminars, so that we can grade you on the last one. -\begin{figure}[t] - \begin{fullwidth} - \centering - \subbottom[% - An interactive document in FeedbackFruits where one can answer quiz questions - posed in the document and ask questions about the content.% - \label{fbfdocquiz}% - ]{\includegraphics[height=0.3\textheight]{figs/fbf-doc-quiz-question.png}} - \hspace{1em} - \subbottom[% - An interactive document in FeedbackFruits where one can annotate the text - with focused topics together with other students in the class.% - \label{fbfdocannotation}% - ]{\includegraphics[height=0.3\textheight]{figs/fbf-doc-annotations.png}} - \caption{Two ways of having interactive documents.}\label{fbfdoc} - \end{fullwidth} -\end{figure} +\begin{figure*}[t] + \begin{sidecaption} + {Two ways of having interactive documents.} + [fbfdoc] + \begin{subfigure}[b]{0.49\columnwidth} + \centering + \includegraphics[width=\columnwidth]{figs/fbf-doc-annotations.png} + \caption{% + An interactive document in FeedbackFruits where one can annotate the + text with focused topics together with other students in the class.% + \label{fbfdocannotation}% + } + \end{subfigure} + \hfill + \begin{subfigure}[b]{0.49\columnwidth} + \centering + \includegraphics[width=\columnwidth]{figs/fbf-doc-quiz-question.png} + \caption{% + An interactive document in FeedbackFruits where one can answer quiz + questions posed in the document and ask questions about the content.% + \label{fbfdocquiz}% + } + \end{subfigure} + \end{sidecaption} +\end{figure*} \mode{% \begin{frame}[fragile] @@ -504,13 +424,9 @@ \subsection{Format} \begin{block}{Teaching material} \begin{itemize} \item<1> Video lectures where students can ask questions and answer - quizzes\footnote{FeedbackFruits or Canvas Studio}. + quizzes. - \pause - - \item<2-3> Reading assignments with social annotation\footnote{% - FeedbackFruits or Perusall - }. + \item<2-3> Reading assignments with social annotation. \end{itemize} \end{block} \end{column} @@ -569,14 +485,24 @@ \subsection{Format} \item A synchronous seminar to summarize all work and tie the sack. \end{itemize} \end{block} + + \uncover<+>{% + \begin{remark} + \begin{itemize} + \item I'm evaluating whether I can use teaching part for assessment. + \item That way you don't need to do the project. + \end{itemize} + \end{remark} + } \end{frame} \begin{frame} \begin{block}{Giving the course} - \begin{enumerate} - \item Given every period; yes, four times per year. - \item If you don't finish, you can try again next period. - \end{enumerate} + \begin{itemize} + \item Given twice pre year, for now. + \item If you don't finish, you can try again next round. + \item Next will be either period 3 or 4, depending on turnout. + \end{itemize} \end{block} \end{frame} } @@ -645,7 +571,6 @@ \subsection{Contents} \begin{remark}[To focus on] \begin{itemize} \item What are the limitations? - \item Do these require a combination to form a Science of Security? \end{itemize} \end{remark} \end{frame} @@ -657,41 +582,35 @@ \subsection{Contents} \citetitle{SecurityAsAScience}\autocite{SecurityAsAScience} by \citeauthor{SecurityAsAScience}. -\mode{% -\begin{frame} - \begin{example}[Philosophy of Science of Security] - \begin{itemize} - \item Discuss - \citetitle{SecurityAsAScience}\footfullcite{SecurityAsAScience}. - \item What is Science of Security? - \item Does that even exist at the moment? - \item Shall we work according to the hypothetico-deductive model? - \item What are the problems? - \end{itemize} - \end{example} -\end{frame} -} -\begin{frame} - \begin{block}{Contents, part II} - \begin{itemize} - \item General introductions to various subfields. - \item Which methods are used and why? - %\item Some exemplary papers? \alert<2>{Both good and bad!} - \item How does a subfield fit into the holistic picture of Security? - \item How can these methods fit into other situations? - \end{itemize} - \end{block} +\section{Contents} - \begin{exercise} - \begin{itemize} - \item What is an area or problem that you're interested in (in security)? - \item Think of an interesting case that you can reflect on during the - course. - \end{itemize} - \end{exercise} +\begin{frame} + \begin{remark} + This year we're syncing more with TAMOS. + \end{remark} \end{frame} +%\begin{frame} +% \begin{block}{Contents, part II} +% \begin{itemize} +% \item General introductions to various subfields. +% \item Which methods are used and why? +% %\item Some exemplary papers? \alert<2>{Both good and bad!} +% \item How does a subfield fit into the holistic picture of Security? +% \item How can these methods fit into other situations? +% \end{itemize} +% \end{block} +% +% \begin{exercise} +% \begin{itemize} +% \item What is an area or problem that you're interested in (in security)? +% \item Think of an interesting case that you can reflect on during the +% course. +% \end{itemize} +% \end{exercise} +%\end{frame} + %\begin{frame} % \begin{remark} % \begin{itemize} @@ -727,6 +646,97 @@ \subsection{Contents} % \end{block} %\end{frame} +\subsection{Learning} + +The first part of the course is an introduction to the scientific method in +general. +We're following the TAMOS course. +However, we complement that material with more security oriented examples. + +\paragraph{Scientificity, part 1} + +The first part is to read \citetitle{HowToDesignSecurityExperiments} by +\textcite{HowToDesignSecurityExperiments}. +This paper covers the same (albeit in different level of detail) as TAMOS' +lectures on +scientific inferences, +observation and measurement, +and experiments. +So after you've read the paper, you can help annotate the TAMOS videos with +more security-related examples. +Particularly, you should connect the pieces of +\citetitle{HowToDesignSecurityExperiments} and the TAMOS lectures. + +\begin{frame} + \begin{block}{Scientificity, part 1} + \begin{itemize} + \item \fullcite{HowToDesignSecurityExperiments} + \item Annotate TAMOS videos with security examples. + \begin{itemize} + \item Scientific inferences, + \item Observation and measurement, + \item Experiments. + \end{itemize} + \end{itemize} + \end{block} +\end{frame} + +\paragraph{Case study: Passwords} + +The next part is to look into passwords as a means of authentication. +Passwords as a mechanism is interesting because it can be evaluated in many +different ways---which covers the spectrum of methods discussed in TAMOS so +far, but also acts as a spring board to TAMOS' next topic (models). + +The first part of this topics will, however, be about scientific literature. +We'll go through some papers and look at how they deal with the literature. +(Still the subject focus is on passwords, but we're interested in the +methodological aspects.) +There will be a seminar given by the KTH Library. + +\begin{frame} + \begin{block}{Case study: Passwords} + \begin{itemize} + \item Different types of literature review. + \item Searching for literature. + \item Seminar by KTH Library. + \end{itemize} + \end{block} +\end{frame} + +\begin{frame} + \begin{block}{Case study: Passwords, continued} + \begin{itemize} + \item How do we evaluate the security of passwords? + \item Read and annotate a variety of papers exploring the topic. + \item Focus on the methodology. + \item Discuss during a seminar. + \end{itemize} + \end{block} +\end{frame} + +\begin{frame} + \begin{remark} + \begin{itemize} + \item I picked passwords because it's an easy topic to understand. + \item I also picked it because practice is still unscientifically + founded. + \item We're interested in the methodological aspects. + \item We want to connect what they do back to TAMOS. + \end{itemize} + \end{remark} +\end{frame} + +\paragraph{Other topics} + +In the rest of the course we'll cover a variety of topics: +\begin{itemize} + \item formal methods + \item cryptography, + \item anonymous communication, + \item possibly other topics too. +\end{itemize} + \subsection{Final assessment} The final assessment will be an assignment where the students design a research @@ -744,6 +754,10 @@ \subsection{Final assessment} \item Explain why the methods answer the questions. \end{itemize} \end{block} + + \begin{remark} + This will be done in groups. + \end{remark} \end{frame} You'll do this by writing a report motivating your choices of methods and @@ -759,15 +773,21 @@ \subsection{Final assessment} \item Review someone else's report. \end{itemize} \end{block} + + \begin{remark} + \begin{itemize} + \item Everyone should review one report (individually). + \item But it's fine to discuss in the groups. + \end{itemize} + \end{remark} \end{frame} -The final assessment will be done in pairs. +The final assessment will be done in groups of 3--5 students. \begin{frame} \begin{remark} \begin{itemize} - \item The final assessment will be done in pairs. - \item Up to three in a group is allowed. + \item The final assessment will be done in groups of 3--5. \end{itemize} \end{remark} \end{frame} @@ -801,13 +821,15 @@ \subsection{Final assessment} %\end{frame} \begin{onlyenv} -\section{The material} +\section{About you} \begin{frame}[fragile] - \begin{center} - \huge - Canvas - \end{center} + \begin{question} + \begin{itemize} + \item What courses have you taken (or are taking)? + \item What are your interests? + \end{itemize} + \end{question} \end{frame} \end{onlyenv} @@ -819,3 +841,94 @@ \section{The material} \only{\printbibliography} \end{frame} + +\mode{\endinput} + +\subsection{Teaching design} + +The teaching design of the course is particularly interesting to describe in +this course, because it is highly relevant on the meta level. + +\begin{frame}[fragile] + \begin{block}{Teaching design} + \begin{itemize} + \item Have problems that must be explored using several + methods. + \item Work through enough problems to cover the entire spectrum. + \end{itemize} + \end{block} + + \begin{remark}[Learning theory] + \begin{columns}[T] + \begin{column}{0.6\columnwidth} + \centering + \includegraphics[width=0.8\columnwidth]{figs/variatio-mater-studiorum.png} + \end{column} + \begin{column}{0.4\columnwidth} + \includegraphics[height=0.55\textheight]{figs/NCOL.jpg} + \end{column} + \end{columns} + \end{remark} +\end{frame} + +The design of the course is based on the variation theory of learning~\cite[see +\eg][]{NecessaryConditionsOfLearning}. +The goal of the theory is to achieve learning that prepares for unknown +situations. +It aims for deep learning (as opposed to surface learning, +\cf~\cite{DeepSurfaceLearning}). +This fits very well with our learning outcomes (\cref{LearningOutcomes}). +In fact, \textcite{NecessaryConditionsOfLearning} makes a point that learning +(according to this theory), is in fact very aligned with science and research. +However, variation theory, according to me, tells us more than the scientific +method traditionally does; it tells us about the preconditions to scientific +discovery. + +But what does this mean for the course concretely? +Well, in a sense, we could say that the teaching will treat some situations and +the assessment will treat something \enquote{completely different}. +Of course, there is something in common, namely the essence of the course. +But the purpose of the assessment is to test if the student can use what +they've learned from the teaching to handle this unknown situation---because +that's what the thesis and the rest of their careers are about. +Now this also means that if a student adopts the approach of opening the +assignments and then try to find the correct answers in the teaching material, +that student will be very disappointed in the course. + +In essence, we will look at problems and work out suitable methods to answer +questions about the problem at hand. +(This is the pattern of variation called contrast, in terms of +\cite{NecessaryConditionsOfLearning}, and focuses on \ref{LOrelate}, it's the +first and crucial step of learning.) +Then we'll dive into each method to explore what kinds of questions it can help +answer. +(This is the pattern of variation called generalization, in terms of +\cite{NecessaryConditionsOfLearning}, and focuses on \ref{LOevaluate}. +Coincidentally, this pattern corresponds to what is called the scientific +method.) +Finally, we will combine the methods to answer more complex questions. +(This is the variation of fusion, in terms of +\cite{NecessaryConditionsOfLearning}, and focuses on \ref{LOapply}.) +The assessment will then be a new problem where the students must combine the +methods to answer more complex questions on their own. + +For the remaining learning objectives, \ref{LOplan} and \ref{LOcomm}, we will +use the students' own works as learning material. +The idea is as follows: +The students will review each others' works, so this concerns \ref{LOcomm}. +If the work is about arguing why a method answers a particular research +question, then another student's solution will provide a contrasting +perspective to one's own. +Even if the choice of method is the same, the phrasing of the arguments +provides contrast to one's own arguments and phrasing thereof. + +We allow for \ref{LOplan} by giving the teaching material, assignments and +their deadlines for participating in seminars in advance. +Since the course runs in every period, it's up to the student to make a plan +for when to complete the assignments and participate in the seminars. +It's fine if a plan needs adapting, life happens; the important thing is that +the students learn to deal with it. +The assessment of this learning outcome consists of evaluating the plan, how it +turned out and what the student learned. + + diff --git a/modules/00-intro/notes.tex b/modules/00-intro/notes.tex index b5c9677..87128ea 100644 --- a/modules/00-intro/notes.tex +++ b/modules/00-intro/notes.tex @@ -3,8 +3,8 @@ \let\subsection\section \let\section\chapter \marginparmargin{outer} - -\newsubfloat{figure}% Allow subfloats in figure environment +\usepackage{subcaption} +%\newsubfloat{figure}% Allow subfloats in figure environment \input{preamble.tex} diff --git a/modules/00-intro/preamble.tex b/modules/00-intro/preamble.tex index 1ae10c8..c4ab745 100644 --- a/modules/00-intro/preamble.tex +++ b/modules/00-intro/preamble.tex @@ -2,6 +2,7 @@ \usepackage[T1]{fontenc} \usepackage[british]{babel} \usepackage{booktabs} +\usepackage{subcaption} \usepackage[% natbib, From 345500ebab287ccd7ea70537154ba0034c5237fd Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 18 Nov 2024 10:38:43 +0100 Subject: [PATCH 21/53] Adds new slides for seminar --- modules/02-passwd/.gitignore | 1 + modules/02-passwd/Makefile | 4 +- modules/02-passwd/seminar-slides.tex | 12 ++ modules/02-passwd/seminar.tex | 157 +++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 modules/02-passwd/seminar-slides.tex create mode 100644 modules/02-passwd/seminar.tex diff --git a/modules/02-passwd/.gitignore b/modules/02-passwd/.gitignore index 85d632d..701f4cf 100644 --- a/modules/02-passwd/.gitignore +++ b/modules/02-passwd/.gitignore @@ -2,3 +2,4 @@ notes.pdf slides.pdf objectives.tex literature +seminar-slides.pdf diff --git a/modules/02-passwd/Makefile b/modules/02-passwd/Makefile index 6183e7b..8f47b51 100644 --- a/modules/02-passwd/Makefile +++ b/modules/02-passwd/Makefile @@ -1,5 +1,5 @@ .PHONY: all -all: notes.pdf slides.pdf +all: notes.pdf slides.pdf seminar-slides.pdf LATEXFLAGS+= -shell-escape @@ -16,6 +16,8 @@ notes.pdf: ${SRC} ${DEPENDS} ${FIGS} slides.pdf: slides.tex slides.pdf: ${SRC} ${DEPENDS} ${FIGS} +seminar-slides.pdf: seminar-slides.tex seminar.tex + objectives.tex: ../00-intro/objectives.tex ${DEPENDS}: diff --git a/modules/02-passwd/seminar-slides.tex b/modules/02-passwd/seminar-slides.tex new file mode 100644 index 0000000..3131b46 --- /dev/null +++ b/modules/02-passwd/seminar-slides.tex @@ -0,0 +1,12 @@ +\documentclass[ignoreframetext]{beamer} +\input{preamble.tex} + +\begin{document} +\mode +\input{seminar.tex} +\mode* + +\begin{frame}[allowframebreaks] + \printbibliography +\end{frame} +\end{document} diff --git a/modules/02-passwd/seminar.tex b/modules/02-passwd/seminar.tex new file mode 100644 index 0000000..6deb8af --- /dev/null +++ b/modules/02-passwd/seminar.tex @@ -0,0 +1,157 @@ +\title{% + How do you know it's secure? + Passwords +} +\author{Daniel Bosk\thanks{% + This material is available under the Creative Commons + Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 international + license. + The material was written with some aid from GitHub Copilot. +}} +\institute{% + KTH EECS +} + +\begin{frame} + \maketitle +\end{frame} + +\mode* + +\begin{abstract} + \input{abstract.tex} +\end{abstract} + +\clearpage + +\begin{frame} + \frametitle{Three Papers on Passwords} + \begin{itemize} + \item \fullcite{OfPasswordsAndPeople} + \item \fullcite{CanLongPasswordsBeSecureAndUsable} + \item \fullcite{WhyPhishingWorks} + \end{itemize} +\end{frame} + +\section{Related to TAMOS} + +\begin{frame} + \begin{question} + \begin{itemize} + \item What type of scientific inferences were they doing? + \end{itemize} + \end{question} + + \begin{question} + \begin{itemize} + \item What type of observation and measurement? + \begin{itemize} + \item Direct or indirect? Instruments? + \item Needed theory? + \end{itemize} + \end{itemize} + \end{question} + + \begin{question} + \begin{itemize} + \item Operationalization? + \begin{itemize} + \item What did they measure and how? + \item Measurement errors? + \end{itemize} + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item Did they do hypothesis testing? + \end{itemize} + \end{question} + + \begin{question} + \begin{itemize} + \item How was their experimental setup? Or was it observational? + \begin{itemize} + \item Randomize intervention and control? + \item Background factors? + \item Blinding? + \item Natural experiment? + \end{itemize} + \end{itemize} + \end{question} + + \begin{question} + \begin{itemize} + \item Error handling? + \begin{itemize} + \item Observer effect? + \end{itemize} + \end{itemize} + \end{question} +\end{frame} + +\section{More general} + +\begin{frame} + \begin{question} + \begin{itemize} + \item We had \citetitle{OfPasswordsAndPeople}, why do we need + \citetitle{CanLongPasswordsBeSecureAndUsable}? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item What can we say about the validity of these results? + \end{itemize} + \end{question} + + \begin{question} + \begin{itemize} + \item How well representative are the results? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item What factors affect how users choose passwords? + \begin{itemize} + \item Is it just the password policy? + \item Can we know from these studies? + \item We'd need more studies focusing on other factors, then a meta-analysis to see what factors are most important and how they interact. + \end{itemize} + \end{itemize} + \end{question} +\end{frame} + +\section{Preoceeding to Models} + +\begin{frame} + \begin{question} + Did they make use of any models? + \end{question} +\end{frame} + +\begin{frame} + \begin{example} + \begin{itemize} + \item Entropy as a model for password strength (guessability). + \begin{itemize} + \item However, later works show that it's not that good a model. + \end{itemize} + \end{itemize} + \end{example} + + \begin{remark} + \begin{itemize} + \item This is the topic of the next section of the course. + \end{itemize} + \end{remark} +\end{frame} + From 88060260aed0904d882b6fc61744aaf09b941231 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 20 Nov 2024 11:40:50 +0100 Subject: [PATCH 22/53] Adds grade.sh to set grades for seminar participation --- modules/02-passwd/grade.sh | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 modules/02-passwd/grade.sh diff --git a/modules/02-passwd/grade.sh b/modules/02-passwd/grade.sh new file mode 100644 index 0000000..2c59262 --- /dev/null +++ b/modules/02-passwd/grade.sh @@ -0,0 +1,41 @@ +oldIFS=$IFS +IFS=$'\n' + +course="vetcyb24p2" +seminar_date=${1} +file=${2} + +teachers="(dbosk|masvanbe|elzen)@kth.se" + +get_grade_data() { + tail -n +2 ${file} \ + | grep -Ev "${teachers}" \ + | cut -d, -f 2,3,5 \ + > participation-seminar.csv + + for user in $(cat participation-seminar.csv | cut -d, -f 1 | sort -u) + do + echo -n "$user "; + sum_minutes=0; + for minutes in $(grep $user participation-seminar.csv | cut -d, -f 3) + do + sum_minutes=$(($sum_minutes + $minutes)); + done; + echo $sum_minutes; + done +} + +open ${file} & +get_grade_data +read -p "Enter the limit in minutes: " limit_minutes + +for result in $(get_grade_data) +do + user=$(echo $result | cut -d ' ' -f 1); + minutes=$(echo $result | cut -d ' ' -f 2); + if [ $minutes -ge $limit_minutes ] + then + canvaslms grade -c ${course} -a "Live seminar ${seminar_date}" \ + -u $user -g complete + fi +done From 5aab8eece811180561c61d04984cdb2165dffeb8 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 9 Dec 2024 14:12:17 +0100 Subject: [PATCH 23/53] Adds seminar slides on models in security --- modules/03-formal-methods/Makefile | 26 +++++++++ modules/03-formal-methods/preamble.tex | 56 ++++++++++++++++++ modules/03-formal-methods/seminar-slides.tex | 12 ++++ modules/03-formal-methods/seminar.tex | 61 ++++++++++++++++++++ 4 files changed, 155 insertions(+) create mode 100644 modules/03-formal-methods/Makefile create mode 100644 modules/03-formal-methods/preamble.tex create mode 100644 modules/03-formal-methods/seminar-slides.tex create mode 100644 modules/03-formal-methods/seminar.tex diff --git a/modules/03-formal-methods/Makefile b/modules/03-formal-methods/Makefile new file mode 100644 index 0000000..2ea7216 --- /dev/null +++ b/modules/03-formal-methods/Makefile @@ -0,0 +1,26 @@ +.PHONY: all +all: seminar-slides.pdf + +LATEXFLAGS+= -shell-escape + +SRC+= preamble.tex +SRC+= abstract.tex seminar.tex + +DEPENDS+= objectives.tex + +seminar-slides.pdf: seminar-slides.tex ${SRC} ${DEPENDS} + +objectives.tex: ../00-intro/objectives.tex + +${DEPENDS}: + ${LN} $< $@ + + +.PHONY: clean +clean: + ${RM} seminar-slides.pdf + ${RM} ${DEPENDS} + + +INCLUDE_MAKEFILES=../../makefiles +include ${INCLUDE_MAKEFILES}/tex.mk diff --git a/modules/03-formal-methods/preamble.tex b/modules/03-formal-methods/preamble.tex new file mode 100644 index 0000000..43bbd69 --- /dev/null +++ b/modules/03-formal-methods/preamble.tex @@ -0,0 +1,56 @@ +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[british]{babel} +\usepackage{booktabs} + +\usepackage[% + natbib, + citestyle=verbose,singletitle=false, + style=verbose, + maxbibnames=99,% + isbn=false,doi=false,url=true +]{biblatex} +\addbibresource{bibliography.bib} + +\usepackage[all]{foreign} +\renewcommand{\foreignfullfont}{} +\renewcommand{\foreignabbrfont}{} + +\usepackage{import} + +\usepackage[strict]{csquotes} +\SetCiteCommand{\autocite} +\usepackage[single]{acro} +\acsetup{cite/cmd={\autocite}} + +\usepackage[noend]{algpseudocode} +\usepackage{xparse} + +\let\email\texttt + +\usepackage[outputdir=ltxobj]{minted} +\setminted{autogobble} + +\usepackage{pythontex} +\setpythontexoutputdir{.} +\setpythontexworkingdir{..} + +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{mathtools} +\usepackage{amsthm} +\usepackage{thmtools} +%\usepackage[unq]{unique} +\DeclareMathOperator{\powerset}{\mathcal{P}} + +\usepackage[binary-units]{siunitx} + +\usepackage{adjustbox} +\usepackage{lipsum} +\usepackage{multicol} +\usepackage{changepage} + +\usepackage{didactic} +\usepackage[capitalize]{cleveref} + +\input{objectives.tex} diff --git a/modules/03-formal-methods/seminar-slides.tex b/modules/03-formal-methods/seminar-slides.tex new file mode 100644 index 0000000..3131b46 --- /dev/null +++ b/modules/03-formal-methods/seminar-slides.tex @@ -0,0 +1,12 @@ +\documentclass[ignoreframetext]{beamer} +\input{preamble.tex} + +\begin{document} +\mode +\input{seminar.tex} +\mode* + +\begin{frame}[allowframebreaks] + \printbibliography +\end{frame} +\end{document} diff --git a/modules/03-formal-methods/seminar.tex b/modules/03-formal-methods/seminar.tex new file mode 100644 index 0000000..57098ae --- /dev/null +++ b/modules/03-formal-methods/seminar.tex @@ -0,0 +1,61 @@ +\title{% + Models in security +} +\author{Daniel Bosk\thanks{% + This material is available under the Creative Commons + Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 international + license. + The material was written with some aid from GitHub Copilot. +}} +\institute{% + KTH EECS +} + +\begin{frame} + \maketitle +\end{frame} + +\mode* + +\begin{abstract} + \input{abstract.tex} +\end{abstract} + +\clearpage + +\section{Related to TAMOS} + +\begin{frame} + \begin{question}[Models] + \begin{enumerate} + \item How do we use models in security? + \item How does that affect our results? + \begin{itemize} + \item Is ElGamal encryption secure or not? + \end{itemize} + \item What's the best we can do about the situation? + \end{enumerate} + \end{question} +\end{frame} + +\begin{frame} + \begin{question}[Engineering design] + \begin{enumerate} + \item Is our use of models just natural to the field or due to security + being an engineering discipline? + \end{enumerate} + \end{question} +\end{frame} + +\section{Model checking and theorem proving} + +\begin{frame} + \begin{question} + \begin{enumerate} + \item How do model checking and theorem proving relate to each other and + cryptography? + \item How sure can we be of the results when using model checking or + theorem proving? + \end{enumerate} + \end{question} +\end{frame} From e43e21220ac12946df733e664bd74422b17f9eac Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 11 Dec 2024 08:42:06 +0100 Subject: [PATCH 24/53] Adds reflection assignment for scientificity --- modules/05-scientificity/reflection.md | 98 ++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 modules/05-scientificity/reflection.md diff --git a/modules/05-scientificity/reflection.md b/modules/05-scientificity/reflection.md new file mode 100644 index 0000000..22bec86 --- /dev/null +++ b/modules/05-scientificity/reflection.md @@ -0,0 +1,98 @@ +# Introduction + +Let's think a bit about how we know what we teach in the security courses are +good things or not. This will let us combine all the classes of methods that +we've covered during the course. Remember also what they wrote in Security as a +Scientific Pursuit: we wouldn't want to just make tautological restatements of +our assumptions. + +Before the seminar, pick THREE (3) of the topics below. For each one you +picked, outline a methodology for how to evaluate it. + +## Passwords + +To do password-based authentication, we're taught that we should salt +and hash the passwords. The user submits the password to the server, +the server adds a 128-bit salt (random number) and hashes the password +using SHA256, then hashes the hash, and hashes that hash, and so on for 1000 +times. That final hash is used to check if it's the same as the one stored. If +so, the user is accepted. Is this password-based authentication scheme secure? + +## Programming in not-C + +When we write programs, we should avoid languages like C or C++. (This is even +suggested by some US government agencies.) It's better to use a language like +Rust, which has built-in memory safety. Writing programs in Rust will result in +fewer security vulnerabilities in the programs and will thus be more secure. Is +this really true? + +## Adding features + +The Bank has used the same back-end software for 50 years (written in COBOL). +This software works and manages the Bank's accounts. Previously the Bank's +staff interacted with the software, e.g. to tranfer money between accounts. + +The Bank hired FutureSoftware to add a web-based front-end so that the +customers can interact with the software directly. That way customers can +transfer money between accounts without the need for Bank staff to do it for +them. (They wrote the software in Python.) + +The Bank then asked VETCYB consultants to evaluate if this is secure. How would +go do it? + +## Mandatory Access Control (MAC) + +The implementation of Mandatory Access Control (MAC) mechanisms, such +as the Bell-LaPadula Model, is considered crucial in environments that +demand high levels of security and confidentiality. Organizations that +handle sensitive or classified information must ensure that data access +is strictly regulated. MAC models achieve this by enforcing control +policies that limit access based on user clearance levels. Does this work? + +## Multi-Factor Authentication (MFA) + +Multi-Factor Authentication (MFA) is promoted as an effective way to enhance +security. By requiring users to provide two or more verification factors before +granting access, MFA adds an additional layer of protection beyond just the +password. The methods of implementing MFA varies; such as SMS, email, or +authenticator apps. Is this secure? + +## Firewalls + +Firewalls are a fundamental component of network security that are +taught in introductory courses. They act as barriers between trusted and +untrusted networks by controlling incoming and outgoing network traffic +based on predetermined security rules. Firewalls can prevent +unauthorized access and attacks. Is this true? + +## Social Engineering Awareness Training + +Security courses often emphasize the importance of educating employees +about social engineering attacks. The training aims to help employees +recognize and avoid common tactics used in attacks, such as phishing. +Is this secure? How effective, if at all, is such training in practice at +preventing social engineering breaches over time? + +## Encrypt Data-at-Rest + +One common security practice is encrypting data-at-rest to protect +sensitive information stored on devices or servers. By encrypting the +data, unauthorized users are prevented from accessing it without the +appropriate decryption key. Is this secure? + +## Regular Security Updates + +It is standard advice to regularly update software to stay protected +against newly discovered vulnerabilities. Updates often include patches +for security flaws that could be exploited by attackers. Does this contribute +to increased security? + +## Penetration Testing (Pentesting) + +Penetration testing, commonly referred to as pentesting, is a proactive +approach to evaluating the security of a computer system, network, +or application by simulating an attack from malicious outsiders and +insiders. Pentesting can help identify vulnerabilities before attackers +exploit them. A comprehensive pentest involves several stages, including +planning, reconnaissance, scanning, exploitation, and reporting. After a +successful pentest the system will be secure. Is this true? From 73d9a5394db3c1592203dd4b0edf629cca6f37e9 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 19 Dec 2024 20:42:00 +0100 Subject: [PATCH 25/53] Adds first working grading script --- adm/grading/.gitignore | 7 + adm/grading/Makefile | 30 + adm/grading/instruction-qualitative.md | 24 + adm/grading/prompts.toml | 36 + adm/grading/submission-qualitative.md | 16 + adm/grading/test-grade_reflections-err.txt | 57 ++ adm/grading/vetcyb-grading.sh.nw | 894 +++++++++++++++++++++ makefiles | 2 +- 8 files changed, 1065 insertions(+), 1 deletion(-) create mode 100644 adm/grading/.gitignore create mode 100644 adm/grading/Makefile create mode 100644 adm/grading/instruction-qualitative.md create mode 100644 adm/grading/prompts.toml create mode 100644 adm/grading/submission-qualitative.md create mode 100644 adm/grading/test-grade_reflections-err.txt create mode 100644 adm/grading/vetcyb-grading.sh.nw diff --git a/adm/grading/.gitignore b/adm/grading/.gitignore new file mode 100644 index 0000000..9bf9c27 --- /dev/null +++ b/adm/grading/.gitignore @@ -0,0 +1,7 @@ +_minted-vetcyb-grading/ +test-* +vetcyb-grading.out +vetcyb-grading.pdf +vetcyb-grading.sh +vetcyb-grading.toc +vetcyb24p2.reflections.d/ diff --git a/adm/grading/Makefile b/adm/grading/Makefile new file mode 100644 index 0000000..050a270 --- /dev/null +++ b/adm/grading/Makefile @@ -0,0 +1,30 @@ +NOWEAVEFLAGS=-delay +LATEXFLAGS=-shell-escape + +.PHONY: all +all: vetcyb-grading.pdf vetcyb-grading.sh + +.INTERMEDIATE: vetcyb-grading.tex +vetcyb-grading.pdf: vetcyb-grading.tex +vetcyb-grading.sh: vetcyb-grading.sh.nw + +GRADE_RESULTS=test-grade_reflections-err.txt + +vetcyb-grading.pdf: ${GRADE_RESULTS} +vetcyb-grading.pdf: ./instruction-qualitative.md ./submission-qualitative.md + +${GRADE_RESULTS}: test-grade-reflections.sh + bash $< + +test-grade-reflections.sh: vetcyb-grading.sh.nw vetcyb-grading.sh + ${NOTANGLE.sh} + +.PHONY: clean +clean: + ${RM} vetcyb-grading.pdf vetcyb-grading.sh + rm *.aux *.fdb_* *.fls *.log *.pdf *.tex + + +INCLUDE_MAKEFILES=../../makefiles +include ${INCLUDE_MAKEFILES}/noweb.mk +include ${INCLUDE_MAKEFILES}/tex.mk diff --git a/adm/grading/instruction-qualitative.md b/adm/grading/instruction-qualitative.md new file mode 100644 index 0000000..b741528 --- /dev/null +++ b/adm/grading/instruction-qualitative.md @@ -0,0 +1,24 @@ + +# Reflection on qualitative methods + +## Metadata + +- Unlocks: None +- Due: None +- Locks: None +- Ungraded submissions: 28 +- Submission type: ['online_text_entry', 'online_upload'] +- URL: https://canvas.kth.se/courses/50613/assignments/318671 +- Submissions: https://canvas.kth.se/courses/50613/assignments/318671/submissions?zip=1 + +## Instruction + +What do qualitative methods contribute to security? How do they +complement the other methods that we\'ve talked about? + +To help you think about this, return to [How do you know it\'s secure? +Passwords](https://canvas.kth.se/courses/50613/assignments/315624 "How do you know it's secure? Passwords"). +How did the different methods fit together there? + + + diff --git a/adm/grading/prompts.toml b/adm/grading/prompts.toml new file mode 100644 index 0000000..6f6cfcf --- /dev/null +++ b/adm/grading/prompts.toml @@ -0,0 +1,36 @@ +# Prompt config files +# more details and examples at https://github.com/efugier/smartcat#configuration + +[empty] +api = "openai" +messages = [] +char_limit = 100000 + +[default] +api = "openai" +model = "gpt-4o" +temperature = 1.0 +char_limit = 100000 + +[[default.messages]] +role = "system" +content = "You are an extremely skilled programmer and scientist with a keen eye for detail and an emphasis on readable code. You have been tasked with acting as a smart version of the cat unix program. You take text and a prompt in and write text out. For that reason, it is of crucial importance to just write the desired output. Do not under any circumstance write any comment or thought as your output will be piped into other programs. Do not write the markdown delimiters for code as well. Sometimes you will be asked to implement or extend some input code. Same thing goes here, write only what was asked because what you write will be directly added to the user's editor. Never ever write ``` around the code. Make sure to keep the indentation and formatting. " + +[4o] +api = "openai" +model = "gpt-4o" +temperature = 0.5 +char_limit = 100000 + +[[4o.messages]] +role = "system" +content = "You are an extremely skilled programmer and scientist with a keen eye for detail and an emphasis on readable code. You have been tasked with acting as a smart version of the cat unix program. You take text and a prompt in and write text out. For that reason, it is of crucial importance to just write the desired output. Do not under any circumstance write any comment or thought as your output will be piped into other programs. Do not write the markdown delimiters for code as well. Sometimes you will be asked to implement or extend some input code. Same thing goes here, write only what was asked because what you write will be directly added to the user's editor. Never ever write ``` around the code. Make sure to keep the indentation and formatting. " + +[o1] +api = "openai" +model = "o1-preview" +char_limit = 100000 + +[[o1.messages]] +role = "user" +content = "You are an extremely skilled programmer and scientist with a keen eye for detail and an emphasis on readable code. You have been tasked with acting as a smart version of the cat unix program. You take text and a prompt in and write text out. For that reason, it is of crucial importance to just write the desired output. Do not under any circumstance write any comment or thought as your output will be piped into other programs. Do not write the markdown delimiters for code as well. Sometimes you will be asked to implement or extend some input code. Same thing goes here, write only what was asked because what you write will be directly added to the user's editor. Never ever write ``` around the code. Make sure to keep the indentation and formatting. " diff --git a/adm/grading/submission-qualitative.md b/adm/grading/submission-qualitative.md new file mode 100644 index 0000000..21e4134 --- /dev/null +++ b/adm/grading/submission-qualitative.md @@ -0,0 +1,16 @@ + - Course: DA2215 HT24 (vetcyb24-p2) + - Assignment: Reflection on qualitative methods + - Student: Studenten Studentensdotter + - Submission id: 24972065 + - Submitted at: 2024-12-11T14:54:21Z + - Graded at: None + - Grade: None + - Graded by: None + - Speedgrader: https://canvas.kth.se/... +# Body + +

Qualitative methods are very important for security research as they offer insights into the why and how of security-related behaviour, and decisions. They often involve human factors, e.g. why choose this password, how is the usability of this library. Quantitative data cannot give us this kind of information.

+

For example for statistical data (quantitative data), qualitative data can give insights into the why, it provides context and meaning.

+

 

+

 

+ diff --git a/adm/grading/test-grade_reflections-err.txt b/adm/grading/test-grade_reflections-err.txt new file mode 100644 index 0000000..6e67ee7 --- /dev/null +++ b/adm/grading/test-grade_reflections-err.txt @@ -0,0 +1,57 @@ +### sc +##### 1 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The reflection lacks a direct focus on the use of statistics as it seems to divert more towards machine learning and cybersecurity without elaborating sufficiently on how statistics is specifically used and its implications. +##### 2 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The reflection is vague and lacks a clear and relevant discussion about the use of statistics specifically. It briefly mentions statistics and machine learning but does not demonstrate a thorough reflection on the use of statistics as was asked for in the assignment. +##### 3 +##### 4 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The reflection provided is quite general and lacks depth in discussing the specific use of statistics. The mention of machine learning and cybersecurity, while interesting, seems somewhat unrelated to the assignment's focus on reflecting on the use of statistics. +##### 5 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No, the reflection lacks a focused analysis on the specific use of statistics. The student briefly mentions statistics without providing a deeper or direct reflection on its application or implications, which was the central task. +### sc 4o +##### 1 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The reflection does not specifically address the use of statistics in a detailed or relevant manner as requested. It briefly mentions statistics but quickly shifts focus to machine learning and cybersecurity without a thorough discussion on statistics. +##### 2 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The reflection does not specifically address the use of statistics in a meaningful way. It briefly mentions statistics but lacks depth and relevance to the assignment prompt. The focus shifts to machine learning and cybersecurity, which are not directly related to the topic of statistics. +##### 3 +##### 4 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The reflection does not specifically address the use of statistics in detail. It briefly mentions statistics as a tool but does not provide a relevant reflection on its use as required by the assignment. The mention of machine learning and cybersecurity is not directly related to the reflection on the use of statistics. +##### 5 +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The student's reflection lacks depth and relevance to the specific assignment on the use of statistics. The reflection is too general and does not specifically address the use of statistics in the context of the course or assignment. +### sc o1 +##### 1 +vetcyb24p2 user1@kth.se Reflection on qualitative methods: No + +The instruction is missing, so it's not possible to determine if the student made an honest effort. +##### 2 +vetcyb24p2 user1@kth.se Reflection on qualitative methods: No, the instruction was not provided, so cannot evaluate the student's reflection for relevance. +vetcyb24p2 user2@kth.se Reflection on qualitative methods: No + +The instruction was not provided, so it's not possible to determine if the student made an honest effort. +##### 3 +vetcyb24p2 user1@kth.se Reflection on the use of models, part I: No + +Cannot evaluate because the instruction is not provided. +vetcyb24p2 user2@kth.se Reflection on the use of models, part II: No. The instruction was not provided, so it's not possible to evaluate whether the student made an honest effort or attempted a relevant reflection based on what was asked. +vetcyb24p2 user3@kth.se Reflection on the use of models, part I: No + +The assignment instructions were not provided, so I cannot determine if the student has made an honest effort based on what was asked. +##### 4 +vetcyb24p2 user4@kth.se Reflection on the use of models, part I: No + +The instruction was not provided as context, so I cannot determine if the student made an honest effort. +##### 5 diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw new file mode 100644 index 0000000..adb3a85 --- /dev/null +++ b/adm/grading/vetcyb-grading.sh.nw @@ -0,0 +1,894 @@ +\documentclass[a4paper]{article} +\usepackage[colorlinks]{hyperref} +\usepackage{noweb} +\noweboptions{shift,longchunks,longxref,breakcode} + +\usepackage[outputdir=ltxobj]{minted} + +%\usepackage[utf8]{inputenc} +%\DeclareUnicodeCharacter{25CF}{$\bullet$} +%\DeclareUnicodeCharacter{251C}{\mbox{\kern.23em +% \vrule height2.2exdepth1exwidth.4pt\vrule height2.2ptdepth-1.8ptwidth.23em}} +%\DeclareUnicodeCharacter{2500}{\mbox{\vrule height2.2ptdepth-1.8ptwidth.5em}} +%\DeclareUnicodeCharacter{2502}{\mbox{\kern.23em +% \vrule height2.2exdepth-1.8ptwidth.4pt\kern.23em}} +%\DeclareUnicodeCharacter{2514}{\mbox{\kern.23em +% \vrule height2.2exdepth-1.8ptwidth.4pt\vrule height2.2ptdepth-1.8ptwidth.23em}} + +\author{Daniel Bosk} +\title{Reporting grades for vetcyb courses} + +\begin{document} +@ +\maketitle +\tableofcontents +\clearpage + +\section{Overview} + +We want to automate the reporting of the results in the vetcyb courses. +There are two ways to pass the course: +\begin{enumerate} +\item\label{ParticipationOption} By participating in the seminars and doing the +prep assignments. + Also known as, participating in all teaching. +\item\label{FinalProjectOption} By doing the final project. +\end{enumerate} + +We want a script that can be run by the [[grader]] script\footnote{% + See \texttt{https://github.com/dbosk/grader/}. +}. +This will have the standard design, except that we'll do the participation as +an intermediate step. +<>= +#!/bin/bash + +courses="vetcyb(24-?p2|2[5-9]|[3-9][0-9])" +components="^INL1" +<> + +<> + +main() { + <> + + # report INL1 to LADOK + canvaslms results -c "${courses}" -A "${components}" \ + | sed -E "s/ ?[HV]T[0-9]{2}( \(.*\))?//" \ + | ladok report -fv +} + +# run main if not sourced from another script +if [ "$0" = "${BASH_SOURCE[0]}" ] +then + main +fi +@ + + +\section{Participation} + +That solved reporting the final project to LADOK (option +\ref{FinalProjectOption} above). +Now we need to translate the participation (option \ref{ParticipationOption}) +to grades for the INL1 assignments. +We want to grade the participation in the seminars and prep so that students +don't have to do the final project. + +The INL1 assignment group contains the following assignments: +\begin{verbatim} +INL1 Peer review: Designing a methodology to answer a question +INL1 The final seminar on 8-9/1 at 8:15 +\end{verbatim} +We want to set grades on those two assignments based on the participation and +prep. +The participation contains the following assignments: +\begin{verbatim} +Participation INL1 Overview of Science in Security +Participation INL1 How to Design Computer Security Experiments +Participation INL1 How do you know it's secure? Passwords +Participation INL1 Reflection on Science in Security +Participation INL1 Comprehension, literature review: Of passwords and people +Participation INL1 Comprehension: Graphical Passwords: Learning from the First Twelve Years +Participation INL1 Achieving Rigor in Literature Reviews Insights from Qualitative Data Analysis and Tool-Support +Participation INL1 Live seminar 13/11 at 15:15 +Participation INL1 Comprehension: Of Passwords and People, Measuring the Effect of Password-Composition Policies +Participation INL1 Comprehension: Can long passwords be secure and usable? +Participation INL1 Comprehension: Why phishing works +Participation INL1 Live seminar 15/11 at 8:15 +Participation INL1 The RSA and ElGamal cryptosystems +Participation INL1 On the Security of EIGamal Based Encryption +Participation INL1 Stealing Keys from PCs using a Radio: Cheap Electromagnetic Attacks on Windowed Exponentiation +Participation INL1 Timing Analysis of Keystrokes and Timing Attacks on SSH +Participation INL1 Reflection on the use of models, part I +Participation INL1 Theorem proving: 1. Introduction +Participation INL1 Theorem proving: 2. Formal methods and Interactive Theorem Proving +Participation INL1 Theorem proving: 3. Example: Proving list-reverse correct (optional) +Participation INL1 Theorem proving: 4. Examples for what can be verified with Interactive Theorem Provers +Participation INL1 Theorem proving: 5. Limitations of Interactive Theorem Proving and Conclusion +Participation INL1 Model checking: algorithmic verification and debugging +Participation INL1 Reflection on the use of models, part II +Participation INL1 Live seminar 9/12 at 10:15 +Participation INL1 Dos and Don'ts of Machine Learning in Computer Security +Participation INL1 Reflection on the use of statistics +Participation INL1 Comprehension: Why Johnny can't encrypt +Participation INL1 Comprehension: Comparing the Usability of Cryptographic APIs +Participation INL1 Reflection on qualitative methods +Participation INL1 SoK: Science, Security and the Elusive Goal of Security as a Scientific Pursuit +Participation INL1 Live seminar 12/12 at 15:15 +\end{verbatim} + +This list will be useful. +However, it will be course specific. +We will generate it as follows. +We'll cache the results and only request it from Canvas if we don't have any +from before. +We'll refresh as often as the system's tempdir is cleaned. +<>= +assignments() { + local course="${1}" + <> + if [ ! -f "${assignments_cache}" ] + then + assignments_refresh "${course}" + fi + cat "${assignments_cache}" +} + +assignments_refresh() { + local course="${1}" + <> + canvaslms assignments -c "${course}" -A "${all_components}" \ + | cut -f 2-3 \ + > "${assignments_cache}" +} +<>= +all_components="INL1" +<>= +local assignments_cache="/tmp/${course}.assignments" +@ + +The idea is that we use the `Live seminar` assignments to tick off the `The +final seminar` assignment. +Then we let the written prep assignments tick off the `Peer review` assignment. +Let's write two functions that return the assignments for each of these. + +These functions will get the names of the assignments and filter on those +exactly. +However, if some are substrings of others, we might get false positives. +But this will not be any issue for us. +<>= +filter_participation() { + local course="${1}" + grep -f <(assignments "${course}" \ + | grep -E "^Participation INL1" \ + | cut -f 2) +} + +filter_live_seminar() { + local course="${1}" + filter_participation "${course}" \ + | grep -E 'Live seminar [0-9]{1,2}/[0-9]{1,2}' +} + +filter_peer_review() { + local course="${1}" + filter_participation "${course}" \ + | grep -vE 'Live seminar [0-9]{1,2}/[0-9]{1,2}' +} +@ + +We'll do the same to get the INL1 assignments. +<>= +filter_INL1() { + local course="${1}" + grep -f <(assignments "${course}" \ + | grep -E "^INL1" \ + | cut -f 2) +} +@ + +\subsection{Grading participation} + +As mentioned above, we'll need to do this on a per course basis, since the +assignments might vary from round to round. +We want to pass the INL1 assignments if the appropriate participation and prep +are checked. +However, we don't want to pass only one of the assignments, both must pass to +skip the project. +<>= +for course in $(canvaslms courses "${courses}") +do + grade_participation "${course}" +done +<>= +grade_participation() { + local course="${1}" + <> + <> + local passed=$(mktemp) + for student in ${students} + do + <> + done > "${passed}" + canvaslms grade -c "${course}" -A "${components}" -g P \ + -u "$(make_regex ${passed})" \ + -m "${participation_msg}" + <> +} +<>= +participation_msg=" +You did all prep and actively participated in all seminars. You don't have to +do the project. +" +@ + +The function [[make_regex]] simply takes the list of usernames [[user1]], +[[user2]] and [[user3]] (contained in the file supplied as the argument, one +per line) and turns them into the regex [[(user1|user2|user3)]]. +<>= +make_regex() { + echo -n "(" + paste -sd '|' "$@" \ + | sed -zE 's/\n//g' # remove newline introduced by paste + echo ")" +} +@ + +\subsection{Get [[results]] from Canvas} + +We need to get the results from Canvas. +We only do this if we don't already have them. +<>= +results() { + local course="${1}" + local results_cache="/tmp/${course}.results" + if [ ! -f "${results_cache}" ] + then + results_refresh "${course}" + fi + cat "${results_cache}" +} +@ + +When we get the results from Canvas, we want to filter out the columns we need. +We want the assignment name, the student's name, the grade and grading date. +The data will look like this: +\begin{verbatim} +Peer review: Designing a methodology to answer a question user@kth.se +The final seminar on 8-9/1 at 8:15 user@kth.se +Overview of Science in Security user@kth.se 100 2024-12-10T08:39:52Z +How to Design Computer Security Experiments user@kth.se 100 2024-12-10T08:40:39Z +How do you know it's secure? Passwords user@kth.se 100 2024-12-10T08:41:27Z +Reflection on Science in Security user@kth.se +Comprehension, literature review: Of passwords and people user@kth.se 100 2024-12-10T08:45:54Z +Comprehension: Graphical Passwords: Learning from the First Twelve Years user@kth.se 100 2024-12-10T08:47:16Z +Achieving Rigor in Literature Reviews Insights from Qualitative Data Analysis and Tool-Support user@kth.se 100 2024-12-10T08:47:41Z +Live seminar 13/11 at 15:15 user@kth.se complete 2024-11-18T13:22:02Z +Comprehension: Of Passwords and People, Measuring the Effect of Password-Composition Policies user@kth.se 100 2024-12-11T13:11:30Z +Comprehension: Can long passwords be secure and usable? user@kth.se 100 2024-12-11T13:12:19Z +Comprehension: Why phishing works user@kth.se 100 2024-12-11T13:13:05Z +Live seminar 15/11 at 8:15 user@kth.se complete 2024-11-18T12:57:48Z +The RSA and ElGamal cryptosystems user@kth.se 100 2024-12-11T13:14:08Z +On the Security of EIGamal Based Encryption user@kth.se 100 2024-12-11T13:14:52Z +Stealing Keys from PCs using a Radio: Cheap Electromagnetic Attacks on Windowed Exponentiation user@kth.se 100 2024-12-11T13:15:27Z +Timing Analysis of Keystrokes and Timing Attacks on SSH user@kth.se 100 2024-12-11T13:16:17Z +Reflection on the use of models, part I user@kth.se +Theorem proving: 1. Introduction user@kth.se 100 2024-12-11T13:20:07Z +Theorem proving: 2. Formal methods and Interactive Theorem Proving user@kth.se 90 2024-12-11T13:20:40Z +Theorem proving: 3. Example: Proving list-reverse correct (optional) user@kth.se 90 2024-12-11T13:21:04Z +Theorem proving: 4. Examples for what can be verified with Interactive Theorem Provers user@kth.se 100 2024-12-11T13:21:29Z +Theorem proving: 5. Limitations of Interactive Theorem Proving and Conclusion user@kth.se 90 2024-12-11T13:21:54Z +Model checking: algorithmic verification and debugging user@kth.se 90 2024-12-11T13:22:23Z +Reflection on the use of models, part II user@kth.se +Live seminar 9/12 at 10:15 user@kth.se complete 2024-12-11T13:25:20Z +Dos and Don'ts of Machine Learning in Computer Security user@kth.se +Reflection on the use of statistics user@kth.se +Comprehension: Why Johnny can't encrypt user@kth.se 100 2024-12-12T11:57:34Z +Comprehension: Comparing the Usability of Cryptographic APIs user@kth.se 100 2024-12-12T11:58:03Z +Reflection on qualitative methods user@kth.se +SoK: Science, Security and the Elusive Goal of Security as a Scientific Pursuit user@kth.se 100 2024-12-12T12:11:18Z +Live seminar 12/12 at 15:15 user@kth.se complete 2024-12-16T09:47:28Z +\end{verbatim} +When we fetch the results from Canvas, we want to use the [[-l]] option to get +their username instead of their name. +<>= +results_refresh() { + local course="${1}" + local results_cache="/tmp/${course}.results" + canvaslms submissions -c "${course}" -A "${all_components}" -l \ + | cut -f 2-4,6 \ + > "${results_cache}" +} +@ + +Here we must be able to distinguish assignments with different grades. +We already have [[filter_live_seminar]] to get some assignments with the grade +`complete`. +But we'll also need the reflection assignments and the non-reflection +assignments. +The reflections are graded `complete`, the non-reflections are graded at least +90 points. +<>= +filter_reflection() { + local course="${1}" + filter_participation "${course}" \ + | grep 'Reflection' +} + +filter_non_reflection() { + local course="${1}" + filter_participation "${course}" \ + | grep -v 'Reflection' +} +@ + + +\subsection{Finding which students to grade} + +The students that we need to grade are the ones that have not already passed +the assignments. +Fortunately, all the assignments in the INL1 group are pass/fail. +So we can just look for the students that have not passed the assignments. +<>= +students=$(results "${course}" | filter_INL1 | students_to_grade) +@ + +The idea is this. +We get the results from stdin. +That way we can use functions like [[filter_INL1]] (as above) to get the +assignments we are interested in. +We filter out the students in these results, +then we go through student-by-student to check if they passed all assignments +or not. +If they did not, we echo their username. +<>= +students_to_grade() { + local results=$(cat) + <> + local students=$(echo "${results}" | cut -f 2 | sort -u) + for student in ${students} + do + if ! echo "${results}" | grep "${student}" | passed_all "${passing_grades}" + then + echo "${student}" + fi + done +} +@ + +We can define a regex for [[passing_grades]] that captures all passing grades +in all grading scales: +\begin{itemize} +\item P, +\item complete, but not incomplete, +\item 90--100. +\end{itemize} +<>= +local passing_grades="${1:-^(P|complete|9[0-9]|100)}" +@ + + +\subsection{Checking if a student has passed all assignments} + +The [[passed_all]] assignment will check if all the assignments that it gets +have a passing grade. +If so, it will return true; otherwise, false. + +It will take input from the standard input. +This will be on the same format as the [[results]] file. +That way we can get the grade column. +We'll count if there are as many P's as there are rows. + +We'll let an optional argument be the passing grade. +That will be a regex. +In some cases, we need negative lookbehind (requires [[-P]]) to avoid matching +`incomplete` when we're looking for `complete`. +On the other hand, since we compare the grade in the first column, we can make +use of [[^complete]] to avoid matching `incomplete`. +<>= +passed_all() { + <> + local lines=$(cat) + echo "${lines}" | cut -f 3 | grep -Pc "${passing_grades}" \ + | grep -qF "$(echo "${lines}" | wc -l)" +} +@ + + +\subsection{Check if a student has passed the participation} + +We'll simply check if they have the desired grades on all assignments. +<>= +passed_participation "${course}" "${student}" +<>= +passed_participation() { + local course="${1}" + shift + for student in $* + do + local student_results=$(results "${course}" | grep "${student}") + <> + then + continue + fi + <> + then + continue + fi + <> + then + continue + fi + echo "${student}" + done +} +@ + +We'll check if they have the grade `complete` on all live seminars. +If not, we continue to the next student. +<>= +if ! echo "${student_results}" \ + | filter_live_seminar "${course}" \ + | passed_all '^complete' +@ + +Otherwise we check if they also have at least 90 points on the FeedbackFruits +prep and `complete` on the reflections. +<>= +if ! echo "${student_results}" \ + | filter_peer_review "${course}" \ + | filter_non_reflection "${course}" \ + | passed_all '^9[0-9]|100' +<>= +if ! echo "${student_results}" \ + | filter_peer_review "${course}" \ + | filter_reflection "${course}" \ + | passed_all '^complete' +@ + +Now we want to construct a similar function, but this one should output +feedback on why the student didn't pass. +This function will take one student as argument and output the feedback on +stdout. +<>= +feedback_participation() { + local course="${1}" + local student="${2}" + local student_results=$(results "${course}" | grep "${student}" \ + | filter_participation) + if ! echo "${student_results}" | passed_all + then + <> + fi +} +@ + +This way we can use it to give feedback to the students who didn't pass. +The students who are listed in the file [[passed]] are the ones who passed. +The other students in [[students]] are the ones who didn't pass. +<>= +for student in $(echo "${students}" | grep -vFxf "${passed}") +do + local feedback=$(feedback_participation "${course}" "${student}") + if [ -n "${feedback}" ] + then + canvaslms grade -c "${course}" -A "${components}" -u "${student}" \ + -m "${feedback}" + fi +done +@ + +Now we should just find the assignments without a passing grade and print those +titles. +<>= +<> +then + echo "You didn't participate in the following live seminars:" + <> + echo "So you must do the project." +<> +then + echo "You haven't completed the following prep assignments" \ + echo "to a sufficient degree (90 points):" + <> + echo "But you can complete them to pass the course," \ + "without doing the project," \ + "since you participated in all seminars and completed most" \ + "of the prep assignments before the seminar." +fi +@ + +Let's look at those if statements. +We have +[[<>]] +from before. +We filter out the relevant assignments and check if they passed. +Then we filter out the ones without a passing grade and just cut the titles. + +Since the grade is in the second column, we prefix the grade by [[\s]] to avoid +matching undesired substrings. +<>= +echo "${student_results}" \ +| filter_live_seminar "${course}" \ +| grep -Ev '\scomplete' \ +| cut -f 1,3 +<>= +elif ! echo "${student_results}" \ + | filter_peer_review "${course}" \ + | passed_all +<>= +echo "${student_results}" \ +| filter_peer_review "${course}" \ +| filter_non_reflection "${course}" \ +| grep -Ev '\s9[0-9]|100' \ +| cut -f 1,3 +echo "${student_results}" \ +| filter_peer_review "${course}" \ +| filter_reflection "${course}" \ +| grep -Ev '\scomplete' \ +| cut -f 1,3 +@ + + +\section{Grading the reflection assignments} + +We need to grade the reflection assignments. +We must also refresh the results from Canvas after we've graded these. + +To grade these assignments, we must download them from Canvas. +We can use [[canvaslms submission]] for this. +We must then check if the student has made an honest attempt at the assignment. +We can do this by asking GPT-4o to assess if it was an honest attempt, based on +the instruction. + +If we don't have any students to grade, we return 1 to indicate so. +This way we can skip refreshing all results if we didn't do anything here. +<>= +grade_reflections "${course}" ${students} \ + && results_refresh "${course}" +<>= +grade_reflections() { + local course="${1}" + shift + local students="$*" + <> + <> + <> + <> + if [ -z "${students_with_results}" ] + then + return 1 + fi + for student in ${students_with_results} + do + <> + done +} +@ + +To create the regex, we can use the [[make_regex]] function. +But that function requires a file containing all the students. +<>= +local students_file=$(mktemp) +echo "${students}" | tr ' ' '\n' > "${students_file}" +students_regex=$(make_regex "${students_file}") +rm "${students_file}" +@ + +To download the submissions, we can use the [[canvaslms submission]] command. +We'll only download ungraded submissions. +<>= +local reflections_dir="/tmp/${course}.reflections.d" +<> +if [ ! -d "${reflections_dir}" ] +then + mkdir "${reflections_dir}" + canvaslms submission -c "${course}" -a "${reflection_assign_regex}" \ + -U -u "${students_regex}" -o "${reflections_dir}" +fi +@ + +To construct the regex, we simply output all the reflection assignment titles +to a file and use [[make_regex]] on that file. +<>= +local reflection_assignments_file=$(mktemp) +assignments "${course}" | filter_reflection | cut -f 2 \ + > "${reflection_assignments_file}" +local reflection_assign_regex=$(make_regex "${reflection_assignments_file}") +@ + +Now we'll also download the assignment instructions. +We want to put them in the root of the [[reflections_dir]]. +<>= +local oldIFS="${IFS}" +IFS=$'\n' +for assignment in $(cat "${reflection_assignments_file}") +do + if [ ! -f "${reflections_dir}/${assignment}.md" ] + then + canvaslms assignment -c "${course}" -a "${assignment}" \ + > "${reflections_dir}/${assignment}.md" + fi +done +IFS="${oldIFS}" +@ + + +\subsection{Grading the student's reflections} + +The above gives us the following file structure +([[reflections_dir=reflections]], output from [[tree reflections]]): +\begin{verbatim} +reflections +├── user1@kth.se +│   └── DA2215 HT24 (vetcyb24-p2) +│   ├── Reflection on qualitative methods +│   │   └── metadata.md +│   ├── Reflection on Science in Security +│   │   └── metadata.md +│   ├── Reflection on the use of models, part I +│   │   └── metadata.md +│   ├── Reflection on the use of models, part II +│   │   ├── metadata.md +│   │   └── Reflection.txt +│   └── Reflection on the use of statistics +│   └── metadata.md +├── user2@kth.se +│   └── DA2215 HT24 (vetcyb24-p2) +│   ├── Reflection on ethics +│   │   └── metadata.md +│   ├── Reflection on Science in Security +│   │   └── metadata.md +│   ├── Reflection on the use of models, part I +│   │   └── metadata.md +│   ├── Reflection on the use of models, part II +│   │   ├── metadata.md +│   │   └── reflection_2.md +│   └── Reflection on the use of statistics +│   └── metadata.md +├── user3@kth.se +│   └── DA2215 HT24 (vetcyb24-p2) +│   ├── Reflection on qualitative methods +│   │   └── metadata.md +│   ├── Reflection on Science in Security +│   │   ├── da2215+Reflection+on+Science+in+Security.pdf +│   │   └── metadata.md +│   ├── Reflection on the use of models, part I +│   │   ├── metadata.md +│   │   └── Reflection+on+the+use+of+models%2C+part+I.pdf +│   ├── Reflection on the use of models, part II +│   │   ├── metadata.md +│   │   └── Reflection+on+the+use+of+models%2C+part+2.pdf +│   └── Reflection on the use of statistics +│   └── metadata.md +... +├── Reflection on ethics.md +├── Reflection on qualitative methods.md +├── Reflection on Science in Security.md +├── Reflection on the use of models, part III.md +├── Reflection on the use of models, part II.md +├── Reflection on the use of models, part I.md +├── Reflection on the use of statistics.md +... +213 directories, 227 files +\end{verbatim} +As we can see, some submissions (online text) are part of the [[metadata.md]] +file, other submissions appear as PDFs, markdown or plain text files. +However, [[canvaslms]] converts these files and integrates them into the +[[metadata.md]] file too (since version 4.5 it supports PDFs too). +So we only need the [[metadata.md]] file. +We also see that we have the instruction of each assignment in the root of the +directory. + +There will not be a directory for a student if they haven't submitted anything. +However, the reflection assignment instructions will also be here. +So we must filter out anything that doesn't contain an [[@]]. +<>= +local students_with_results=$(find "${reflections_dir}" \ + -mindepth 1 -maxdepth 1 -type d \ + | xargs -I {} basename "{}" \ + | grep "@") +@ + +The idea is that we use Smartcat ([[sc]]) to ask GPT-4o to assess if the +submission is an honest attempt based on the instruction. +This means that for each student, we'll have to iterate through the +assignments. + +Since we used the [[-U]] flag to [[canvaslms submission]], each student's +directory will only contain assignment directories for the assignments they +have submitted that haven't been graded yet. +So we can iterate through those directories. +To find them, we want to look in the student's directory, just ignore the one +course directory (since it doesn't match the value of [[course]]), and pick the +assignment directories. +We'll use [[find]] for this. +Then we get a list of all the assignments for the student. +<>= +local student_assignments=$(find "${reflections_dir}/${student}" \ + -mindepth 2 -maxdepth 2 -type d) +local oldIFS="${IFS}" +IFS=$'\n' +for assignment_dir in ${student_assignments} +do + <> +done +IFS="${oldIFS}" +@ + +For each assignment, we'll need to check if the student has made an honest +attempt. +Their attempt is in the [[metadata.md]] file. +The instruction is in the root of the directory~[[reflections_dir]]. +<>= +local assignment=$(basename "${assignment_dir}") +local submission="${assignment_dir}/metadata.md" +local instruction="${reflections_dir}/${assignment}.md" +local assessment=$(cat "${submission}" \ + | sc_cmd "${reflection_assessment_prompt}" \ + -c "${instruction}") +<>= +reflection_assessment_prompt=" +Based on the instruction (provided as context), evaluate if the student has +made an honest effort. That is, the student attempted a relevant reflection +based on what was asked for in the instruction. If so, output 'Yes' and nothing +else. If not, ouput 'No' and a brief explanation. +" +<>= +if echo "${assessment}" | grep -qi "^Yes" +then + canvaslms grade -c "${course}" -a "${assignment}" -u "${student}" -g complete +else + echo >&2 + echo "${course} ${student} ${assignment}: ${assessment}" >&2 +fi +@ + +An instruction might look like this: +\inputminted[breaklines]{markdown}{./instruction-qualitative.md} + +And a corresponding submission may look like this: +\inputminted[breaklines]{markdown}{./submission-qualitative.md} + + +\subsection{Evaluating the reliability} + +We want to evaluate the reliability of the grading. +We'll do this by running the [[grade_reflections]] functions on all students +who has ungraded submissions. + +We've tried the following configurations for the [[sc]] command: +\inputminted[breaklines]{toml}{./prompts.toml} + +The default configuration gives unstable results. +When tested on [[essc@kth.se]], we get the following results. +(With a slightly different prompt than [[reflection_assessment_prompt]] +though.) +It rejects some reflections four out of ten times. +The [[4o]] configuration lowers the temperature to \(0.5\), this seems to give +more consistent results (accepts 20 out of 20). +The [[o1]] configuration is much slower, but also gives consistent results +(accepts 20 out of 20). + +The current prompt seems more stable across all configurations though. +However, for some students, the [[o1]] model thinks that it didn't get a copy +of the instruction---which it did. +So we'll default to the [[4o]] configuration. +<>= +model="4o" +<>= +sc_cmd() { + sc "${model}" "${@}" +} +@ + +To do our evaluations, we used the following script. +It runs a few grading rounds on a few students for each model configuration. +Optimally, we'd run 20 rounds on all students, but that would take a long time +and be costly (but not more than a few euros). +<>= +#!/bin/bash + +source vetcyb-grading.sh + +#students=$(canvaslms users -sc vetcyb24p2) +students="user5@kth.se +user2@kth.se +user4@kth.se +user3@kth.se +user1@kth.se +user6@kth.se +user7@kth.se" + +rounds=5 + +test() { + echo "### sc" + echo "### sc" >&2 + model="default" + + <> + + echo "### sc 4o" + echo "### sc 4o" >&2 + model="4o" + + <> + + echo "### sc o1" + echo "### sc o1" >&2 + model="o1" + + <> +} +@ + +When we run the tests, we want to filter stdout and stderr to separate files. +We're mostly interested in stderr, since that's where the fails appear. +And the fails are fewer than the passes. +<>= +test > test-grade_reflections.txt 2> test-grade_reflections-err.txt +@ + +When running the tests, we want to output the headers to both stdout and +stderr. +<>= +for i in $(seq ${rounds}) +do + echo "##### $i" + echo "##### $i" >&2 + grade_reflections vetcyb24p2 ${students} +done +@ + +Let's have a look at the output. +What's interesting to look at is the comments for when the model fails a +student, particularly how it compares across different rounds. +We want it to be stable, that is, to fail the same students in every round or +accept them in every round. +We want to avoid situations where the student might be accepted in one round +and rejected in another. + +As we can see in the output, the [[4o]] model is stable. +Particularly, the [[o1]] model seems very unstable as it sometimes thinks that +it didn't get any copy of the instruction. +\inputminted[breaklines]{text}{test-grade_reflections-err.txt} + +Let's have a look at that reflection on statistics by user1. +We see that it is rejected four out of five times by both [[default]] and +[[4o]] configurations. +\inputminted[breaklines]{text}{./user1-statistics.md} + +The final run gave the following fails: +\begin{minted}{text} +$ grade_reflections vetcyb24p2 $(canvaslms users -sc vetcyb24p2 | cut -f 2) +vetcyb24p2 user1@kth.se Reflection on the use of statistics: No + +The reflection lacks depth and relevance specifically to the use of statistics. +It briefly mentions statistics but quickly shifts focus to machine learning and +cybersecurity without adequately reflecting on the use of statistics as +instructed. + +vetcyb24p2 maxengm@kth.se Reflection on Science in Security: No, the student +did not provide a reflection. The submission consists of a list of tasks and +activities related to security topics without any personal insights, analysis, +or reflection on the science in security. + +vetcyb24p2 maxengm@kth.se Reflection on qualitative methods: No. The student's +reflection focuses on quantitative aspects and usability testing rather than on +qualitative methods, which was the assignment's focus. + +vetcyb24p2 ronih@kth.se Reflection on Science in Security: No. The submission +appears to be an analysis of specific security topics rather than a reflection +on Science in Security as requested by the assignment. +\end{minted} +This feedback was correct. +It was just the last one that was a bit brief in its description of methodology +for the different cases. + + +\section{The complete code} + +\inputminted[numbers=left]{bash}{vetcyb-grading.sh} +\end{document} diff --git a/makefiles b/makefiles index 6012491..898e836 160000 --- a/makefiles +++ b/makefiles @@ -1 +1 @@ -Subproject commit 601249138f77ccffa98a186b2fb966d1ea47e46d +Subproject commit 898e8365a5a2911841cb13be015b4e06382c5f5c From e61faed073c2d81a5cb30f4886ceabe487ecc0e3 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 19 Dec 2024 20:52:56 +0100 Subject: [PATCH 26/53] Adds grading script for grading seminar participation --- adm/grading/grade_seminar.sh | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 adm/grading/grade_seminar.sh diff --git a/adm/grading/grade_seminar.sh b/adm/grading/grade_seminar.sh new file mode 100644 index 0000000..de51b62 --- /dev/null +++ b/adm/grading/grade_seminar.sh @@ -0,0 +1,45 @@ +oldIFS=$IFS +IFS=$'\n' + +course="vetcyb24p2" +seminar_date=${1} +file=${2} + +teachers="(dbosk|masvanbe|elzen)@kth.se" + +get_grade_data() { + tail -n +2 ${file} \ + | grep -Ev "${teachers}" \ + | cut -d, -f 2,3,5 \ + > participation-seminar.csv + + for user in $(cat participation-seminar.csv | cut -d, -f 1 | sort -u) + do + echo -n "$user "; + sum_minutes=0; + for minutes in $(grep $user participation-seminar.csv | cut -d, -f 3) + do + sum_minutes=$(($sum_minutes + $minutes)); + done; + echo $sum_minutes; + done +} + +open ${file} & +get_grade_data +read -p "Enter the limit in minutes: " limit_minutes + +for result in $(get_grade_data) +do + user=$(echo $result | cut -d ' ' -f 1); + minutes=$(echo $result | cut -d ' ' -f 2); + if [ $minutes -ge $limit_minutes ] + then + canvaslms grade -c ${course} -a "Live seminar ${seminar_date}" \ + -u $user -g complete + else + canvaslms grade -c ${course} -a "Live seminar ${seminar_date}" \ + -u $user -g incomplete \ + -m "You had $minutes minutes of participation out of more than $limit_minutes minutes." + fi +done From d6705f17ca560787f18f62bb4ac578c09750a61e Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 19 Dec 2024 20:53:49 +0100 Subject: [PATCH 27/53] Adds feedback for incomplete participation in seminars --- modules/02-passwd/grade.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/02-passwd/grade.sh b/modules/02-passwd/grade.sh index 2c59262..de51b62 100644 --- a/modules/02-passwd/grade.sh +++ b/modules/02-passwd/grade.sh @@ -37,5 +37,9 @@ do then canvaslms grade -c ${course} -a "Live seminar ${seminar_date}" \ -u $user -g complete + else + canvaslms grade -c ${course} -a "Live seminar ${seminar_date}" \ + -u $user -g incomplete \ + -m "You had $minutes minutes of participation out of more than $limit_minutes minutes." fi done From 926beced679d96be4001c465cd8afc0a42c405d0 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 19 Dec 2024 20:55:08 +0100 Subject: [PATCH 28/53] Adds seminar slides for the scientificity module --- modules/05-scientificity/.gitignore | 1 + modules/05-scientificity/Makefile | 5 +- modules/05-scientificity/seminar-slides.tex | 12 ++ modules/05-scientificity/seminar.tex | 115 ++++++++++++++++++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 modules/05-scientificity/seminar-slides.tex create mode 100644 modules/05-scientificity/seminar.tex diff --git a/modules/05-scientificity/.gitignore b/modules/05-scientificity/.gitignore index 85d632d..701f4cf 100644 --- a/modules/05-scientificity/.gitignore +++ b/modules/05-scientificity/.gitignore @@ -2,3 +2,4 @@ notes.pdf slides.pdf objectives.tex literature +seminar-slides.pdf diff --git a/modules/05-scientificity/Makefile b/modules/05-scientificity/Makefile index eff3e29..37bdd51 100644 --- a/modules/05-scientificity/Makefile +++ b/modules/05-scientificity/Makefile @@ -1,5 +1,5 @@ .PHONY: all -all: notes.pdf slides.pdf +all: notes.pdf slides.pdf seminar-slides.pdf LATEXFLAGS+= -shell-escape @@ -14,6 +14,8 @@ notes.pdf: ${SRC} ${DEPENDS} ${FIGS} slides.pdf: slides.tex slides.pdf: ${SRC} ${DEPENDS} ${FIGS} +seminar-slides.pdf: seminar-slides.tex seminar.tex ${SRC} ${DEPENDS} ${FIGS} + objectives.tex: ../00-intro/objectives.tex ${DEPENDS}: @@ -25,6 +27,7 @@ clean: ${RM} notes.pdf slides.pdf ${RM} ${DEPENDS} ${MAKE} -C fig clean + ${RM} seminar-slides.pdf INCLUDE_MAKEFILES=../../makefiles diff --git a/modules/05-scientificity/seminar-slides.tex b/modules/05-scientificity/seminar-slides.tex new file mode 100644 index 0000000..3131b46 --- /dev/null +++ b/modules/05-scientificity/seminar-slides.tex @@ -0,0 +1,12 @@ +\documentclass[ignoreframetext]{beamer} +\input{preamble.tex} + +\begin{document} +\mode +\input{seminar.tex} +\mode* + +\begin{frame}[allowframebreaks] + \printbibliography +\end{frame} +\end{document} diff --git a/modules/05-scientificity/seminar.tex b/modules/05-scientificity/seminar.tex new file mode 100644 index 0000000..18ef3b9 --- /dev/null +++ b/modules/05-scientificity/seminar.tex @@ -0,0 +1,115 @@ +\title{% + Science in Security, + wrapping up +} +\author{Daniel Bosk\thanks{% + This material is available under the Creative Commons + Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 international + license. + The material was written with some aid from GitHub Copilot. +}} +\institute{% + KTH EECS +} + +\end{block}\end{frame}\begin{frame} + \maketitle +\end{frame} + +\mode* + +\begin{abstract} + \input{abstract.tex} +\end{abstract} + +\clearpage + +\section{Some cases} + +\begin{frame}\begin{block}{Passwords} +To do password-based authentication, we're taught that we should salt +and hash the passwords. The user submits the password to the server, +the server adds a 128-bit salt (random number) and hashes the password +using SHA256, then hashes the hash, and hashes that hash, and so on for 1000 +times. That final hash is used to check if it's the same as the one stored. If +so, the user is accepted. Is this password-based authentication scheme secure? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Programming in not-C} +When we write programs, we should avoid languages like C or C++. (This is even +suggested by some US government agencies.) It's better to use a language like +Rust, which has built-in memory safety. Writing programs in Rust will result in +fewer security vulnerabilities in the programs and will thus be more secure. Is +this really true? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Adding features} +The Bank has used the same back-end software for 50 years (written in COBOL). +This software works and manages the Bank's accounts. Previously the Bank's +staff interacted with the software, e.g. to tranfer money between accounts. + +The Bank hired FutureSoftware to add a web-based front-end so that the +customers can interact with the software directly. That way customers can +transfer money between accounts without the need for Bank staff to do it for +them. (They wrote the software in Python.) + +The Bank then asked VETCYB consultants to evaluate if this is secure. How would +go do it? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Mandatory Access Control (MAC)} +The implementation of Mandatory Access Control (MAC) mechanisms, such +as the Bell-LaPadula Model, is considered crucial in environments that +demand high levels of security and confidentiality. Organizations that +handle sensitive or classified information must ensure that data access +is strictly regulated. MAC models achieve this by enforcing control +policies that limit access based on user clearance levels. Does this work? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Multi-Factor Authentication (MFA)} +Multi-Factor Authentication (MFA) is promoted as an effective way to enhance +security. By requiring users to provide two or more verification factors before +granting access, MFA adds an additional layer of protection beyond just the +password. The methods of implementing MFA varies; such as SMS, email, or +authenticator apps. Is this secure? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Firewalls} +Firewalls are a fundamental component of network security that are +taught in introductory courses. They act as barriers between trusted and +untrusted networks by controlling incoming and outgoing network traffic +based on predetermined security rules. Firewalls can prevent +unauthorized access and attacks. Is this true? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Social Engineering Awareness Training} +Security courses often emphasize the importance of educating employees +about social engineering attacks. The training aims to help employees +recognize and avoid common tactics used in attacks, such as phishing. +Is this secure? How effective, if at all, is such training in practice at +preventing social engineering breaches over time? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Encrypt Data-at-Rest} +One common security practice is encrypting data-at-rest to protect +sensitive information stored on devices or servers. By encrypting the +data, unauthorized users are prevented from accessing it without the +appropriate decryption key. Is this secure? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Regular Security Updates} +It is standard advice to regularly update software to stay protected +against newly discovered vulnerabilities. Updates often include patches +for security flaws that could be exploited by attackers. Does this contribute +to increased security? +\end{block}\end{frame} + +\begin{frame}\begin{block}{Penetration Testing (Pentesting)} +Penetration testing, commonly referred to as pentesting, is a proactive +approach to evaluating the security of a computer system, network, +or application by simulating an attack from malicious outsiders and +insiders. Pentesting can help identify vulnerabilities before attackers +exploit them. A comprehensive pentest involves several stages, including +planning, reconnaissance, scanning, exploitation, and reporting. After a +successful pentest the system will be secure. Is this true? +\end{block}\end{frame} From 4c5e32e5eb9a570b72834ac2bb6c77e75803d8e4 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Fri, 20 Dec 2024 09:33:55 +0100 Subject: [PATCH 29/53] Fix the grading script to only grade project assignments We don't want to grade the survey in the project assignments group. --- adm/grading/vetcyb-grading.sh.nw | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index adb3a85..eaccfaa 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -54,6 +54,7 @@ main() { # report INL1 to LADOK canvaslms results -c "${courses}" -A "${components}" \ + -S canvaslms.grades.conjunctavgsurvey \ | sed -E "s/ ?[HV]T[0-9]{2}( \(.*\))?//" \ | ladok report -fv } @@ -211,7 +212,8 @@ grade_participation() { do <> done > "${passed}" - canvaslms grade -c "${course}" -A "${components}" -g P \ + canvaslms grade -c "${course}" -a "${project_assignments_regex}" \ + -g P \ -u "$(make_regex ${passed})" \ -m "${participation_msg}" <> @@ -223,6 +225,13 @@ do the project. " @ +We must remember to set the grades for only the project assignments, not all +INL1 assignments. +The INL1 assignments group also includes a survey. +<>= +project_assignments_regex="^(Peer review: Designing a methodology|The final seminar)" +@ + The function [[make_regex]] simply takes the list of usernames [[user1]], [[user2]] and [[user3]] (contained in the file supplied as the argument, one per line) and turns them into the regex [[(user1|user2|user3)]]. @@ -473,7 +482,8 @@ do local feedback=$(feedback_participation "${course}" "${student}") if [ -n "${feedback}" ] then - canvaslms grade -c "${course}" -A "${components}" -u "${student}" \ + canvaslms grade -c "${course}" -a "${project_assignments_regex}" \ + -u "${student}" \ -m "${feedback}" fi done From a63a0adf9a8cd9be7ae3927f24b5e188b33d44fa Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Fri, 20 Dec 2024 11:34:19 +0100 Subject: [PATCH 30/53] Adds more examples from grading --- adm/grading/instruction-statistics.md | 23 +++++++++++++++++++++++ adm/grading/user1-statistics.md | 18 ++++++++++++++++++ adm/grading/user2-statistics.md | 13 +++++++++++++ adm/grading/user5-statistics.md | 14 ++++++++++++++ adm/grading/vetcyb-grading.sh.nw | 13 ++++++++++--- 5 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 adm/grading/instruction-statistics.md create mode 100644 adm/grading/user1-statistics.md create mode 100644 adm/grading/user2-statistics.md create mode 100644 adm/grading/user5-statistics.md diff --git a/adm/grading/instruction-statistics.md b/adm/grading/instruction-statistics.md new file mode 100644 index 0000000..38ab9d3 --- /dev/null +++ b/adm/grading/instruction-statistics.md @@ -0,0 +1,23 @@ + +# Reflection on the use of statistics + +## Metadata + +- Unlocks: None +- Due: None +- Locks: None +- Ungraded submissions: 27 +- Submission type: ['online_text_entry', 'online_upload'] +- URL: https://canvas.kth.se/courses/50613/assignments/318595 +- Submissions: https://canvas.kth.se/courses/50613/assignments/318595/submissions?zip=1 + +## Instruction + +In what ways do we use statistics in security research? Consider how the +papers you\'ve read so far have used statistics. + +What about machine learning? (Machine learning is basically black-box +automated statistics.) + + + diff --git a/adm/grading/user1-statistics.md b/adm/grading/user1-statistics.md new file mode 100644 index 0000000..2cb8eea --- /dev/null +++ b/adm/grading/user1-statistics.md @@ -0,0 +1,18 @@ + - Course: DA2215 HT24 (vetcyb24-p2) + - Assignment: Reflection on the use of statistics + - Student: Student Studentensson + - Submission id: 24966368 + - Submitted at: 2024-12-11T19:42:23Z + - Graded at: None + - Grade: None + - Graded by: None + - Speedgrader: https://canvas.kth.se/courses/50613/gradebook/speed_grader?assignment_id=318595&student_id=154870 +## reflection.md + +```markdown +The statistic is an useful tool, that helps us capturing the big picture. But we need to take this into account as this can also mean that the individual cases may be quite different. + +The machine learning is an emerging field, that we need to understand as it changes everything and the cybersecurity is no exception. + +``` + diff --git a/adm/grading/user2-statistics.md b/adm/grading/user2-statistics.md new file mode 100644 index 0000000..5c5a654 --- /dev/null +++ b/adm/grading/user2-statistics.md @@ -0,0 +1,13 @@ + - Course: DA2215 HT24 (vetcyb24-p2) + - Assignment: Reflection on the use of statistics + - Student: Studenten Studentensson + - Submission id: 24966347 + - Submitted at: 2024-12-11T17:35:37Z + - Graded at: None + - Grade: None + - Graded by: None + - Speedgrader: https://canvas.kth.se/courses/50613/gradebook/speed_grader?assignment_id=318595&student_id=110079 +# Body + +

They used success rates from Mls trained with real-world and syntetic data to to compare how realistic data compares to syntetic. They also analyse false positive rates, precision and recall to measure effectivness in WF+WO attacks.  

+ diff --git a/adm/grading/user5-statistics.md b/adm/grading/user5-statistics.md new file mode 100644 index 0000000..b376c43 --- /dev/null +++ b/adm/grading/user5-statistics.md @@ -0,0 +1,14 @@ + - Course: DA2215 HT24 (vetcyb24-p2) + - Assignment: Reflection on the use of statistics + - Student: Stentina Studentensdotter + - Submission id: 24966371 + - Submitted at: 2024-12-10T15:05:24Z + - Graded at: None + - Grade: None + - Graded by: None + - Speedgrader: https://canvas.kth.se/courses/50613/gradebook/speed_grader?assignment_id=318595&student_id=173646 +# Body + +

Statistics play a vital role in security research for several reasons.
For example the first paper used live statics gathered by the Tor project to prove that their developed client closely matches a real network in performance. They essentially analysed patterns of the Tor networked and compared them with their developed simulation client.
The second paper, used statistics in their background section to quantify risk and the third paper measured the accuracy of WF classification an attacker can achieve in a real world scenario, which assessing the effectiveness of the attack.
There are of course many more (e.g. access risk based on history, evaluate performance, experiments to study user behaviour for something like password reuse), but I will stop at the ones found in the papers.

+

Machine learning essentially operates completely on the statistics of the data it was trained on. Therefore, all the things explained above can be done by an ML algorithm without a human having to spend time on it. However, an ML is only ever as good as the data it was trained on and also brings many other problems. Consequently, it is a useful tool but one need to be careful when using it and verify the results.

+ diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index eaccfaa..958e831 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -870,6 +870,13 @@ We see that it is rejected four out of five times by both [[default]] and [[4o]] configurations. \inputminted[breaklines]{text}{./user1-statistics.md} +Let's compare it to the instruction. +\inputminted[breaklines]{markdown}{./instruction-statistics.md} + +And now compare to some accepted reflections. +\inputminted[breaklines]{text}{./user5-statistics.md} +\inputminted[breaklines]{text}{./user2-statistics.md} + The final run gave the following fails: \begin{minted}{text} $ grade_reflections vetcyb24p2 $(canvaslms users -sc vetcyb24p2 | cut -f 2) @@ -880,16 +887,16 @@ It briefly mentions statistics but quickly shifts focus to machine learning and cybersecurity without adequately reflecting on the use of statistics as instructed. -vetcyb24p2 maxengm@kth.se Reflection on Science in Security: No, the student +vetcyb24p2 user8@kth.se Reflection on Science in Security: No, the student did not provide a reflection. The submission consists of a list of tasks and activities related to security topics without any personal insights, analysis, or reflection on the science in security. -vetcyb24p2 maxengm@kth.se Reflection on qualitative methods: No. The student's +vetcyb24p2 user8@kth.se Reflection on qualitative methods: No. The student's reflection focuses on quantitative aspects and usability testing rather than on qualitative methods, which was the assignment's focus. -vetcyb24p2 ronih@kth.se Reflection on Science in Security: No. The submission +vetcyb24p2 user9@kth.se Reflection on Science in Security: No. The submission appears to be an analysis of specific security topics rather than a reflection on Science in Security as requested by the assignment. \end{minted} From 5d9e019953456ceccdd416f01b8687e6d0fc9e73 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 9 Jan 2025 15:42:00 +0100 Subject: [PATCH 31/53] Adapts to having one more assignment in INL1 (final report) --- adm/grading/vetcyb-grading.sh.nw | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index 958e831..3f0a716 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -79,10 +79,21 @@ don't have to do the final project. The INL1 assignment group contains the following assignments: \begin{verbatim} INL1 Peer review: Designing a methodology to answer a question +INL1 Final version of the report for final seminar INL1 The final seminar on 8-9/1 at 8:15 +INL1 Course evaluation survey \end{verbatim} -We want to set grades on those two assignments based on the participation and -prep. +We want to set grades on the first three assignments based on the participation +and prep. +We use a mandatory course evaluation to simply get a date. +If the student finishes by participation, they will finish a few week earlier. +CSN doesn't like this. +So to get a date in the last week of the course, we'll let the students who +finish by participation to do the mandatory course evaluation survey then. +That way we get a date in the last week of the course. +Also, we get all the students to fill in the survey, instead of the usual two +students. + The participation contains the following assignments: \begin{verbatim} Participation INL1 Overview of Science in Security @@ -229,7 +240,7 @@ We must remember to set the grades for only the project assignments, not all INL1 assignments. The INL1 assignments group also includes a survey. <>= -project_assignments_regex="^(Peer review: Designing a methodology|The final seminar)" +project_assignments_regex="^(Peer review:|The final seminar|Final version of the report)" @ The function [[make_regex]] simply takes the list of usernames [[user1]], From 1e50e9d23b8820716229939cedfd5474ac5629f3 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 9 Jan 2025 15:42:29 +0100 Subject: [PATCH 32/53] Emphasizes more that we don't do unnecessary grading --- adm/grading/vetcyb-grading.sh.nw | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index 3f0a716..e078dec 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -590,6 +590,13 @@ grade_reflections() { To create the regex, we can use the [[make_regex]] function. But that function requires a file containing all the students. +So we'll write the students who need grading to a temporary file and use that. + +We also emphasize \emph{students who need grading}. +Grading the reflections is, quite literally, an expensive operation. +But we only grade reflections that are not already graded---see +[[<>]] just +below. <>= local students_file=$(mktemp) echo "${students}" | tr ' ' '\n' > "${students_file}" @@ -598,7 +605,9 @@ rm "${students_file}" @ To download the submissions, we can use the [[canvaslms submission]] command. -We'll only download ungraded submissions. +We'll only download ungraded submissions (by the [[-U]] option to +[[canvaslms]]). +Consequently, we'll only grade submissions that haven't been graded yet. <>= local reflections_dir="/tmp/${course}.reflections.d" <> From be27e82d2a5382ab592532e4c1cf57b864428c6e Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 5 Feb 2025 20:25:36 +0100 Subject: [PATCH 33/53] Improve grading Makefile --- adm/grading/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/adm/grading/Makefile b/adm/grading/Makefile index 050a270..b0f39fb 100644 --- a/adm/grading/Makefile +++ b/adm/grading/Makefile @@ -8,6 +8,8 @@ all: vetcyb-grading.pdf vetcyb-grading.sh vetcyb-grading.pdf: vetcyb-grading.tex vetcyb-grading.sh: vetcyb-grading.sh.nw +vetcyb-grading.pdf: prompts.toml + GRADE_RESULTS=test-grade_reflections-err.txt vetcyb-grading.pdf: ${GRADE_RESULTS} From 19533ca6323039acf4e90c22a06bcb90a24ab3c8 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 5 Feb 2025 20:27:17 +0100 Subject: [PATCH 34/53] Improves grading script structure --- adm/grading/vetcyb-grading.sh.nw | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index e078dec..880d796 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -29,17 +29,19 @@ We want to automate the reporting of the results in the vetcyb courses. There are two ways to pass the course: \begin{enumerate} -\item\label{ParticipationOption} By participating in the seminars and doing the -prep assignments. + \item\label{ParticipationOption} By participating in the seminars and doing + the prep assignments. Also known as, participating in all teaching. -\item\label{FinalProjectOption} By doing the final project. + \item\label{FinalProjectOption} By doing the final project. \end{enumerate} We want a script that can be run by the [[grader]] script\footnote{% See \texttt{https://github.com/dbosk/grader/}. }. -This will have the standard design, except that we'll do the participation as -an intermediate step. +This will have the standard design (see [[report_INL1]]), except that we'll do +the participation grading before. +This way we can set the grades of the INL1 assignments based on the +participation and prep. <>= #!/bin/bash @@ -49,16 +51,22 @@ components="^INL1" <> -main() { - <> - - # report INL1 to LADOK +report_INL1() { canvaslms results -c "${courses}" -A "${components}" \ -S canvaslms.grades.conjunctavgsurvey \ | sed -E "s/ ?[HV]T[0-9]{2}( \(.*\))?//" \ | ladok report -fv } +grade_participation() { + <> +} + +main() { + grade_participation + report_INL1 +} + # run main if not sourced from another script if [ "$0" = "${BASH_SOURCE[0]}" ] then @@ -211,10 +219,10 @@ skip the project. <>= for course in $(canvaslms courses "${courses}") do - grade_participation "${course}" + grade_course_participation "${course}" done <>= -grade_participation() { +grade_course_participation() { local course="${1}" <> <> From 03968ae58b3ef5e2749973cc4a6383abb059bd03 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 5 Feb 2025 20:27:36 +0100 Subject: [PATCH 35/53] Grading script: Only give feedback after the last seminar --- adm/grading/vetcyb-grading.sh.nw | 95 ++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 17 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index 880d796..ac6faf5 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -490,23 +490,7 @@ feedback_participation() { <> fi } -@ - -This way we can use it to give feedback to the students who didn't pass. -The students who are listed in the file [[passed]] are the ones who passed. -The other students in [[students]] are the ones who didn't pass. -<>= -for student in $(echo "${students}" | grep -vFxf "${passed}") -do - local feedback=$(feedback_participation "${course}" "${student}") - if [ -n "${feedback}" ] - then - canvaslms grade -c "${course}" -a "${project_assignments_regex}" \ - -u "${student}" \ - -m "${feedback}" - fi -done -@ +@ This way we can use it to give feedback to the students who didn't pass. Now we should just find the assignments without a passing grade and print those titles. @@ -559,6 +543,83 @@ echo "${student_results}" \ | cut -f 1,3 @ +\subsection{Giving feedback to students who didn't pass} + +The students who are listed in the file [[passed]] are the ones who passed. +The other students in [[students]] are the ones who didn't pass. +<>= +echo "${students}" | grep -vFxf "${passed}" +@ + +However, these results only make sense after the last seminar of the course. +Before that last seminar, none of the students could have passed. +Unfortunately, just checking if \emph{anyone} passed, will not be enough. +In the rounds following, maybe all missed a small thing, but then they won't +get feedback about it. +So we need to compare to the dates of the seminars. +We can't rely on the dates being equal, then the script might run before the +seminar that day. +So [[today]] must be strictly after the last seminar. +<>= +<> +<> +if [ "${today}" -gt "${last_date}" ] +then + for student in $(<>) + do + local feedback=$(feedback_participation "${course}" "${student}") + if [ -n "${feedback}" ] + then + canvaslms grade -c "${course}" -a "${project_assignments_regex}" \ + -u "${student}" \ + -m "${feedback}" + fi + done +fi +@ + + +\subsection{Getting the last seminar date} + +Now, the dates of the seminars are in the title of the assignments. +It's written as `Live seminar 13/11 at 15:15`. +So we want to change it into the date format `24-11-13`, that way it will be +comparable to today's date. +The relevant year is in the course name, so we can get it from +[[course]]---which will have the format [[vetcyb24p2]]. +<>= +last_seminar_date() { + local course="${1}" + local year=$(echo "${course}" | sed -E 's/vetcyb([0-9]{2})-?p[1-4]/\1/') + assignments "${course}" \ + | filter_live_seminar \ + | cut -f 2 \ + | cut -d ' ' -f 3 \ + | <> \ + | sort \ + | tail -n 1 +} +<>= +local year=$(echo "${course}" | sed -E 's/vetcyb([0-9]{2})-?p[1-4]/\1/') +local last_date=$(last_seminar_date "${course}") +@ + +We also need today's date in the same format. +<>= +local today=$(date +%y-%m-%d) +@ + +Let's rewrite the date to the format `yy-mm-dd`. +We must change the month and day to two-digit numbers. +We can do this by rewriting all [[/d]] and [[d/]] to [[/0d]] and [[0d/]]. +Then we can swap the month and day by rewriting [[dd/mm]] to [[mm-dd]] and +inserting the year ([[${year}]]) at the beginning. +<>= +sed -E "s|^([0-9]{1})/|0\1/|" \ +| sed -E "s|/([0-9]{1})$|/0\1|" \ +| sed -E "s|([0-9]{2})/([0-9]{2})|${year}-\2-\1|" +@ + \section{Grading the reflection assignments} From 2bc46bb17828e75971fd8828e59405f71edc6836 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 6 Feb 2025 08:39:44 +0100 Subject: [PATCH 36/53] Bugfixes grading: Fix course matching and feedback --- adm/grading/vetcyb-grading.sh.nw | 55 ++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index ac6faf5..fc9f207 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -212,15 +212,35 @@ filter_INL1() { As mentioned above, we'll need to do this on a per course basis, since the assignments might vary from round to round. -We want to pass the INL1 assignments if the appropriate participation and prep -are checked. -However, we don't want to pass only one of the assignments, both must pass to -skip the project. <>= -for course in $(canvaslms courses "${courses}") +oldIFS="${IFS}" +IFS=$'\n' +for course in $(<>) do + IFS="${oldIFS}" grade_course_participation "${course}" done +IFS="${oldIFS}" +@ + +For the courses, we need something that can be used as an identifier. +That would be the first or second column. +The first is shorter, so we'll use that. +But it also contains parentheses, so we'll need to deal with them to not be +interpreted as regex. +If they're interpreted as regex, we won't get any matches. +So we'll need to either escape them or replace them by periods ([[.]]). +<>= +canvaslms courses "${courses}" \ +| cut -f 1 \ +| sed -E 's/([()])/\\\1/g' +@ + +Now to the grading. +We want to pass the INL1 assignments if the appropriate participation and prep +are checked. +However, we don't want to pass only one of the assignments, both must pass to +skip the project. <>= grade_course_participation() { local course="${1}" @@ -231,10 +251,13 @@ grade_course_participation() { do <> done > "${passed}" - canvaslms grade -c "${course}" -a "${project_assignments_regex}" \ - -g P \ - -u "$(make_regex ${passed})" \ - -m "${participation_msg}" + if [ -s "${passed}" ] + then + canvaslms grade -c "${course}" -a "${project_assignments_regex}" \ + -g P \ + -u "$(make_regex ${passed})" \ + -m "${participation_msg}" + fi <> } <>= @@ -377,12 +400,16 @@ students_to_grade() { local students=$(echo "${results}" | cut -f 2 | sort -u) for student in ${students} do - if ! echo "${results}" | grep "${student}" | passed_all "${passing_grades}" - then - echo "${student}" - fi + <> + <> + echo "${student}" done } +<>= +if echo "${results}" | grep "${student}" | passed_all "${passing_grades}" +then + continue +fi @ We can define a regex for [[passing_grades]] that captures all passing grades @@ -563,7 +590,7 @@ So [[today]] must be strictly after the last seminar. <>= <> <> -if [ "${today}" -gt "${last_date}" ] +if [[ "${last_date}" < "${today}" ]] then for student in $(<>) do From fda973a2560d2d385fc2e90b299f3edf14046cce Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 6 Feb 2025 09:38:14 +0100 Subject: [PATCH 37/53] Adds another check for when to grade students --- adm/grading/vetcyb-grading.sh.nw | 43 ++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index fc9f207..3cf8e53 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -405,11 +405,6 @@ students_to_grade() { echo "${student}" done } -<>= -if echo "${results}" | grep "${student}" | passed_all "${passing_grades}" -then - continue -fi @ We can define a regex for [[passing_grades]] that captures all passing grades @@ -423,6 +418,44 @@ in all grading scales: local passing_grades="${1:-^(P|complete|9[0-9]|100)}" @ +The check if a student has passed all assignments is now quite straightforward. +<>= +if echo "${results}" | grep "${student}" | passed_all "${passing_grades}" +then + continue +fi +@ + +We don't need to grade anyone who is already graded, we don't want to spam them +with feedback. +So how do we detect this? +We can check if they have a grade on the `Final version of the report` +assignment, or rather, a date. +If that date is later than all the other dates, then they are graded. +Otherwise they're not. +<>= +local final_report_date=$(echo "${results}" \ + | grep "${student}" \ + | grep 'Final version of the report' \ + | cut -f 4) +local latest_date=$(echo "${results}" \ + | grep "${student}" \ + | filter_participation \ + | cut -f 4 \ + | sort \ + | tail -n 1) +if [ -n "${final_report_date}" -a -n "${latest_date}" ] +then + if [[ "${final_report_date}" > "${latest_date}" ]] + then + continue + fi +fi +@ We note that this only works when all assignments are in the results piped to +[[students_to_grade]]. +For instance, if we only get results filtered by [[filter_INL1]], then we we +can't compare the dates of the `Final version of the report` (which is present) +to the other assignments (which are not present). \subsection{Checking if a student has passed all assignments} From 67f0a2b91abc86f882bfbe142255d87ec10a1cbb Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 6 Feb 2025 10:49:03 +0100 Subject: [PATCH 38/53] Grading: Improves students_to_grade --- adm/grading/vetcyb-grading.sh.nw | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index 3cf8e53..9d30ff9 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -382,7 +382,7 @@ the assignments. Fortunately, all the assignments in the INL1 group are pass/fail. So we can just look for the students that have not passed the assignments. <>= -students=$(results "${course}" | filter_INL1 | students_to_grade) +students=$(results "${course}" | students_to_grade) @ The idea is this. @@ -395,12 +395,12 @@ or not. If they did not, we echo their username. <>= students_to_grade() { - local results=$(cat) + local results="$(cat)" <> local students=$(echo "${results}" | cut -f 2 | sort -u) for student in ${students} do - <> + <> <> echo "${student}" done @@ -418,12 +418,20 @@ in all grading scales: local passing_grades="${1:-^(P|complete|9[0-9]|100)}" @ -The check if a student has passed all assignments is now quite straightforward. -<>= -if echo "${results}" | grep "${student}" | passed_all "${passing_grades}" +If the student has passed any INL1 assignment, we don't need to grade them. +Then we know that they have either passed the course or started working on the +project. +<>= +if echo "${results}" | grep "${student}" \ + | filter_INL1 | passed_any "^P" then continue fi +<>= +passed_any() { + local grades="${1}" + cut -f 3 | grep -qP "${grades}" +} @ We don't need to grade anyone who is already graded, we don't want to spam them @@ -457,6 +465,12 @@ For instance, if we only get results filtered by [[filter_INL1]], then we we can't compare the dates of the `Final version of the report` (which is present) to the other assignments (which are not present). +Also, when we give feedback to a student in the INL1 assignments, they are not +labelled as graded (with a grading date). +Perhaps we can get them to be labelled as graded if we set the grade [[-]]? +Nope, doesn't work. +We must set a non-passing grade on them. + \subsection{Checking if a student has passed all assignments} The [[passed_all]] assignment will check if all the assignments that it gets From dee1a8583deccb92799af109a0f2e40d2da2e69a Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 3 Apr 2025 08:51:36 +0200 Subject: [PATCH 39/53] Adds more content to intro lecture Summarizes the contents (topics) of the course. --- modules/00-intro/contents.tex | 108 +++++++++++++++++++++++----------- 1 file changed, 75 insertions(+), 33 deletions(-) diff --git a/modules/00-intro/contents.tex b/modules/00-intro/contents.tex index 212b802..bf6c3dc 100644 --- a/modules/00-intro/contents.tex +++ b/modules/00-intro/contents.tex @@ -96,15 +96,15 @@ \section{Overview} \begin{frame} \begin{question} - What are the methods we (in the security community) use and why? + What are the \emph{research} methods we (in the security community) use and + why? \end{question} \end{frame} \begin{frame} \begin{block}{The goal} \begin{itemize} - \item Give a holistic view of Science of Security. - \item What are the methods we use and why? + \item Give a holistic view of \emph{Science} of Security. \end{itemize} \end{block} \end{frame} @@ -147,12 +147,18 @@ \section{Overview} \begin{frame} \begin{block}{Aim of Science of Security course} \begin{itemize} - \item Complement the general methods course. + \item Complement the general methods course (TAMOS). \item Better prepare students for thesis (and hopefully worklife \dots). - \item They should be able to contribute to scientifically based + \item They should be able to contribute to \emph{scientifically} based development in cybersecurity. \end{itemize} \end{block} + + \begin{remark} + \begin{itemize} + \item This course is now fully synced with TAMOS\@. + \end{itemize} + \end{remark} \end{frame} \only
{\subsection{Goals and requirements}} @@ -334,6 +340,14 @@ \subsection{The goal} \item Evaluate the suitability of proposed methods. \end{itemize} \end{block} + + \begin{remark} + \begin{itemize} + \item The focus is on \emph{research methods}. + \item It's \emph{not} on {constructing a secure solution}. + \item We want to know \emph{how do you know if it is secure?} + \end{itemize} + \end{remark} \end{frame} @@ -476,32 +490,26 @@ \subsection{Format} \begin{block}{Teaching}<+> \begin{itemize} \item Reading material and watching videos. + \item Write reflection to prepare for seminar. \item Discuss and work with material at synchronous seminars. \end{itemize} \end{block} \begin{block}{Assessment}<+> - \begin{itemize} - \item A synchronous seminar to summarize all work and tie the sack. - \end{itemize} + Either + \begin{enumerate} + \item You do all prep and participate in all seminars. + \item You do the project, write a report, peer review and participate in + the final seminar. + \end{enumerate} \end{block} - - \uncover<+>{% - \begin{remark} - \begin{itemize} - \item I'm evaluating whether I can use teaching part for assessment. - \item That way you don't need to do the project. - \end{itemize} - \end{remark} - } \end{frame} \begin{frame} \begin{block}{Giving the course} \begin{itemize} - \item Given twice pre year, for now. + \item Given twice pre year, for now: period 2 and 4. \item If you don't finish, you can try again next round. - \item Next will be either period 3 or 4, depending on turnout. \end{itemize} \end{block} \end{frame} @@ -585,12 +593,6 @@ \subsection{Contents} \section{Contents} -\begin{frame} - \begin{remark} - This year we're syncing more with TAMOS. - \end{remark} -\end{frame} - %\begin{frame} % \begin{block}{Contents, part II} % \begin{itemize} @@ -727,15 +729,55 @@ \subsection{Learning} \end{remark} \end{frame} -\paragraph{Other topics} +\paragraph{Models: Cryptography, formal methods, simulations} -In the rest of the course we'll cover a variety of topics: -\begin{itemize} - \item formal methods - \item cryptography, - \item anonymous communication, - \item possibly other topics too. -\end{itemize} +\begin{frame} + \begin{block}{Models---deductive methods} + \begin{itemize} + \item Cryptography: proving crypto protocols (RSA and ElGamal). + \item How models are inaccurate (side channels). + \item Formal methods: proving complex protocols, software, hardware. + \item Simulations: can't trial-and-error in real world (Tor). + \end{itemize} + \end{block} +\end{frame} + +\paragraph{Statistics} + +\begin{frame} + \begin{block}{Statistics} + \begin{itemize} + \item How is statistics used in security? + \item It's used in models and simulations (the science). + \item Used in security solutions (or attacks). + \end{itemize} + \end{block} +\end{frame} + +\paragraph{Qualitative methods} + +\begin{frame} + \begin{block}{Qualitative methods} + \begin{itemize} + \item How are qualitative methods used in security? + \item Qualitative methods are used to understand the human aspects of + security. + \item It's a method to explore things, to explain. + \item It can generate hypotheses that can be tested quantitatively. + \end{itemize} + \end{block} +\end{frame} + +\paragraph{Ethics} + +\begin{frame} + \begin{block}{Ethics} + \begin{itemize} + \item What should be do and not do? + \item What research questions should we answer and how can we do it? + \end{itemize} + \end{block} +\end{frame} \subsection{Final assessment} From 9eaf1e635a9629dd4e0b15e6ccaa829f3a4b1375 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 23 Apr 2025 10:48:30 +0200 Subject: [PATCH 40/53] Improves seminar attendance grading script --- adm/grading/grade_seminar.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adm/grading/grade_seminar.sh b/adm/grading/grade_seminar.sh index de51b62..c122c78 100644 --- a/adm/grading/grade_seminar.sh +++ b/adm/grading/grade_seminar.sh @@ -1,11 +1,11 @@ oldIFS=$IFS IFS=$'\n' -course="vetcyb24p2" -seminar_date=${1} -file=${2} +course="${1}" +seminar_date="${2}" +file="${3}" -teachers="(dbosk|masvanbe|elzen)@kth.se" +teachers="(dbosk|masvanbe|elzen|gylje)@kth.se" get_grade_data() { tail -n +2 ${file} \ From 63757a0571f6b8048384278c216f3d8ce1374067 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 23 Apr 2025 10:48:56 +0200 Subject: [PATCH 41/53] Improves 02-passwd seminar slides --- modules/02-passwd/seminar.tex | 41 +++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/modules/02-passwd/seminar.tex b/modules/02-passwd/seminar.tex index 6deb8af..b263d84 100644 --- a/modules/02-passwd/seminar.tex +++ b/modules/02-passwd/seminar.tex @@ -24,17 +24,50 @@ \clearpage +\section{Some interesting questions} + +\begin{frame} + \begin{question} + What part of security is not a science? + \end{question} +\end{frame} + +\section{The papers} + \begin{frame} - \frametitle{Three Papers on Passwords} \begin{itemize} \item \fullcite{OfPasswordsAndPeople} \item \fullcite{CanLongPasswordsBeSecureAndUsable} \item \fullcite{WhyPhishingWorks} \end{itemize} + \begin{onlyenv}<2> + \begin{remark} + Focus on the \emph{methods}, not the results! + \end{remark} + \end{onlyenv} \end{frame} \section{Related to TAMOS} +\begin{frame} + \begin{exercise} + \begin{itemize} + \item Try to relate the three papers + \begin{itemize} + \item \citetitle{OfPasswordsAndPeople} + \item \citetitle{CanLongPasswordsBeSecureAndUsable} + \item \citetitle{WhyPhishingWorks} + \end{itemize} + \item to the TAMOS lectures + \begin{itemize} + \item Scientific inferences, + \item Observation and measurements, + \item Experiments + \end{itemize} + \end{itemize} + \end{exercise} +\end{frame} + \begin{frame} \begin{question} \begin{itemize} @@ -101,9 +134,7 @@ \section{More general} \citetitle{CanLongPasswordsBeSecureAndUsable}? \end{itemize} \end{question} -\end{frame} -\begin{frame} \begin{question} \begin{itemize} \item What can we say about the validity of these results? @@ -124,7 +155,9 @@ \section{More general} \begin{itemize} \item Is it just the password policy? \item Can we know from these studies? - \item We'd need more studies focusing on other factors, then a meta-analysis to see what factors are most important and how they interact. + %\item We'd need more studies focusing on other factors, then a + %meta-analysis to see what factors are most important and how they + %interact. \end{itemize} \end{itemize} \end{question} From 4f30ab77cbceb71a7a6185ebea1302183cf6dcca Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Tue, 29 Apr 2025 12:31:44 +0200 Subject: [PATCH 42/53] Improve models seminar slides --- modules/03-formal-methods/seminar.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/03-formal-methods/seminar.tex b/modules/03-formal-methods/seminar.tex index 57098ae..ee9d621 100644 --- a/modules/03-formal-methods/seminar.tex +++ b/modules/03-formal-methods/seminar.tex @@ -56,6 +56,7 @@ \section{Model checking and theorem proving} cryptography? \item How sure can we be of the results when using model checking or theorem proving? + Better than the ElGamal example? \end{enumerate} \end{question} \end{frame} From 5e230899cb280faaf3fb221e74d7f8a43778ed17 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 7 May 2025 09:45:48 +0200 Subject: [PATCH 43/53] Renames formal-methods to models --- modules/03-models/.gitignore | 3 +++ modules/{03-formal-methods => 03-models}/Makefile | 0 modules/{03-formal-methods => 03-models}/extendoldsoft.md | 0 modules/{03-formal-methods => 03-models}/preamble.tex | 0 modules/{03-formal-methods => 03-models}/seminar-slides.tex | 0 modules/{03-formal-methods => 03-models}/seminar.tex | 0 modules/{03-formal-methods => 03-models}/teaching.md | 0 7 files changed, 3 insertions(+) create mode 100644 modules/03-models/.gitignore rename modules/{03-formal-methods => 03-models}/Makefile (100%) rename modules/{03-formal-methods => 03-models}/extendoldsoft.md (100%) rename modules/{03-formal-methods => 03-models}/preamble.tex (100%) rename modules/{03-formal-methods => 03-models}/seminar-slides.tex (100%) rename modules/{03-formal-methods => 03-models}/seminar.tex (100%) rename modules/{03-formal-methods => 03-models}/teaching.md (100%) diff --git a/modules/03-models/.gitignore b/modules/03-models/.gitignore new file mode 100644 index 0000000..3344cd5 --- /dev/null +++ b/modules/03-models/.gitignore @@ -0,0 +1,3 @@ +objectives.tex +*.csv +seminar-slides.pdf diff --git a/modules/03-formal-methods/Makefile b/modules/03-models/Makefile similarity index 100% rename from modules/03-formal-methods/Makefile rename to modules/03-models/Makefile diff --git a/modules/03-formal-methods/extendoldsoft.md b/modules/03-models/extendoldsoft.md similarity index 100% rename from modules/03-formal-methods/extendoldsoft.md rename to modules/03-models/extendoldsoft.md diff --git a/modules/03-formal-methods/preamble.tex b/modules/03-models/preamble.tex similarity index 100% rename from modules/03-formal-methods/preamble.tex rename to modules/03-models/preamble.tex diff --git a/modules/03-formal-methods/seminar-slides.tex b/modules/03-models/seminar-slides.tex similarity index 100% rename from modules/03-formal-methods/seminar-slides.tex rename to modules/03-models/seminar-slides.tex diff --git a/modules/03-formal-methods/seminar.tex b/modules/03-models/seminar.tex similarity index 100% rename from modules/03-formal-methods/seminar.tex rename to modules/03-models/seminar.tex diff --git a/modules/03-formal-methods/teaching.md b/modules/03-models/teaching.md similarity index 100% rename from modules/03-formal-methods/teaching.md rename to modules/03-models/teaching.md From 3d2d364509c25713cb886538ca4284da29cff9d6 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 12 May 2025 15:08:13 +0200 Subject: [PATCH 44/53] Adds slides used in the seminar on qualitative and quantitative methods --- modules/04-quantqual/Makefile | 31 ++++ modules/04-quantqual/abstract.tex | 31 ++++ modules/04-quantqual/bibliography.bib | 0 modules/04-quantqual/contents.tex | 235 ++++++++++++++++++++++++++ modules/04-quantqual/notes.tex | 64 +++++++ modules/04-quantqual/preamble.tex | 55 ++++++ modules/04-quantqual/slides.tex | 106 ++++++++++++ 7 files changed, 522 insertions(+) create mode 100644 modules/04-quantqual/Makefile create mode 100644 modules/04-quantqual/abstract.tex create mode 100644 modules/04-quantqual/bibliography.bib create mode 100644 modules/04-quantqual/contents.tex create mode 100644 modules/04-quantqual/notes.tex create mode 100644 modules/04-quantqual/preamble.tex create mode 100644 modules/04-quantqual/slides.tex diff --git a/modules/04-quantqual/Makefile b/modules/04-quantqual/Makefile new file mode 100644 index 0000000..eff3e29 --- /dev/null +++ b/modules/04-quantqual/Makefile @@ -0,0 +1,31 @@ +.PHONY: all +all: notes.pdf slides.pdf + +LATEXFLAGS+= -shell-escape + +SRC+= preamble.tex +SRC+= abstract.tex contents.tex + +DEPENDS+= objectives.tex + +notes.pdf: notes.tex +notes.pdf: ${SRC} ${DEPENDS} ${FIGS} + +slides.pdf: slides.tex +slides.pdf: ${SRC} ${DEPENDS} ${FIGS} + +objectives.tex: ../00-intro/objectives.tex + +${DEPENDS}: + ${LN} $< $@ + + +.PHONY: clean +clean: + ${RM} notes.pdf slides.pdf + ${RM} ${DEPENDS} + ${MAKE} -C fig clean + + +INCLUDE_MAKEFILES=../../makefiles +include ${INCLUDE_MAKEFILES}/tex.mk diff --git a/modules/04-quantqual/abstract.tex b/modules/04-quantqual/abstract.tex new file mode 100644 index 0000000..2b33cc5 --- /dev/null +++ b/modules/04-quantqual/abstract.tex @@ -0,0 +1,31 @@ +% What's the problem? +% Why is it a problem? Research gap left by other approaches? +% Why is it important? Why care? +% What's the approach? How to solve the problem? +% What's the findings? How was it evaluated, what are the results, limitations, +% what remains to be done? + +% XXX Summary +\emph{Summary:} +In this seminar we will explore the relationship between quantitative and +qualitative methods. +We're particularly interested in how they complement each other and why +\emph{qualitative} methods are so important in cybersecurity. + +% XXX Motivation and intended learning outcomes +\emph{Intended learning outcomes:} +This assignment focuses on practice to +\begin{itemize} + \item \LOrelate; + \item \LOevaluate; + \item \LOapply; + \item \LOcomm. +\end{itemize} + +% XXX Prerequisites +\emph{Prerequisites:} +We need basic knowledge of security, corresponding to an introductory course in +the subject. +We also need a high-level overview of the breadth of research methods used in +the area of security, corresponding to the overview lecture \enquote{The +Scientific Method} given in the course. diff --git a/modules/04-quantqual/bibliography.bib b/modules/04-quantqual/bibliography.bib new file mode 100644 index 0000000..e69de29 diff --git a/modules/04-quantqual/contents.tex b/modules/04-quantqual/contents.tex new file mode 100644 index 0000000..dc1822f --- /dev/null +++ b/modules/04-quantqual/contents.tex @@ -0,0 +1,235 @@ +\title{% + Qualitative and quantitative methods +} +\author{Daniel Bosk\thanks{% + This material is available under the Creative Commons + Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) 4.0 international + license. + The material was written with some aid from GitHub Copilot. +}} +\institute{% + KTH EECS +} + +\begin{frame} + \maketitle +\end{frame} + +\mode* + +\begin{abstract} + \input{abstract.tex} +\end{abstract} + +\clearpage + +\section{Warm-up} + +\begin{frame} +\begin{columns}[T,totalwidth=\linewidth] + \begin{column}{0.5\linewidth} + \begin{block}{Quantitative} + \begin{itemize} + \item Shadow: Running Tor in a box + \item Website Fingerprinting with Website Oracles + \item Evaluating the Real-World Applicability of WF + \item Dos and Don'ts of Machine Learning in Security + \end{itemize} + \end{block} + \end{column} + \begin{column}{0.5\linewidth} + \begin{block}{Qualitative} + \begin{itemize} + \item Why phishing works + \item Why Johnny can't encrypt + \item Comparing the Usability of Cryptographic APIs + \end{itemize} + \end{block} + \end{column} +\end{columns} + \begin{exercise}[Venting] + \begin{itemize} + \item What are your thoughts after reading the papers? + \end{itemize} + \end{exercise} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item How do qualitative and quantitative methods complement each + other? + \end{itemize} + \end{question} +\end{frame} + +\section{Quantitative methods} + +\begin{frame} + \begin{block}{Papers} + \begin{itemize} + \item Shadow: Running Tor in a box + \item Website Fingerprinting with Website Oracles + \item Online Website Fingerprinting: Evaluating the Real-World + Applicability of Website Fingerprinting + \item Dos and Don'ts of Machine Learning in Security + \end{itemize} + \end{block} + + \begin{question}[Venting] + \begin{itemize} + \item What are your thoughts after reading the papers? + \end{itemize} + \end{question} +\end{frame} + +%\section{Users get routed} +% +%\begin{frame} +% \begin{question}[Users get routed] +% \begin{itemize} +% \item What was the research question? +% \item What methods did they use? +% \item Why is that a good method? +% \item Can we use another method? +% \end{itemize} +% \end{question} +%\end{frame} +% +%\begin{frame} +% \begin{question} +% \begin{itemize} +% \item Why do we need to use empirical methods in this case? +% \item What effect does data have on validity? +% \end{itemize} +% \end{question} +%\end{frame} + +\subsection{Shadow: Running Tor in a box} + +\begin{frame} + \begin{question}[Shadow: Running Tor in a box] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item They evaluate the quality of a research tool. + \item What are the challenges in doing that? + \end{itemize} + \end{question} +\end{frame} + +\subsection{WF with Website Oracles} + +\begin{frame} + \begin{question}[WF with Website Oracles] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item What type of contribution do we get from this paper? + What is the Website Oracle? + \item How do they show WOs exist in reality? + \end{itemize} + \end{question} +\end{frame} + +\subsection{Evaluating WF in Real World} + +\begin{frame} + \begin{question}[Evaluating WF in Real World] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + \begin{itemize} + \item They complained about the evaluation of WF in other papers. + What was the problem? + \item Are there any problems with this paper's approach? + \end{itemize} + \end{question} +\end{frame} + + +\section{Qualitative methods} + +\begin{frame} + \begin{block}{Papers} + \begin{itemize} + \item Why phishing works + \item Why Johnny can't encrypt + \item Comparing the Usability of Cryptographic APIs + \end{itemize} + \end{block} + + \begin{question}[Venting] + \begin{itemize} + \item What are your thoughts after reading the papers? + \end{itemize} + \end{question} +\end{frame} + +\subsection{Why phishing works} + +\begin{frame} + \begin{question}[Evaluating WF in Real World] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\subsection{Why Johnny can't encrypt} + +\begin{frame} + \begin{question}[Evaluating WF in Real World] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + +\subsection{Comparing the Usability of Cryptographic APIs} + +\begin{frame} + \begin{question}[Evaluating WF in Real World] + \begin{itemize} + \item What was the research question? + \item What methods did they use? + \item Why is that a good method? + \item Can we use another method? + \end{itemize} + \end{question} +\end{frame} + + + diff --git a/modules/04-quantqual/notes.tex b/modules/04-quantqual/notes.tex new file mode 100644 index 0000000..49b372d --- /dev/null +++ b/modules/04-quantqual/notes.tex @@ -0,0 +1,64 @@ +\documentclass[a4paper,10pt,article,oneside]{memoir} +%%% Tufte %%% +\usepackage{marginfix} +%\setlength{\evensidemargin}{\oddsidemargin} +\marginparmargin{outer} +\setlrmarginsandblock{2.5cm}{8cm}{*} + +\footnotesinmargin + +\usepackage{ragged2e} +\renewcommand{\sidefootform}{\RaggedRight} +\renewcommand{\foottextfont}{\footnotesize\RaggedRight} + +\setmpjustification{\RaggedRight}{\RaggedRight} + +% margin figure and caption typeset ragged against text block +\setfloatadjustment{marginfigure}{\mpjustification} +\setmarginfloatcaptionadjustment{figure}{\captionstyle{\mpjustification}} + +% From https://tex.stackexchange.com/a/324757/17418 +% Palatino for main text and math +\usepackage[osf,sc]{mathpazo} + +% Helvetica for sans serif +% (scaled to match size of Palatino) +\usepackage[scaled=0.90]{helvet} + +% Bera Mono for monospaced +% (scaled to match size of Palatino) +\usepackage[scaled=0.85]{beramono} + +\setlxvchars\setxlvchars +\checkandfixthelayout + +\nouppercaseheads +%%% end tufte %%% +\let\subsubsection\subsection +\let\subsection\section +\let\section\chapter + +\input{preamble.tex} + +\usepackage[noamsthm,notheorems]{beamerarticle} +\setjobnamebeamerversion{slides} + +%\usepackage{authblk} +%\let\institute\affil + +\declaretheorem[style=theorem]{theorem} +\declaretheorem[style=definition]{definition} +\declaretheorem[style=definition]{assumption} +\declaretheorem[style=definition]{protocol} +\declaretheorem[style=example]{example} +\declaretheorem[style=remark]{remark} +\declaretheorem[style=remark]{idea} +\declaretheorem[style=exercise]{exercise} +\declaretheorem[style=exercise]{question} +\declaretheorem[style=solution]{solution} + +\begin{document} +\input{contents.tex} + +\printbibliography +\end{document} diff --git a/modules/04-quantqual/preamble.tex b/modules/04-quantqual/preamble.tex new file mode 100644 index 0000000..dce955a --- /dev/null +++ b/modules/04-quantqual/preamble.tex @@ -0,0 +1,55 @@ +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[british]{babel} +\usepackage{booktabs} + +\usepackage[% + natbib, + citestyle=verbose,singletitle=false, + style=verbose, + maxbibnames=99,% + isbn=false,doi=false,url=true +]{biblatex} +\addbibresource{bibliography.bib} + +\usepackage[all]{foreign} +\renewcommand{\foreignfullfont}{} +\renewcommand{\foreignabbrfont}{} + +\usepackage{import} + +\usepackage[strict]{csquotes} +\SetCiteCommand{\autocite} +\usepackage[single]{acro} +\acsetup{cite/cmd={\autocite}} + +\usepackage[noend]{algpseudocode} +\usepackage{xparse} + +\let\email\texttt + +\usepackage[outputdir=ltxobj]{minted} +\setminted{autogobble} + +\usepackage{pythontex} +\setpythontexoutputdir{.} +\setpythontexworkingdir{..} + +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{mathtools} +\usepackage{amsthm} +\usepackage{thmtools} +%\usepackage[unq]{unique} +\DeclareMathOperator{\powerset}{\mathcal{P}} + +\usepackage[binary-units]{siunitx} + +\usepackage{adjustbox} +\usepackage{lipsum} +\usepackage{multicol} +\usepackage{changepage} + +\usepackage[capitalize]{cleveref} + +\input{objectives.tex} diff --git a/modules/04-quantqual/slides.tex b/modules/04-quantqual/slides.tex new file mode 100644 index 0000000..395cdf5 --- /dev/null +++ b/modules/04-quantqual/slides.tex @@ -0,0 +1,106 @@ +\documentclass[ignoreframetext]{beamer} +\input{preamble.tex} + +\usetheme{Berlin} +\setbeamertemplate{footline}%{miniframes theme} +{% + \begin{beamercolorbox}[colsep=1.5pt]{upper separation line foot} + \end{beamercolorbox} + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}% + \leavevmode{\usebeamerfont{author in head/foot}\insertshortauthor}% + \hfill% + {\usebeamerfont{institute in head/foot}\usebeamercolor[fg]{institute in head/foot}\insertshortinstitute}% + \end{beamercolorbox}% + \begin{beamercolorbox}[ht=2.5ex,dp=1.125ex,% + leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}% + {\usebeamerfont{title in head/foot}\insertshorttitle} \hfill \insertframenumber% + \end{beamercolorbox}% + \begin{beamercolorbox}[colsep=1.5pt]{lower separation line foot} + \end{beamercolorbox} +} +\setbeamercovered{transparent} +\setbeamertemplate{bibliography item}{\relax} + +\AtBeginSection[]{% + \begin{frame} + \tableofcontents[currentsection] + \end{frame} +} + +\ProvideDocumentEnvironment{assumption}{o}{% + \IfValueTF{#1}{% + \begin{block}{Assumption: #1} + }{% + \begin{block}{Assumption} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{protocol}{o}{% + \IfValueTF{#1}{% + \begin{block}{Protocol: #1} + }{% + \begin{block}{Protocol} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{remark}{o}{% + \IfValueTF{#1}{% + \begin{alertblock}{Note: #1} + }{% + \begin{alertblock}{Note} + } +}{% + \end{alertblock} +} + +\ProvideDocumentEnvironment{idea}{o}{% + \IfValueTF{#1}{% + \begin{block}{Idea: #1} + }{% + \begin{block}{Idea} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{question}{o}{% + \setbeamercolor{block body}{bg=orange!15,fg=black} + \setbeamercolor{block title}{bg=orange,fg=white} + \setbeamercolor{local structure}{fg=orange} + \IfValueTF{#1}{% + \begin{block}{Question: #1} + }{% + \begin{block}{Question} + } +}{% + \end{block} +} + +\ProvideDocumentEnvironment{exercise}{o}{% + \setbeamercolor{block body}{bg=yellow!10,fg=black} + \setbeamercolor{block title}{bg=yellow,fg=black} + \setbeamercolor{local structure}{fg=yellow} + \IfValueTF{#1}{% + \begin{block}{Exercise: #1} + }{% + \begin{block}{Exercise} + } +}{% + \end{block} +} + + +\begin{document} +\mode +\input{contents.tex} +\mode* + +\begin{frame}[allowframebreaks] + \printbibliography +\end{frame} +\end{document} From 25107ee134a0034d86b43d2627624ce40123bb3a Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 12 May 2025 22:20:52 +0200 Subject: [PATCH 45/53] Fixes bug that prevents compiling seminar.tex --- modules/05-scientificity/seminar.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/05-scientificity/seminar.tex b/modules/05-scientificity/seminar.tex index 18ef3b9..d707929 100644 --- a/modules/05-scientificity/seminar.tex +++ b/modules/05-scientificity/seminar.tex @@ -12,7 +12,7 @@ KTH EECS } -\end{block}\end{frame}\begin{frame} +\begin{frame} \maketitle \end{frame} From 83abf414eed991fcec565ac148bcffa944b42af7 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 12 May 2025 22:21:24 +0200 Subject: [PATCH 46/53] Adds discussion for {SoKScienceOfSecurity} paper --- modules/05-scientificity/seminar.tex | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/modules/05-scientificity/seminar.tex b/modules/05-scientificity/seminar.tex index d707929..d572a9f 100644 --- a/modules/05-scientificity/seminar.tex +++ b/modules/05-scientificity/seminar.tex @@ -24,6 +24,55 @@ \clearpage +\section{Security as a scientific pursuit} + +\Textcite{SoKScienceOfSecurity} discusses security as a scientific pursuit. + +\begin{frame} + \begin{exercise}[Time to vent] + Air your thoughts about the paper + \citetitle{SoKScienceOfSecurity}~\autocite{SoKScienceOfSecurity}. + \end{exercise} +\end{frame} + +\begin{frame} + \begin{question} + How did they\autocite{SoKScienceOfSecurity} know that this is so? + What can we actually say from these results? + \end{question} + + \begin{question} + The paper\autocite{SoKScienceOfSecurity} is from + \citeyear{SoKScienceOfSecurity}. + How well can we repeat this study to see what the state is today? + \end{question} +\end{frame} + +\begin{frame} + \begin{question} + What can empirical experiments contribute to security? + \end{question} + + \begin{question} + What can deductive reasoning contribute to security? + \end{question} + + \begin{question} + What can quantitative observations contribute to security? + \end{question} + + \begin{question} + What can qualitative observations contribute to security? + \end{question} +\end{frame} + +\begin{frame} + \begin{remark}[Final take-away] + Look for \enquote{the full version of the paper}! + \end{remark} +\end{frame} + + \section{Some cases} \begin{frame}\begin{block}{Passwords} From 269522bb5f39cd5195dcc59e877455ef00d95d17 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 12 May 2025 22:27:31 +0200 Subject: [PATCH 47/53] Emphasizes the Bloomish verbs in the learning objectives --- modules/00-intro/objectives.tex | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/00-intro/objectives.tex b/modules/00-intro/objectives.tex index 2209d27..495c430 100644 --- a/modules/00-intro/objectives.tex +++ b/modules/00-intro/objectives.tex @@ -7,22 +7,22 @@ }} \newLO{\LOrelate}{LOrelate} -{relate the different parts of scientific method, how they relate to one +{\emph{relate} the different parts of scientific method, how they relate to one another, contribute and not contribute to scientificity in security} \newLO{\LOevaluate}{LOevaluate} -{assess, analyse, and discuss the quality in, and ethical aspects of, knowledge -generation related to digital systems and in particular the security of these -systems} +{\emph{assess, analyse, and discuss} the quality in, and ethical aspects of, +knowledge generation related to digital systems and in particular the security +of these systems} \newLO{\LOapply}{LOapply} -{apply scientific methodology to show how to answer issues in the cybersecurity -field} +{\emph{apply} scientific methodology to show how to answer issues in the +cybersecurity field} \newLO{\LOplan}{LOplan} -{plan and carry out assignments within given time frames and available +{\emph{plan and carry out} assignments within given time frames and available resources} \newLO{\LOcomm}{LOcomm} -{write short, clear and arguing texts based on own analysis as well as given -material} +{\emph{write short, clear and arguing} texts based on own analysis as well as +given material} From 6a6bad20b43b89f2661466869b59785701a6f796 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Tue, 13 May 2025 15:59:19 +0200 Subject: [PATCH 48/53] More discussion questions to 05-scientificity Also adds timing for different activities. --- modules/05-scientificity/seminar.tex | 331 ++++++++++++++++++++------- 1 file changed, 243 insertions(+), 88 deletions(-) diff --git a/modules/05-scientificity/seminar.tex b/modules/05-scientificity/seminar.tex index d572a9f..b563edc 100644 --- a/modules/05-scientificity/seminar.tex +++ b/modules/05-scientificity/seminar.tex @@ -33,6 +33,10 @@ \section{Security as a scientific pursuit} Air your thoughts about the paper \citetitle{SoKScienceOfSecurity}~\autocite{SoKScienceOfSecurity}. \end{exercise} + + \begin{center} + \(<10\) minutes + \end{center} \end{frame} \begin{frame} @@ -46,6 +50,10 @@ \section{Security as a scientific pursuit} \citeyear{SoKScienceOfSecurity}. How well can we repeat this study to see what the state is today? \end{question} + + \begin{center} + \(<10\) minutes + \end{center} \end{frame} \begin{frame} @@ -64,101 +72,248 @@ \section{Security as a scientific pursuit} \begin{question} What can qualitative observations contribute to security? \end{question} + + \begin{center} + 5 minutes + \end{center} \end{frame} \begin{frame} \begin{remark}[Final take-away] - Look for \enquote{the full version of the paper}! + Always look for \enquote{the full version of the paper}! \end{remark} \end{frame} \section{Some cases} -\begin{frame}\begin{block}{Passwords} -To do password-based authentication, we're taught that we should salt -and hash the passwords. The user submits the password to the server, -the server adds a 128-bit salt (random number) and hashes the password -using SHA256, then hashes the hash, and hashes that hash, and so on for 1000 -times. That final hash is used to check if it's the same as the one stored. If -so, the user is accepted. Is this password-based authentication scheme secure? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Programming in not-C} -When we write programs, we should avoid languages like C or C++. (This is even -suggested by some US government agencies.) It's better to use a language like -Rust, which has built-in memory safety. Writing programs in Rust will result in -fewer security vulnerabilities in the programs and will thus be more secure. Is -this really true? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Adding features} -The Bank has used the same back-end software for 50 years (written in COBOL). -This software works and manages the Bank's accounts. Previously the Bank's -staff interacted with the software, e.g. to tranfer money between accounts. - -The Bank hired FutureSoftware to add a web-based front-end so that the -customers can interact with the software directly. That way customers can -transfer money between accounts without the need for Bank staff to do it for -them. (They wrote the software in Python.) - -The Bank then asked VETCYB consultants to evaluate if this is secure. How would -go do it? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Mandatory Access Control (MAC)} -The implementation of Mandatory Access Control (MAC) mechanisms, such -as the Bell-LaPadula Model, is considered crucial in environments that -demand high levels of security and confidentiality. Organizations that -handle sensitive or classified information must ensure that data access -is strictly regulated. MAC models achieve this by enforcing control -policies that limit access based on user clearance levels. Does this work? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Multi-Factor Authentication (MFA)} -Multi-Factor Authentication (MFA) is promoted as an effective way to enhance -security. By requiring users to provide two or more verification factors before -granting access, MFA adds an additional layer of protection beyond just the -password. The methods of implementing MFA varies; such as SMS, email, or -authenticator apps. Is this secure? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Firewalls} -Firewalls are a fundamental component of network security that are -taught in introductory courses. They act as barriers between trusted and -untrusted networks by controlling incoming and outgoing network traffic -based on predetermined security rules. Firewalls can prevent -unauthorized access and attacks. Is this true? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Social Engineering Awareness Training} -Security courses often emphasize the importance of educating employees -about social engineering attacks. The training aims to help employees -recognize and avoid common tactics used in attacks, such as phishing. -Is this secure? How effective, if at all, is such training in practice at -preventing social engineering breaches over time? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Encrypt Data-at-Rest} -One common security practice is encrypting data-at-rest to protect -sensitive information stored on devices or servers. By encrypting the -data, unauthorized users are prevented from accessing it without the -appropriate decryption key. Is this secure? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Regular Security Updates} -It is standard advice to regularly update software to stay protected -against newly discovered vulnerabilities. Updates often include patches -for security flaws that could be exploited by attackers. Does this contribute -to increased security? -\end{block}\end{frame} - -\begin{frame}\begin{block}{Penetration Testing (Pentesting)} -Penetration testing, commonly referred to as pentesting, is a proactive -approach to evaluating the security of a computer system, network, -or application by simulating an attack from malicious outsiders and -insiders. Pentesting can help identify vulnerabilities before attackers -exploit them. A comprehensive pentest involves several stages, including -planning, reconnaissance, scanning, exploitation, and reporting. After a -successful pentest the system will be secure. Is this true? -\end{block}\end{frame} +\begin{frame}[fragile] + \begin{block}{The cases} + \begin{itemize} + \item Passwords + \item Programming in not-C + \item Adding features + \item Mandatory Access Control (MAC) + \item Multi-Factor Authentication (MFA) + \item Firewalls + \item Social Engineering Awareness Training + \item Encrypt Data-at-Rest + \item Regular Security Updates + \item Penetration Testing (Pentesting) + \end{itemize} + \end{block} +\end{frame} + +\begin{frame}[fragile] + \begin{exercise}[Work out cases] + \begin{itemize} + \item Join the breakout room of your favourite case. + \item Work out the \emph{methodology} for \emph{how to know}. + \hfill 15 minutes% erase the space, otherwise these will be uneven + \begin{itemize} + \item Analyse and evaluate your different approaches. + \item Try to settle on one. + \end{itemize} + \item Take a break. + \hfill 10 minutes% + \item Then you'll summarize in whole class. + \hfill 50 minutes% + \end{itemize} + \end{exercise} + + \begin{question}[To answer in class] + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if a solution + is correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Passwords} + To do password-based authentication, we're taught that we should salt + and hash the passwords. The user submits the password to the server, + the server adds a 128-bit salt (random number) and hashes the password + using SHA256, then hashes the hash, and hashes that hash, and so on for 1000 + times. That final hash is used to check if it's the same as the one stored. If + so, the user is accepted. Is this password-based authentication scheme secure? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Programming in not-C} + When we write programs, we should avoid languages like C or C++. (This is even + suggested by some US government agencies.) It's better to use a language like + Rust, which has built-in memory safety. Writing programs in Rust will result in + fewer security vulnerabilities in the programs and will thus be more secure. Is + this really true? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Adding features} + The Bank has used the same back-end software for 50 years (written in COBOL). + This software works and manages the Bank's accounts. Previously the Bank's + staff interacted with the software, e.g. to tranfer money between accounts. + + The Bank hired FutureSoftware to add a web-based front-end so that the + customers can interact with the software directly. That way customers can + transfer money between accounts without the need for Bank staff to do it for + them. (They wrote the software in Python.) + + The Bank then asked VETCYB consultants to evaluate if this is secure. How would + go do it? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Mandatory Access Control (MAC)} + The implementation of Mandatory Access Control (MAC) mechanisms, such + as the Bell-LaPadula Model, is considered crucial in environments that + demand high levels of security and confidentiality. Organizations that + handle sensitive or classified information must ensure that data access + is strictly regulated. MAC models achieve this by enforcing control + policies that limit access based on user clearance levels. Does this work? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Multi-Factor Authentication (MFA)} + Multi-Factor Authentication (MFA) is promoted as an effective way to enhance + security. By requiring users to provide two or more verification factors before + granting access, MFA adds an additional layer of protection beyond just the + password. The methods of implementing MFA varies; such as SMS, email, or + authenticator apps. Is this secure? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Firewalls} + Firewalls are a fundamental component of network security that are + taught in introductory courses. They act as barriers between trusted and + untrusted networks by controlling incoming and outgoing network traffic + based on predetermined security rules. Firewalls can prevent + unauthorized access and attacks. Is this true? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Social Engineering Awareness Training} + Security courses often emphasize the importance of educating employees + about social engineering attacks. The training aims to help employees + recognize and avoid common tactics used in attacks, such as phishing. + Is this secure? How effective, if at all, is such training in practice at + preventing social engineering breaches over time? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Encrypt Data-at-Rest} + One common security practice is encrypting data-at-rest to protect + sensitive information stored on devices or servers. By encrypting the + data, unauthorized users are prevented from accessing it without the + appropriate decryption key. Is this secure? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Regular Security Updates} + It is standard advice to regularly update software to stay protected + against newly discovered vulnerabilities. Updates often include patches + for security flaws that could be exploited by attackers. Does this contribute + to increased security? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} + +\begin{frame} + \begin{block}{Penetration Testing (Pentesting)} + Penetration testing, commonly referred to as pentesting, is a proactive + approach to evaluating the security of a computer system, network, + or application by simulating an attack from malicious outsiders and + insiders. Pentesting can help identify vulnerabilities before attackers + exploit them. A comprehensive pentest involves several stages, including + planning, reconnaissance, scanning, exploitation, and reporting. After a + successful pentest the system will be secure. Is this true? + \end{block} + + \begin{question} + \begin{itemize} + \item What did you conclude: how do you \emph{evaluate} if this is + correct? + \item What were the disagreements? + \end{itemize} + \end{question} +\end{frame} From 882444c7033196e50e4a88f854c28cae7013b646 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Fri, 16 May 2025 10:56:23 +0200 Subject: [PATCH 49/53] Adds missing .gitignore --- modules/04-quantqual/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 modules/04-quantqual/.gitignore diff --git a/modules/04-quantqual/.gitignore b/modules/04-quantqual/.gitignore new file mode 100644 index 0000000..85d632d --- /dev/null +++ b/modules/04-quantqual/.gitignore @@ -0,0 +1,4 @@ +notes.pdf +slides.pdf +objectives.tex +literature From cd58e8aca34bff941dd675468e2482a4756733aa Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Mon, 26 May 2025 08:20:46 +0200 Subject: [PATCH 50/53] Changes from sc to llm for interacting with the LLM --- adm/grading/.gitignore | 3 +- ...t => test-grade_reflections-err-first.txt} | 0 adm/grading/vetcyb-grading.sh.nw | 129 ++++++++++++------ 3 files changed, 87 insertions(+), 45 deletions(-) rename adm/grading/{test-grade_reflections-err.txt => test-grade_reflections-err-first.txt} (100%) diff --git a/adm/grading/.gitignore b/adm/grading/.gitignore index 9bf9c27..54d71cd 100644 --- a/adm/grading/.gitignore +++ b/adm/grading/.gitignore @@ -1,5 +1,6 @@ _minted-vetcyb-grading/ -test-* +test-grade_reflections.txt +test-grade_reflections-err.txt vetcyb-grading.out vetcyb-grading.pdf vetcyb-grading.sh diff --git a/adm/grading/test-grade_reflections-err.txt b/adm/grading/test-grade_reflections-err-first.txt similarity index 100% rename from adm/grading/test-grade_reflections-err.txt rename to adm/grading/test-grade_reflections-err-first.txt diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index 9d30ff9..b395996 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -899,14 +899,15 @@ local assignment=$(basename "${assignment_dir}") local submission="${assignment_dir}/metadata.md" local instruction="${reflections_dir}/${assignment}.md" local assessment=$(cat "${submission}" \ - | sc_cmd "${reflection_assessment_prompt}" \ - -c "${instruction}") + | llm_cmd "${instruction}") <>= reflection_assessment_prompt=" -Based on the instruction (provided as context), evaluate if the student has -made an honest effort. That is, the student attempted a relevant reflection -based on what was asked for in the instruction. If so, output 'Yes' and nothing -else. If not, ouput 'No' and a brief explanation. +Based on the instruction (provided as context), evaluate if +the student has made an honest effort. That is, the student +attempted a relevant reflection based on what was asked for +in the instruction. If so, output 'Yes' followed by some +feedback on how to improve. If not, ouput 'No' and a brief +explanation. " <>= if echo "${assessment}" | grep -qi "^Yes" @@ -928,31 +929,38 @@ And a corresponding submission may look like this: \subsection{Evaluating the reliability} We want to evaluate the reliability of the grading. -We'll do this by running the [[grade_reflections]] functions on all students -who has ungraded submissions. - -We've tried the following configurations for the [[sc]] command: -\inputminted[breaklines]{toml}{./prompts.toml} - -The default configuration gives unstable results. -When tested on [[essc@kth.se]], we get the following results. -(With a slightly different prompt than [[reflection_assessment_prompt]] -though.) -It rejects some reflections four out of ten times. -The [[4o]] configuration lowers the temperature to \(0.5\), this seems to give -more consistent results (accepts 20 out of 20). -The [[o1]] configuration is much slower, but also gives consistent results -(accepts 20 out of 20). - -The current prompt seems more stable across all configurations though. +We'll do this by running the [[grade_reflections]] functions on some select +students. + +In previous experiments, some of the models give unstable results. +The [[4o]] model with lowered temperature to \(0.5\) seems to give more +consistent results. +The [[o1]] model is much slower, but also seems to give consistent results. +But now we'll run a few more systematic tests. However, for some students, the [[o1]] model thinks that it didn't get a copy of the instruction---which it did. -So we'll default to the [[4o]] configuration. +So we'll default to the [[4o]] model. <>= -model="4o" +llm_model="4o" +llm_options="-o temperature 0.5" +llm_sys_prompt=" +You are a skilled scientist and teacher with a keen eye +for detail and an emphasis on readability. + +You have been tasked with acting as a smart version of the +cat unix program. You take text and a prompt in and write +text out. For that reason, it is of crucial importance to +just write the desired output. Do not under any circumstance +write any comment or thought as your output will be piped +into other programs. +" <>= -sc_cmd() { - sc "${model}" "${@}" +llm_cmd() { + llm prompt \ + -m "${llm_model}" \ + ${llm_options} \ + -s "${llm_sys_prompt}" \ + "${@}" } @ @@ -965,33 +973,58 @@ and be costly (but not more than a few euros). source vetcyb-grading.sh -#students=$(canvaslms users -sc vetcyb24p2) -students="user5@kth.se +course=vetcyb25p4 +#students=$(canvaslms users -sc ${course}) +students=" +user1@kth.se user2@kth.se -user4@kth.se user3@kth.se -user1@kth.se -user6@kth.se -user7@kth.se" +user4@kth.se +user5@kth.se +" rounds=5 test() { - echo "### sc" - echo "### sc" >&2 - model="default" + echo "### llm 4o" + echo "### llm 4o" >&2 + llm_model="4o" + llm_options="" + + <> + + echo "### sc 4o temp=0.5" + echo "### sc 4o temp=0.5" >&2 + llm_model="4o" + llm_temperature="0.5" + + <> + + echo "### llm o1" + echo "### llm o1" >&2 + llm_model="o1" + llm_options="" + + <> + + echo "### llm o3" + echo "### llm o3" >&2 + llm_model="o3" + llm_options="--no-stream" <> - echo "### sc 4o" - echo "### sc 4o" >&2 - model="4o" + echo "### llm o3-mini" + echo "### llm o3-mini" >&2 + llm_model="o3-mini" + llm_options="" <> - echo "### sc o1" - echo "### sc o1" >&2 - model="o1" + echo "### llm o4-mini" + echo "### llm o4-mini" >&2 + llm_model="o4-mini" + llm_options="" <> } @@ -1011,7 +1044,7 @@ for i in $(seq ${rounds}) do echo "##### $i" echo "##### $i" >&2 - grade_reflections vetcyb24p2 ${students} + grade_reflections ${course} ${students} done @ @@ -1022,11 +1055,17 @@ We want it to be stable, that is, to fail the same students in every round or accept them in every round. We want to avoid situations where the student might be accepted in one round and rejected in another. +\inputminted[breaklines]{text}{test-grade_reflections-err.txt} + + + +\appendix +\section{Results from the first experiment}\label{FirstExperiment} As we can see in the output, the [[4o]] model is stable. Particularly, the [[o1]] model seems very unstable as it sometimes thinks that it didn't get any copy of the instruction. -\inputminted[breaklines]{text}{test-grade_reflections-err.txt} +\inputminted[breaklines]{text}{test-grade_reflections-err-first.txt} Let's have a look at that reflection on statistics by user1. We see that it is rejected four out of five times by both [[default]] and @@ -1071,4 +1110,6 @@ for the different cases. \section{The complete code} \inputminted[numbers=left]{bash}{vetcyb-grading.sh} + + \end{document} From 65377e0e822ba876066a933954ae87c3b94bd53a Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 28 May 2025 13:04:44 +0200 Subject: [PATCH 51/53] Fix grading script: improve error handling and clean up test files - Updated Makefile clean target to also remove test artifacts related to reflection grading. - Enhanced vetcyb-grading.sh.nw: - Added checks for missing or empty metadata.md submissions and missing instructions. - Improved parameter handling (use of "$@" instead of "$*"). - Added minor formatting for canvaslms invocation for clarity. - Now outputs clear error messages if submission or instruction is missing, and continues gracefully. - Documentation changes: added cleveref package in LaTeX preamble. --- adm/grading/Makefile | 5 +++- adm/grading/vetcyb-grading.sh.nw | 40 ++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/adm/grading/Makefile b/adm/grading/Makefile index b0f39fb..3c91f61 100644 --- a/adm/grading/Makefile +++ b/adm/grading/Makefile @@ -24,7 +24,10 @@ test-grade-reflections.sh: vetcyb-grading.sh.nw vetcyb-grading.sh .PHONY: clean clean: ${RM} vetcyb-grading.pdf vetcyb-grading.sh - rm *.aux *.fdb_* *.fls *.log *.pdf *.tex + ${RM} *.aux *.fdb_* *.fls *.log *.pdf *.tex + ${RM} test-grade-reflections.sh + ${RM} test-grade_reflections.txt + ${RM} test-grade_reflections-err.txt INCLUDE_MAKEFILES=../../makefiles diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index b395996..5a854c2 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -15,6 +15,8 @@ %\DeclareUnicodeCharacter{2514}{\mbox{\kern.23em % \vrule height2.2exdepth-1.8ptwidth.4pt\vrule height2.2ptdepth-1.8ptwidth.23em}} +\usepackage{cleveref} + \author{Daniel Bosk} \title{Reporting grades for vetcyb courses} @@ -253,10 +255,11 @@ grade_course_participation() { done > "${passed}" if [ -s "${passed}" ] then - canvaslms grade -c "${course}" -a "${project_assignments_regex}" \ - -g P \ - -u "$(make_regex ${passed})" \ - -m "${participation_msg}" + canvaslms grade -c "${course}" \ + -a "${project_assignments_regex}" \ + -g P \ + -u "$(make_regex ${passed})" \ + -m "${participation_msg}" fi <> } @@ -715,7 +718,7 @@ grade_reflections "${course}" ${students} \ grade_reflections() { local course="${1}" shift - local students="$*" + local students="$@" <> <> <> @@ -757,8 +760,11 @@ local reflections_dir="/tmp/${course}.reflections.d" if [ ! -d "${reflections_dir}" ] then mkdir "${reflections_dir}" - canvaslms submission -c "${course}" -a "${reflection_assign_regex}" \ - -U -u "${students_regex}" -o "${reflections_dir}" + canvaslms submission -c "${course}" \ + -a "${reflection_assign_regex}" \ + -u "${students_regex}" \ + -o "${reflections_dir}" \ + -U fi @ @@ -896,9 +902,23 @@ Their attempt is in the [[metadata.md]] file. The instruction is in the root of the directory~[[reflections_dir]]. <>= local assignment=$(basename "${assignment_dir}") -local submission="${assignment_dir}/metadata.md" -local instruction="${reflections_dir}/${assignment}.md" -local assessment=$(cat "${submission}" \ +local submission="$(cat ${assignment_dir}/metadata.md)" +if [ $? -ne 0 ] +then + echo "Couldn't find metadata.md for ${course} ${student} ${assignment}" >&2 + continue +elif [ -z "${submission}" ] +then + echo "No submission for ${course} ${student} ${assignment}" >&2 + continue +fi +local instruction="$(cat ${reflections_dir}/${assignment}.md)" +if [ -z "${instruction}" ] +then + echo "No instruction for ${course} ${assignment}" >&2 + continue +fi +local assessment=$(echo "${submission}" \ | llm_cmd "${instruction}") <>= reflection_assessment_prompt=" From 75b07057ae7dc810c20eae281ca5c6e4ef6e1994 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Wed, 28 May 2025 13:23:47 +0200 Subject: [PATCH 52/53] Refactor reflection grading script to use llm package instead of Smartcat; improve logging and clarify prompt instructions - Replaced references to Smartcat with the llm package/command for LLM-based reflection grading. - Refactored helper function llm_cmd to use array syntax for llm_options for better flexibility. - Standardized logging: echo course/student/assignment status; improved failure reporting. - Fixed `.nw` fragment ordering to avoid redundant helper function definitions and misplaced force-download logic. - Clarified and updated the system prompt and assignment grading comments for readability and maintainability. - Reduced test rounds from 5 to 3 for more efficient test runs. - Ensured test output is streamed both to files and console using tee for easier review of results. - Various minor wording edits and improvements to code clarity in test scripts and instructions. --- adm/grading/vetcyb-grading.sh.nw | 83 +++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index 5a854c2..14ba039 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -870,8 +870,8 @@ local students_with_results=$(find "${reflections_dir}" \ | grep "@") @ -The idea is that we use Smartcat ([[sc]]) to ask GPT-4o to assess if the -submission is an honest attempt based on the instruction. +The idea is that we use the [[llm]] package (and command) to ask GPT-4o to +assess if the submission is an honest attempt based on the instruction. This means that for each student, we'll have to iterate through the assignments. @@ -929,14 +929,28 @@ in the instruction. If so, output 'Yes' followed by some feedback on how to improve. If not, ouput 'No' and a brief explanation. " +<>= +llm_cmd() { + llm prompt \ + -m ${llm_model} \ + "${llm_options[@]}" \ + -s "${llm_sys_prompt}" \ + -f <(echo "${1}") \ + --no-stream \ + "${reflection_assessment_prompt}" +} <>= if echo "${assessment}" | grep -qi "^Yes" then + echo "${course} ${student} ${assignment}: complete" canvaslms grade -c "${course}" -a "${assignment}" -u "${student}" -g complete else echo >&2 - echo "${course} ${student} ${assignment}: ${assessment}" >&2 + echo "${course} ${student} ${assignment}: NOT COMPLETE" >&2 + echo "${assessment}" >&2 + echo >&2 fi +echo >&2 @ An instruction might look like this: @@ -952,7 +966,8 @@ We want to evaluate the reliability of the grading. We'll do this by running the [[grade_reflections]] functions on some select students. -In previous experiments, some of the models give unstable results. +In previous experiments (\cref{FirstExperiment}), some of the models give +unstable results. The [[4o]] model with lowered temperature to \(0.5\) seems to give more consistent results. The [[o1]] model is much slower, but also seems to give consistent results. @@ -962,7 +977,7 @@ of the instruction---which it did. So we'll default to the [[4o]] model. <>= llm_model="4o" -llm_options="-o temperature 0.5" +llm_options=(-o temperature 0.5) llm_sys_prompt=" You are a skilled scientist and teacher with a keen eye for detail and an emphasis on readability. @@ -974,14 +989,6 @@ just write the desired output. Do not under any circumstance write any comment or thought as your output will be piped into other programs. " -<>= -llm_cmd() { - llm prompt \ - -m "${llm_model}" \ - ${llm_options} \ - -s "${llm_sys_prompt}" \ - "${@}" -} @ To do our evaluations, we used the following script. @@ -1003,58 +1010,66 @@ user4@kth.se user5@kth.se " -rounds=5 +rounds=3 test() { - echo "### llm 4o" - echo "### llm 4o" >&2 + <> + + echo "### llm 4o temp=0.5" + echo "### llm 4o temp=0.5" >&2 llm_model="4o" - llm_options="" + llm_options=(-o temperature 0.5) <> - echo "### sc 4o temp=0.5" - echo "### sc 4o temp=0.5" >&2 + echo "### llm 4o" + echo "### llm 4o" >&2 llm_model="4o" - llm_temperature="0.5" + unset llm_options <> echo "### llm o1" echo "### llm o1" >&2 llm_model="o1" - llm_options="" + unset llm_options <> echo "### llm o3" echo "### llm o3" >&2 llm_model="o3" - llm_options="--no-stream" + unset llm_options <> echo "### llm o3-mini" echo "### llm o3-mini" >&2 llm_model="o3-mini" - llm_options="" + unset llm_options <> echo "### llm o4-mini" echo "### llm o4-mini" >&2 llm_model="o4-mini" - llm_options="" + unset llm_options <> } @ -When we run the tests, we want to filter stdout and stderr to separate files. -We're mostly interested in stderr, since that's where the fails appear. -And the fails are fewer than the passes. -<>= -test > test-grade_reflections.txt 2> test-grade_reflections-err.txt +We need to force the download, in case we have already graded the students. +So this will be the same as above, except that we don't use the [[-U]] flag. +<>= +<> +local reflections_dir="/tmp/${course}.reflections.d" +<> +rm -Rf "${reflections_dir}" +canvaslms submission -c "${course}" \ + -a "${reflection_assign_regex}" \ + -u "${students_regex}" \ + -o "${reflections_dir}" @ When running the tests, we want to output the headers to both stdout and @@ -1068,6 +1083,15 @@ do done @ +When we run the tests, we want to filter stdout and stderr to separate files. +We're mostly interested in stderr, since that's where the fails appear. +And the fails are fewer than the passes. +<>= +test 1> >(tee test-grade_reflections.txt >&1) \ + 2> >(tee test-grade_reflections-err.txt >&1) \ + | tee test-grade_reflections-all.txt +@ + Let's have a look at the output. What's interesting to look at is the comments for when the model fails a student, particularly how it compares across different rounds. @@ -1080,6 +1104,7 @@ and rejected in another. \appendix + \section{Results from the first experiment}\label{FirstExperiment} As we can see in the output, the [[4o]] model is stable. From 3878ebc53272f47bc20886108e0458826fa5bfb9 Mon Sep 17 00:00:00 2001 From: Daniel Bosk Date: Thu, 29 May 2025 20:08:52 +0200 Subject: [PATCH 53/53] Adds 4.1 model --- adm/grading/vetcyb-grading.sh.nw | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/adm/grading/vetcyb-grading.sh.nw b/adm/grading/vetcyb-grading.sh.nw index 14ba039..63e7681 100644 --- a/adm/grading/vetcyb-grading.sh.nw +++ b/adm/grading/vetcyb-grading.sh.nw @@ -970,13 +970,15 @@ In previous experiments (\cref{FirstExperiment}), some of the models give unstable results. The [[4o]] model with lowered temperature to \(0.5\) seems to give more consistent results. -The [[o1]] model is much slower, but also seems to give consistent results. +The [[o1]] (o1-preview at the time) model is much slower, but also seems to +give consistent results. But now we'll run a few more systematic tests. However, for some students, the [[o1]] model thinks that it didn't get a copy of the instruction---which it did. -So we'll default to the [[4o]] model. +So we'll default to the [[4o]] class of models, using the latest (as of May +2025) version [[4.1]]. <>= -llm_model="4o" +llm_model="4.1" llm_options=(-o temperature 0.5) llm_sys_prompt=" You are a skilled scientist and teacher with a keen eye @@ -1022,13 +1024,20 @@ test() { <> - echo "### llm 4o" - echo "### llm 4o" >&2 - llm_model="4o" + echo "### llm 4.1" + echo "### llm 4.1" >&2 + llm_model="4.1" unset llm_options <> + echo "### llm 4.1 temp=0.5" + echo "### llm 4.1 temp=0.5" >&2 + llm_model="4.1" + llm_options=(-o temperature 0.5) + + <> + echo "### llm o1" echo "### llm o1" >&2 llm_model="o1"