<?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: Gavriliuc Vlada</title>
    <description>The latest articles on DEV Community by Gavriliuc Vlada (@gavriliucvlada).</description>
    <link>https://dev.to/gavriliucvlada</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%2F4064363%2F8d0d1165-96bc-49ec-94b6-9239bb874167.jpg</url>
      <title>DEV Community: Gavriliuc Vlada</title>
      <link>https://dev.to/gavriliucvlada</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gavriliucvlada"/>
    <language>en</language>
    <item>
      <title>The npm Worm That Keeps Coming Back — And Why Governments Are Finally Procuring a Fix</title>
      <dc:creator>Gavriliuc Vlada</dc:creator>
      <pubDate>Tue, 08 Sep 2026 11:22:08 +0000</pubDate>
      <link>https://dev.to/gavriliucvlada/the-npm-worm-that-keeps-coming-back-and-why-governments-are-finally-procuring-a-fix-41cf</link>
      <guid>https://dev.to/gavriliucvlada/the-npm-worm-that-keeps-coming-back-and-why-governments-are-finally-procuring-a-fix-41cf</guid>
      <description>&lt;p&gt;On August 28, 2026, a npm package called &lt;code&gt;@7nohe/openapi-react-query-codegen&lt;/code&gt; — a TanStack Query codegen tool with over 150,000 weekly downloads — started shipping malware. Ten malicious versions went out in twenty minutes. If that timeline sounds familiar, it should: this is the same Shai-Hulud worm family that's been eating through the npm and PyPI ecosystems since September 2025, now on its latest variant, nicknamed &lt;strong&gt;Trinitite&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What's actually interesting here isn't just "another supply chain attack." It's how the attack got in, how little changed about the fix, and — maybe more relevant if you build software that governments end up buying — how regulators are starting to respond with actual procurement, not just guidance documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Trinitite Got In
&lt;/h2&gt;

&lt;p&gt;The compromised release workflow had a genuinely dumb weak point: it treated a pull request comment containing the literal string "npm publish" as authorization to publish a release. No check that the commenter was a maintainer. The attacker checked out the PR, and GitHub Actions OIDC did the rest, publishing straight through the project's own trusted, legitimate pipeline.&lt;/p&gt;

&lt;p&gt;This is the pattern that's defined the whole Shai-Hulud campaign since the original TanStack compromise in May 2026 (CVE-2026-45321, CVSS 9.6): attackers aren't targeting the package anymore, they're targeting the pipeline. That May incident chained a &lt;code&gt;pull_request_target&lt;/code&gt; trigger, GitHub Actions cache poisoning, and OIDC token extraction from runner process memory — and the packages it produced carried &lt;strong&gt;valid SLSA Build Level 3 provenance attestations&lt;/strong&gt;. Read that again: a worm that produces validly signed, attested malicious packages. Provenance confirms where an artifact was built. It says nothing about whether attacker-controlled code executed inside that trusted environment.&lt;/p&gt;

&lt;p&gt;Once installed, Trinitite runs a fairly elaborate obfuscation chain — an XOR-wrapped loader, a hidden &lt;code&gt;binding.gyp&lt;/code&gt; execution path that fires even when you run &lt;code&gt;npm install --ignore-scripts&lt;/code&gt;, AES-256-GCM encrypted payload blobs — before dropping into familiar Shai-Hulud territory: stealing GitHub, npm, PyPI, RubyGems, cloud, Vault, and Kubernetes credentials, then republishing itself through any package the stolen credentials can reach.&lt;/p&gt;

&lt;p&gt;One detail that puts the scale in perspective: &lt;a href="https://thehackernews.com/2026/09/shai-huluds-reach-just-grew-to-469.html" rel="noopener noreferrer"&gt;a report from early September found that the latest Shai-Hulud variant now scans 469 distinct credential locations across developer machines, CI/CD tooling, cloud configs, and even AI tool configs&lt;/a&gt;, up from 189 in earlier versions. The attackers aren't breaking trust relationships anymore. They're just harvesting the credentials that make those relationships work in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Just Review Your Dependencies" Isn't Really an Answer Anymore
&lt;/h2&gt;

&lt;p&gt;Every writeup on this campaign converges on roughly the same mitigation list: lock down GitHub Actions cache and fork PR behavior, restrict which workflows can mint OIDC publish tokens, don't trust a passing provenance check as proof of safety, treat every secret reachable from a build environment as already exposed.&lt;/p&gt;

