Skip to content

fix(security): move Jackson to fixed 2.21.5 baseline - #160

Draft
seonghobae wants to merge 5 commits into
developfrom
security/jackson-databind-2.21.5
Draft

fix(security): move Jackson to fixed 2.21.5 baseline#160
seonghobae wants to merge 5 commits into
developfrom
security/jackson-databind-2.21.5

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Purpose

Repair the shared protected dependency baseline that caused open mightyETL Security Scan failures through inherited jackson-databind advisories. This is a direct-develop, repository-wide security slice rather than a PR-local suppression.

Exact current identity

  • protected/live base: develop@622e5e6c3d534f230c390f10e3832efadfc01825;
  • branch: security/jackson-databind-2.21.5;
  • exact current head: 2905c416679dfccf6ad48e7a7f056b22d476a553;
  • exact comparison: four commits ahead, zero behind, merge base exactly protected develop;
  • Draft: true;
  • GitHub mergeability: true at the latest refetch;
  • formal reviews: none;
  • unresolved review threads: zero;
  • CodeRabbit commit status: success, but status-only evidence is not a qualifying formal approval.

Every check/review from an older head is stale and does not transfer.

Trigger / RCA

PR #158 Security Scan run 31312834418, Trivy filesystem job 93243221587, failed after Trivy itself completed successfully. The hard findings gate reported three MEDIUM findings against inherited com.fasterxml.jackson.core:jackson-databind:

  • CVE-2026-54515;
  • CVE-2026-59889;
  • GHSA-mhm7-754m-9p8w.

