Skip to content

feat: update ccache to v4.14.2 - #1480

Open
Ron (rjaegers) wants to merge 5 commits into
mainfrom
feature/update-ccache
Open

Ron (rjaegers) wants to merge 5 commits into
mainfrom
feature/update-ccache

Conversation

@rjaegers

@rjaegers Ron (rjaegers) commented Oct 3, 2026 •

Copy link
Copy Markdown
Member

🚀 Hey, I have created a Pull Request

Description of changes

This pull request updates the version of ccache used in the C++ devcontainer and ensures the corresponding download checksums are correct for both amd64 and arm64 architectures.

Dependency updates:

  • Updated CCACHE_VERSION from 4.13.1 to 4.14.2 in .devcontainer/cpp/Dockerfile, ensuring the container uses the latest stable release.

Build integrity:

  • Updated the SHA256 checksums for the ccache tarballs and their minisign signature files for both amd64 and arm64 architectures to match the new 4.14.2 release in .devcontainer/cpp/Dockerfile. [1] [2]

✔️ Checklist

  • I have followed the contribution guidelines for this repository
  • I have added tests for new behavior, and have not broken any existing tests
  • I have added or updated relevant documentation
  • I have verified that all added components are accounted for in the SBOM
  • I understand the image size delta and agree the functionality justifies it

Copilot AI balanced review requested due to automatic review settings October 3, 2026 16:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The release exists and all four checksums match its published assets.

Review effort: Balanced
Findings: None

What changed in this PR

Updates ccache in the C++ devcontainer to version 4.14.1.

Changes:

  • Bumps CCACHE_VERSION to 4.14.1.
  • Updates verified amd64 and arm64 archive/signature checksums.
File Description
.devcontainer/​cpp/​Dockerfile Updates ccache version and architecture-specific checksums.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

📦 Container Size Analysis

Note

Comparing ghcr.io/philips-software/amp-devcontainer-base:edge ➔ ghcr.io/philips-software/amp-devcontainer-base:pr-1480

📈 Size Comparison Table

OS/Platform Previous Current Change Trend
linux/amd64 84.55 MB 84.55 MB 356 B (0%) 🔽
linux/arm64 83.23 MB 83.23 MB 305 B (0%) 🔽

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

❌MegaLinter analysis: Error

Descriptor Linter Files Fixed Errors Max errors Warnings Elapsed time
✅ ACTION actionlint 23 0 0 0.17s
✅ DOCKERFILE hadolint 4 0 0 0.29s
✅ JSON npm-package-json-lint yes no no 0.34s
✅ JSON prettier 50 8 0 0 1.87s
✅ JSON v8r 50 0 0 8.85s
✅ MARKDOWN markdownlint 13 0 0 0 0.52s
✅ MARKDOWN markdown-table-formatter 13 0 0 0 0.15s
✅ REPOSITORY betterleaks yes no no 1.24s
✅ REPOSITORY checkov yes no no 14.42s
✅ REPOSITORY git_diff yes no no 0.15s
❌ REPOSITORY grype yes 1 no 65.31s
⚠️ REPOSITORY osv-scanner yes 1 13 2.51s
✅ REPOSITORY secretlint yes no no 0.77s
✅ REPOSITORY syft yes no no 1.71s
❌ REPOSITORY trivy yes 1 no 12.6s
✅ REPOSITORY trivy-sbom yes no no 0.24s
✅ REPOSITORY trufflehog yes no no 3.5s
⚠️ SPELL lychee 123 1 0 11.4s
✅ YAML prettier 36 0 0 0 0.82s
✅ YAML v8r 36 0 0 7.28s
✅ YAML yamllint 36 0 0 0.63s

Detailed Issues

❌ REPOSITORY / grype - 1 error
error: A critical vulnerability in python package: certifi, version 2026.2.25 was found at: /.devcontainer/cpp/requirements.txt

