Skip to content

fix(zeus): remediate seven v5 PCRE2 findings with native 10.49 RPMs - #20

Merged
rcamarda390 merged 3 commits into
mainfrom
fix/zeus-v5-pcre2-security
Oct 2, 2026
Merged

rcamarda390 merged 3 commits into
mainfrom
fix/zeus-v5-pcre2-security

Conversation

@rcamarda390

@rcamarda390 rcamarda390 commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Zeus 2.0.0-v5 contains pcre2 and pcre2-syntax 10.44-1.el10.3 even after the existing DNF refresh. Xray associates seven CVEs with pcre2-syntax; the vulnerable code is in the same source package's regex runtime. Replace both RPMs with upstream 10.49 built on UBI10.

Findings

CVE Upstream fix
CVE-2026-86145 10.48: DFA workspace size/offset checks
CVE-2026-103111 10.49: growable JIT-stack allocation bounds
CVE-2026-89161 10.48: copied-subject ownership in JIT matching
CVE-2026-89158 10.48: compiler integer-overflow bounds
CVE-2026-89157 10.48: pattern-conversion allocation sizing
CVE-2026-89160 10.48: invalid-UTF backward-scan bounds
CVE-2026-89156 10.48: JIT mode validation before fallback
The two 32-bit-specific advisories are not applicable to linux/amd64, but the update also contains their fixes.

Change and checks

  • Add a checksum-pinned PCRE2 builder and a narrow RPM spec for the existing 8-bit and POSIX runtimes and syntax documentation; keep compilers out of the final image.
  • Run upstream make check, including the security regressions.
  • Preserve libpcre2-8.so.0 and libpcre2-posix.so.3, JIT and Unicode; compare exported APIs in both libraries against the UBI-provided library and fail on any missing symbol.
  • Install both RPMs together after the last distro refresh; keep RPM ownership and accurate version metadata.
  • Assert final RPM versions and loaded library bytes, and exercise Git PCRE, grep PCRE and DNF's installed dependency check. Use writable temporary DNF paths for the non-root smoke check.
  • Update software.yaml. Keep all other installed software and release/publication behavior unchanged.

Validation: local Python syntax passed. Attempt 1 passed all four upstream test-suite targets, then failed because the RPM spec used LICENCE instead of LICENCE.md. Corrected the filename and addressed review feedback to preserve the POSIX runtime and compare its exports. Attempt 2 exposed a build-directory RPATH in the POSIX library copied before libtool's installation step. Corrected packaging to use the upstream install/relink step. Attempt 3 passed: https://github.com/rcamarda390/my-docker-images/actions/runs/37069645836 (commit 1969456). All four upstream PCRE2 test targets passed, both library export comparisons had no missing symbols, RPM installation and DNF dependency checks passed, and final-image verification passed both during build and in the non-root container smoke test. Trivy completed with one HIGH (node-forge CVE-2026-85393, whose existing source-backport regression passed); the two pre-existing scoped pip-vendored VEX assessments remain unchanged. Health and blocking-scan steps were skipped by existing workflow configuration. Nothing was published. This is not an Xray rescan or clearance of the remaining report. No Docker engine is available locally.

Remaining findings and limits

The attached v5 report contains 291 distinct CVEs. This PR addresses seven, not the whole report. Existing v5 build logs already verify standalone setuptools 84.0.0 and msgpack 1.2.3, pip's scoped bundled-code assessment, and the node-forge source regression. Those Xray rows remain subject to scan review; global package upgrades do not by themselves clear bundled or RPM copies. Remaining Node/OS and AI SDK associations still need vendor/source applicability checks. No findings are hidden, no scan gate is weakened, and no clean Xray claim is made.

Next remediation targets

Family Evidence and open work
npm / Node RPMs v5 installs Node 22.23.2 and distro npm 10.9.8. npm dependencies must be checked in the RPM-owned copy; updating application lockfiles does not replace it. Upstream npm 12.2.0 supports this Node version, but migration and removal/replacement of the old RPM contents still require validation.
Python TLS (CVE-2026-19553) Python 3.12.14 is affected. The upstream 3.12 backport adds a DeprecationWarning for missing server_hostname, unlike the ValueError on main; do not claim enforced hostname validation from this warning-only patch.
OpenSSL v5 has 3.5.8; the two high advisories list 3.5.9 fixes. Keep open pending a vendor-compatible update, including provider compatibility.
util-linux, RPM, glibc, curl, expat Source-family findings require vendor backport applicability and compatible native updates. Removing shared libraries or RPM/DNF would break the developer image.
GCC family CVE-2026-102010 concerns a libstdc++ template header; determine affected compiled consumers before treating every libgcc/libgomp association as vulnerable runtime code.
distro pip python3-pip and python3-pip-wheel remain separate RPM-owned copies even though active global/AWS pip was upgraded. They need independent treatment.
AI SDK CVE-2026-8768 needs an authoritative affected-package/fixed-release mapping before selecting another override. Existing provider-utils version assertions cover earlier advisories only.

Risk: this temporarily carries an upstream runtime newer than UBI10's package. ABI/smoke checks and the upstream suite gate it. Remove the carry once UBI10 supplies equivalent fixes. Rollback is reverting this PR and rebuilding a new immutable revision; do not overwrite v5.

Primary sources:

Agent: ChatGPT Work Codex /root
LLM: GPT-6

Build checksum-pinned upstream PCRE2 10.49 with JIT/Unicode and upstream regressions; preserve libpcre2-8.so.0 and compare every UBI exported 8-bit API. Replace both runtime and syntax RPMs after repository refresh. Verify package versions, loaded library, Git/grep and DNF dependency closure. Addresses CVE-2026-86145, -103111, -89161, -89158, -89157, -89160 and -89156 from Zeus v5.

Agent: ChatGPT Work Codex /root
LLM: GPT-6

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 43fc51ceec

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +39 to +40
install -pm755 .libs/libpcre2-8.so.0.* %{buildroot}%{_libdir}/
ln -s "$(basename .libs/libpcre2-8.so.0.*)" %{buildroot}%{_libdir}/libpcre2-8.so.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Preserve the PCRE2 POSIX shared library

The replacement RPM packages only libpcre2-8.so.0*, but the UBI/CentOS pcre2 package being upgraded also owns and provides libpcre2-posix.so.3 (package file list). During the upgrade, RPM removes the old package's POSIX library because the new package no longer contains it, so any downstream native program using PCRE2's POSIX API will fail to load; the current symbol comparison and smoke tests miss this because they inspect only libpcre2-8. Package the newly built libpcre2-posix.so.3* alongside the 8-bit runtime.

Useful? React with 👍 / 👎.

@rcamarda390
rcamarda390 merged commit f10f51d into main Oct 2, 2026
2 checks passed
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.

1 participant