{"id":22187,"date":"2022-02-25T15:02:18","date_gmt":"2022-02-25T14:02:18","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=22187"},"modified":"2023-06-18T17:48:20","modified_gmt":"2023-06-18T15:48:20","slug":"software-dependencies-die-gefahr-aus-der-tiefe","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/","title":{"rendered":"Software Dependencies &#8211; Die Gefahr aus der Tiefe"},"content":{"rendered":"\n<p>&#8220;Unbekannte infiltrieren Paketmanager npm und verseuchen Tools mit Schadcode&#8221; hei\u00dft es am 08.11.2021 auf <a href=\"https:\/\/www.heise.de\/news\/Unbekannte-infiltrieren-Paketmanager-npm-und-verseuchen-Tools-mit-Schadcode-6260153.html\" title=\"heise online\">heise online<\/a>. Die Nutzeraccounts der Maintainer von <a href=\"https:\/\/github.com\/advisories\/GHSA-73qr-pfmq-6rp8\" title=\"coa \">coa<\/a> und <a href=\"https:\/\/github.com\/advisories\/GHSA-g2q5-5433-rhrf\" title=\"rc \">rc<\/a> wurden gehackt und neue Versionen dieser Pakete hochgeladen (inklusive Malware). Zwar denken sich bestimmt viele bei coa und rc: &#8220;Aha toll&#8221;, aber sp\u00e4testens bei React oder Angular sollte man hellh\u00f6rig werden. Schlie\u00dflich werden diese JavaScript-Frameworks Millionenfach genutzt. Und wer jetzt richtig geraten hat, ahnt schon: Beide dieser Frameworks nutzen diese Bibliotheken auf die ein oder andere Weise. Dieser Blockartikel beschreibt die Risiken von Software-Dependencies in Produktivsystemen und Wege, damit umzugehen.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/github.com\/veged\/coa\/issues\/99#issuecomment-960928949\"><img loading=\"lazy\" decoding=\"async\" width=\"385\" height=\"489\" data-attachment-id=\"22818\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f.png\" data-orig-size=\"385,489\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f.png\" alt=\"\" class=\"wp-image-22818\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f.png 385w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f-236x300.png 236w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/a><figcaption>Karikatur eines Softwareprojekts (Quelle: <a href=\"https:\/\/github.com\/veged\/coa\/issues\/99#issuecomment-960928949\" title=\"GitHub\">GitHub<\/a>)<\/figcaption><\/figure><\/div>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Der-Fall-npm\">Der Fall npm<\/h2>\n\n\n\n<p class=\"has-text-align-justify has-black-color has-cyan-bluish-gray-background-color has-text-color has-background has-small-font-size\"><strong>Begriffserkl\u00e4rung:<\/strong> Dieser Artikel verwendet h\u00e4ufig die Begriffe Abh\u00e4ngigkeit\/Dependency, Bibliothek\/Library oder Paket\/Package. Diese Begriffe werden im Kontext des Artikels gleichbedeutend verwendet und bezeichnen externe Software-Bausteine, die f\u00fcr die Erstellung neuer Software verwendet werden.<\/p>\n\n\n\n<p>Wer schon einmal Software entwickelt hat, wei\u00df, wie undurchsichtig Software-Dependencies sind. Ich ben\u00f6tige Package A, Package A ben\u00f6tigt wiederum Package B, C und D und ehe wir uns versehen, haben wir das ganze Alphabet abgearbeitet und unser Programm kann gerade einmal &#8220;Hello World&#8221; auf der Kommandozeile ausgeben.<\/p>\n\n\n\n<p>Das folgende Bild zeigt die Dependencies und geschachtelten Dependencies einer neu erstellten React App und macht deutlich, dass es quasi unm\u00f6glich ist den \u00dcberblick \u00fcber alle verwendeten Pakete und deren Ersteller zu behalten (Jeder Punkt stellt eine Dependency dar; das eigentliche Projekt und seine Dependencies sind gelb bzw. wei\u00df hervorgehoben). <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"656\" data-attachment-id=\"22737\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/dependency-graph\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph.png\" data-orig-size=\"1405,900\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"dependency-graph\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph-1024x656.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph-1024x656.png\" alt=\"\" class=\"wp-image-22737\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph-1024x656.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph-300x192.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph-768x492.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/dependency-graph.png 1405w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption><a href=\"https:\/\/npm.anvaka.com\/#\/view\/2d\/https%253A%252F%252Fraw.githubusercontent.com%252FThisUsernameIsAllreadyTaken%252FJust-Create-React-App%252Fmain%252Fpackage.json\" title=\"Grafische Darstellung der Dependencies\">Grafische Darstellung der Dependencies<\/a> einer neu erstellten <a href=\"https:\/\/github.com\/ThisUsernameIsAllreadyTaken\/Just-Create-React-App\/\" title=\"React App\">React App<\/a>, erstellt mit <a href=\"https:\/\/github.com\/anvaka\/npmgraph.an\" title=\"npmgraph.an\">npmgraph.an<\/a><\/figcaption><\/figure>\n\n\n\n<p>Im Fall von coa und rc war ich einer der ersten, der von diesem Problem erfahren hat. Zuf\u00e4llig habe ich in diesen ca. 2h versucht ein neues React-Projekt mit <a href=\"https:\/\/create-react-app.dev\/\">create-react-app<\/a><a href=\"https:\/\/reactjs.org\/\"> <\/a>anzulegen. Die Antwort von React war:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">Error: Cannot find module &#039;\/Users\/...\/node_modules\/coa\/compile.js&#039;<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-justify has-black-color has-cyan-bluish-gray-background-color has-text-color has-background has-small-font-size\"><strong>Begriffserkl\u00e4rung:<\/strong> Bei <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a> handelt es sich um einen Paketmanager f\u00fcr JavaScript, \u00e4hnlich wie <a href=\"https:\/\/yarnpkg.com\/\">yarn<\/a>, <a href=\"https:\/\/pypi.org\/project\/pip\/\">pip<\/a> und im weiteren Sinn <a href=\"https:\/\/maven.apache.org\/\">Maven<\/a>. Die von npm bereitgestellten Packages werden dort von den Erstellern hochgeladen, versioniert und verwaltet. Nutzer k\u00f6nnen die dort liegenden Packages mittels &#8220;npm install&#8221; in ihre eigenen Projekte einbinden. Ein in npm angebotenes Package kann wiederum andere npm-Packages ben\u00f6tigen, um zu funktionieren.<\/p>\n\n\n\n<p>Irgendwo in der Toolchain wurde auf das nicht existente Module compile.js im Package coa verwiesen. Im <a href=\"https:\/\/github.com\/facebook\/create-react-app\/issues\/11620\" title=\"Github von create-react-app\">Github von create-react-app<\/a> war die Diskussion schon im vollen Gange und recht schnell wurde klar: <a href=\"https:\/\/github.com\/facebook\/create-react-app\/issues\/11620#issuecomment-961011294\" title=\"&quot;coa&quot; wurde kompromittiert\">coa wurde kompromittiert<\/a>. Genauso schnell begann die Diskussion, welche Folgen das haben k\u00f6nnte, denn bis dato wusste noch niemand, um welche Art Malware es sich handelt. Mittlerweile wissen wir, es handelt sich &#8220;nur&#8221; um den Qakbot-Trojaner, welcher beispielsweise Banking-Informationen von Privatnutzern auslesen soll. <\/p>\n\n\n\n<p>Bei diesem Angriff handelt es sich weder um den ersten, noch um den letzten dieser Art. Erst im Monat vorher, wurde beispielsweise <a href=\"https:\/\/www.npmjs.com\/package\/ua-parser-js\" title=\"&quot;ua-parser-js&quot;\">ua-parser-js<\/a> mit demselben <a href=\"https:\/\/www.bleepingcomputer.com\/news\/security\/popular-npm-library-hijacked-to-install-password-stealers-miners\/\" title=\"Trojaner \">Trojaner <\/a>kompromittiert. Und im Januar 2022 machte <a href=\"https:\/\/github.com\/Marak\" title=\"Marak&nbsp;Squires\">Marak&nbsp;Squires<\/a> auf sich aufmerksam, als er seine eigenen, weit verbreiteten npm-Pakete <a href=\"https:\/\/fakerjs.dev\/update.html\" title=\"faker \">faker<\/a> und <a href=\"https:\/\/github.com\/Marak\/colors.js\/commit\/074a0f8ed0c31c35d13d28632bd8a049ff136fb6\" title=\"colors \">colors<\/a> mit Schadcode versetzte, als Auflehnung gegen den Missbrauch von Open-Source Software.<\/p>\n\n\n\n<p>Im Fall von faker und colors, waren die Ausma\u00dfe bereits verheerend. Die Bibliotheken haben zusammen fast 23 Millionen Downloads in einer Woche und \u00fcber 21.000 Projekte, die auf diese Bibliotheken aufbauen. Von heute auf morgen k\u00f6nnen diese nicht mehr neu deployt werden. An dieser Stelle reden wir von einer Supply Chain Attacke. In diesen F\u00e4llen sind diese zwar nicht mit weitreichenden Folgen verbunden, sondern &#8220;nur&#8221; mit etwas Downtime. Im Vergleich dazu handelt es sich bei coa, rc und ua-parser-js um Supply Chain Attacken, die verheerende Ausma\u00dfe annehmen k\u00f6nnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Auswirkungen<\/h2>\n\n\n\n<p>Die m\u00f6glichen Auswirkungen von solchen Attacken werden klar, wenn man sich \u00fcber den Deployment-Prozess eines Unternehmens Gedanken macht. In modernen Softwareprojekten ist das Deployment (hoffentlich) automatisiert \u00fcber sogenannte CI\/CD Pipelines. Das bedeutet:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Ich lade einen neuen Stand meines Quellcodes in die Versionsverwaltung des Projekts (Push). <\/li><li>Eine Pipeline wird automatisch gestartet.<ol><li>In einem Testsystem wird der Build des Projekts ausgef\u00fchrt (hierf\u00fcr werden wieder alle Dependencies installiert)<\/li><li>Tests werden ausgef\u00fchrt<\/li><li>Der Build wird in die Produktivumgebung geladen.<\/li><\/ol><\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"392\" data-attachment-id=\"22639\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/manual_pipeline_v14_2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2.png\" data-orig-size=\"1430,548\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"manual_pipeline_v14_2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2-1024x392.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2-1024x392.png\" alt=\"\" class=\"wp-image-22639\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2-1024x392.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2-300x115.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2-768x294.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/manual_pipeline_v14_2.png 1430w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>CI\/CD Pipeline Beispiel von <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/pipelines\/\" title=\"GitLab CI\/CD\">GitLab CI\/CD<\/a><\/figcaption><\/figure>\n\n\n\n<p>Ist in diesem Szenario eine kompromittiert Dependency enthalten, wird unter Umst\u00e4nden das ganze System infiltriert. Das k\u00f6nnte zum Beispiel dazu f\u00fchren, dass sensible Daten mitgelesen oder geklaut werden. Sollte man so Zugriff auf Server erhalten, ist dieser anf\u00e4llig f\u00fcr Remote Code Execution (RCE) Angriffe. Also ein Angriff, in dem ein Hacker Code auf dem Zielsystem ausf\u00fchrt. Das wird normalerweise durch Konfigurationen verhindert, k\u00f6nnte aber umgangen werden, wenn der Code Aufruf von innerhalb der Serverumgebung kommt.<\/p>\n\n\n\n<p>Und selbst wenn nicht dieser Fall eintritt, kann eine fehlerhafte Dependency immer noch dazu f\u00fchren, dass die konfigurierten Pipelines nicht mehr funktionieren und die Entwicklung zum Stillstand bringt (siehe Fall <a href=\"https:\/\/github.com\/veged\/coa\/issues\/99#issuecomment-960942947\" title=\"coa\">coa<\/a>).<\/p>\n\n\n\n<p>Letzten Endes sind die Auswirkungen davon abh\u00e4ngig, auf welchen Systemen die infiltriere Software landet.<\/p>\n\n\n\n<p>Der erste Schritt, um sich abzusichern und in den meisten F\u00e4llen wohl auch gegangen wird, ist die Verwendung von Docker Containern oder VMs. Dadurch wird ein Neu-Deployment vereinfacht und (wahrscheinlich) verhindert, dass Zugriff auf unterliegende Systeme erlangt wird. In automatischen Build Pipelines ist das der Standard. Sich hierbei auf bew\u00e4hrte Systeme zu st\u00fctzen, ist zwar erstmal gut, jedoch sollte man dem nicht blind vertrauen, wie der Fall von log4j 2021 gezeigt hat.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das Problem mit Docker<\/h2>\n\n\n\n<p>Docker ist toll und hilft uns auf so vielen Ebenen, jedoch bef\u00fcrchte ich, dass es h\u00e4ufig leichtfertig verwendet wird. Es gibt viele Dinge, die beachtet werden m\u00fcssen und Schritte, die man befolgen sollte, um sein. Ein paar Stichpunkte hierzu sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Verwendung von Untrusted Images<\/li><li>Verwendung von Multi-Stage Builds<\/li><li>Leichtsinniges Volume-Mapping<\/li><\/ul>\n\n\n\n<p>Docker selbst kl\u00e4rt \u00fcber die richtigen Schritte bei der Verwendung von Docker auf der eigenen <a href=\"https:\/\/docs.docker.com\/engine\/security\/\" title=\"Webseite\">Webseite<\/a> auf und berichtet \u00fcber <a href=\"https:\/\/docs.docker.com\/engine\/security\/non-events\/\" title=\"Sicherheitsl\u00fccken\">Sicherheitsl\u00fccken<\/a>. Bei dem ersten Punkt landen wir wieder bei dem Anfang. Falsche Verwendung von Dependencies.<\/p>\n\n\n\n<p>Punkt 2 ist elementar und sollte jeder Person, die mit Docker arbeitet, ein Begriff sein. <a href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\" title=\"Multi-Stage Builds\">Multi-Stage Builds<\/a> helfen uns einerseits dabei, die Gr\u00f6\u00dfe des finalen Images minimal zu halten und sorgen andererseits daf\u00fcr, dass Dependencies nur in der Stage existieren, in der sie ben\u00f6tigt werden. (<a href=\"https:\/\/vsupalov.com\/docker-multi-stage-advantages\/\" title=\"Und noch vieles mehr\">Und noch vieles mehr.<\/a>)<\/p>\n\n\n\n<p>Der dritte Punkt, kann alle bisherigen Schritte obsolet machen, denn gebe ich einem unsicheren Image die M\u00f6glichkeit auf den Host zu schreiben (an Orte an die er nicht soll), gebe ich auch einem m\u00f6glichen Eindringling Zugriff auf das System. So k\u00f6nnte man sich beispielsweise \u00fcber den Container Root-Rechte auf dem Host beschaffen. Darauf werde ich hier nicht weiter eingehen, da das schon genug andere vor mir getan haben (siehe <a href=\"https:\/\/blog.trailofbits.com\/2019\/07\/19\/understanding-docker-container-escapes\/\" title=\"trailofbits.com\">trailofbits.com<\/a> oder <a href=\"https:\/\/www.electricmonk.nl\/log\/2017\/09\/30\/root-your-docker-host-in-10-seconds-for-fun-and-profit\/\" title=\"electricmonk.nl\">electricmonk.nl<\/a>)<\/p>\n\n\n\n<p>Es sind eine Menge &#8220;wenn-dann&#8221;s, die eintreten m\u00fcssen, damit der Worst-Case eintritt, jedoch zeigt es auch, dass ein Eindringling mit recht wenig Aufwand (Hacken eines Accounts bspw. auf npm) Zugang zu einer Menge vertraulicher Daten oder sogar dem Host System erhalten kann. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aus-versehen-open-source\">Aus Versehen Open-Source?<\/h2>\n\n\n\n<p>Das folgende Bild zeigt die verschiedenen Lizenzen, der im oben visualisierten Abh\u00e4ngigkeiten einer neu erstellten React App. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Lizenzen.png\"><img loading=\"lazy\" decoding=\"async\" width=\"289\" height=\"446\" data-attachment-id=\"22742\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/lizenzen\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Lizenzen.png\" data-orig-size=\"289,446\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Lizenzen\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Lizenzen.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Lizenzen.png\" alt=\"\" class=\"wp-image-22742\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Lizenzen.png 289w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Lizenzen-194x300.png 194w\" sizes=\"auto, (max-width: 289px) 100vw, 289px\" \/><\/a><figcaption>Verwendete Lizenzen von Software-Dependencies<\/figcaption><\/figure><\/div>\n\n\n\n<p>Das Problem hierbei ist, dass viele Entwickler sich keine Gedanken darum machen, welche Konsequenzen es haben kann Open-Source Software zu verwenden, wenn man die Lizenz nicht versteht. So gibt es zwar manche Lizenzen wie zum Beispiel die einmal verwendete <a href=\"http:\/\/www.wtfpl.net\/about\/\" title=\"WTFPL\">WTFPL<\/a>, welche einem buchst\u00e4blich alles erlaubt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">      DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE \n                       &#091;...]\n       0. You just DO WHAT THE FUCK YOU WANT TO.<\/code><\/pre>\n\n\n\n<p>Andererseits gibt es aber auch Lizenzen wie die <a href=\"https:\/\/www.gnu.org\/licenses\/gpl-3.0.html\" title=\"GPL(-3)\">GNU Gerneral Public License (GPL)<\/a>, die Software, welche GPL-lizenzierte Software verwenden, verpflichten, diese ebenfalls und unter GPL zu lizenzieren. Ergo: Diese neue Software muss Open Source werden (Siehe <a href=\"https:\/\/www.gnu.org\/licenses\/copyleft.de.html#:~:text=Copyleft%20ist%20eine%20allgemeine%20Methode,erweiterten%20Programmversionen%20ebenfalls%20frei%20sind.\" title=\"copyleft\">copyleft<\/a>).<\/p>\n\n\n\n<p>Damit verbunden, sind auch Versions-Updates von Dependencies ein Problem, denn in ihnen kann die Lizenz ver\u00e4ndert werden, sollten alle Entwickler einverstanden sein (siehe <a href=\"https:\/\/opensource.guide\/de\/legal\/\">https:\/\/opensource.guide\/de\/legal\/<\/a>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to Dependency Management<\/h2>\n\n\n\n<p>Da wir jetzt alle enorm Panik um unseren Code mit 1 Million Dependencies haben, lohnt es sich Gedanken um die L\u00f6sung zu machen. Um zu vermeiden, dass unsere Software durch sich \u00e4ndernde Dependency-Versionen kompromittiert wird, gibt es einige Wege sich zu sch\u00fctzen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Richtiger Einsatz von CI\/CD und Docker<\/h3>\n\n\n\n<p>Zwar habe ich zuvor vor der falschen Verwendung von Build-Pipelines und Docker gewarnt, jedoch sind sie bei richtiger Verwendung zwei der wichtigsten Tools, um die Integrit\u00e4t unseres Systems sicherzustellen. Dieser Artikel soll keine Anleitung f\u00fcr die richtige Verwendung und Konfiguration von Build-Pipelines werden, das haben schon genug andere gemacht. Einen einfachen Einstieg auf praktischer Ebene bieten beispielsweise <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/pipelines\/\" title=\"Gitlab CI\/CD Pipelines\">Gitlab CI\/CD Pipelines<\/a> oder <a href=\"https:\/\/github.com\/features\/actions\" title=\"GitHub Actions\">GitHub Actions<\/a> und als unabh\u00e4ngige L\u00f6sung nat\u00fcrlich <a href=\"https:\/\/www.jenkins.io\/\" title=\"Jenkins\">Jenkins<\/a>. <\/p>\n\n\n\n<p>F\u00fcr die etwas weiter gedachten theoretischen Aspekte lohnt sich ein Blick in das Google Buch <a href=\"https:\/\/sre.google\/books\/building-secure-reliable-systems\/\" title=\"Buch Building Secure and Reliable Systems\">Building Secure and Reliable Systems<\/a>, in dem anschaulich verschiedene Ans\u00e4tze, Muster und Prinzipien beim Bau von gro\u00dfen Systemen beschrieben werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Verwendung von genauen Versionsnummern<\/h3>\n\n\n\n<p>Es ist einfach und intuitiv, eine Abh\u00e4ngigkeit in der neuesten Version zu installieren (@latest etc.). Man erh\u00e4lt die neuesten Security-Patches und den besten Funktionsumfang. Allerdings hat man so auch keinerlei Kontrolle dar\u00fcber, sollte eine neue Software Malware enthalten. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-latest.png\"><img loading=\"lazy\" decoding=\"async\" width=\"291\" height=\"45\" data-attachment-id=\"22684\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/docker-latest\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-latest.png\" data-orig-size=\"291,45\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Docker-latest\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-latest.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-latest.png\" alt=\"\" class=\"wp-image-22684\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-version.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"22685\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/docker-version\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-version.png\" data-orig-size=\"283,45\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Docker-version\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-version.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Docker-version.png\" alt=\"\" class=\"wp-image-22685\" width=\"292\" height=\"46\" \/><\/a><\/figure>\n\n\n\n<p>Allerdings gibt uns auch das keine hundertprozentige Sicherheit. Gehen wir zum Beispiel nach dem <a href=\"https:\/\/docs.npmjs.com\/updating-your-published-package-version-number\" title=\"Leitfaden von npm\">Leitfaden von npm<\/a> sollen wir die Versionsnummern \u00e4ndern, sollten sich gro\u00dfe \u00c4nderungen ergeben. Welche \u00c4nderungen wir als gro\u00df erachten, steht uns jedoch erst einmal frei (und dementsprechend auch m\u00f6glichen Angreifern).<\/p>\n\n\n\n<p>Um hier das Risiko m\u00f6glichst gering zu halten, sollte Versionierung richtig verwendet werden. Dadurch wird einerseits in Konfigurationsdateien festgehalten, welche Ver\u00e4nderungen von Dependencies wir akzeptieren, und andererseits wird zu anderen Entwicklern kommuniziert, worauf geachtet werden muss. <a href=\"https:\/\/docs.npmjs.com\/about-semantic-versioning\" title=\"npm\">npm<\/a> verwendet hierf\u00fcr <a href=\"https:\/\/semver.org\/lang\/de\/\" title=\"Semantik Versioning\">Semantik Versioning<\/a>. Kurz zusammengefasst:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>1.2.3: Wir befinden uns in Major Release 1, Minor Release 2 und Patch Release 3.<\/li><li>Major Release: Enth\u00e4lt r\u00fcckw\u00e4rts inkompatible Ver\u00e4nderungen. Ein unbedachtes Update kann die Software kaputt machen. Ein Major Release mit Versionsnummer 0 bedeutet &#8220;unstable&#8221; und ist mit Vorsicht zu benutzen.<\/li><li>Minor Release: Ist r\u00fcckw\u00e4rts kompatibel, kann aber neue Features enthalten (z.B. neue API-Funktionen)<\/li><li>Patch Release: Ist r\u00fcckw\u00e4rts kompatibel, enth\u00e4lt aber Bugfixes, die ansonsten nichts an der Funktion \u00e4ndern.<\/li><\/ul>\n\n\n\n<p>M\u00f6chte ich nun angeben, welche \u00c4nderungen der Dependencies ich als Nutzer akzeptiere, kann ich das \u00fcber verschiedene Marker machen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&gt;= 1.2.3 bedeutet so viel wie @latest, also alle Versionen gr\u00f6\u00dfer gleich 1.2.3 wird akzeptiert (Egal ob sie kompatibel ist oder nicht).<\/li><li>^1.2.3 oder 1.x bedeutet, Minor-Releases werden akzeptiert.<\/li><li>~1.2.3 oder 1.2.x bedeutet, Patch-Releases werden akzeptiert.<\/li><\/ul>\n\n\n\n<p>Diese Syntax kann sich bei unterschiedlichen Package-Managern unterscheiden (z.B. Maven), die Funktionalit\u00e4t wird aber f\u00fcr gew\u00f6hnlich unterst\u00fctzt.<\/p>\n\n\n\n<p>Der n\u00e4chste Schritt tiefer ins Rabbithole, ist die Betrachtung von verschachtelten Dependencies. Wie bereits erw\u00e4hnt, ben\u00f6tigen auch die von uns verwendeten Bibliotheken wiederum andere Bibliotheken, um zu funktionieren (siehe <a href=\"#Der-Fall-npm\" title=\"&quot;Der Fall npm&quot;\">Der Fall npm<\/a>).  Den \u00dcberblick zu behalten ist quasi unm\u00f6glich und dementsprechend auch, zu verstehen, wie geschachtelte Dependencies verwaltet werden und wie mit neuen Major-, Minor- und Patch-Releases umgegangen wird. Manche Package-Manager wie npm und yarn bieten uns sogenannte <a href=\"https:\/\/snyk.io\/blog\/what-is-package-lock-json\/\" title=\"Lock-Files\">Lock-Files<\/a>, in denen alle Versionen aller im Projekt enthaltenen Dependencies und Sub-Dependencies gelistet sind. Diese Dateien sind enorm wichtig, um die Reproduzierbarkeit unseres Programms zu garantieren und daf\u00fcr zu sorgen, dass ein automatisierter Build das gew\u00fcnschte Ergebnis produziert.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\" id=\"lock-file\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lock-react.png\"><img loading=\"lazy\" decoding=\"async\" width=\"876\" height=\"232\" data-attachment-id=\"22746\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/lock-react\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lock-react.png\" data-orig-size=\"876,232\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"lock-react\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lock-react.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lock-react.png\" alt=\"\" class=\"wp-image-22746\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lock-react.png 876w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lock-react-300x79.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lock-react-768x203.png 768w\" sizes=\"auto, (max-width: 876px) 100vw, 876px\" \/><\/a><figcaption>Eintrag von React in der package-lock.json einer React App<\/figcaption><\/figure>\n\n\n\n<p>Im Bild sehen wir den Eintrag von des Package React im Lock-File einer React-App. Wir sehen neben der Versionsnummer au\u00dferdem die Punkte <a href=\"https:\/\/docs.npmjs.com\/cli\/v6\/configuring-npm\/package-lock-json#resolved\" title=\"resolved\">resolved<\/a>, in dem beschrieben wird, von wo das Paket installiert und upgedatet wird und den Punkt <a href=\"https:\/\/docs.npmjs.com\/cli\/v6\/configuring-npm\/package-lock-json#integrity\" title=\"integrity\">integrity<\/a>, welcher eine Checksum liefert, um die Echtheit des Pakets zu \u00fcberpr\u00fcfen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 3: Mirror \/ Fork \/ Vendoring<\/h3>\n\n\n\n<p>Eine M\u00f6glichkeit sich vor ungewollten Ver\u00e4nderungen eines Pakets zu sch\u00fctzen ist sogenanntes Mirroring. Ich spiegel die von mir verwendeten Dependencies in einer eigenen Registry und lasse meine Programme nur noch von dort Pakete installieren. Diese Methode funktioniert f\u00fcr alle m\u00f6glichen Arten von Dependencies, wie zum Beispiel Node-Modules (npm \/ yarn), Maven, Gradle oder auch Docker Images. <\/p>\n\n\n\n<p>Aber wieso will ich meine eigene Registry f\u00fcr Dependencies, wenn es alles schon online vorhanden ist? Nun, neben den im Verlauf des Artikels bereits genannten Gr\u00fcnden:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Was passiert, wenn eine korrumpierte Version hochgeladen wird?<\/li><li>Was passiert, wenn sich die Lizenz \u00e4ndert? <\/li><\/ul>\n\n\n\n<p>Folgen au\u00dferdem die Fragen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Was passiert, wenn die normale Registry nicht erreichbar ist?<\/li><li>Was passiert, wenn der Besitzer der Dependency die Sichtbarkeit \u00e4ndert?<\/li><\/ul>\n\n\n\n<p>Dazu kommt, dass in einem Dependency-Mirror auch Forks, also ver\u00e4nderte Versionen eines ver\u00f6ffentlichten Pakets bereitgestellt werden k\u00f6nnen, ohne diese ver\u00f6ffentlichen zu m\u00fcssen. Das kann hilfreich sein, um sie an die Bed\u00fcrfnisse des Unternehmens ideal anzupassen.<\/p>\n\n\n\n<p>Au\u00dferdem bietet es den Vorteil, dass firmenintern geregelt werden kann, welche Pakete verwendet werden d\u00fcrfen und welche nicht (Abh\u00e4ngigkeiten m\u00fcssen genehmigt werden). Das klingt zwar zun\u00e4chst l\u00e4stig, bringt aber einiges an Sicherheit, gerade wenn unerfahrenere Entwickler an einem Projekt beteiligt sind.<\/p>\n\n\n\n<p>Um also sicherzugehen, dass unsere Dependencies immer vorhanden und sicher sind, ist ein Mirror die beste M\u00f6glichkeit.<\/p>\n\n\n\n<p>Am Beispiel von npm ist die Umsetzung recht einfach. Das Bild des <a href=\"#lock-file\" title=\"Lock-Files\">Lock-Files<\/a> zeigt im resolved-Feld auf die npm-Registry. Um diesen Link zu \u00e4ndern, muss lediglich in der Konfigurationsdatei <a href=\"https:\/\/docs.npmjs.com\/cli\/v8\/configuring-npm\/npmrc\" title=\"npmrc\">npmrc<\/a> das entsprechende Feld angepasst werden. Um nun einen Mirror der npm-Registry zu erstellen, kann beispielsweise <a href=\"https:\/\/verdaccio.org\/\" title=\"Verdaccio\">Verdaccio<\/a> verwendet werden. Dabei handelt es sich um ein weit verbreitetes Tool f\u00fcr diesen Zweck und kann ohne viel Aufwand in einer modernen Serverumgebung gehostet werden.<\/p>\n\n\n\n<p>F\u00fcr die anderen genannten Dependency Manager \/ Registries existieren ebenfalls mehr oder weniger verbreitete Tools, um einen Mirror zu realisieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 4: Monitoring<\/h3>\n\n\n\n<p>Um das Lizenzproblem in Angriff zu nehmen, hilft es sich zu informieren, welche Lizenzen existieren und eine Whitelist mit akzeptierten Lizenzen zu erstellen. Da das schnell sehr un\u00fcbersichtlich werden kann (siehe <a href=\"#aus-versehen-open-source\">Aus Versehen Open-Source<\/a>), kann es sich lohnen, hierf\u00fcr externe Anbieter zu nutzen. GitLab bietet hierf\u00fcr direkt ein <a href=\"https:\/\/docs.gitlab.com\/ee\/user\/compliance\/license_compliance\/\" title=\"Tool \">Licence Complience Tool<\/a> f\u00fcr seine CI\/CD Pipelines an oder man setzt auf externe Anbieter wie <a href=\"https:\/\/snyk.io\/product\/open-source-license-compliance\/\" title=\"Snyk\">Snyk<\/a>. Diese Tools erlauben es automatisiert auf Lizenzprobleme testen zu lassen und bieten Hilfe bei Unklarheiten, sowie der M\u00f6glichkeit zur eigenen Konfiguration. <\/p>\n\n\n\n<p>LinkedIn beschreibt in einem eigenen <a href=\"https:\/\/engineering.linkedin.com\/blog\/2018\/09\/managing-software-dependency-at-scale\" title=\"Blogartikel \">Blogartikel <\/a>au\u00dferdem den Umgang mit Software-Dependencies in einem globalen Umfeld und beschreibt dabei eine neue L\u00f6sung, Probleme zwischen Software Dependencies zu erkennen und Schwachstellen zu \u00fcberwachen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Globale Schritte gegen das Problem<\/h2>\n\n\n\n<p>Die anfangs genannten F\u00e4lle haben neben Panik um die eigene Software auch die Frage aufgerufen, wer haftet, wenn Malware durch Software Dependencies verbreitet wird oder falsche Lizenzen verwendet werden. Der Package-Manager? Die Versionsverwaltung? Der Publisher? Ich selbst?<\/p>\n\n\n\n<p>Letzten Endes ist diese Frage nicht gekl\u00e4rt, aber im Zweifel immer der Endnutzer. Zwar werden die <a href=\"https:\/\/github.com\/veged\/coa\/issues\/99#issuecomment-961018571\" title=\"Stimmen \">Stimmen<\/a> lauter, dass gro\u00dfe Unternehmen hierf\u00fcr zur Rechenschaft gezogen werden m\u00fcssen, oder zumindest f\u00fcr eine schnelle L\u00f6sung f\u00fcr bereiten k\u00f6nnen, jedoch geht jeder Nutzer selbst durch die Verwendung von Drittsoftware ein Risiko ein, das er automatisch durch Akzeptieren der Lizenz in Kauf nimmt.<\/p>\n\n\n\n<p>Um die Sicherheit bei der Verwendung von Software-Dependencies zu verbessern, findet schon seit l\u00e4ngerem ein Umschwung statt. So unterst\u00fctzt Maven schon lange Zeit das <a href=\"https:\/\/cwiki.apache.org\/confluence\/display\/MAVEN\/Maven+3.x+Compatibility+Notes#Maven3.xCompatibilityNotes-PluginMetaversionResolution\" title=\"LATEST-Tag nichtmehr\">LATEST-Tag nicht mehr<\/a> und genau aus diesen Gr\u00fcnden etablieren sich Systeme wie Docker, CI\/CD etc. <\/p>\n\n\n\n<p>Um das eigene Unternehmen in eine gute Position zu bringen, lohnt es sich, die in diesem Artikel beschriebenen Techniken umzusetzen und sich stets auf dem Laufenden zu halten. Um die Position nach innen und au\u00dfen zu st\u00e4rken ist es wom\u00f6glich sinnvoll sich nach Qualit\u00e4tssicherungsnormen wie <a href=\"https:\/\/www.tuvsud.com\/de-de\/dienstleistungen\/auditierung-und-zertifizierung\/iso-9001#:~:text=Die%20Basis%20daf%C3%BCr%20ist%20die,Dienstleistungsqualit%C3%A4t%20zu%20erf%C3%BCllen.\" title=\"ISO 9001\">ISO 9001<\/a> zertifizieren zu lassen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Weitere Quellen<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.heise.de\/news\/Unbekannte-infiltrieren-Paketmanager-npm-und-verseuchen-Tools-mit-Schadcode-6260153.html\">https:\/\/www.heise.de\/news\/Unbekannte-infiltrieren-Paketmanager-npm-und-verseuchen-Tools-mit-Schadcode-6260153.html<\/a><\/li><li><a href=\"https:\/\/engineering.linkedin.com\/blog\/2018\/09\/managing-software-dependency-at-scale\">https:\/\/engineering.linkedin.com\/blog\/2018\/09\/managing-software-dependency-at-scale<\/a><\/li><li><a href=\"https:\/\/forums.swift.org\/t\/dependency-mirroring-and-forking\/13902\">https:\/\/forums.swift.org\/t\/dependency-mirroring-and-forking\/13902<\/a><\/li><li><a href=\"https:\/\/github.com\/advisories\/GHSA-g2q5-5433-rhrf\">https:\/\/github.com\/advisories\/GHSA-g2q5-5433-rhrf<\/a><\/li><li><a href=\"https:\/\/github.com\/advisories\/GHSA-73qr-pfmq-6rp8\">https:\/\/github.com\/advisories\/GHSA-73qr-pfmq-6rp8<\/a><\/li><li><a href=\"https:\/\/github.com\/veged\/coa\/issues\/99\">https:\/\/github.com\/veged\/coa\/issues\/99<\/a><\/li><li><a href=\"https:\/\/vsupalov.com\/docker-latest-tag\/#:~:text=You%20should%20avoid%20using%20the,apart%20from%20the%20image%20ID.\">https:\/\/vsupalov.com\/docker-latest-tag\/#:~:text=You%20should%20avoid%20using%20the,apart%20from%20the%20image%20ID.<\/a><\/li><li><a href=\"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3277539.3277541\">https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3277539.3277541<\/a><\/li><li><a href=\"https:\/\/github.com\/facebook\/create-react-app\/issues\/11620\">https:\/\/github.com\/facebook\/create-react-app\/issues\/11620<\/a><\/li><li><a href=\"https:\/\/www.infoq.com\/articles\/securing-docker\/\">https:\/\/www.infoq.com\/articles\/securing-docker\/<\/a><\/li><li><a href=\"https:\/\/www.tuvsud.com\/de-de\/dienstleistungen\/auditierung-und-zertifizierung\/iso-9001#:~:text=Die%20Basis%20daf%C3%BCr%20ist%20die,Dienstleistungsqualit%C3%A4t%20zu%20erf%C3%BCllen.\">https:\/\/www.tuvsud.com\/de-de\/dienstleistungen\/auditierung-und-zertifizierung\/iso-9001#:~:text=Die%20Basis%20daf%C3%BCr%20ist%20die,Dienstleistungsqualit%C3%A4t%20zu%20erf%C3%BCllen.<\/a><\/li><li><a href=\"https:\/\/www.youtube.com\/watch?v=g-JgA1hvJzA\">https:\/\/www.youtube.com\/watch?v=g-JgA1hvJzA<\/a><\/li><li><a href=\"https:\/\/www.ezequiel.tech\/2020\/05\/rce-in-cloud-dm.html\">https:\/\/www.ezequiel.tech\/2020\/05\/rce-in-cloud-dm.html<\/a><\/li><li><a href=\"https:\/\/npm.anvaka.com\/#\/\">https:\/\/npm.anvaka.com\/#\/<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;Unbekannte infiltrieren Paketmanager npm und verseuchen Tools mit Schadcode&#8221; hei\u00dft es am 08.11.2021 auf heise online. Die Nutzeraccounts der Maintainer von coa und rc wurden gehackt und neue Versionen dieser Pakete hochgeladen (inklusive Malware). Zwar denken sich bestimmt viele bei coa und rc: &#8220;Aha toll&#8221;, aber sp\u00e4testens bei React oder Angular sollte man hellh\u00f6rig werden. [&hellip;]<\/p>\n","protected":false},"author":1039,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,649,262,2],"tags":[],"ppma_author":[863],"class_list":["post-22187","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-interactive-media","category-rich-media-systems","category-system-engineering"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":26064,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/02\/03\/das-neue-javascript-framework-qwik-js-mit-resumability-zur-optimalen-performance-im-web\/","url_meta":{"origin":22187,"position":0},"title":"Das neue JavaScript Framework Qwik.js &#8211; Mit Resumability zur optimalen Performance im Web?","author":"Tim Peters","date":"3. February 2024","format":false,"excerpt":"Aufgrund des mittlerweile riesigen Angebots und der Menge an Mitbewerbern in nahezu jeder Branche im Web sind die Konsumenten der Inhalte anspruchsvoller als je zuvor und der Page Speed ist ein entscheidender Erfolgsfaktor f\u00fcr jedes Online-Unternehmen. Webseiten, die schnell laden und ohne Verz\u00f6gerung auf Nutzerinput reagieren, halten die User nicht\u2026","rel":"","context":"In &quot;Interactive Media&quot;","block_context":{"text":"Interactive Media","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/vm6o42zSi0mK7OntVhP16W6OzSt7pjZZCVNu7KsyoI5nngqyiFVAO6FaCRb6nCvnr61gi8Fw-un2XKSeEMNoShtb-gKJMInIJbMFb3yRUnB51fadHVk9S_8Vx9Dn2qmQ7OIW4i7A0-nBtZ6JOw-XWZE.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/vm6o42zSi0mK7OntVhP16W6OzSt7pjZZCVNu7KsyoI5nngqyiFVAO6FaCRb6nCvnr61gi8Fw-un2XKSeEMNoShtb-gKJMInIJbMFb3yRUnB51fadHVk9S_8Vx9Dn2qmQ7OIW4i7A0-nBtZ6JOw-XWZE.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/vm6o42zSi0mK7OntVhP16W6OzSt7pjZZCVNu7KsyoI5nngqyiFVAO6FaCRb6nCvnr61gi8Fw-un2XKSeEMNoShtb-gKJMInIJbMFb3yRUnB51fadHVk9S_8Vx9Dn2qmQ7OIW4i7A0-nBtZ6JOw-XWZE.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/vm6o42zSi0mK7OntVhP16W6OzSt7pjZZCVNu7KsyoI5nngqyiFVAO6FaCRb6nCvnr61gi8Fw-un2XKSeEMNoShtb-gKJMInIJbMFb3yRUnB51fadHVk9S_8Vx9Dn2qmQ7OIW4i7A0-nBtZ6JOw-XWZE.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":28372,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/18\/safeguards-in-der-ki-unterstutzten-softwareentwicklung\/","url_meta":{"origin":22187,"position":1},"title":"Safeguards in der KI-unterst\u00fctzten Softwareentwicklung","author":"Christoph Merck","date":"18. February 2026","format":false,"excerpt":"KI gest\u00fctzte Werkzeuge und autonome Agenten machen Softwareentwicklung schneller, schaffen aber neue Sicherheitsrisiken, weil sie eigenst\u00e4ndig Entscheidungen treffen und externe Tools nutzen k\u00f6nnen. Der Artikel zeigt, warum deshalb ein mehrschichtiges Safeguard Konzept n\u00f6tig ist, das klassische Ma\u00dfnahmen wie Code Reviews, Tests und statische sowie dynamische Analysen mit KI spezifischen Schutzmechanismen\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":28402,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/20\/ai-aided-requirements-engineering-methodische-integration-von-llms-und-agenten-frameworks-in-den-anforderungsprozess\/","url_meta":{"origin":22187,"position":2},"title":"AI-Aided Requirements Engineering: Methodische Integration von LLMs und Agenten-Frameworks in den Anforderungsprozess","author":"Cedric Gottschalk","date":"20. February 2026","format":false,"excerpt":"Abstract Unklare und unvollst\u00e4ndige Anforderungen gelten als einer der Hauptgr\u00fcnde f\u00fcr das Scheitern von Softwareprojekten. Das vorliegende Paper untersucht den \u00dcbergang von klassischem Requirements Engineering (RE) hin zu einem KI-gest\u00fctzten Anforderungsprozess (AI-Aided RE). Zun\u00e4chst wird der Status Quo der Human-AI Collaboration (HAIC) im RE analysiert, wobei die Dominanz explorativer Proof-of-Concept-Ans\u00e4tze\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/CLEAR-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/CLEAR-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/CLEAR-1.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":28499,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/20\/ki-generierte-dokumentation\/","url_meta":{"origin":22187,"position":3},"title":"KI-generierte Dokumentation","author":"Ai Nhu Dinh","date":"20. February 2026","format":false,"excerpt":"Abstract Software documentation represents a critical yet frequently neglected component of the software development lifecycle. Time constraints, outdated content, and limited accessibility remain persistent challenges in practice. Recent advances in artificial intelligence offer new opportunities to automate documentation processes and improve quality and maintainability.This paper investigates AI-supported documentation generation by\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":27870,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/07\/25\/tools-zur-automatischen-erstellung-von-sboms\/","url_meta":{"origin":22187,"position":4},"title":"Tools zur automatischen Erstellung von SBOMs","author":"Pauline Wolf","date":"25. July 2025","format":false,"excerpt":"Transparenz und Sicherheit durch automatisierte Software-St\u00fccklisten Anmerkung:\u00a0Dieser Blogpost wurde w\u00e4hrend dem Sommersemester 2025 f\u00fcr das Modul Enterprise IT (113601a) verfasst. 1. Einleitung Moderne Software besteht l\u00e4ngst nicht mehr nur aus eigenem Quellcode. In nahezu jedem Projekt werden gro\u00dfe Mengen externer Bibliotheken, Frameworks und Open-Source-Komponenten genutzt. Wie auch bei physischen Lieferketten\u2026","rel":"","context":"In &quot;DevOps&quot;","block_context":{"text":"DevOps","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/devops\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":28173,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/01\/14\/autonome-ki-agenten-in-der-softwareentwicklung-architektur-patterns-theoretische-frameworks-und-design-entscheidungen\/","url_meta":{"origin":22187,"position":5},"title":"Autonome KI-Agenten in der Softwareentwicklung: Architektur-Patterns, theoretische Frameworks und Design-Entscheidungen","author":"Kay Kn\u00f6pfle","date":"14. January 2026","format":false,"excerpt":"Abstract This paper provides a systematic introduction to AI agents, covering core definitions and foundational architectural concepts. It examines tool integration, including operational principles, capabilities, and evaluation of AI coding agents, as well as the Model Context Protocol. The paper further analyzes memory systems as a key component for context\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"Schematische Darstellung des Groupchat Patterns","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/01\/groupchat.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/01\/groupchat.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/01\/groupchat.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/01\/groupchat.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":863,"user_id":1039,"is_guest":0,"slug":"jp112","display_name":"Eric Prytulla","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5ae05b98444ae84da70df6ff8240ae44d6fad71768c3b57de48ea0b8e793d522?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1039"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=22187"}],"version-history":[{"count":69,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22187\/revisions"}],"predecessor-version":[{"id":22838,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22187\/revisions\/22838"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=22187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=22187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=22187"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=22187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}