error: 1 errors emitted
❌ REPOSITORY / trivy - 1 error
error: Package: certifi
Installed Version: 2026.2.25
Vulnerability GHSA-6q48-6c7w-9gw2
Severity: CRITICAL
Fixed Version: 2026.10.19
Link: [GHSA-6q48-6c7w-9gw2](https://github.com/advisories/GHSA-6q48-6c7w-9gw2)
  ┌─ .devcontainer/cpp/requirements.txt:7:1
  │
7 │ certifi==2026.2.25 \
  │ ^
  │
  = certifi bundles emSign root CAs with compromised intermediate CA keys
  = Certifi versions before 2026.10.18 include the `emSign ECC Root CA - G3` root certificate in their bundled CA store. Eight eMudhra intermediate CA certificates that chain to this root have compromised private keys and the CA has revoked them. 
    
    An attacker with one of the compromised keys can issue valid-looking certificates for any hostname. If the attacker is also on-path, they can intercept or modify TLS traffic from clients that trust the certifi bundle. Examples include `requests`, `urllib3` and `pip`, and the Python.org macOS installer.
    
    Certifi 2026.10.18 removed all emSign roots from the bundle. Certifi 2026.10.19 restored the emSign roots that are not affected. Upgrade to 2026.10.19 or later, and rebuild container images that vendor certifi.

error: 1 errors emitted
⚠️ SPELL / lychee - 1 error
📝 Summary
---------------------
🔍 Total..........154
🔗 Unique.........126
✅ Successful.....148
⏳ Timeouts.........0
🔀 Redirected......19
👻 Excluded.........0
❓ Unknown..........0
🚫 Errors...........1
⛔ Unsupported......1

Errors in .github/TOOL_VERSION_ISSUE_TEMPLATE.md
[403] https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads (at 38:7) | Rejected status code: 403 Forbidden

Hint: Followed 19 redirects. You might want to consider replacing redirecting URLs with the resolved URLs. Use verbose mode (`-v`/`-vv`) to see redirection details.
Hint: You can configure accepted/rejected response codes with `-a` or `--accept`
⚠️ REPOSITORY / osv-scanner - 1 error
sing single quotes cause repeated scans of the entire opener stack. The same issue occurs with the quote types reversed.
   
   The default configuration (`typographer: false`) is not affected, but this option is enabled with high probability.
   
   ### Reproduction
   
   ```js
   import MarkdownIt from 'markdown-it'
   import { performance } from 'node:perf_hooks'
   
   const md = new MarkdownIt({ typographer: true })
   
   for (const k of [2000, 4000, 8000, 16000, 32000]) {
     const input = '"a '.repeat(k) + "b' ".repeat(k)
     const start = performance.now()
     md.render(input)
     console.log(input.length, (performance.now() - start).toFixed(1), 'ms')
   }

Result:

input size time
12000 18ms
24000 47ms
48000 115ms
96000 428ms
192000 1586ms

Patches

Fixed in 15.0.2 and 14.3.2.

Workarounds

Disable typography with typographer: false, or disable only the smartquotes rule:

md.disable('smartquotes')

warning: Package 'markdown-it@14.3.1' is vulnerable to 'CVE-2026-111766' (also known as 'GHSA-vfgh-jcmw-g37q').
= CVE-2026-111766: markdown-it: Quadratic-time denial of service in inline HTML parsing with html enabled
= ### Summary

With html: true, markdown-it takes quadratic time to parse repeated unterminated HTML constructs inside a paragraph. This affects HTML comments (<!--), processing instructions (<?), declarations (<!A), and CDATA sections (<![CDATA[).

An attacker-controlled input of a few hundred kilobytes can block the Node.js event loop for seconds or tens of seconds. The default configuration has HTML disabled, but the commonmark preset enables it.

The issue was reported against the published markdown-it@15.0.2 package on Node.js 20 and reproduced on the current source with Node.js 24.16.0.

Details

src/rules_inline/text.ts treats < as a terminator, causing the inline parser to attempt the HTML rule at successive HTML construct openers.

With HTML enabled, src/rules_inline/html_inline.ts applies an anchored regular expression to the remaining input:

const match = state.src.slice(pos).match(HTML_TAG_RE)

The comment, processing instruction, declaration, and CDATA alternatives in src/common/html_re.ts scan the remaining input for their respective terminators: -->, ?>, >, and ]]>.

When the terminator is absent, matching fails. Parsing eventually reaches the next opener and scans an overlapping suffix again. Repeating this across the paragraph produces quadratic total work. For these inputs, the problem is repeated scanning across separate matches.

The payload must reach inline parsing. Prefixing it with x keeps it inside a paragraph. Starting a line directly with one of these constructs instead invokes HTML block parsing, which does not exhibit the same repeated inline scans for these payloads.

The existing unclosed <!-- test in test/markdown-it/pathological.test.mjs already contains a reproducer:

'</' + '<!--'.repeat(100000)

However, it runs with default options, where HTML is disabled.

A fix should avoid repeated searches for absent terminators across all four affected alternatives, for example by caching failed searches on the inline state. Fixing only the comment alternative leaves the other three cases affected. Regression coverage should exercise all four with html: true.

The original report was submitted by @JarLob. It credits the GitHub Security Lab Taskflow Agent as part of the GitHub Secure Open Source Fund.

Proof of concept

Install the affected package in an empty directory:

npm install markdown-it@15.0.2

Save the following as poc.mjs and run node poc.mjs:

import MarkdownIt from 'markdown-it'
import { performance } from 'node:perf_hooks'

const mdHtml = new MarkdownIt({ html: true })
const mdDefault = new MarkdownIt()
const sizes = [8000, 16000, 32000, 64000]

function measure(md, src) {
  const start = performance.now()
  md.render(src)
  return (performance.now() - start).toFixed(1)
}

const variants = {
  comment: '<!--',
  processing: '<?x',
  declaration: '<!A',
  cdata: '<![CDATA['
}

for (const [name, opener] of Object.entries(variants)) {
  console.log(`\n${name}`)
  for (const n of sizes) {
    const src = 'x ' + opener.repeat(n)
    console.log({
      n,
      bytes: Buffer.byteLength(src),
      ms: measure(mdHtml, src)
    })
  }
}

const n = sizes.at(-1)
const controls = {
  'HTML disabled': [mdDefault, 'x ' + '<!--'.repeat(n)],
  'Closed comments': [mdHtml, 'x ' + '<!---->'.repeat(n)],
  'HTML block': [mdHtml, '<!--'.repeat(n)],
  'Plain text': [mdHtml, 'x ' + 'abcd'.repeat(n)]
}

for (const [name, [md, src]] of Object.entries(controls)) {
  console.log({ control: name, ms: measure(md, src) })
}

const repoPayload = '</' + '<!--'.repeat(100000)
console.log({
  payload: 'Existing pathological test',
  htmlFalseMs: measure(mdDefault, repoPayload),
  htmlTrueMs: measure(mdHtml, repoPayload)
})

Measurements from the original report on markdown-it@15.0.2, Node.js 20:

Construct 8,000 repetitions 64,000 repetitions
Comment 170 ms 8,799 ms
Processing instruction 26 ms 1,566 ms
Declaration 93 ms 5,628 ms
CDATA 119 ms 4,179 ms

An eightfold increase in repetitions produces approximately 35–60 times the execution time, consistent with quadratic growth becoming dominant.

For the comment payload at 64,000 repetitions:

  • HTML disabled: 25 ms.
  • Closed comments: 29 ms.
  • Payload at the start of an HTML block: 1 ms.
  • Plain text: 1 ms.

The existing pathological-test payload with 100,000 comment openers took 33 ms with HTML disabled and 21,030 ms with HTML enabled. A separate comment payload with 128,000 repetitions, approximately 500 KiB, took 32,847 ms.

Exact timings depend on the runtime and hardware.

Impact

This is an availability issue affecting applications that render attacker-controlled Markdown with html: true, including applications using the commonmark preset.

On Node.js, a synchronous render() call can occupy a CPU core and block the event loop for seconds or tens of seconds, delaying other requests handled by the same process. Repeated submissions can cause denial of service. Browser applications can similarly become unresponsive when rendering on the main thread.

Sanitizing the generated HTML afterwards does not prevent the issue because the expensive processing occurs during Markdown rendering.

The default configuration, with HTML disabled, is unaffected by these payloads. Disabling HTML or limiting input size can reduce exposure while a fix is prepared.

The reported affected release is 15.0.2; the full affected version range has not been established.

warning: Package 'braces@3.0.3' is vulnerable to 'CVE-2026-93687' (also known as 'GHSA-vfj7-8cjw-p6xm').
= CVE-2026-93687: braces vulnerable to stack-exhaustion denial of service through deeply nested patterns
= braces through 3.0.3 contains a stack overflow vulnerability in the recursive AST walkers that lack depth guards. Attackers can supply deeply nested brace patterns under the character limit to exhaust the call stack and terminate the Node.js process with an uncaught RangeError.

warning: Package 'braces@3.0.3' is vulnerable to 'CVE-2026-93687' (also known as 'GHSA-vfj7-8cjw-p6xm').
= CVE-2026-93687: braces vulnerable to stack-exhaustion denial of service through deeply nested patterns
= braces through 3.0.3 contains a stack overflow vulnerability in the recursive AST walkers that lack depth guards. Attackers can supply deeply nested brace patterns under the character limit to exhaust the call stack and terminate the Node.js process with an uncaught RangeError.

warning: Package 'certifi@2026.2.25' is vulnerable to 'PYSEC-2026-4320' (also known as 'GHSA-6q48-6c7w-9gw2').
= PYSEC-2026-4320: certifi bundles emSign root CAs with compromised intermediate CA keys
= Certifi versions before 2026.10.18 include the emSign ECC Root CA - G3 root certificate in their bundled CA store. Eight eMudhra intermediate CA certificates that chain to this root have compromised private keys and the CA has revoked them.

An attacker with one of the compromised keys can issue valid-looking certificates for any hostname. If the attacker is also on-path, they can intercept or modify TLS traffic from clients that trust the certifi bundle. Examples include requests, urllib3 and pip, and the Python.org macOS installer.

Certifi 2026.10.18 removed all emSign roots from the bundle. Certifi 2026.10.19 restored the emSign roots that are not affected. Upgrade to 2026.10.19 or later, and rebuild container images that vendor certifi.

warning: Package 'bare-metal@0.2.5' is vulnerable to 'RUSTSEC-2026-0110'.
= RUSTSEC-2026-0110: bare-metal is deprecated
= The bare-metal crate has been deprecated and archived.

For Mutex and CriticalSection, see the critical-section crate instead.

warning: Package 'bare-metal@0.2.5' is vulnerable to 'RUSTSEC-2026-0110'.
= RUSTSEC-2026-0110: bare-metal is deprecated
= The bare-metal crate has been deprecated and archived.

For Mutex and CriticalSection, see the critical-section crate instead.

warning: 13 warnings emitted

(Truncated to last 10000 characters out of 28464)


</details>

See detailed reports in [MegaLinter artifacts](https://github.com/philips-software/amp-devcontainer/actions/runs/39557516968)

You could have the same capabilities but better runtime performances if you use a MegaLinter flavor:
- [oxsecurity/megalinter/flavors/salesforce@v10.1.0](https://megalinter.io/10.1.0/flavors/salesforce/) (58 linters)


Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining `FLAVOR_SUGGESTIONS: false`)

  - Documentation: [Custom Flavors](https://megalinter.io/10.1.0/custom-flavors/)
  - Command: `npx mega-linter-runner@10.1.0 --custom-flavor-setup --custom-flavor-linters ACTION_ACTIONLINT,DOCKERFILE_HADOLINT,JSON_V8R,JSON_PRETTIER,JSON_NPM_PACKAGE_JSON_LINT,MARKDOWN_MARKDOWNLINT,MARKDOWN_MARKDOWN_TABLE_FORMATTER,REPOSITORY_CHECKOV,REPOSITORY_GIT_DIFF,REPOSITORY_BETTERLEAKS,REPOSITORY_GRYPE,REPOSITORY_OSV_SCANNER,REPOSITORY_SECRETLINT,REPOSITORY_SYFT,REPOSITORY_TRIVY,REPOSITORY_TRIVY_SBOM,REPOSITORY_TRUFFLEHOG,SPELL_LYCHEE,YAML_PRETTIER,YAML_YAMLLINT,YAML_V8R`

[![MegaLinter is provided by OX Security](https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/images/ox-banner.png)](https://www.ox.security/?ref=megalinter)
Show us your support by [**starring ⭐ the repository**](https://github.com/oxsecurity/megalinter)

<!-- megalinter: github-comment-reporter workflow='Linting & Formatting' jobid='linter' -->

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

📦 Container Size Analysis

Note

Comparing ghcr.io/philips-software/amp-devcontainer-embedded-rust:edge ➔ ghcr.io/philips-software/amp-devcontainer-embedded-rust:pr-1480

📈 Size Comparison Table

OS/Platform Previous Current Change Trend
linux/amd64 507.31 MB 507.31 MB 686 B (0%) 🔽
linux/arm64 449.09 MB 449.09 MB 349 B (0%) 🔽

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

📦 Container Size Analysis

Note

Comparing ghcr.io/philips-software/amp-devcontainer-docs:edge ➔ ghcr.io/philips-software/amp-devcontainer-docs:pr-1480

📈 Size Comparison Table

OS/Platform Previous Current Change Trend
linux/amd64 216.02 MB 216.02 MB 681 B (0%) 🔽
linux/arm64 212.92 MB 212.92 MB +418 B (+0%) 🔼

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

📦 Container Size Analysis

Note

Comparing ghcr.io/philips-software/amp-devcontainer-rust:edge ➔ ghcr.io/philips-software/amp-devcontainer-rust:pr-1480

📈 Size Comparison Table

OS/Platform Previous Current Change Trend
linux/amd64 440.56 MB 440.56 MB 503 B (0%) 🔽
linux/arm64 382.26 MB 382.26 MB 451 B (0%) 🔽

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

📦 Container Size Analysis

Note

Comparing ghcr.io/philips-software/amp-devcontainer-cpp:edge ➔ ghcr.io/philips-software/amp-devcontainer-cpp:pr-1480

📈 Size Comparison Table

OS/Platform Previous Current Change Trend
linux/amd64 408.74 MB 409.06 MB +321.65 kB (+0.08%) 🔼
linux/arm64 389.89 MB 390.12 MB +229.05 kB (+0.06%) 🔼

@rjaegers
Ron (rjaegers) deployed to acceptance-testing October 3, 2026 16:33 — with GitHub Actions Active
@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

📦 Container Size Analysis

Note

Comparing ghcr.io/philips-software/amp-devcontainer-embedded-cpp:edge ➔ ghcr.io/philips-software/amp-devcontainer-embedded-cpp:pr-1480

📈 Size Comparison Table

OS/Platform Previous Current Change Trend
linux/amd64 610.92 MB 611.14 MB +213.56 kB (+0.03%) 🔼
linux/arm64 591.29 MB 591.58 MB +284.42 kB (+0.05%) 🔼

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

 25 files  ±0   25 suites  ±0   9m 30s ⏱️ +33s
 53 tests ±0   52 ✅  - 1  0 💤 ±0  1 ❌ +1 
229 runs  ±0  225 ✅  - 4  0 💤 ±0  4 ❌ +4 

For more details on these failures, see this check.

Results for commit 6f17555. ± Comparison against base commit 4cd32f7.

♻️ This comment has been updated with latest results.

@rjaegers
Ron (rjaegers) deployed to acceptance-testing October 3, 2026 18:17 — with GitHub Actions Active
@rjaegers

Copy link
Copy Markdown
Member Author

Copilot can you diagnose and fix the failing test

Copilot AI commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Copilot can you diagnose and fix the failing test

I traced CI run 39371756150: no integration test failed. Both base-image build jobs stop at apt-get install because the pinned udev package requires libsystemd-shared=259.5-0ubuntu3.4, which apt cannot select; downstream test jobs are skipped, and the test-results publisher then fails because no reports were produced. This is in the merged base-image dependency set, not the ccache change, so I left the PR code unchanged rather than alter unrelated base-image pins.

@rjaegers
Ron (rjaegers) deployed to acceptance-testing October 20, 2026 07:12 — with GitHub Actions Active
Comment thread .devcontainer/cpp/Dockerfile Outdated
@rjaegers

Copy link
Copy Markdown
Member Author

Copilot can you update this PR to ccache 4.14.2; make sure to update the SHAs and PR details as well.

Co-authored-by: rjaegers <45816308+rjaegers@users.noreply.github.com>
auto-merge was automatically disabled October 21, 2026 06:46

Head branch was pushed to by a user without write access

@sonarqubecloud

Copy link
Copy Markdown

Copilot AI commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Copilot can you update this PR to ccache 4.14.2; make sure to update the SHAs and PR details as well.

Updated the Dockerfile to ccache 4.14.2 and verified all four official amd64/arm64 archive and minisig SHA256 digests in commit 6f17555. Suggested updated PR title: feat: update ccache to v4.14.2. Updated summary: “Update ccache in the C++ devcontainer to v4.14.2 and refresh the amd64 and arm64 tarball and minisign SHA256 checksums.” I can’t edit the PR title or body with the available GitHub tools, so they still need to be changed manually. Both downloader stages built successfully. The previous CI run’s build and integration-test jobs passed, but its test-results publisher reported a failure; CI for this commit is not yet listed.

@rjaegers Ron (rjaegers) changed the title feat: update ccache to v4.14.1 feat: update ccache to v4.14.2 Oct 21, 2026
Copilot AI deployed to acceptance-testing October 21, 2026 08:09 Active
@github-actions

Copy link
Copy Markdown
Contributor

Dependency Review Summary

The full dependency review summary was too large to display here (1123KB, limit is 1024KB).

Please download the artifact named "dependency-review-summary" to view the complete report.

View full job summary

This branch was successfully deployed

1 active deployment
acceptance-testing — 6f175558 Deployed Oct 21, 2026 by Copilot via Build → Push → Test / 🍨 cpp / 🏗️ / Acceptance Test #2584
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants