<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Suman Mandal</title>
    <description>The latest articles on DEV Community by Suman Mandal (@jijo-007).</description>
    <link>https://dev.to/jijo-007</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3293123%2F74ece689-d664-40f1-b78f-5cb1b1e0875f.jpg</url>
      <title>DEV Community: Suman Mandal</title>
      <link>https://dev.to/jijo-007</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jijo-007"/>
    <language>en</language>
    <item>
      <title>From Design Discussions to Production: Building Report Metadata Protection in Kubescape</title>
      <dc:creator>Suman Mandal</dc:creator>
      <pubDate>Thu, 30 Jul 2026 06:29:43 +0000</pubDate>
      <link>https://dev.to/jijo-007/from-design-discussions-to-production-building-report-metadata-protection-in-kubescape-de2</link>
      <guid>https://dev.to/jijo-007/from-design-discussions-to-production-building-report-metadata-protection-in-kubescape-de2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ua2bzlt6fahppfhnqn4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ua2bzlt6fahppfhnqn4.jpg" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article focuses on the engineering journey behind designing and implementing &lt;strong&gt;Report Metadata Protection&lt;/strong&gt; in &lt;strong&gt;Kubescape v4.0.11&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you're looking for installation instructions, usage examples, or command reference for &lt;code&gt;--hide&lt;/code&gt;, &lt;code&gt;--encrypt&lt;/code&gt;, and &lt;code&gt;kubescape decrypt&lt;/code&gt;, please refer to the official Kubescape documentation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official Documentation:&lt;/strong&gt; &lt;a href="https://kubescape.io/docs/scanning/#protecting-report-metadata" rel="noopener noreferrer"&gt;https://kubescape.io/docs/scanning/#protecting-report-metadata&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Can a Security Report Become a Security Risk?
&lt;/h1&gt;

&lt;p&gt;That question stayed with me throughout this project.&lt;/p&gt;

&lt;p&gt;Security scanners exist to help organizations improve their security posture. They identify vulnerabilities, misconfigurations, exposed secrets, and policy violations. But while working with Kubescape, I realized something interesting.&lt;/p&gt;

&lt;p&gt;The reports themselves often contain sensitive information.&lt;/p&gt;

&lt;p&gt;A typical scan report may include Kubernetes namespaces, workload names, repository metadata, Git information, source file paths, container image names, and other identifiers that reveal details about an organization's infrastructure.&lt;/p&gt;

&lt;p&gt;These reports are frequently shared outside engineering teams—for compliance reviews, customer support, security audits, or even when opening issues in public repositories.&lt;/p&gt;

&lt;p&gt;At that point, I started asking myself a simple question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can a security report itself become a security concern?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer was yes.&lt;/p&gt;

&lt;p&gt;That question eventually became the starting point for &lt;strong&gt;Report Metadata Protection&lt;/strong&gt;, a feature that shipped with &lt;strong&gt;Kubescape v4.0.11&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article isn't about how to use the feature. Instead, it's about everything that happened before the feature reached users.&lt;/p&gt;







&lt;h1&gt;
  
  
  The Problem We Were Actually Trying to Solve
&lt;/h1&gt;

&lt;p&gt;When people hear the phrase &lt;strong&gt;"security report,"&lt;/strong&gt; the assumption is that the report itself is safe to share.&lt;/p&gt;

&lt;p&gt;After all, it's the output of a security scanner.&lt;/p&gt;

&lt;p&gt;But while working on Kubescape, I realized something interesting.&lt;/p&gt;

&lt;p&gt;Although the report doesn't expose secrets like passwords or API tokens, it often contains metadata that can reveal a surprising amount about an organization's infrastructure.&lt;/p&gt;

&lt;p&gt;For example, a report may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes namespaces&lt;/li&gt;
&lt;li&gt;Workload and deployment names&lt;/li&gt;
&lt;li&gt;Container image names&lt;/li&gt;
&lt;li&gt;Repository information&lt;/li&gt;
&lt;li&gt;Git metadata&lt;/li&gt;
&lt;li&gt;Source file paths&lt;/li&gt;
&lt;li&gt;Cluster resource names&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually, none of these fields are necessarily sensitive.&lt;/p&gt;

