FEDERICA BERTONICyber Geopolitics · AI Risk · Strategic Cyber Threat Intelligence
ANALYSIS

Home / Analysis

Cyber-Geopolitical Analysis

Alpine and the upgrade that left a dependency unpatched

GitLab’s return at Alpine shows why an updated application version does not establish that its runtime was corrected: recovery requires identifying the artifact actually running and the trust relationships that still need to be rebuilt.

Federica Bertoni
UPS power management module and server racks with network cabling at the NERSC data center.
Power equipment and network cabling at the NERSC data center; contextual photograph, not depicting Alpine Linux infrastructure or its incident.Illustrative photograph Derrick Coetzee / Wikimedia Commons. CC0 1.0. Resized without cropping; re-encoded as JPEG. · Image source · CC0 1.0

A fix has to reach the system doing the work

In its October 30 announcement, Alpine reports that GitLab is back on a rebuilt server running GitLab 19.3.7 and Ruby 3.3.13; its incident timeline dates reopening to the previous day. I find the earlier unsuccessful upgrade more instructive than the return itself, because it shows how advancing an application’s version can leave the relevant weakness untouched when the correction belongs to a component supplied through a different build process.

In my assessment, “updated” should describe a verified property of the deployed software chain, rather than the completion of an administrative task. An expected version number, working logins, and pipelines accepting jobs can all be useful observations without answering whether the vulnerable component used by the running process contains the required change. That distinction matters whenever an organization assembles its own distribution or relies on a supplier to do so.

The version label and the contents can diverge

Alpine reports that upgrading its custom image to GitLab 19.3.6 left Ruby unpatched. The same tag was republished on October 27 with Ruby 3.3.13. GitLab’s security advisory describes CVE-2026-97229 as code execution through crafted regular expressions, while Ruby’s technical explanation locates the underlying defect in Onigmo’s pattern-compilation logic.

A distribution’s contents therefore need to be distinguished from its label: a tag can stay unchanged as the files it identifies change, and a distributor can incorporate a correction before a component receives a new release number. GitLab’s backport documentation demonstrates the change in a Ruby 3.3.12 build, illustrating why a mechanical comparison of runtime version numbers would also be an incomplete test.

An image digest and a component inventory help establish which artifact was deployed, but neither independently certifies its security. Verification has to connect the assessed build to the process actually running, while digest pinning needs an update path of its own. Otherwise, immutability can preserve an outdated artifact just as reliably as a corrected one, turning a useful identity control into misplaced confidence about the content.

Correction and reconstruction answer different questions

Alpine cannot exclude code execution because logs are incomplete. External records support checks of October 20–22 commits and packages built October 20–24, with an extension through October 27 announced; release-signing keys were not on GitLab. These findings have different scopes and support neither an unrestricted assurance about the supply chain nor a conclusion that the attacker successfully executed code.

Rebuilding an instance addresses a possible persistent foothold, artifact checks examine possible modification, and replacing secrets addresses potential exposure. Their results cannot be exchanged without losing the question each action was intended to answer. A successful restoration does not retrospectively establish the absence of compromise, particularly where some of the observations needed to resolve that question were never collected or are no longer available.

I consider records outside the system under examination especially valuable when their independence is assessed against the failure being investigated. Two copies of information already altered at their common source could agree completely. Records generated through separate paths, at different times, and under identifiable responsibilities can provide a more useful comparison, although their existence still requires a clear account of which artifacts and periods they cover.

Restored service leaves work in connected systems

The October 30 notice requires new passwords, renewed two-factor authentication, recreated personal tokens, and reentered CI/CD variable values, recommending new credentials where possible. Platform availability consequently does not finish the work for those using its integrations: an organization still has to establish that its process can operate without reactivating a trust relationship whose credentials should have been replaced.

For a business developing software or consuming components supplied by others, that means tracing secret use beyond the restored service and identifying which automations depended on it. A pipeline restarted by reentering an old credential could solve an immediate interruption while leaving the reason for invalidating that credential unresolved. This is a scenario to check during recovery, rather than a claim about what Alpine’s users have done.

The evidence needed before closing remediation

I would bring this case to management, technical owners, and suppliers through a specific request: identify the corrected component, the deployed artifact, the verification performed on the running system, and responsibility for incorporating subsequent changes. A component inventory is useful when it supports that chain of evidence; the document alone cannot establish that a process loaded the software version and patches that were assessed.

I would support closing the intervention only within the scope justified by those checks, keeping outstanding integration work and missing evidence visible. A mismatch between the verified image and the image running, a dependency excluded from the correction, or reuse of a secret requiring replacement would reopen that assessment. These are observable conditions, allowing the judgment to be challenged and revised even after the service has become available again.

Sources and supporting evidence

  1. Alpine Linux — GitLab is back: what you need to doPublished October 30, 2026; accessed October 31, 2026.
  2. Alpine Linux — GitLab security incident: attempted exploitation of CVE-2026-97229Published October 28, 2026, with reopening update; accessed October 31, 2026.
  3. GitLab — Critical Patch Release: 19.4.2, 19.3.5, 19.2.8Security advisory dated October 12, 2026; accessed October 31, 2026.
  4. Ruby — Regexp compilation fixes related to GitLab CVEsTechnical note dated October 23, 2026; accessed October 31, 2026.
  5. GitLab CNG — Ruby regexp program-size backportBuild-change documentation; accessed October 31, 2026.

You stay in control

Your preferences

The site does not include advertising, browsing analytics, or profiling. You can choose whether to remember your accessibility settings for subsequent pages and visits.

Technical functions

Always necessary

Once you make a choice, the browser stores it for 6 months so it can be respected without displaying the notice on every page. This record contains no personal identifiers and is not sent to the site.

Stores text size, contrast, link underlining, and reduced motion settings on your device. Settings are not sent to the Data Controller or to third parties. Without this option, you can adjust them on the current page.

These settings expire when your choice expires: no later than 6 months. If you reject or disable this option, saved settings are deleted; active settings remain available on the current page.

This choice does not authorize future tools or services. For full details, including any technical security tools used by the hosting provider, read the cookie and preferences policy.