&lt;p&gt;All correct. All also things a single team can only partially control, because the actual risk isn't your code — it's the 500+ transitive dependencies you didn't write, sitting in a supply chain you can't fully see. That's exactly the gap a &lt;strong&gt;Software Bill of Materials (SBOM)&lt;/strong&gt; is meant to close: a structured, machine-readable inventory of every component and dependency in a piece of software, so when the next Trinitite-style compromise hits, you can actually answer "are we exposed?" in minutes instead of days of manually grepping lockfiles.&lt;/p&gt;

&lt;p&gt;SBOMs for traditional software are already a regulatory requirement in the EU under the Cyber Resilience Act. What's newer, and what makes this genuinely current, is that the same idea is now being extended specifically to AI systems — where the "dependency graph" includes not just packages but models, datasets, and fine-tuning pipelines, none of which fit cleanly into a traditional SBOM format.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Government Is Already Procuring This
&lt;/h2&gt;

&lt;p&gt;Here's where it stops being abstract. Germany's Federal Office for Information Security (BSI) has an &lt;a href="https://tenderwell.com/tender/projekt-1034-technische-umsetzung-einer-sbom-fur-ki-sbom4ai-47441106" rel="noopener noreferrer"&gt;open tender for a project called SBOM4AI&lt;/a&gt;, published August 28, 2026 — the same day Trinitite started shipping, though the timing there is coincidental rather than causal.&lt;/p&gt;

&lt;p&gt;The scope is specific: take the "SBOM for AI – Minimum Elements" concept published under the G7 framework and turn it into an actual technical implementation — a system that automatically generates a machine-readable SBOM for AI systems, in a format usable by developers, auditors, and regulators, explicitly designed to support Cyber Resilience Act auditability requirements. Contract duration is 18 months, deadline for bids is September 28, 2026.&lt;/p&gt;

&lt;p&gt;What I find worth paying attention to isn't the tender itself so much as what it signals: a national cybersecurity authority is treating "we don't have a standard, automatable way to know what's inside an AI system's supply chain" as a problem serious enough to fund directly, rather than waiting for the private sector or a nonprofit consortium to solve it. Given that AI coding assistants are themselves accelerating how fast new dependencies get pulled into codebases — often outside standard package managers entirely — that's not a bad instinct.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Actually Means for Your Pipeline
&lt;/h2&gt;

&lt;p&gt;You don't need a government contract to take the lesson here. A few concrete things worth doing regardless of team size:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate an SBOM as part of your build, not as an afterthought.&lt;/strong&gt; Tools like Syft, CycloneDX, or GitHub's own dependency graph can do this automatically; the point is having it before an incident, not scrambling to reconstruct it during one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop trusting provenance as a safety signal.&lt;/strong&gt; SLSA attestations tell you where something was built. They don't tell you the build wasn't compromised in-flight, as Trinitite proved twice now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolate fork PR workflows from cache and publish permissions.&lt;/strong&gt; The &lt;code&gt;pull_request_target&lt;/code&gt; and comment-triggered-publish patterns behind both major TanStack incidents are avoidable with a few lines of workflow config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat any secret reachable from a CI runner as already leaked.&lt;/strong&gt; Rotate on a schedule, not just on suspicion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trinitite won't be the last variant. The people behind the original TeamPCP toolkit were reportedly arrested in Australia shortly before this wave shipped, using the same core malware with new keys and new graffiti strings — which tells you the tooling outlives the individuals running it. The realistic goal isn't preventing the next worm. It's making sure that when it lands, you can answer "what do we actually have deployed, and what depends on it" faster than the worm can spread.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>The State Machine Hiding Inside Every Construction Project</title>
      <dc:creator>Gavriliuc Vlada</dc:creator>
      <pubDate>Mon, 17 Aug 2026 12:01:31 +0000</pubDate>
      <link>https://dev.to/gavriliucvlada/the-state-machine-hiding-inside-every-construction-project-1n68</link>
      <guid>https://dev.to/gavriliucvlada/the-state-machine-hiding-inside-every-construction-project-1n68</guid>
      <description>&lt;p&gt;Here's a distributed systems problem you probably haven't thought about: dozens of independent teams, each editing their own piece of a shared 3D model, over a timeline of years, where a stale read can mean someone pours concrete based on the wrong version of a structural drawing.&lt;/p&gt;

&lt;p&gt;That's the problem Building Information Modeling (BIM) has to solve, and the system that solves it is called a Common Data Environment, or CDE. It's worth understanding, because it's one of the cleaner real-world examples of a versioned, permissioned, multi-writer data system with the state machine spelled out as an actual international standard instead of left to whatever a team improvised.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why plain file storage doesn't work here
&lt;/h2&gt;

&lt;p&gt;A typical BIM project involves architects, structural engineers, MEP contractors, the client, and external consultants, all editing models that constantly reference each other. A structural engineer's model has to line up with the architect's, which has to line up with the electrical contractor's, across design, approval, and construction phases spanning years.&lt;/p&gt;

&lt;p&gt;Dropbox or SharePoint can hold the files. What they can't answer natively is the question every contributor actually needs answered: is this specific revision of this specific file the one I'm allowed to build from right now, or is it still a draft someone's iterating on? Get that wrong on a construction site and the cost isn't a merge conflict, it's a physical rebuild.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data model: containers, not files
&lt;/h2&gt;

&lt;p&gt;The standard that governs this, ISO 19650, doesn't treat a file as just a file. It defines an "information container": a unit of data with mandatory structured metadata attached:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;State: exactly one of four values at any time: Work in Progress, Shared, Published, or Archived&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Status code (suitability): what the container is currently allowed to be used for, e.g. "for coordination" or "authorized for construction"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Revision: a tracked version number&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Classification: a category code so containers can be filtered and queried systematically, usually against a scheme like Uniclass&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The four states form a directed workflow, not just labels. A container in Work in Progress is visible only to the team producing it. Once it's stable enough for others to reference (but not yet final), it moves to Shared. Once it's contractually approved, it moves to Published. Transitions are meant to be one directional, with defined exceptions for rejection back to an earlier state.&lt;/p&gt;

&lt;p&gt;If you've built approval workflows for a CMS or a PLM system, this pattern will look familiar: draft, review, publish, archive. What's different here is that the states, the metadata schema, and the transition rules are externally standardized, so a CDE built by one vendor and a CDE built by another are expected to expose the same conceptual model, even if the implementation differs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard engineering problems
&lt;/h2&gt;

&lt;p&gt;A few things make this genuinely nontrivial to build well, beyond just implementing a four-state enum:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access control that depends on lifecycle state, not just role&lt;/strong&gt;. A permission model here isn't "editor vs viewer." It's "this user can read this container, but only because it's in the Shared state, and only certain fields of its metadata, and that access should change automatically the moment the container moves to Published." That's state-dependent authorization, layered on top of normal role-based access, and it has to be enforced consistently across every client that touches the data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interoperability across authoring tools&lt;/strong&gt;. Contributors use different BIM software (Revit, ArchiCAD, Civil 3D, and others), each with its own native file format. To avoid vendor lock-in on the authoring side, CDEs generally need to support IFC (Industry Foundation Classes), an open, schema-based exchange format that represents building elements as structured entities with relationships, not just geometry. Round-tripping data through IFC without losing information is its own hard problem, since different tools implement the schema with slightly different interpretations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-project isolation at scale&lt;/strong&gt;. A CDE is rarely built for one project. It's typically operated as a platform serving many concurrent projects for the same organization, which means project spaces need to be cleanly isolated from each other while still sharing common infrastructure, user directories, and organizational permission structures. Get the isolation boundary wrong and you risk cross-project data leakage, which in a public infrastructure context is a real liability, not just a bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auditability as a first-class requirement, not a feature&lt;/strong&gt;. Every state transition and revision needs a traceable record: who moved it, when, and under what authorization. This isn't optional logging. In regulated or public-sector contexts, "who approved this exact version, and when" is often a contractual and legal requirement, which means the audit trail has to be tamper-evident, not just present.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seeing the spec in the wild
&lt;/h2&gt;

&lt;p&gt;If you want to see what a real-world requirement for one of these platforms actually looks like, Germany's state highway authority for North Rhine-Westphalia currently has an &lt;a href="https://tenderwell.com/tender/common-data-environment-cde-cloudbasiert-als-saas-neu-46343629" rel="noopener noreferrer"&gt;open tender for a cloud-based CDE&lt;/a&gt;, meant to support around 90 BIM projects over a four year framework. It's a useful read if you want to see how these architectural requirements (multi-tenant isolation, managed cloud delivery, structured functional evaluation) get translated into a concrete specification instead of staying abstract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading on the actual standard
&lt;/h2&gt;

&lt;p&gt;The full specification is published by &lt;a href="https://www.iso.org/standard/68078.html" rel="noopener noreferrer"&gt;ISO&lt;/a&gt; (ISO 19650), and the open exchange format most CDEs are expected to support is documented by &lt;a href="https://www.buildingsmart.org/standards/bsi-standards/industry-foundation-classes/" rel="noopener noreferrer"&gt;buildingSMART International&lt;/a&gt;, the organization that maintains IFC.&lt;/p&gt;

&lt;p&gt;It's a niche corner of software, but the core problem, versioned, permissioned, auditable collaboration on structured data across many independent writers, is one a lot of us end up rebuilding in some form anyway, usually without a standards body telling us what the states are supposed to be called.&lt;/p&gt;

</description>
      <category>distributedsystems</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