&lt;p&gt;Together, however, they paint a detailed picture of an organization's environment.&lt;/p&gt;

&lt;p&gt;Many organizations share scan reports with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security consultants&lt;/li&gt;
&lt;li&gt;Customers&lt;/li&gt;
&lt;li&gt;Compliance auditors&lt;/li&gt;
&lt;li&gt;Open-source maintainers&lt;/li&gt;
&lt;li&gt;Internal teams outside engineering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those situations, exposing infrastructure metadata may not be acceptable.&lt;/p&gt;

&lt;p&gt;The obvious solution might seem to be removing all of that information.&lt;/p&gt;

&lt;p&gt;Unfortunately, that creates another problem.&lt;/p&gt;

&lt;p&gt;Most security findings reference workloads, namespaces, or resources.&lt;/p&gt;

&lt;p&gt;If those identifiers disappear completely, the report quickly becomes difficult to understand.&lt;/p&gt;

&lt;p&gt;That led us to a fundamental engineering challenge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How can we protect sensitive metadata without making the report useless?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single question influenced almost every design decision that followed.&lt;/p&gt;

&lt;p&gt;Instead of asking &lt;em&gt;"How do we hide names?"&lt;/em&gt;, the real question became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do we preserve the usefulness of a security report while protecting the information organizations don't want to expose?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything else—the anonymization pipeline, encryption support, decryption workflow, and CLI design—was built to answer that question.&lt;/p&gt;




&lt;h1&gt;
  
  
  From One Idea to Two Different Workflows
&lt;/h1&gt;

&lt;p&gt;Initially, I thought there would be a single solution.&lt;/p&gt;

&lt;p&gt;As the design discussions evolved, it became clear that different users had different requirements.&lt;/p&gt;

&lt;p&gt;Some users wanted reports they could safely share without exposing infrastructure names.&lt;/p&gt;

&lt;p&gt;Others needed actual cryptographic protection because reports might travel outside trusted environments.&lt;/p&gt;

&lt;p&gt;Trying to satisfy both requirements with a single implementation would have complicated the user experience.&lt;/p&gt;

&lt;p&gt;Instead, the feature evolved into two complementary workflows.&lt;/p&gt;

&lt;p&gt;The first focuses on &lt;strong&gt;hiding&lt;/strong&gt; sensitive identifiers while preserving the structure of the report.&lt;/p&gt;

&lt;p&gt;The second focuses on &lt;strong&gt;encrypting&lt;/strong&gt; sensitive metadata so that it can later be recovered only by someone who possesses the correct master key.&lt;/p&gt;

&lt;p&gt;Although both workflows aim to protect report metadata, they solve different problems.&lt;/p&gt;

&lt;p&gt;Understanding that distinction became one of the most important design decisions during development.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building the &lt;code&gt;--hide&lt;/code&gt; Workflow
&lt;/h1&gt;

&lt;p&gt;The first capability introduced was the &lt;code&gt;--hide&lt;/code&gt; flag.&lt;/p&gt;

&lt;p&gt;At first glance, replacing names might sound simple.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;Simply removing values would make reports difficult to understand.&lt;/p&gt;

&lt;p&gt;Imagine every workload name becoming an empty string.&lt;/p&gt;

&lt;p&gt;Relationships between resources would disappear, making debugging much harder.&lt;/p&gt;

&lt;p&gt;Instead, the implementation generates deterministic pseudonyms.&lt;/p&gt;

&lt;p&gt;That means identical values always produce identical replacements.&lt;/p&gt;

&lt;p&gt;For example, if the namespace &lt;code&gt;production&lt;/code&gt; appears in twenty different places inside the report, every occurrence is replaced with the same pseudonym.&lt;/p&gt;

&lt;p&gt;Although the original value is hidden, the relationships remain intact.&lt;/p&gt;

&lt;p&gt;This allows users to understand the report without exposing sensitive infrastructure details.&lt;/p&gt;

&lt;p&gt;This was an important balance between usability and privacy.&lt;/p&gt;

&lt;p&gt;The goal wasn't encryption.&lt;/p&gt;

&lt;p&gt;The goal was making reports safer to share while preserving their usefulness.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why &lt;code&gt;--hide&lt;/code&gt; Wasn't Enough
&lt;/h1&gt;

&lt;p&gt;As discussions continued, another use case became clear.&lt;/p&gt;

&lt;p&gt;Some organizations don't simply want identifiers hidden.&lt;/p&gt;

&lt;p&gt;They need them to remain confidential while still allowing authorized users to recover the original values later.&lt;/p&gt;

&lt;p&gt;That requirement cannot be solved through pseudonymization.&lt;/p&gt;

&lt;p&gt;Once a value has been replaced, there is no secure way to recover the original information.&lt;/p&gt;

&lt;p&gt;This is where encryption became necessary.&lt;/p&gt;

&lt;p&gt;Rather than extending the &lt;code&gt;--hide&lt;/code&gt; implementation beyond its intended purpose, Kubescape introduced a separate workflow dedicated to protecting report metadata through encryption.&lt;/p&gt;

&lt;p&gt;The result was a much cleaner design.&lt;/p&gt;

&lt;p&gt;Each workflow now had a clear responsibility.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--hide&lt;/code&gt; reduces accidental exposure.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--encrypt&lt;/code&gt; provides cryptographic confidentiality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trying to combine both into a single workflow would have made the feature harder to understand and maintain.&lt;/p&gt;

&lt;p&gt;Separating them made both implementations simpler and more intuitive.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Engineering Lesson That Stood Out
&lt;/h1&gt;

&lt;p&gt;Looking back, I don't think the most valuable lesson from this project was learning how to implement anonymization.&lt;/p&gt;

&lt;p&gt;It was learning that software design is about understanding trade-offs.&lt;/p&gt;

&lt;p&gt;There is rarely a single "correct" solution.&lt;/p&gt;

&lt;p&gt;Every design decision introduces compromises.&lt;/p&gt;

&lt;p&gt;Removing metadata makes reports less useful.&lt;/p&gt;

&lt;p&gt;Pseudonymization preserves usability but isn't intended to provide cryptographic protection.&lt;/p&gt;

&lt;p&gt;Encryption protects confidentiality but introduces key management and recovery workflows.&lt;/p&gt;

&lt;p&gt;Choosing between those approaches wasn't just an implementation decision.&lt;/p&gt;

&lt;p&gt;It was a product design decision.&lt;/p&gt;

&lt;p&gt;As contributors, it's easy to jump straight into writing code.&lt;/p&gt;

&lt;p&gt;This project reminded me that the quality of the implementation often depends on the quality of the conversations that happen before implementation even begins.&lt;/p&gt;




&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;This article focused on the journey from identifying a security problem to designing the overall solution.&lt;/p&gt;

&lt;p&gt;In the next part, I'll dive into the implementation itself, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the anonymization pipeline was designed&lt;/li&gt;
&lt;li&gt;Why deterministic pseudonyms were chosen&lt;/li&gt;
&lt;li&gt;Integrating the feature into Kubescape's scanning pipeline&lt;/li&gt;
&lt;li&gt;CLI design decisions&lt;/li&gt;
&lt;li&gt;Lessons learned while implementing the feature in Go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually, I'll also write about the encryption architecture, including the Data Encryption Key (DEK), master key management, why the master key never travels with the report, and how &lt;code&gt;kubescape decrypt&lt;/code&gt; restores protected metadata.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This feature taught me much more than how to build anonymization or encryption into a security tool.&lt;/p&gt;

&lt;p&gt;It showed me what building production software in an open-source project really looks like.&lt;/p&gt;

&lt;p&gt;Ideas become discussions.&lt;/p&gt;

&lt;p&gt;Discussions become design decisions.&lt;/p&gt;

&lt;p&gt;Design decisions become implementations.&lt;/p&gt;

&lt;p&gt;Implementations become documentation.&lt;/p&gt;

&lt;p&gt;And finally, after many rounds of review and collaboration, they become features that thousands of users can rely on.&lt;/p&gt;

&lt;p&gt;That journey—from design discussions to production—is what made this project so rewarding.&lt;/p&gt;




&lt;h1&gt;
  
  
  About Me
&lt;/h1&gt;

&lt;p&gt;Hi! I'm &lt;strong&gt;Suman Mandal&lt;/strong&gt; (GitHub: &lt;strong&gt;&lt;a href="https://github.com/jijo-OO7" rel="noopener noreferrer"&gt;@jijo-OO7&lt;/a&gt;&lt;/strong&gt;), an open-source contributor passionate about Kubernetes, cloud-native technologies, and security engineering.&lt;/p&gt;

&lt;p&gt;Through this blog series, I want to share not only the technical details behind the features I build, but also the engineering decisions, design trade-offs, review process, and lessons that aren't always visible in a merged pull request.&lt;/p&gt;

&lt;p&gt;If you're beginning your own open-source journey, I hope my experiences can make yours a little easier.&lt;/p&gt;

&lt;p&gt;You can find me here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐙 GitHub: &lt;a href="https://github.com/jijo-OO7" rel="noopener noreferrer"&gt;https://github.com/jijo-OO7&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading, and I'll see you in the next part, where I'll dive into the implementation of the &lt;code&gt;--hide&lt;/code&gt; workflow and the design decisions behind it.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Bridging the Gap: Converting SPDX 3.0 to 2.3 in the Software Supply Chain</title>
      <dc:creator>Suman Mandal</dc:creator>
      <pubDate>Thu, 16 Apr 2026 07:43:48 +0000</pubDate>
      <link>https://dev.to/jijo-007/bridging-the-gap-converting-spdx-30-to-23-in-the-software-supply-chain-3omc</link>
      <guid>https://dev.to/jijo-007/bridging-the-gap-converting-spdx-30-to-23-in-the-software-supply-chain-3omc</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction: What is SPDX?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the root of modern software supply chain security lies SPDX—short for Software Package Data Exchange.&lt;/p&gt;

&lt;p&gt;At its core, SPDX is a standardized format for describing what’s inside a piece of software.&lt;/p&gt;

&lt;p&gt;Think of it as an ingredients label for software.&lt;/p&gt;

&lt;p&gt;An SPDX document helps answer critical questions such as:&lt;br&gt;
What packages are included?&lt;br&gt;
What files exist?&lt;br&gt;
What licenses apply?&lt;br&gt;
Who created the software?&lt;br&gt;
How do different components relate to each other?&lt;br&gt;
Why SPDX Matters&lt;/p&gt;

&lt;p&gt;In real-world scenarios, when you install something like:&lt;/p&gt;

&lt;p&gt;a Docker image&lt;br&gt;
an npm package&lt;br&gt;
a Linux distribution&lt;/p&gt;

&lt;p&gt;…you are pulling in hundreds (sometimes thousands) of dependencies.&lt;/p&gt;

&lt;p&gt;SPDX provides a structured way to declare:&lt;/p&gt;

&lt;p&gt;“Here’s everything inside this software—legally and technically.”&lt;/p&gt;

&lt;p&gt;This is essential for:&lt;/p&gt;

&lt;p&gt;SBOMs (Software Bill of Materials)&lt;br&gt;
Supply chain security&lt;br&gt;
License compliance&lt;br&gt;
CI/CD automation pipelines&lt;/p&gt;

&lt;p&gt;Major organizations like Google, Microsoft, and Red Hat rely on SPDX or compatible standards internally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s Inside an SPDX Document?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An SPDX document typically consists of:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Packages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Includes metadata such as name, version, and supplier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Individual files along with their associated licenses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Relationships&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Defines how components interact, for example:&lt;/p&gt;

