%% SPDX-License-Identifier: CC0-1.0
%%
%% Copyright (C) 2024, 2025 Woj. Kosior <koszko@koszko.org>
\documentclass[
hyperref={
hyperfootnotes = false,
pdftex,
colorlinks = true,
linkbordercolor = .,
linkcolor = [rgb]{0,0.2,0},
urlcolor = [rgb]{0,0,0.5},
citecolor = [rgb]{0.5,0,0}
}
]{beamer}
\usepackage{polski}
\usepackage{pgfpages}
\usetheme{Rochester}
\usecolortheme{seagull}
\usepackage{calc}
\usepackage{svg}
\usepackage{graphicx}
\usepackage[export]{adjustbox}
\usepackage{verbatimbox}
\usepackage{listings}
\usepackage{seqsplit}
\usepackage{soul}
\usepackage{substr}
\usepackage{colortbl}
\usepackage{booktabs,tabularx}
\usepackage[normalem]{ulem}
\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{footline}[frame number]
\IfSubStringInString{\detokenize{-handouts}}{\jobname}{
\mode<handout>{\setbeamercolor{background canvas}{bg=black!10}}
\pgfpagesuselayout{2 on 1}[letterpaper,border shrink=5mm]
}{}
\IfSubStringInString{\detokenize{-onlynotes}}{\jobname}{
\setbeameroption{show only notes}
}{}
\IfSubStringInString{\detokenize{-onlyslides}}{\jobname}{
% nothing
}{}
\IfSubStringInString{\detokenize{-pympress}}{\jobname}{
\usepackage{pgfpages}
\setbeameroption{show notes on second screen}
}{}
\IfSubStringInString{\detokenize{-slidesandnotes}}{\jobname}{
\setbeameroption{show notes}
}{}
% https://tex.stackexchange.com/questions/249040/scale-column-of-a-table-in-percentage-of-textwidth#answer-249043
\newdimen\netTableWidth
\newcommand{\columnsCount}[1]{%
\netTableWidth=\dimexpr
\linewidth
- #1\tabcolsep - #1\tabcolsep
- #1\arrayrulewidth -2\arrayrulewidth
\relax%
}
\usepackage{tikzpagenodes}
\usetikzlibrary{calc}
\tikzset{frameoverlay/.style={overlay,remember picture,shift={(current page text area.south west)},
x={($(current page text area.south east)-(current page text area.south west)$)},
y={($(current page text area.north west)-(current page text area.south west)$)},nodes={anchor=south west}}}
\newcommand{\logosInHeading}{
\begin{tikzpicture}[frameoverlay]
\path
(-0.079,1.005) node{
\includegraphics[
height=0.5in
]{Logo-WIET-2021.png}
}
(0.835,0.966) node{
\includegraphics[
height=0.7in
]{agh_idub_pl_cmyk.pdf}
};
\end{tikzpicture}
}
\makeatletter
\long\def\beamer@@frametitle[#1]#2{%
\beamer@ifempty{#2}{}{%
\gdef\insertframetitle{\centering{#2\ifnum\beamer@autobreakcount>0
\relax{}\space\usebeamertemplate*{frametitle continuation}\fi}}%
\gdef\beamer@frametitle{#2}%
\gdef\beamer@shortframetitle{#1}%
\logosInHeading{}%
}%
}
\makeatother
\newcommand{\svgframe}[2]{%
\begin{frame}{#1}
\includesvg[
width=\linewidth,
inkscapelatex=false
]{#2}
\begin{center}
\textit{(na podstawie opracowania własnego)}
\end{center}
\end{frame}%
}
\newcommand{\puttitle}{Potwierdzanie autentyczności oprogramowania poprzez
powtarzalność kompilacji}
\newcommand{\putauthorname}{Wojciech Kosior}
\hypersetup{
pdftitle = {\puttitle},
pdfauthor = {\putauthorname}
}
\title{\puttitle{}}
\date{}
\begin{document}
\begin{frame}{}
\titlepage
\vspace{-0.5in}
\renewcommand{\arraystretch}{\baselinestretch}
\columnsCount{2}
{\small
\begin{tabular}{ m{.35\netTableWidth} m{.65\netTableWidth} }
Autor: & \putauthorname \\
Opiekun pracy: & dr hab.\ inż.\ Piotr Pacyna, prof.\ AGH \\
Wydział: & Informatyki, Elektroniki i Telekomunikacji
\end{tabular}
}
\renewcommand{\arraystretch}{1.5}
\vspace{2in}
\begin{tikzpicture}[frameoverlay]
\path
(0.22,0.027) node{
\includegraphics[
height=0.85in
]{Logo-WIET-2021.png}
}
(0.5,0.005) node{
\includegraphics[
height=1.05in
]{agh_idub_pl_cmyk.pdf}
};
\end{tikzpicture}
\end{frame}
\note{
\begin{itemize}
\item nazywam się\ldots{}
\item opiekun to\ldots{}
\item praca o: zabezpieczenie łańcucha dostaw oprogramowania
\end{itemize}
}
\svgframe{Złożoność procesu kompilacji}{build-process-overview.svg}
\note{
\begin{itemize}
\item kompilacja: szeroko rozumiana (pakiety, ``budowanie'')
\item slajd: przykład
\item kompilacja do norm dystrybucji: nawet setki lini skryptu-przepisu na
pakiet
\end{itemize}
}
\begin{frame}{Najważniejsze pojęcia}
\begin{itemize}
\item powtarzalność \textit{(reproducibility)}
\item hermetyczność
\item bootstrapowalność
\end{itemize}
\vspace{0.3in}
\includesvg[
width=\linewidth,
inkscapelatex=false
]{boxes.svg}
\end{frame}
\note{
\begin{itemize}
\item przy każdym powtórzeniu tej samej kompilacji -- bit-do-bitu identyczny
wynik
\item wykorzystanie wielokrotnej kompilacji
\begin{itemize}
\item różne infrastruktury/organizacje
\item utrudnione zanieczyszczenie oprogramowania złośliwym kodem w procesie
kompilacji
\end{itemize}
\item warunek konieczny niewystarczający powtarzalności: niezależność od
zmiennych
\begin{itemize}
\item zainstalowane programy, zasoby sieciowe
\item stąd: izolowanie procesu na poziomie sieci i systemu plików
\end{itemize}
\item pakiet samozależny: pakowanie
\end{itemize}
}
\begin{frame}{Cel pracy}
\begin{itemize}
\item \sout{zapewnić deterministyczne działanie kompilatorów i powiązanych
narzędzi}
\item \textbf{zapewnić niezmienność elementów na wejściu procesu
(re)kompilacji}
\item \textbf{uniknąć pojedynczych punktów podatności \textit{(single points
of failure)} w procesie}
\end{itemize}
\end{frame}
\note{
\begin{itemize}
\item usuwanie źródeł niepowtarzalności w procesie kompilacji
\begin{itemize}
\item dotychczasowe prace innych osób
\item \textbf{nie} przedmiot tych badań
\end{itemize}
\item zamiast tego
\begin{itemize}
\item konkretne wersje zależności, narzędzi i (meta)danych w 1. kompilacji
\begin{itemize}
\item zagwarantowanie, że można je zidentyfikować
\item zagwarantowanie, że przy powtórzeniu kompilacji nie zostaną użyte
inne wersje
\end{itemize}
\item proces rozwiązywania zależności
\begin{itemize}
\item często wykonywany automatycznie
\item weryfikowanie powtarzalności jego wyniku
\end{itemize}
\end{itemize}
\end{itemize}
}
\begin{frame}{Stan dotychczasowy}
\vspace{-0.2in}
\begin{center}
Kompilacja pakietów
\end{center}
\renewcommand{\arraystretch}{\baselinestretch}
\columnsCount{2}
{\small
\begin{tabular}{
>{\centering\arraybackslash}m{.5\netTableWidth}
>{\centering\arraybackslash}m{.5\netTableWidth}
}
powtarzalność monitorowana & powtórzenie utrudnione
\end{tabular}
}
\vspace{-0.3in}
\includesvg[
width=\linewidth,
inkscapelatex=false
]{ecosystems-state.svg}
\begin{center}
\textit{(na podstawie opracowania własnego, z wykorzystaniem logotypów
istniejących projektów)}
\end{center}
\end{frame}
\note{
\begin{itemize}
\item praca skupiona na: repozytoria z tysiącami pakietów
\item Debian, GNU Guix
\begin{itemize}
\item state of the art
\item zasady działania opisane w pracy
\end{itemize}
\item repozytoria specyficzne dla konkretnych ekosystemów
\begin{itemize}
\item różna higiena
\item zautomatyzowanie rekompilacji = wyzwanie
\end{itemize}
\end{itemize}
}
\begin{frame}{Postęp pakowania w 2025}
\renewcommand{\arraystretch}{1.5}
\columnsCount{4}
\begin{tabular}{
>{\raggedright\arraybackslash}p{.43\netTableWidth}
>{\raggedright\arraybackslash}p{.19\netTableWidth}
>{\raggedright\arraybackslash}p{.19\netTableWidth}
>{\raggedright\arraybackslash}p{.19\netTableWidth}
}
\rowcolor{gray!40}
\textit{\textbf{ekosystem}} &
\textbf{PyPI} &
\textbf{npm} &
\textbf{crates} \\
\textit{\textbf{pakiety w GNU Guix}} &
$3\,699$ &
$55$ &
$3\,704$ \\
\textit{\textbf{pakiety w Debianie}} &
$5\,312$ &
$998$ &
$1\,424$
\end{tabular}
\begin{center}
\textit{(na podstawie opracowania własnego)}
\end{center}
\end{frame}
\note{
\begin{itemize}
\item stwierdzono: powolne przedostawanie się oprogramowania npm do
reprodukowalnych dystrybucji
\item \textbf{opisane obszernie} w pracy przypuszczenia powodów: trudne
bootstrapowanie, niskie zainteresowanie taką formą pakietów, \textbf{duże
drzewa zależności}, \textbf{dopuszczanie zależności występujących w wielu
wersjach jednocześnie} (aka konfliktów)
\end{itemize}
}
\begin{frame}{Ekosystem npm}
\includesvg[
width=\linewidth,
inkscapelatex=false
]{dependee_counts.svg}
\begin{center}
\textit{(na podstawie opracowania własnego)}
\end{center}
\end{frame}
\note{
\begin{itemize}
\item w pracy opisany dokładnie ekosystem npm (rodzaje zależności itd.)
\item popularność = ile innych pakietów używa danego pakietu
\item badanie Goswami'ego z 2019, porównanie, analizowane zmiany
\item ogółem olbrzymie drzewa zależności, po ponad 1000 pakietów do projektu
\item pytanie: jaka część zależności faktycznie potrzebna do kompilacji
pakietu?
\end{itemize}
}
\begin{frame}{Problem rozwiązywania zależności}
Dotychczasowe i zaproponowane podejścia do powtarzalności (``paradygmaty'')
\vspace{0.5\baselineskip}
\begin{itemize}
\setcounter{enumi}{-1}
\itemsep0.5\baselineskip
\item Brak powtarzalności \pause
\item Zależności ustalone, brak kroku rozwiązywania zależności (GNU Guix)
\item Powtarzalność kompilacji \textbf{nieobejmująca rozwiązywania
zależności} (pliki lockfile, Debian) \pause
\item Rozwiązywanie zależności powtarzane w ramach rekompilacji (nowe!)
\end{itemize}
\note<2>{
\begin{itemize}
\item klasyczne podejście (paradygmat 2) -- określić zestaw zależności,
udostępnić je dla procesu kompilacji pakietu, wykonać proces, najlepiej w
izolacji
\begin{itemize}
\item powtórzenia w oparciu o określone raz drzewo zależności
\item samo budowanie drzewa -- generalnie nie powtarzalne
\end{itemize}
\item Guix, Nix: przepis na pakiet = zdefiniowane wszystko
\end{itemize}
}
\note<3>{
\begin{itemize}
\item zależności nieustalone a priori kompilacji
\item odpowiednie mechanizmy $\rightarrow{}$ gwarantowanie dostępności i
niezmienności metadanych \textbf{potencjalnych} zależności
\item budowanie drzewa zależności -- powtarzalne
\end{itemize}
}
\end{frame}
\begin{frame}{Najważniejsze pytania badawcze}
\begin{itemize}
\itemsep0.5\baselineskip
\item Jakie są typowe rozmiary drzew zależności projektów npm?
\item W jakim stopniu można je zredukować?
\item Czy rozmiary drzew zależności i zależności w wielu wersjach jednocześnie
stanowią główną przeszkodę w pakowaniu oprogramowania npm?
\end{itemize}
\end{frame}
\note{
\begin{itemize}
\item interesują: drzewa zależności \textbf{kompilacji}
\item dodatkowo: eliminacja zależności bezpośrednich, pośrednich, czy
bezpośrednich+pośrednich?
\item i.e., opisane wcześniej przypuszczenia głównych problemów – czy słuszne?
\end{itemize}
}
\begin{frame}{Eksperyment}
\begin{itemize}
\itemsep0.5\baselineskip
\item Próba rekompilacji najpopularniejszych pakietów z npm Registry
\item Eliminacja zbędnych zależności
\item Określenie minimalnych drzew zależności
\end{itemize}
\vspace{0.3in}
\begin{center}
\includesvg[
width=0.2\linewidth,
inkscapelatex=false
]{construction-crane.svg}
\end{center}
\end{frame}
\note{
\begin{itemize}
\item ok. 300 najpopularniejszych pakietów z npm Registry
\item sprawdzenie: czy rekompilacja wg ``standardowej'' procedury możliwa
\item czy usunięcie danej zależności = błąd kompilacji?
\item rekompilacja wielokrotna każdego pakietu
\end{itemize}
}
\begin{frame}{Statusy pakietów}
\vspace{-0.25\baselineskip}
\begin{center}
\includesvg[
width=0.95\linewidth,
inkscapelatex=false
]{status-counts.svg}
\end{center}
\begin{center}
\textit{(na podstawie opracowania własnego)}
\end{center}
\end{frame}
\note{
\begin{itemize}
\item konwencjonalne procedury -- automatyczne zrekompilowanie 10-20\% pakietów
\item porównywalnie, jak u Goswami'ego w 2019
\item pakiety zrekompilowane z powodzeniem: dalsze testowanie
\end{itemize}
}
\begin{frame}{Rozmiary drzew zależności}
\includesvg[
width=\linewidth,
inkscapelatex=false
]{tree-size-stats-no-bc.svg}
\vspace{-0.5\baselineskip}
\begin{center}
\textit{(na podstawie opracowania własnego)}
\end{center}
\end{frame}
\note{
\begin{itemize}
\item wykres: pierwotne i zredukowane drzewa zależności pakietów
\item porównanie: pakiety, które mają odpowiedniki w Debianie i pozostałe
\item brak spodziewanego związku ``rozmiar drzewa zależności : obecność w
Debianie''
\item nieusuwalne konflikty zależności -- również brak spodziewanego związku z
obecnością w Debianie
\end{itemize}
}
\begin{frame}{Wnioski}
\begin{itemize}
\itemsep0.5\baselineskip
\item Główne przeszkody w pakowaniu oprogramowania npm inne od przypuszczanych
\pause
\item Dotychczasowe paradygmaty najprawdopodobniej wystarczające do
zastosowania powtarzalności kompilacji do oprogramowania npm\ldots{} \pause
\item \ldots{}za to powtarzalnie kompilowane pakiety w dystrybucjach --
nieadekwatne do potrzeb developerów \pause
\item Poziom bezpieczeństwa wynikający z powtarzalności kompilacji trudny
do osiągnięcia inaczej\ldots{} \pause
\item \ldots{}ale rozpowszechnienie tego środka wymaga kompatybilności z
dominującymi narzędziami i formatami pakietów
\end{itemize}
\note<1>{
\begin{itemize}
\item główne przeszkody: nie wielkość drzew, nie konflikty zależności
\item raczej bootstrapowalność, marne zainteresowanie takimi pakietami w
formacie Guix'a
\end{itemize}
}
\note<2>{
\begin{itemize}
\item nowy paradygmat niekoniecznie potrzebny
\item Guix: trudna bootstrapowalność, ale też OK
\item Guix/Nix: brak SPOF jak w Debianie
\end{itemize}
}
\note<3>{
\begin{itemize}
\item zwykła, prosta komenda ``npm install''
\item nie pożeniona z pakietami Guix
\end{itemize}
}
\note<4>{
\begin{itemize}
\item SolarWinds 2020
\item pojednycza, niby dobrze zabezpieczona infra
\end{itemize}
}
\note<5>{
\begin{itemize}
\item Święty Graal: repozytorium z powtarzalnie zkompilowanymi pakietami
\textbf{w formacie npm}
\item analogicznie dla PyPI itd.
\end{itemize}
}
\end{frame}
\begin{frame}{Dziękuję za uwagę!}
Grafiki podmiotów trzecich wykorzystane w prezentacji:
\vspace{\baselineskip}
{\small
\columnsCount{3}
\begin{tabular}{
>{\raggedright\arraybackslash}p{.34\netTableWidth}
>{\raggedright\arraybackslash}p{.20\netTableWidth}
>{\raggedright\arraybackslash}p{.46\netTableWidth}
}
\href{https://en.wikipedia.org/wiki/File:Debian-OpenLogo.svg}{logo
Debian} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{Debian-OpenLogo.svg} &
%% -- Software in the Public Interest, Inc (na licencjach
%% \href{https://creativecommons.org/licenses/by-sa/3.0/legalcode.en}{CC BY-SA
%% 3.0 Unported} lub
%% \href{https://www.gnu.org/licenses/lgpl-3.0.html#license-text}{GNU LGPL
%% wersja 3} lub późniejsza)
\\
\href{https://en.wikipedia.org/wiki/File:Guix_logo.svg}{logo GNU Guix} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{Guix_logo.svg} &
%% --
%% Luis Felipe López Acevedo (na licencji
%% \href{https://creativecommons.org/licenses/by-sa/4.0/legalcode.en}{CC BY-SA
%% 4.0 International})
\\
\href{https://en.wikipedia.org/wiki/File:NixOS_logo.svg}{logo NixOS} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{NixOS_logo.svg} &
%% --
%% Tim Cuthbertson (na licencji
%% \href{https://creativecommons.org/licenses/by/4.0/legalcode.en}{CC BY 4.0
%% International})
\\
\href{https://en.wikipedia.org/wiki/File:Archlinux-logo-standard-version.svg}{logo
Arch Linux} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{Archlinux-logo-standard-version.svg} &
%% -- Judd Vinet, Aaron Griffin i Levente Polyák (na licencji GNU
%% GPL wersja 2 lub późniejsza)
\\
\href{https://en.wikipedia.org/wiki/File:Npm-logo.svg}{logo npm} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{Npm-logo.svg} &
%% -- npm, Inc.
\\
\href{https://en.wikipedia.org/wiki/File:PyPI_logo.svg}{logo PyPI} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{PyPI_logo.svg} &
%% -- Python Software Foundation (na licencji GNU GPL wersja 2 lub
%% późniejsza)
\\
\href{https://en.wikipedia.org/wiki/File:Rust_programming_language_black_logo.svg}{logo
Rust} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{Rust_programming_language_black_logo.svg} &
%% -- Rust Foundation (na licencji
%% \href{https://creativecommons.org/licenses/by/4.0/legalcode.en}{CC BY
%% 4.0 International})
\\
\href{https://en.wikipedia.org/wiki/File:Apache_Maven_logo.svg}{logo
Apache Maven} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{Apache_Maven_logo.svg} &
%% -- Apache Software Foundation (na licencji
%% \href{https://www.apache.org/licenses/LICENSE-2.0}{Apache 2.0})
\\
\href{https://seeklogo.com/vector-logo/272997/composer}{logo Composer} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{composer-seeklogo.svg} &
%% -- WizardCat (na licencji
%% \href{https://github.com/composer/composer/raw/main/LICENSE}{Expat})
\\
\href{https://openclipart.org/detail/202046/loupe-magnifer}{lupa} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{Loupe.svg} &
\href{https://openclipart.org/artist/spadassin}{openclipart.org/artist/spadassin}
\\
\href{https://openclipart.org/detail/3574/-by--3574}{kartonowe pudło} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{bogdanco_Simple_cardboard_box.svg} &
\href{https://openclipart.org/artist/bogdanco}{openclipart.org/artist/bogdanco}
\\
\href{https://openclipart.org/detail/168285/construction-crane}{żuraw
budowlany} &
\includesvg[
height=\baselineskip,
inkscapelatex=false
]{construction-crane.svg} &
\href{https://openclipart.org/artist/Markacio}{openclipart.org/artist/Markacio}
\end{tabular}
}
\end{frame}
\end{document}
% https://publicdomainvectors.org/en/free-clipart/Vector-image-of-closed-cardboard-box/19548.html
% https://publicdomainvectors.org/en/free-clipart/Loupe-magnifer/73563.html