%% SPDX-License-Identifier: CC0-1.0 %% %% Copyright (C) 2024, 2025 Woj. Kosior \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{\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