&lt;p&gt;“A depends on B”&lt;br&gt;
“A contains B”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Licenses&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Standard identifiers like MIT, Apache-2.0, GPL, etc.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SPDX Versions: Why This Project Exists&lt;br&gt;
SPDX 2.3 (Target)&lt;br&gt;
Document-based structure&lt;br&gt;
Organized into sections (packages, files, relationships)&lt;br&gt;
Simpler and widely adopted&lt;br&gt;
SPDX 3.0 (Source)&lt;br&gt;
Graph-based model&lt;br&gt;
Modular design (profiles like software, security, AI, etc.)&lt;br&gt;
Far more expressive and flexible&lt;/p&gt;

&lt;p&gt;This shift from a document model → graph model is powerful—but it introduces a major challenge:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backward compatibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Core Problem: Not Transformation, But Controlled Loss&lt;/p&gt;

&lt;p&gt;I’ve been working on contributing to SPDX tooling this summer, specifically focusing on:&lt;/p&gt;

&lt;p&gt;SPDX 3.0 → SPDX 2.3 backward conversion&lt;/p&gt;

&lt;p&gt;At first glance, this might sound like a simple transformation—but it’s not.&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;p&gt;SPDX 3.0 is graph-based&lt;br&gt;
SPDX 2.3 is document-based&lt;/p&gt;

&lt;p&gt;Not all information in 3.0 can be represented in 2.3.&lt;/p&gt;

&lt;p&gt;So the goal is not a perfect transformation.&lt;/p&gt;

&lt;p&gt;Instead, the real objective is:&lt;/p&gt;

&lt;p&gt;Controlled loss of information&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;p&gt;Preserving what can be represented in 2.3&lt;br&gt;
Gracefully handling what cannot&lt;br&gt;
Ensuring no critical data is silently lost&lt;br&gt;
Why This Matters for End Users&lt;/p&gt;

&lt;p&gt;While SPDX 3.0 is the future, many existing systems still rely on SPDX 2.3.&lt;/p&gt;

&lt;p&gt;A backward conversion enables:&lt;/p&gt;

&lt;p&gt;Compatibility with legacy tooling&lt;br&gt;
Gradual migration to SPDX 3.0&lt;br&gt;
Continued support for existing compliance systems&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;p&gt;It allows ecosystems to adopt SPDX 3.0 without breaking what already works.&lt;/p&gt;

&lt;p&gt;Where tools-golang Fits In&lt;/p&gt;

&lt;p&gt;The tools-golang project provides Go-based utilities for working with SPDX documents.&lt;/p&gt;

&lt;p&gt;It is commonly used to:&lt;/p&gt;

&lt;p&gt;Parse SPDX files&lt;br&gt;
Generate SPDX outputs&lt;br&gt;
Validate document structure&lt;/p&gt;

&lt;p&gt;However:&lt;/p&gt;

&lt;p&gt;It primarily supports SPDX 2.x&lt;br&gt;
It does not fully support SPDX 3.0 yet&lt;/p&gt;

&lt;p&gt;This makes it a natural fit for:&lt;/p&gt;

&lt;p&gt;Generating valid SPDX 2.3 output after conversion&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The evolution from SPDX 2.3 → 3.0 represents a major leap in how we model software systems—from static documents to rich, interconnected graphs.&lt;/p&gt;

&lt;p&gt;But with that progress comes a practical challenge: ensuring backward compatibility.&lt;/p&gt;

&lt;p&gt;The work on SPDX 3.0 → 2.3 conversion sits right at this intersection.&lt;/p&gt;

&lt;p&gt;It’s not about perfect translation—it’s about:&lt;/p&gt;

&lt;p&gt;Making thoughtful trade-offs&lt;br&gt;
Preserving essential information&lt;br&gt;
Enabling real-world adoption&lt;/p&gt;

&lt;p&gt;As the software supply chain ecosystem continues to evolve, solutions like this will play a key role in bridging the gap between where we are and where we’re going.&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
    </item>
  </channel>
</rss>
