{"id":26340,"date":"2024-07-23T19:56:48","date_gmt":"2024-07-23T17:56:48","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=26340"},"modified":"2024-07-23T22:13:04","modified_gmt":"2024-07-23T20:13:04","slug":"tools-for-automatic-creation-of-software-bill-of-materials-sbom","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/07\/23\/tools-for-automatic-creation-of-software-bill-of-materials-sbom\/","title":{"rendered":"Tools for automatic creation of Software Bill of Materials (SBOM)"},"content":{"rendered":"\n<p>In times, where software develops at a rapid pace, there is little time to write each component of code yourself. That is why libraries and other tools alike exist &#8211; to make our lives easier and to speed up the development process. But how can we keep an overview over all the components we use? After all, the libraries and packages we use come with dependencies we mostly do not know of. Checking our <em>requirements.txt <\/em>file is not enough as it does not keep track of dependencies and sometimes not even version numbers. Python is just an example here, the problem persists through other languages as well.<\/p>\n\n\n\n<p>This is why SBOMs were created. To aid with this problem and increase awareness for packages and their licensing as well as their security.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is an SBOM?<\/h2>\n\n\n\n<p>SBOMs have been around since about 2018, so they are quiet new in terms of information technology. You can consider it a building block for supply chain risk management. The supply chain is everything: every tool, library or package that touches the software or plays any role during its lifecycle.<sup>[1] <\/sup><\/p>\n\n\n\n<p>An SBOM serves as a list of &#8220;ingredients&#8221; that make up software components. They include critical information about libraries, tools and processes used in development and building the software.<sup>[2]<\/sup><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why should you use an SBOM?<\/h2>\n\n\n\n<p>Nowadays software is developed at a rapid pace and developers, include code from open source repositories and proprietary packages, to speed up the development and you wouldn&#8217;t want to reinvent the wheel each time you need a piece of software that is already written. Using these tools is quiet helpful as it saves time and by that money for the companies. But, all these components can contain weaknesses and general security risks that the developers might not know about. A risk report by synopsis released in 2024, consolidated findings from over 1000 open source codebases across 17 industries in 2023. They found that 96% of the total codebases contained open source code and 84% of codebases contained vulnerabilities. Looking back to 2021, the Log4Shell vulnerability inside the Log4j logging framework, affected numerous companies around the world. Only one version was vulnerable but it took companies some time to figure out what version they were running. An SBOM could have helped here as it keeps track of version numbers as well.<sup>[2]<\/sup><\/p>\n\n\n\n<p>Security issues always come with cost attached. Either to fix them prematurely or to fix them after a breach occurred. This of course also brings damage to the company image, that needs to be avoided. This is why all dependencies, images and infrastructure used, need continuous checking for vulnerabilities and weaknesses. An SBOM serves as a great overview over exactly these things. It gives you insight into all components to look for vulnerabilities and licenses, that do not comply with internal and external policies.<sup>[2]<\/sup><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tools for creating an SBOM<\/h2>\n\n\n\n<p>There are two popular types of data exchange standards used in SBOMs. There is the CycloneDX format by OWASP. It emphasizes on security vulnerabilities. It can be formatted in json or xml. SPDX by the Linux foundation focuses more on software licenses.<sup>[3]<\/sup><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>CDX<\/strong><\/td><td><strong>SPDX<\/strong><\/td><\/tr><tr><td>Open source<\/td><td>Open source<\/td><\/tr><tr><td>OWASP<\/td><td>Linux foundation<\/td><\/tr><tr><td>lightweight and focus on vulnerabilities<\/td><td>ensure compliance and transparency<\/td><\/tr><tr><td>focus on ease of adoption and automation<\/td><td><\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\"><sup>[4]<\/sup><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Comparing Tools<\/h2>\n\n\n\n<p>In order to compare both tools, I created a small python application that creates a webserver and accesses the GitHub API:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">import requests\nfrom flask import Flask, jsonify\n\napp = Flask(__name__)\n\n@app.route(&#039;\/&#039;)\ndef home():\n    return &quot;Hello, SBOM&quot;\n\n@app.route(&#039;\/api&#039;)\ndef api():\n    response = requests.get(&#039;http:\/\/api.github.com&#039;)\n    return jsonify(response.json())\n\nif __name__ == &#039;__main__&#039;:\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>When this code is executed, it starts a local webserver on port 5000 and allows you to browse to a window saying &#8220;Hello, SBOM&#8221; and to view the GitHub API.<br>The <em>requirements.txt<\/em> contains the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">Flask\nrequests<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">CycloneDX<\/h2>\n\n\n\n<p>CycloneDX supports a multitude of languages (even Haskell) and can scan your code either locally or as a part of a CI\/CD pipeline. It even has an API server for on demand checks of code. To use CycloneDX for python, there is a pip package called <em>cyclonedx-bom<\/em> (This is similar for other languages; maven has a CycloneDX plugin to create SBOMs during a build). With its command you can generate a multitude of different SBOMs for your python project. See the documentation for more info.<sup>[5]<\/sup><\/p>\n\n\n\n<p>First of all, i created an SBOM using CycloneDX, by firstly installing the pip package:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">pip install cyclonedx-bom<\/code><\/pre>\n\n\n\n<p>And then creating the SBOM using the following command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">cyclonedx-py environment &gt; .\/CycloneDX\/environment.json<\/code><\/pre>\n\n\n\n<p>This gives us the SBOM for out entire environment in CDX format and saves it in the environment.json file.<\/p>\n\n\n\n<p>The syntax here is the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">&quot;components&quot;: &#091;\n\t{\n\t\t&quot;bom-ref&quot;: &quot;Flask==3.0.3&quot;,\n\t\t&quot;description&quot;: &quot;A simple framework for building complex web applications.&quot;,\n\t\t&quot;externalReferences&quot;: &#091;\n\t\t\t{\n\t\t\t\t&quot;comment&quot;: &quot;from packaging metadata Project-URL: Chat&quot;,\n\t\t\t\t&quot;type&quot;: &quot;chat&quot;,\n\t\t\t\t&quot;url&quot;: &quot;https:\/\/discord.gg\/pallets&quot;\n\t\t\t},\n\t\t\t{\n\t\t\t\t&quot;comment&quot;: &quot;from packaging metadata Project-URL: Documentation&quot;,\n\t\t\t\t&quot;type&quot;: &quot;documentation&quot;,\n\t\t\t\t&quot;url&quot;: &quot;https:\/\/flask.palletsprojects.com\/&quot;\n\t\t\t},\n\t\t\t{\n\t\t\t\t&quot;comment&quot;: &quot;from packaging metadata Project-URL: Source&quot;,\n\t\t\t\t&quot;type&quot;: &quot;other&quot;,\n\t\t\t\t&quot;url&quot;: &quot;https:\/\/github.com\/pallets\/flask\/&quot;\n\t\t\t},\n\t\t\t{\n\t\t\t\t&quot;comment&quot;: &quot;from packaging metadata Project-URL: Donate&quot;,\n\t\t\t\t&quot;type&quot;: &quot;other&quot;,\n\t\t\t\t&quot;url&quot;: &quot;https:\/\/palletsprojects.com\/donate&quot;\n\t\t\t},\n\t\t\t{\n\t\t\t\t&quot;comment&quot;: &quot;from packaging metadata Project-URL: Changes&quot;,\n\t\t\t\t&quot;type&quot;: &quot;release-notes&quot;,\n\t\t\t\t&quot;url&quot;: &quot;https:\/\/flask.palletsprojects.com\/changes\/&quot;\n\t\t\t}\n\t\t],\n\t\t&quot;licenses&quot;: &#091;\n\t\t\t{\n\t\t\t\t&quot;license&quot;: {\n\t\t\t\t\t&quot;name&quot;: &quot;License :: OSI Approved :: BSD License&quot;\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\t&quot;name&quot;: &quot;Flask&quot;,\n\t\t&quot;purl&quot;: &quot;pkg:pypi\/flask@3.0.3&quot;,\n\t\t&quot;type&quot;: &quot;library&quot;,\n\t\t&quot;version&quot;: &quot;3.0.3&quot;\n\t},\n&lt;SNIP&gt;<\/code><\/pre>\n\n\n\n<p>As we can see, the overview for a single package is quiet detailed. The first block shows general information. In the second and third, we get a ton of external references, like github or discord links as well as licensing information. The final block then contains other metadata. This is of course so detailed, because Flask is a very popular package to use for writing web backends. Other packages that are not as popular, will not contain such detailed information and certainly not as much.<\/p>\n\n\n\n<p>If we scroll all the way down in the file, we can even see dependencies. So which package depends on which:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">&lt;SNIP&gt;\n&quot;dependencies&quot;: &#091;\n\t{\n\t\t&quot;dependsOn&quot;: &#091;&quot;Jinja2==3.1.4&quot;, &quot;Werkzeug==3.0.3&quot;, &quot;blinker==1.8.2&quot;, &quot;click==8.1.7&quot;, &quot;itsdangerous==2.2.0&quot;],\n\t\t&quot;ref&quot;: &quot;Flask==3.0.3&quot;\n\t},\n\t{\n\t\t&quot;dependsOn&quot;: &#091;&quot;MarkupSafe==2.1.5&quot;],\n\t\t&quot;ref&quot;: &quot;Jinja2==3.1.4&quot;\n\t},\n\t{\n\t\t&quot;ref&quot;: &quot;MarkupSafe==2.1.5&quot;\n\t},\n\t{\n\t\t&quot;dependsOn&quot;: &#091;&quot;MarkupSafe==2.1.5&quot;],\n\t\t&quot;ref&quot;: &quot;Werkzeug==3.0.3&quot;\n\t},\n&lt;SNIP&gt;<\/code><\/pre>\n\n\n\n<p>We can see that Flask itself depends on 5 other packages. They even include the version numbers for our case. Some packages have no dependencies, like <em>MarkupSafe.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Syft<\/h2>\n\n\n\n<p>Syft can create SBOMs in multiple formats, including CDX and SPDX. It is also a CLI tool and can scan containers as well as file systems. You can also create an SBOM using Syfts own format.<sup>[6]<\/sup><\/p>\n\n\n\n<p>I installed Syft inside of a WSL machine locally with the provided command.<sup>[6]<\/sup><\/p>\n\n\n\n<p>Using Syft, I created a multitude of SBOM files. One in CycloneDX format, one in SPDX format, one in Syfts own format, and one in human readable text form.<\/p>\n\n\n\n<p>They all utilize the same syntax for that:<\/p>\n\n\n\n<p>syft . -o [format] &gt; [output file]<\/p>\n\n\n\n<p>Syft then creates SBOMs like this:<\/p>\n\n\n\n<p>CyclonDX:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">{&quot;$schema&quot;:&quot;http:\/\/cyclonedx.org\/schema\/bom-1.6.schema.json&quot;,&quot;bomFormat&quot;:&quot;CycloneDX&quot;,&quot;specVersion&quot;:&quot;1.6&quot;,&quot;serialNumber&quot;:&quot;urn:uuid:870e8bd0-e86b-48ed-a703-a94c1d4e0f8d&quot;,&quot;version&quot;:1,&quot;metadata&quot;:{&quot;timestamp&quot;:&quot;2024-07-21T19:28:56+02:00&quot;,&quot;tools&quot;:{&quot;components&quot;:&#091;{&quot;type&quot;:&quot;application&quot;,&quot;author&quot;:&quot;anchore&quot;,&quot;name&quot;:&quot;syft&quot;,&quot;version&quot;:&quot;1.9.0&quot;}]},&quot;component&quot;:{&quot;bom-ref&quot;:&quot;af63bd4c8601b7f1&quot;,&quot;type&quot;:&quot;file&quot;,&quot;name&quot;:&quot;.&quot;}},&quot;components&quot;:&#091;{&quot;bom-ref&quot;:&quot;pkg:pypi\/flask@3.0.3?package-id=9a5e3b2e12b775ed&quot;,&quot;type&quot;:&quot;library&quot;,&quot;name&quot;:&quot;Flask&quot;,&quot;version&quot;:&quot;3.0.3&quot;,&quot;cpe&quot;:&quot;cpe:2.3:a:palletsprojects:flask:3.0.3:*:*:*:*:*:*:*&quot;,&quot;purl&quot;:&quot;pkg:pypi\/Flask@3.0.3&quot;,&quot;properties&quot;:&#091;{&quot;name&quot;:&quot;syft:package:foundBy&quot;,&quot;value&quot;:&quot;python-installed-package-cataloger&quot;},{&quot;name&quot;:&quot;syft:package:language&quot;,&quot;value&quot;:&quot;python&quot;},{&quot;name&quot;:&quot;syft:package:type&quot;,&quot;value&quot;:&quot;python&quot;},{&quot;name&quot;:&quot;syft:package:metadataType&quot;,&quot;value&quot;:&quot;python-package&quot;},{&quot;name&quot;:&quot;syft:location:0:path&quot;,&quot;value&quot;:&quot;\/testApp\/Lib\/site-packages\/flask-3.0.3.dist-info\/METADATA&quot;}\n&lt;SNIP&gt;<\/code><\/pre>\n\n\n\n<p>This is definitely not human readable. Except if you run the output through a tool to reformat it. All the outputs look very similar to this:<\/p>\n\n\n\n<p>SPDX:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">{&quot;spdxVersion&quot;:&quot;SPDX-2.3&quot;,&quot;dataLicense&quot;:&quot;CC0-1.0&quot;,&quot;SPDXID&quot;:&quot;SPDXRef-DOCUMENT&quot;,&quot;name&quot;:&quot;.&quot;,&quot;documentNamespace&quot;:&quot;https:\/\/anchore.com\/syft\/dir\/b9dc3c0c-0e97-4ba7-ba77-a0849de48ec8&quot;,&quot;creationInfo&quot;:{&quot;licenseListVersion&quot;:&quot;3.24&quot;,&quot;creators&quot;:&#091;&quot;Organization: Anchore, Inc&quot;,&quot;Tool: syft-1.9.0&quot;],&quot;created&quot;:&quot;2024-07-21T17:29:29Z&quot;},&quot;packages&quot;:&#091;{&quot;name&quot;:&quot;Flask&quot;,&quot;SPDXID&quot;:&quot;SPDXRef-Package-python-Flask-9a5e3b2e12b775ed&quot;,&quot;versionInfo&quot;:&quot;3.0.3&quot;,&quot;supplier&quot;:&quot;NOASSERTION&quot;,&quot;downloadLocation&quot;:&quot;NOASSERTION&quot;,&quot;filesAnalyzed&quot;:false,&quot;sourceInfo&quot;:&quot;acquired package info from installed python package manifest file: \/testApp\/Lib\/site-packages\/flask-3.0.3.dist-info\/METADATA, \/testApp\/Lib\/site-packages\/flask-3.0.3.dist-info\/RECORD&quot;,&quot;licenseConcluded&quot;:&quot;NOASSERTION&quot;,&quot;licenseDeclared&quot;:&quot;NOASSERTION&quot;,&quot;copyrightText&quot;:&quot;NOASSERTION&quot;,&lt;SNIP&gt;<\/code><\/pre>\n\n\n\n<p>SYFT Format:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">{&quot;artifacts&quot;:&#091;{&quot;id&quot;:&quot;9a5e3b2e12b775ed&quot;,&quot;name&quot;:&quot;Flask&quot;,&quot;version&quot;:&quot;3.0.3&quot;,&quot;type&quot;:&quot;python&quot;,&quot;foundBy&quot;:&quot;python-installed-package-cataloger&quot;,&quot;locations&quot;:&#091;{&quot;path&quot;:&quot;\/testApp\/Lib\/site-packages\/flask-3.0.3.dist-info\/METADATA&quot;,&quot;accessPath&quot;:&quot;\/testApp\/Lib\/site-packages\/flask-3.0.3.dist-info\/METADATA&quot;,&quot;annotations&quot;:{&quot;evidence&quot;:&quot;primary&quot;}},{&quot;path&quot;:&quot;\/testApp\/Lib\/site-packages\/flask-3.0.3.dist-info\/RECORD&quot;,&quot;accessPath&quot;:&quot;\/testApp\/Lib\/site-packages\/flask-3.0.3.dist-info\/RECORD&quot;,&quot;annotations&quot;:{&quot;evidence&quot;:&quot;supporting&quot;}}],&quot;licenses&quot;:&#091;]&lt;SNIP&gt;<\/code><\/pre>\n\n\n\n<p>As you can see, all these outputs are more machine than human readable.<\/p>\n\n\n\n<p>Syft does provide a human readable format like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">&#091;Path: .]\n&#091;Flask]\n Version:\t 3.0.3\n Type:\t\t python\n Found by:\t python-installed-package-cataloger\n\n&#091;Jinja2]\n Version:\t 3.1.4\n Type:\t\t python\n Found by:\t python-installed-package-cataloger\n&lt;SNIP&gt;<\/code><\/pre>\n\n\n\n<p>But there is a lot of information missing here, like licenses or dependencies.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jake<\/h2>\n\n\n\n<p>Jake is a tool specific to python. You can either generate an SBOM or a report on known vulnerabilities of used components. It is also installed via a pip package and can scan your local directory.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">jake sbom --output-format json -o Jake\/sbom.json<\/code><\/pre>\n\n\n\n<p>With this command we can generate an SBOM and save it to sbom.json. <\/p>\n\n\n\n<p>One immediate problem is once again the readability. It seems that human readability is more the exception than the rule.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">{&quot;$schema&quot;: &quot;http:\/\/cyclonedx.org\/schema\/bom-1.4.schema.json&quot;, &quot;bomFormat&quot;: &quot;CycloneDX&quot;, &quot;specVersion&quot;: &quot;1.4&quot;, &quot;serialNumber&quot;: &quot;urn:uuid:84961009-c747-4ace-968f-167284c4e87f&quot;, &quot;version&quot;: 1, &quot;metadata&quot;: {&quot;timestamp&quot;: &quot;2024-07-23T19:51:44.666349+00:00&quot;, &quot;tools&quot;: &#091;{&quot;vendor&quot;: &quot;CycloneDX&quot;, &quot;name&quot;: &quot;cyclonedx-python-lib&quot;, &quot;version&quot;: &quot;3.1.5&quot;, &quot;externalReferences&quot;: &#091;{&quot;url&quot;: &quot;https:\/\/github.com\/CycloneDX\/cyclonedx-python-lib\/actions&quot;, &quot;type&quot;: &quot;build-system&quot;}, {&quot;url&quot;: &quot;https:\/\/pypi.org\/project\/cyclonedx-python-lib\/&quot;, &quot;type&quot;: &quot;distribution&quot;}, {&quot;url&quot;: &quot;https:\/\/cyclonedx.github.io\/cyclonedx-python-lib\/&quot;, &quot;type&quot;: &quot;documentation&quot;}, {&quot;url&quot;: &quot;https:\/\/github.com\/CycloneDX\/cyclonedx-python-lib\/issues&quot;, &quot;type&quot;: &quot;issue-tracker&quot;}, {&quot;url&quot;: &quot;https:\/\/github.com\/CycloneDX\/cyclonedx-python-lib\/blob\/main\/LICENSE&quot;, &quot;type&quot;: &quot;license&quot;}, {&quot;url&quot;: &quot;https:\/\/github.com\/CycloneDX\/cyclonedx-python-lib\/blob\/main\/CHANGELOG.md&quot;, &quot;type&quot;: &quot;release-notes&quot;}, {&quot;url&quot;: &quot;https:\/\/github.com\/CycloneDX\/cyclonedx-python-lib&quot;, &quot;type&quot;: &quot;vcs&quot;}, {&quot;url&quot;: &quot;https:\/\/cyclonedx.org&quot;, &quot;type&quot;: &quot;website&quot;}]}, {&quot;vendor&quot;: &quot;Sonatype Nexus Community&quot;, &quot;name&quot;: &quot;jake&quot;, &quot;version&quot;: &quot;3.0.14&quot;, &quot;externalReferences&quot;: &#091;{&quot;url&quot;: &quot;https:\/\/app.circleci.com\/pipelines\/github\/sonatype-nexus-community\/jake&quot;, &quot;type&quot;: &quot;build-system&quot;}, {&quot;url&quot;: &quot;https:\/\/pypi.org\/project\/jake\/&quot;, &quot;type&quot;: &quot;distribution&quot;},\n&lt;SNIP&gt;<\/code><\/pre>\n\n\n\n<p>But we once again get a lot of meta data at the beginning of the file and licensing information. The output seems very similar to the one of Syft but, we can notice a few differences. The tool relies on the Sonatype OSS Index, which is a catalogue for open source components and scanning tools.<sup>[7][8]<\/sup><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Which SBOM tool you use is entirely up to you. Most are well documented and easy to implement. If you need it to be human readable and not just machine readable, you should have another tool at hand to reformat some of the outputs. But, all three tools find the same things and provide very similar output. Notably, Syft provides more metadata than CycloneDX, like timestamp, format, version of Syft and more. CycloneDX focuses more on the important part. It does not give as much metadata than Syft but gives the information on components and dependencies in a much more readable and clearer way. Jake has more similarities with Syft than CycloneDX, in terms of metadata and readability. But the ability to also generate an automated risk report can be quiet helpful.<\/p>\n\n\n\n<p>So, should you use SBOMs in your Projects? Yes, definitely. The amount of work you have to put into creating an SBOM or including it into your build pipeline is way less, than trying to figure out all dependencies\/versions yourself.<\/p>\n\n\n\n<p>It also increases security awareness. By looking through your SBOM you can spot vulnerable versions way easier.<\/p>\n\n\n\n<p>You can also ensure compliance as they provide a great overview over licensing information.<\/p>\n\n\n\n<p>[1] <a href=\"https:\/\/www.synopsys.com\/glossary\/what-is-software-supply-chain-security.html\">https:\/\/www.synopsys.com\/glossary\/what-is-software-supply-chain-security.html<\/a><\/p>\n\n\n\n<p>[2] <a href=\"https:\/\/about.gitlab.com\/blog\/2022\/10\/25\/the-ultimate-guide-to-sboms\">https:\/\/about.gitlab.com\/blog\/2022\/10\/25\/the-ultimate-guide-to-sboms<\/a><\/p>\n\n\n\n<p>[3] <a href=\"https:\/\/www.wiz.io\/academy\/top-open-source-sbom-tools\">https:\/\/www.wiz.io\/academy\/top-open-source-sbom-tools<\/a><\/p>\n\n\n\n<p>[4] <a href=\"https:\/\/scribesecurity.com\/blog\/spdx-vs-cyclonedx-sbom-formats-compared\/\">https:\/\/scribesecurity.com\/blog\/spdx-vs-cyclonedx-sbom-formats-compared\/<\/a><\/p>\n\n\n\n<p>[5] <a href=\"https:\/\/github.com\/CycloneDX\/cyclonedx-python\">https:\/\/github.com\/CycloneDX\/cyclonedx-python<\/a><\/p>\n\n\n\n<p>[6] <a href=\"https:\/\/anchore.com\/sbom\/how-to-generate-an-sbom-with-free-open-source-tools\/\">https:\/\/anchore.com\/sbom\/how-to-generate-an-sbom-with-free-open-source-tools\/<\/a><\/p>\n\n\n\n<p>[7] <a href=\"https:\/\/ossindex.sonatype.org\/\">https:\/\/ossindex.sonatype.org<\/a><\/p>\n\n\n\n<p>[8] <a href=\"https:\/\/github.com\/sonatype-nexus-community\/jake\">https:\/\/github.com\/sonatype-nexus-community\/jake<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In times, where software develops at a rapid pace, there is little time to write each component of code yourself. That is why libraries and other tools alike exist &#8211; to make our lives easier and to speed up the development process. But how can we keep an overview over all the components we use? [&hellip;]<\/p>\n","protected":false},"author":1167,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[150],"ppma_author":[976],"class_list":["post-26340","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-ci-cd"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":27870,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/07\/25\/tools-zur-automatischen-erstellung-von-sboms\/","url_meta":{"origin":26340,"position":0},"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":27382,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/tools-zur-automatischen-erstellung-von-software-bill-of-materials-sbom\/","url_meta":{"origin":26340,"position":1},"title":"Tools zur automatischen Erstellung von Software Bill of Materials (SBOM)","author":"Dorina Sobiecki","date":"27. February 2025","format":false,"excerpt":"Anmerkung: Dieser Blogpost wurde f\u00fcr das Modul Enterprise IT (113601a) verfasst. 1. Einleitung Die fortschreitende Digitalisierung und die zunehmende Vernetzung von Softwaresystemen haben Cybersicherheit zu einem zentralen Thema f\u00fcr Unternehmen, Beh\u00f6rden und Endnutzer gemacht. Transparenz \u00fcber die eingesetzten Softwarekomponenten ist dabei essenziell, um Sicherheitsl\u00fccken zu identifizieren und regulatorische Anforderungen zu\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":27883,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/07\/25\/tools-zur-automatischen-erstellung-von-software-bill-of-materials-sbom-2\/","url_meta":{"origin":26340,"position":2},"title":"Tools zur automatischen Erstellung von Software Bill of Materials (SBOM)","author":"Luca-Max Baur","date":"25. July 2025","format":false,"excerpt":"Anmerkung:\u00a0Dieser Blogpost wurde w\u00e4hrend dem Sommersemester 2025 f\u00fcr das Modul Enterprise IT (113601a) verfasst. \u201eI cant fix what I cant see\u201cOhne Kenntnisse \u00fcber die benutzten Komponenten und Libraries agieren Softwareentwickler wie im Blindflug bez\u00fcglich ihrer Software-Sicherheit. Bekannte Supply Chain Angriffe wie SolarWinds oder die Log4shell L\u00fccke haben genau dies gezeigt.\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":28011,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/09\/11\/cloud-native-security-scanner\/","url_meta":{"origin":26340,"position":3},"title":"Cloud-native Security Scanner","author":"Tim Ruff","date":"11. September 2025","format":false,"excerpt":"Dieses Projekt wurde im Rahmen der Vorlesung \u201eSoftware Development for Cloud Computing\u201c umgesetzt. Ausgangslage und Projektidee Unser bisheriger Fokus im Studium lag haupts\u00e4chlich auf Themen der IT-Security und Machine Learning, weshalb wir beide bis auf die grundlegenden Vorlesungen zum Thema Software Entwicklung kaum Erfahrungen in diesem Bereich gesammelt haben. Aus\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\/2025\/09\/image.jpeg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/09\/image.jpeg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/09\/image.jpeg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/09\/image.jpeg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/09\/image.jpeg?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":22187,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/","url_meta":{"origin":26340,"position":4},"title":"Software Dependencies &#8211; Die Gefahr aus der Tiefe","author":"Eric Prytulla","date":"25. February 2022","format":false,"excerpt":"\"Unbekannte infiltrieren Paketmanager npm und verseuchen Tools mit Schadcode\" 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: \"Aha toll\", aber sp\u00e4testens bei React oder\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\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":23067,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/15\/security-strategies-and-best-practices-for-microservices-architecture\/","url_meta":{"origin":26340,"position":5},"title":"Security Strategies and Best Practices for Microservices Architecture","author":"Larissa Schmauss","date":"15. March 2022","format":false,"excerpt":"Microservices architectures seem to be the new trend in the approach to application development. However, one should always keep in mind that microservices architectures are always closely associated with a specific environment:\u00a0Companies want to develop faster and faster, but resources are also becoming more limited, so they now want to\u2026","rel":"","context":"In &quot;Scalable Systems&quot;","block_context":{"text":"Scalable Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/"},"img":{"alt_text":"","src":"https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a","width":350,"height":200,"srcset":"https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a 1x, https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":976,"user_id":1167,"is_guest":0,"slug":"tim_drobny","display_name":"Tim Drobny","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5e5af04f84e925c83ea6c89489e956eb22ae9e2b0e947192960a1722f9962828?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\/26340","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\/1167"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=26340"}],"version-history":[{"count":11,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26340\/revisions"}],"predecessor-version":[{"id":26369,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26340\/revisions\/26369"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=26340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=26340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=26340"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=26340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}