The scanner checked out synthetic merge 6f0669cc1c3b36f14296ab839154991c298a7eec (#158 head 3b501f8... merged into protected develop@622e5e6...). #158 itself changes MySQL source discovery and does not alter Jackson. Re-running #158 against the unchanged base cannot change this inherited failure.

Protected root pom.xml imports Spring Boot 3.5.16 dependency management and had no explicit Jackson override. Spring Boot 3.5.16 manages Jackson 2.21.4; FasterXML's 2.21 LTS line released 2.21.5 on 2026-07-06, and upstream advisory/release material identifies 2.21.5 as the patched 2.21.x line for the current Databind findings.

Real-world Maven feasibility

mightyETL imports spring-boot-dependencies rather than inheriting spring-boot-starter-parent. Spring Boot's Maven documentation explicitly states that property-only overrides do not work in that topology; the project must declare an overriding dependency/BOM before the Spring Boot BOM. Therefore this PR imports com.fasterxml.jackson:jackson-bom:2.21.5 immediately before spring-boot-dependencies, keeping Jackson modules aligned on one upstream LTS patch line instead of pinning Databind alone.

No CVE suppression, Trivy severity reduction, invented repository secret, cross-repository mutation, or feature-branch-only patch is used.

TDD

RED

Commit b60d7a6ef6b8a7fd8faa4cf3598bc25768a1847b adds only JacksonSecurityBaselineTest. It requires:

  • exact root jackson-bom.version 2.21.5;
  • explicit Jackson BOM import;
  • the Jackson override import to precede Spring Boot dependency management.

The exact starting POM has none of these, so the test is source-proven fail-first at the dependency-management production boundary.

GREEN candidate

  • c6ddc23c5a3ab7e71be5795164f42b16e076b3fc adds only the supported Jackson BOM override before Spring Boot dependency management;
  • c31256350f125728d86b5c8b48007d7b52433c11 records root cause, alternatives, compatibility/rollback and acceptance evidence in docs/doctoring/jackson-2.21.5-security-baseline.md;
  • exact current head 2905c416679dfccf6ad48e7a7f056b22d476a553 records the LTS patch override in CHANGELOG.md.

Fresh hosted proof on the current head

All exposed workflow aggregates for 2905c416679dfccf6ad48e7a7f056b22d476a553 have now completed successfully:

  • CI 31315057362: success;
  • Dependency Review 31315057369: success;
  • CycloneDX SBOM 31315057355: success;
  • SAST Semgrep 31315057350: success;
  • Security Scan 31315057367: success.

Security Scan Trivy job 93248855990 checked out synthetic merge 1e5b77c98b4c5870a5633dea05c84287074ded27 (Merge 2905c416... into 622e5e6...) and reported 0 CRITICAL/HIGH/MEDIUM findings in trivy-results.sarif. That is strong merged-tree evidence that the Jackson remediation removes the inherited hard findings, but it is not literal-source scanner evidence.

CI macOS job 93248864251 likewise checked out synthetic merge 1e5b77c..., ran the full Maven reactor successfully, and reported 276 ETL tests, 106 CDC tests and 3 gateway tests with zero test failures/skips in those result sets. However, the same log proves the existing durable-job JaCoCo gate is vacuous on this tree: Analyzed bundle 'etl-service' with 0 classes followed by All coverage checks have been met. That independent quality-gate defect is tracked by #162 and repaired by active PR #164; this CI result must not be represented as valid 100% owned-production coverage evidence.

Compatibility / rollback

This remains inside Jackson 2.21 LTS and changes only the patch baseline. Spring Boot cautions that dependency overrides may cause compatibility issues, so complete reactor/build/security evidence remains mandatory. Removing the override is mechanically simple but would knowingly restore the vulnerable 2.21.4 inherited baseline while Boot 3.5.16 remains unchanged; a compatibility failure therefore requires another supported security path rather than silent rollback to the advisories.

Remaining gates

Keep Draft. The current source implementation has materially strong merged-tree deterministic/security evidence, but protected merge acceptance is still blocked by independent controls rather than by the Jackson fix itself:

After this PR integrates, unchanged feature PRs such as #158 must be rerun against the new protected base rather than reusing their old synthetic failure or any #160 evidence.

Summary by CodeRabbit

  • 보안 개선

    • Jackson Databind를 2.21.5 LTS 기준으로 업데이트해 알려진 보안 취약점에 대응했습니다.
    • 의존성 관리 기준을 정비해 Spring Boot 기본 버전보다 안전한 Jackson 버전이 우선 적용되도록 했습니다.
  • 문서화

    • 취약점 원인, 적용한 해결책, 호환성 검증 및 롤백 기준을 보안 기준선 문서로 정리했습니다.
  • 검증

    • Jackson 버전과 의존성 적용 순서를 자동으로 확인하는 검증을 추가했습니다.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Jackson 2.21.5 BOM을 Spring Boot BOM보다 먼저 import하도록 루트 Maven 설정을 변경했습니다. 보안 기준선 문서와 변경 기록을 추가했습니다. BOM 버전과 선언 순서를 검증하는 Maven 테스트를 추가했습니다.

Changes

Jackson 보안 기준선

Layer / File(s) Summary
보안 기준선과 remediation 정의
docs/doctoring/jackson-2.21.5-security-baseline.md
Jackson 2.21.5 기준선, 취약점 원인, 선택한 remediation, 대안, 검증 조건, 호환성 범위와 참고 문헌을 문서화했습니다.
Maven BOM 재정의
pom.xml, CHANGELOG.md
jackson-bom.version2.21.5로 설정했습니다. Jackson BOM을 spring-boot-dependencies보다 먼저 import하도록 추가했습니다. 변경 내용을 Unreleased 항목에 기록했습니다.
BOM 선언 검증
etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java
루트 프로젝트를 탐색하고 Jackson BOM 버전, 두 BOM의 존재 여부와 선언 순서를 검증합니다.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related issues

  • ContextualWisdomLab/mightyETL issue 196: Trivy의 Maven 의존성 해석이 불완전한 경우에도 Jackson 2.21.5 BOM remediation이 필요한지 검증하는 내용으로, 본 변경의 목적과 직접 관련됩니다.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 Jackson 버전을 보안 기준선 2.21.5로 변경하는 변경 사항을 명확하고 간결하게 요약합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch security/jackson-databind-2.21.5

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Rate Limit Exceeded

@seonghobae have exceeded the limit for the number of chat messages per hour. Please wait 18 minutes and 9 seconds before sending another message.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Collaborator Author

Fresh scanner-completeness evidence — #196 does not supersede this remediation

Revalidated this PR before writing: source head remains 2905c416679dfccf6ad48e7a7f056b22d476a553, base remains protected develop@622e5e6c3d534f230c390f10e3832efadfc01825, and GitHub still reports the PR mergeable/Draft.

A newer direct-develop Security Scan on unrelated PR #192 exposed a separate hard-evidence defect now tracked by #196. Trivy job 93333070855 warned:

Dependency version cannot be determined. Child dependencies will not be found.

and then emitted zero CRITICAL/HIGH/MEDIUM findings. Because the scanner explicitly reported incomplete Maven/BOM resolution, that zero-findings result is now classified as incomplete / non-passing security evidence even though its workflow aggregate was green. The same run was also synthetic-merge source, which is an independent identity limitation.

This does not make #160 unnecessary and must not be used as rollback evidence. The protected base still has no Jackson BOM override; the accepted remediation decision remains to prove the resolved exact dependency graph and patched 2.21.5 baseline on accepted source identity, without CVE suppression, severity reduction, or scanner-warning suppression.

Accordingly the merge boundary for this PR is stricter than the existing body currently states: in addition to literal-source execution, non-vacuous coverage and independent approval, accepted security evidence must prove dependency-resolution completeness or an independently complete same-revision resolved-dependency scanner path. A green Trivy aggregate containing the #196 warning does not qualify. No evidence from #192 or any other PR transfers to this head.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/doctoring/jackson-2.21.5-security-baseline.md`:
- Around line 97-99: Update the Spring Boot plugin documentation link in the
references to use the version-specific `/3.5/maven-plugin/using.html` path,
keeping the Jackson BOM link and citation details unchanged.
- Around line 91-93: 참고문헌 목록에 CVE-2026-59889를 FasterXML advisory 식별자
GHSA-5gvw-p9qm-jgwh와 함께 별도 항목으로 추가하고, GHSA-mhm7-754m-9p8w도 별도의 참고문헌 항목으로 추가하세요.
기존 Jackson 참고문헌 형식과 링크 스타일을 유지하세요.

In
`@etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java`:
- Around line 30-39: JacksonSecurityBaselineTest의 문자열 기반
jacksonBom/springBootBom 검사를 XML parser 또는 Maven model 검증으로 교체하세요. 루트
dependencyManagement에서 com.fasterxml.jackson:jackson-bom의 import type, import
scope, version 연결과 spring-boot-dependencies의 실제 구조 및 순서를 확인하고, 별도 effective POM
또는 dependency tree 검증으로 etl-service가 해결한 jackson-databind 버전까지 검사하도록 업데이트하세요.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 061f6857-563d-42ca-b3bc-ce945c0bc194

📥 Commits

Reviewing files that changed from the base of the PR and between 942d164 and 6adb4dc.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • docs/doctoring/jackson-2.21.5-security-baseline.md
  • etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java
  • pom.xml

Comment on lines +91 to +93
FasterXML. (2026, July 7). *Jackson release 2.21*. GitHub. https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.21

FasterXML. (2026). *Case-insensitive deserialization bypasses per-property @JsonIgnoreProperties in jackson-databind* (GHSA-5jmj-h7xm-6q6v; CVE-2026-54515). GitHub Security Advisory. https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-5jmj-h7xm-6q6v

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.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -u

printf '%s\n' '--- guidance files ---'
find .. -name AGENTS.md -print

printf '%s\n' '--- target document ---'
target='docs/doctoring/jackson-2.21.5-security-baseline.md'
if [ -f "$target" ]; then
  cat -n "$target" | sed -n '1,120p'
else
  printf 'Missing: %s\n' "$target"
fi

printf '%s\n' '--- advisory and version references ---'
rg -n -i 'GHSA-mhm7-754m-9p8w|GHSA-5jmj-h7xm-6q6v|CVE-2026-54515|CVE-2026-59889|2\.21\.5|Spring Boot' . --glob '!node_modules' --glob '!dist' --glob '!build'

Repository: ContextualWisdomLab/mightyETL

Length of output: 15161


🏁 Script executed:

#!/bin/bash
set -u

printf '%s\n' '--- repository guidance ---'
cat -n ../git/AGENTS.md

printf '%s\n' '--- referenced URLs and status ---'
python3 - <<'PY'
from pathlib import Path
from urllib.request import Request, urlopen
import re

path = Path("docs/doctoring/jackson-2.21.5-security-baseline.md")
text = path.read_text()
urls = re.findall(r'https?://\S+', text)

for url in urls:
    url = url.rstrip(').,;')
    try:
        request = Request(url, method="HEAD", headers={"User-Agent": "Mozilla/5.0"})
        with urlopen(request, timeout=15) as response:
            print(response.status, response.geturl(), url)
    except Exception as exc:
        print("ERROR", url, type(exc).__name__, str(exc))
PY

printf '%s\n' '--- advisory metadata ---'
for advisory in GHSA-mhm7-754m-9p8w GHSA-5jmj-h7xm-6q6v; do
  url="https://api.github.com/repos/FasterXML/jackson-databind/security-advisories/$advisory"
  printf '%s\n' "$advisory"
  curl -L --fail --silent --show-error \
    -H 'Accept: application/vnd.github+json' \
    -H 'User-Agent: review-check' \
    "$url" | jq '{ghsa_id, cve_id, summary, severity, vulnerable_versions, patched_versions, references}'
done

Repository: ContextualWisdomLab/mightyETL

Length of output: 4459


🌐 Web query:

"GHSA-mhm7-754m-9p8w" "CVE-2026-59889" Jackson

💡 Result:

GHSA-mhm7-754m-9p8w and CVE-2026-59889 are two distinct security vulnerabilities affecting the Jackson Databind library, both related to the bypass of @JsonView annotations [1][2][3]. CVE-2026-59889 CVE-2026-59889 is an authorization-bypass vulnerability where the @JsonView annotation is bypassed for @JsonUnwrapped properties [2][3][4]. Specifically, the UnwrappedPropertyHandler fails to enforce visibility checks when replaying buffered JSON, allowing an attacker to write to properties that should have been restricted by the active view [3][5][4]. This issue is fixed in Jackson Databind versions 2.18.9, 2.21.5, 2.22.1, 3.1.5, and 3.2.1 [2][3][5]. GHSA-mhm7-754m-9p8w GHSA-mhm7-754m-9p8w describes a separate @JsonView bypass vulnerability involving creator properties (e.g., constructor parameters) combined with @JsonTypeInfo(include=As.EXTERNAL_PROPERTY) [1][6][7]. The deserializer failed to apply view-based filtering in the creator-property branch, which allowed unauthorized modification of restricted creator parameters [1][6]. This is categorized as a "patch gap" because while fixes were initially applied to the 3.x line, they were not correctly backported to earlier versions [1][6][7]. This was addressed in the same release cycle as CVE-2026-59889 (e.g., 2.18.9, 2.21.5, 2.22.1) [8][9]. In summary, both identifiers represent critical @JsonView bypass flaws that allow unauthorized mass-assignment of sensitive fields, and both were addressed in the July 2026 release of Jackson Databind versions [2][3]. Users are advised to upgrade to the latest versions (2.18.9, 2.21.5, 2.22.1, 3.1.5, 3.2.1 or newer) to mitigate these risks [2][3][5].

Citations:


🏁 Script executed:

#!/bin/bash
set -u

printf '%s\n' '--- advisory API responses ---'
for advisory in GHSA-mhm7-754m-9p8w GHSA-5jmj-h7xm-6q6v; do
  printf '\n%s\n' "$advisory"
  curl -k -L --fail --silent --show-error \
    -H 'Accept: application/vnd.github+json' \
    -H 'User-Agent: review-check' \
    "https://api.github.com/repos/FasterXML/jackson-databind/security-advisories/$advisory" |
    jq '{ghsa_id, cve_id, summary, description, severity, published_at, updated_at, identifiers, references, vulnerabilities, cvss}'
done

printf '%s\n' '--- CVE record endpoints ---'
for url in \
  'https://cveawg.mitre.org/api/cve/CVE-2026-59889' \
  'https://cveawg.mitre.org/api/cve/CVE-2026-54515' \
  'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2026-59889' \
  'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2026-54515'
do
  printf '\n%s\n' "$url"
  curl -k -L --silent --show-error --max-time 20 "$url" |
    jq 'if .containers then {cveMetadata,containers} elif .vulnerabilities then {totalResults, vulnerabilities} else . end' 2>/dev/null |
    head -c 12000
  printf '\n'
done

printf '%s\n' '--- link reachability without certificate validation ---'
python3 - <<'PY'
from pathlib import Path
from urllib.request import Request, urlopen
import re, ssl

text = Path("docs/doctoring/jackson-2.21.5-security-baseline.md").read_text()
urls = sorted(set(u.rstrip(").,;") for u in re.findall(r'https?://\S+', text)))
ctx = ssl._create_unverified_context()

for url in urls:
    try:
        request = Request(url, method="HEAD", headers={"User-Agent": "Mozilla/5.0"})
        with urlopen(request, timeout=20, context=ctx) as response:
            print(response.status, response.geturl(), url)
    except Exception as exc:
        print("ERROR", url, type(exc).__name__, str(exc))
PY

Repository: ContextualWisdomLab/mightyETL

Length of output: 32751


참고문헌에 누락된 advisory 식별자를 추가하세요.

Trigger의 CVE-2026-59889GHSA-mhm7-754m-9p8w를 별도 참고문헌으로 추가하세요. CVE-2026-59889의 FasterXML advisory는 GHSA-5gvw-p9qm-jgwh이며, GHSA-mhm7-754m-9p8w와는 별도 취약점입니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/doctoring/jackson-2.21.5-security-baseline.md` around lines 91 - 93,
참고문헌 목록에 CVE-2026-59889를 FasterXML advisory 식별자 GHSA-5gvw-p9qm-jgwh와 함께 별도 항목으로
추가하고, GHSA-mhm7-754m-9p8w도 별도의 참고문헌 항목으로 추가하세요. 기존 Jackson 참고문헌 형식과 링크 스타일을
유지하세요.

Source: Coding guidelines

Comment on lines +97 to +99
Spring Boot. (2026). *Using the plugin: Using Spring Boot without the parent POM*. Spring Documentation. https://docs.spring.io/spring-boot/maven-plugin/using.html

Spring Boot. (2026). *Version properties: Jackson BOM*. Spring Documentation. https://docs.spring.io/spring-boot/3.5/appendix/dependency-versions/properties.html

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- AGENTS.md files ---'
find .. -name AGENTS.md -print

printf '%s\n' '--- target document ---'
target='docs/doctoring/jackson-2.21.5-security-baseline.md'
if [ -f "$target" ]; then
  sed -n '1,120p' "$target"
else
  printf 'Missing target: %s\n' "$target"
fi

printf '%s\n' '--- relevant repository references ---'
rg -n -i '3\.5(\.16)?|4\.1\.0|maven-plugin/using\.html|Jackson BOM|2\.21\.5|GHSA-mhm7-754m-9p8w' -- "$target" docs README.md 2>/dev/null || true

printf '%s\n' '--- link status and redirects ---'
for url in \
  'https://docs.spring.io/spring-boot/maven-plugin/using.html' \
  'https://docs.spring.io/spring-boot/3.5/maven-plugin/using.html' \
  'https://docs.spring.io/spring-boot/3.5/appendix/dependency-versions/properties.html'
do
  printf '\n%s\n' "$url"
  curl -L -sS -o /dev/null -w 'status=%{http_code} final=%{url_effective}\n' "$url" || true
done

Repository: ContextualWisdomLab/mightyETL

Length of output: 14116


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- repository guidance ---'
cat ../git/AGENTS.md

printf '%s\n' '--- unversioned page metadata ---'
curl -L -sS 'https://docs.spring.io/spring-boot/maven-plugin/using.html' |
  tr '\n' ' ' |
  grep -oE '<title>[^<]*|Spring Boot [0-9]+\.[0-9]+(\.[0-9]+)?' |
  head -20 || true

printf '%s\n' '--- versioned page metadata ---'
curl -L -sS 'https://docs.spring.io/spring-boot/3.5/maven-plugin/using.html' |
  tr '\n' ' ' |
  grep -oE '<title>[^<]*|Spring Boot [0-9]+\.[0-9]+(\.[0-9]+)?' |
  head -20 || true

printf '%s\n' '--- relevant page wording ---'
for url in \
  'https://docs.spring.io/spring-boot/maven-plugin/using.html' \
  'https://docs.spring.io/spring-boot/3.5/maven-plugin/using.html'
do
  printf '\nURL: %s\n' "$url"
  curl -L -sS "$url" |
    sed 's/<[^>]*>/ /g' |
    tr -s '[:space:]' ' ' |
    grep -oE '.{0,120}(without the parent POM|dependency management|version).{0,240}' |
    head -8 || true
done

Repository: ContextualWisdomLab/mightyETL

Length of output: 8498


Spring Boot 문서 링크를 3.5 버전으로 고정하세요.

기준선이 Spring Boot 3.5.16이므로, 최신 4.1.0 문서를 가리키는 비버전 경로 대신 /3.5/maven-plugin/using.html을 사용하세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/doctoring/jackson-2.21.5-security-baseline.md` around lines 97 - 99,
Update the Spring Boot plugin documentation link in the references to use the
version-specific `/3.5/maven-plugin/using.html` path, keeping the Jackson BOM
link and citation details unchanged.

Source: Coding guidelines

Comment on lines +30 to +39
String jacksonBom = "<artifactId>jackson-bom</artifactId>";
String springBootBom = "<artifactId>spring-boot-dependencies</artifactId>";
int jacksonIndex = pom.indexOf(jacksonBom);
int springBootIndex = pom.indexOf(springBootBom);

assertTrue(jacksonIndex >= 0, "Root dependencyManagement must import the Jackson BOM explicitly");
assertTrue(springBootIndex >= 0, "Root dependencyManagement must continue importing Spring Boot dependencies");
assertTrue(
jacksonIndex < springBootIndex,
"Without the Spring Boot parent POM, the explicit Jackson override BOM must precede spring-boot-dependencies"

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.

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- AGENTS.md files ---'
find .. -name AGENTS.md -print
printf '%s\n' '--- target and nearby Maven files ---'
git ls-files | grep -E '(^|/)(pom\.xml|JacksonSecurityBaselineTest\.java|AGENTS\.md)$' | sed -n '1,120p'
printf '%s\n' '--- test outline ---'
ast-grep outline etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java || true
printf '%s\n' '--- test source ---'
cat -n etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java
printf '%s\n' '--- Maven POM locations/content around Jackson ---'
for f in $(git ls-files '*pom.xml'); do
  if grep -q -E 'jackson|spring-boot-dependencies|jackson-bom' "$f"; then
    echo "### $f"
    grep -n -C 6 -E 'jackson|spring-boot-dependencies|dependencyManagement|jackson-databind' "$f" | sed -n '1,240p'
  fi
done

Repository: ContextualWisdomLab/mightyETL

Length of output: 6518


🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- repository guidance ---'
cat -n AGENTS.md
printf '%s\n' '--- focused verifier ---'
python3 - <<'PY'
from pathlib import Path
import xml.etree.ElementTree as ET

test = Path("etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java").read_text()
pom_text = Path("pom.xml").read_text(encoding="utf-8")
root = ET.fromstring(pom_text)
ns = {"m": "http://maven.apache.org/POM/4.0.0"}

management = root.find("m:dependencyManagement/m:dependencies", ns)
imports = []
for dep in management.findall("m:dependency", ns):
    imports.append({
        "groupId": dep.findtext("m:groupId", namespaces=ns),
        "artifactId": dep.findtext("m:artifactId", namespaces=ns),
        "version": dep.findtext("m:version", namespaces=ns),
        "type": dep.findtext("m:type", namespaces=ns),
        "scope": dep.findtext("m:scope", namespaces=ns),
    })

print("current raw checks:", {
    "version_contains": "<jackson-bom.version>2.21.5</jackson-bom.version>" in pom_text,
    "jackson_index": pom_text.find("<artifactId>jackson-bom</artifactId>"),
    "spring_boot_index": pom_text.find("<artifactId>spring-boot-dependencies</artifactId>"),
})
print("parsed jackson import:", next((d for d in imports if d["artifactId"] == "jackson-bom"), None))
print("parsed spring boot import:", next((d for d in imports if d["artifactId"] == "spring-boot-dependencies"), None))
print("test uses XML parser:", "XML" in test or "DocumentBuilder" in test or "MavenXpp3Reader" in test)
print("test resolves dependency graph:", any(x in test for x in ("dependency:tree", "effective-pom", "jackson-databind")))

counterexample = """<project>
  <properties>
    <!-- <jackson-bom.version>2.21.5</jackson-bom.version> -->
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <artifactId>unrelated-jackson-bom</artifactId>
      </dependency>
      <dependency>
        <artifactId>spring-boot-dependencies</artifactId>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>"""
print("counterexample raw checks:", {
    "version_contains": "<jackson-bom.version>2.21.5</jackson-bom.version>" in counterexample,
    "jackson_index": counterexample.find("<artifactId>jackson-bom</artifactId>"),
    "spring_boot_index": counterexample.find("<artifactId>spring-boot-dependencies</artifactId>"),
})
PY

Repository: ContextualWisdomLab/mightyETL

Length of output: 3322


🏁 Script executed:

#!/bin/bash
set -eu
python3 - <<'PY'
from pathlib import Path

source = Path("etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java").read_text()
fake_pom = """<project>
  <!--
    <jackson-bom.version>2.21.5</jackson-bom.version>
    <artifactId>jackson-bom</artifactId>
  -->
  <dependencyManagement>
    <dependencies>
      <!-- The marker below is not a dependency-management entry. -->
      <dependency>
        <artifactId>spring-boot-dependencies</artifactId>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>"""

predicates = [
    "<jackson-bom.version>2.21.5</jackson-bom.version>" in fake_pom,
    fake_pom.find("<artifactId>jackson-bom</artifactId>") >= 0,
    fake_pom.find("<artifactId>spring-boot-dependencies</artifactId>") >= 0,
    fake_pom.find("<artifactId>jackson-bom</artifactId>") < fake_pom.find("<artifactId>spring-boot-dependencies</artifactId>"),
]
print("all raw test predicates pass:", all(predicates))
print("fake POM has parsed Jackson dependency-management import:", False)
print("test source contains XML parser/model:", any(x in source for x in ("DocumentBuilder", "MavenXpp3Reader", "XmlPullParser")))
print("test source checks resolved jackson-databind version:", "jackson-databind" in source)
PY

Repository: ContextualWisdomLab/mightyETL

Length of output: 371


XML 구조와 해석된 의존성으로 Jackson 보안 계약을 검사하세요.

JacksonSecurityBaselineTestcontainsindexOf만 사용합니다. 주석이나 무관한 XML 노드의 문자열만으로 모든 검사가 통과할 수 있습니다. 테스트는 com.fasterxml.jackson:jackson-bomtype, scope, version 연결 또는 etl-service의 실제 jackson-databind 버전을 검사하지 않습니다. XML parser 또는 Maven model로 dependencyManagement 구조를 검사하고, effective POM 또는 dependency tree로 resolved version을 별도로 검사하세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@etl-service/src/test/java/com/xtrmetl/etl/documentation/JacksonSecurityBaselineTest.java`
around lines 30 - 39, JacksonSecurityBaselineTest의 문자열 기반
jacksonBom/springBootBom 검사를 XML parser 또는 Maven model 검증으로 교체하세요. 루트
dependencyManagement에서 com.fasterxml.jackson:jackson-bom의 import type, import
scope, version 연결과 spring-boot-dependencies의 실제 구조 및 순서를 확인하고, 별도 effective POM
또는 dependency tree 검증으로 etl-service가 해결한 jackson-databind 버전까지 검사하도록 업데이트하세요.

Source: Coding guidelines

@opencode-agent opencode-agent Bot added area: security Security boundary, hardening, or vulnerability prevention priority: medium Normal-priority or P2 work status: draft Draft pull request type: bug Defect or incorrect behavior labels Aug 22, 2026
@seonghobae seonghobae added the bug Something isn't working label Sep 7, 2026 — with ChatGPT Codex Connector
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: security Security boundary, hardening, or vulnerability prevention bug Something isn't working priority: medium Normal-priority or P2 work status: draft Draft pull request type: bug Defect or incorrect behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant