Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
7c477be
deps(deps): bump jackson-bom.version from 2.22.1 to 2.22.2
dependabot[bot] Aug 24, 2026
7ec762c
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Sep 28, 2026
c11cde5
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Sep 29, 2026
65ad90e
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Sep 29, 2026
c6d2071
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Sep 29, 2026
c6a2a0a
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Sep 29, 2026
3e9ba61
fix(security): patch Jackson denial-of-service CVEs
seonghobae Oct 1, 2026
bf121df
docs(gaps): bind Jackson repair to exact evidence
seonghobae Oct 1, 2026
027474b
fix(security): integrate Jackson owner and repair admin fixture
seonghobae Oct 1, 2026
fd020bd
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
6e4934c
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
f2a3f02
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
d76c5c3
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
704b717
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
fe3c35f
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
af51b45
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
5d2bd73
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
7294365
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
6736608
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
6ab3c7d
Admin API ์ธ์ฆ ๋ˆ„๋ฝ ํ•ด๊ฒฐ
seonghobae Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .jules/sentinel.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,8 @@
**Vulnerability:** The document hashing routine in `DefaultDocumentConversionService` processed file streams without enforcing any maximum size limit on the bytes read. An attacker could exploit this by uploading a maliciously large stream (or exploiting a compression bomb if unzipping), exhausting system memory, CPU, or disk space (DoS).
**Learning:** Checking the declared file size (e.g., `file.getSize()`) in initial validation is not always sufficient if the input stream itself can be spoofed or dynamically expanded during reading. The actual bytes read must be verified against bounds continuously.
**Prevention:** Always enforce a strict, configurable size limit (e.g., `ConversionProperties.maxUploadSizeBytes`) within the `while` loop that reads from untrusted input streams. Track `totalRead` and throw an exception immediately if the limit is exceeded.

## 2026-07-20 - Admin API Authorization Check
**Vulnerability:** The Admin API (`AdminController`) exposed internal admin endpoints (`/api/v1/admin/convert/jobs`, etc.) without any `TenantAccessService` authorization checks.
**Learning:** Admin endpoints must enforce strict authorization checks, such as `admin:operate`, to prevent unauthorized internal or external users from listing all tenant jobs, deleting them, or retrying dead lettered jobs without authorization.
**Prevention:** Always inject `TenantAccessService` into admin endpoints and require appropriate cross-tenant admin permissions via `tenantAccessService.require(headers, "admin:operate")`.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

### Security

- Jackson BOM์„ `2.22.3`์œผ๋กœ ์˜ฌ๋ ค `jackson-databind`์˜ ๋ฌด์ œํ•œ type-id ์บ์‹œ ์„ฑ์žฅ(CVE-2026-91776)๊ณผ ์ด์ฐจ ์‹œ๊ฐ„ forward-reference ํ•ด์„(CVE-2026-91777)์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ๋ฃŒ๋œ GHSA-5jmj-h7xm-6q6v OSV ์˜ˆ์™ธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  SBOMยท์ œ3์ž ๊ณ ์ง€๋ฌธ์„ ์ƒˆ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์™€ ํ•จ๊ป˜ ๊ฐฑ์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.
- `GET /api/v1/convert/jobs/{jobId}/download`๊ฐ€ ๋ฆฌ์†Œ์Šค ์กฐํšŒ ์ „์— ์ „์šฉ `artifact:read` ๊ถŒํ•œ์„ ๊ฒ€์ฆํ•˜๊ณ , PDF ์ €์žฅ์†Œ ์ ‘๊ทผ ์ „์— ์ž‘์—…์˜ tenant ์†Œ์œ ๊ถŒ์„ ํ™•์ธํ•˜๋„๋ก ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. `job:read`๋งŒ์œผ๋กœ๋Š” ๋ฌธ์„œ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์œผ๋ฉฐ, ์ธ์ฆ ๋ˆ„๋ฝยท๊ถŒํ•œ ๋ˆ„๋ฝยท๊ต์ฐจ tenant UUID ์ ‘๊ทผ์€ ๊ฐ๊ฐ fail closed ์ฒ˜๋ฆฌ๋˜๊ณ  ๊ต์ฐจ tenant ์š”์ฒญ์€ ๋ฆฌ์†Œ์Šค ์กด์žฌ๋ฅผ ์ˆจ๊ธฐ๋Š” `404`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
- Maven XML ํ…Œ์ŠคํŠธ ๋ณด๊ณ ์„œ ๊ฒ€์ฆ๊ธฐ๋Š” ๊ฐ `testsuite`์˜ `tests`, `skipped`, `failures`, `errors` ์†์„ฑ์„ ๋ชจ๋‘ ํ•„์ˆ˜ ์ฆ๊ฑฐ๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ์•”๋ฌต์ ์œผ๋กœ 0์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š๊ณ  fail closed ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๊ฐ ์†์„ฑ ๋ˆ„๋ฝ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
- Maven XML ํ…Œ์ŠคํŠธ ๋ณด๊ณ ์„œ ๊ฒ€์ฆ๊ธฐ๋Š” UTF-8๋งŒ ํ—ˆ์šฉํ•˜๊ณ  UTF-8 BOM์€ ์ˆ˜์šฉํ•˜๋ฉฐ, NUL ๋ฐ”์ดํŠธยทDTDยท์—”ํ„ฐํ‹ฐ ์„ ์–ธ์„ ํŒŒ์‹ฑ ์ „์— ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. UTF-16 ๊ฐ™์€ ๋Œ€์ฒด ์ธ์ฝ”๋”ฉ์œผ๋กœ ์œ„ํ—˜ ์„ ์–ธ์„ ๋ฐ”์ดํŠธ ๊ฒ€์‚ฌ์—์„œ ์ˆจ๊ธฐ๋Š” ์šฐํšŒ์™€ ์™ธ๋ถ€ ์—”ํ„ฐํ‹ฐ ์ฝ๊ธฐยท์—”ํ„ฐํ‹ฐ ํ™•์žฅํ˜• ์„œ๋น„์Šค ๊ฑฐ๋ถ€๋ฅผ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋กœ ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
Expand All @@ -36,6 +37,7 @@

### Fixed

- Enforced `admin:operate` on every Admin API endpoint and repaired the controller test fixture to construct the released `TenantContext` contract directly.
- ๋ทฐ์–ด UI์˜ ์žฌ์‹œ๋„ ๋ฒ„ํŠผ ๋กœ๋”ฉ ์ƒํƒœ๊ฐ€ ๋‚ด๋ถ€ DOM์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋ณต์›๋˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

## [0.1.0] - 2026-06-25
Expand Down
10 changes: 5 additions & 5 deletions docs/legal/2026-07-03-third-party-attribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ CycloneDX SBOM. It is engineering evidence, not legal advice.
| Component | Version | License metadata | Package URL |
| --- | --- | --- | --- |
| com.fasterxml.jackson.core:jackson-annotations | 2.22 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.22?type=jar` |
| com.fasterxml.jackson.core:jackson-core | 2.22.1 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.core/jackson-core@2.22.1?type=jar` |
| com.fasterxml.jackson.core:jackson-databind | 2.22.1 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.22.1?type=jar` |
| com.fasterxml.jackson.datatype:jackson-datatype-jdk8 | 2.22.1 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.datatype/jackson-datatype-jdk8@2.22.1?type=jar` |
| com.fasterxml.jackson.datatype:jackson-datatype-jsr310 | 2.22.1 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.datatype/jackson-datatype-jsr310@2.22.1?type=jar` |
| com.fasterxml.jackson.module:jackson-module-parameter-names | 2.22.1 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.module/jackson-module-parameter-names@2.22.1?type=jar` |
| com.fasterxml.jackson.core:jackson-core | 2.22.3 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.core/jackson-core@2.22.3?type=jar` |
| com.fasterxml.jackson.core:jackson-databind | 2.22.3 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.22.3?type=jar` |
| com.fasterxml.jackson.datatype:jackson-datatype-jdk8 | 2.22.3 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.datatype/jackson-datatype-jdk8@2.22.3?type=jar` |
| com.fasterxml.jackson.datatype:jackson-datatype-jsr310 | 2.22.3 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.datatype/jackson-datatype-jsr310@2.22.3?type=jar` |
| com.fasterxml.jackson.module:jackson-module-parameter-names | 2.22.3 | Apache-2.0 | `pkg:maven/com.fasterxml.jackson.module/jackson-module-parameter-names@2.22.3?type=jar` |
| com.fasterxml:classmate | 1.7.3 | Apache-2.0 | `pkg:maven/com.fasterxml/classmate@1.7.3?type=jar` |
| commons-logging:commons-logging | 1.4.0 | Apache-2.0 | `pkg:maven/commons-logging/commons-logging@1.4.0?type=jar` |
| io.micrometer:micrometer-commons | 1.15.12 | Apache-2.0 | `pkg:maven/io.micrometer/micrometer-commons@1.15.12?type=jar` |
Expand Down
59 changes: 59 additions & 0 deletions docs/product-technical-gap-baseline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Clearfolio Product and Technical Gap Baseline

## Goal and loop

Clearfolio is the ContextualWisdomLab document-viewer bounded context. Its buyer
quality loop is review โ†’ root-cause repair โ†’ exact-head validation โ†’ ordinary
merge. A queued, skipped, stale-head, or fail-closed Check is not passing.

## Current product and technical boundary

- **Product responsibility:** submit documents asynchronously, expose conversion
status, render same-origin PDF artifacts, and enforce tenant-scoped access.
- **Runtime boundary:** Spring WebFlux controllers delegate validation,
conversion, state, artifact, authorization, and audit work to their owning
services and repositories; no cross-service database access is authorized.
- **Supply-chain boundary:** Maven dependency policy, CycloneDX SBOM, license
policy, third-party attribution, Trivy, OSV, Semgrep, and CodeQL provide
fail-closed release evidence.

## PRD and TRD acceptance baseline

| Evidence | Acceptance rule | Status |
| --- | --- | --- |
| Product behavior | `mvn -B --no-transfer-progress verify`; zero test failures, errors, or skips; production line and branch coverage 100% | Required on exact repair head |
| Public contract | Java 21 compilation and public Javadocs complete with warning and deprecation budget 0 | Required on exact repair head |
| Supply chain | Trivy/OSV/SAST report no actionable finding; committed SBOM and attribution match the resolved dependency graph | #503 Security `36824043955` and SAST `36824043968` GREEN |
| Review admission | Independent approval and all required terminal Checks bind to the current head | Not yet satisfied |

## Gap and action ledger

| Gap | Exact evidence and RCA | Action | Status |
| --- | --- | --- | --- |
| Jackson denial-of-service exposure | clearfolio#660 head `2a6b0b621e075da224210c0ca78db344af5dea52`, Security run `36778995059`, Trivy job `110104143035`: CVE-2026-91776 and CVE-2026-91777 in `jackson-databind` 2.22.2 | Repair canonical dependency owner #503 with Jackson 2.22.3, a downgrade regression test, refreshed SBOM/attribution, and removal of the expired OSV exception | Resolved at source commit `3e9ba61e1aa2a903e920cf832f9daa5467f2e166`; CI `36824043863`, Security `36824043955`, SAST `36824043968`, and fuzz `36824043977` GREEN |
| Historical evidence drift | #503 review found its original one-file 2.22.2 bump left SBOM, attribution, POM rationale, and expired ignore stale | Keep dependency version and buyer evidence in one PR; run attribution/license drift checks | Resolved; both review threads closed and local evidence contracts GREEN |
| Merge admission | #503 is Ready after product/security/fuzz validation; its Draft CodeQL run `36824043888` was skipped. #660 is Draft on the vulnerable predecessor head. | Obtain a non-skipped CodeQL verdict and independent approval on the current #503 head, then ordinarily integrate it into consumers and revalidate their new heads | Hold |

## Decision traceability

The selected repair is the upstream Jackson 2.22.3 patch line, released
2026-09-21 with fixes for both CVEs. Ignoring the findings, weakening Trivy, or
retaining the expired OSV exception was rejected because each would preserve a
buyer-visible denial-of-service risk or conceal stale evidence. A new duplicate
dependency PR was rejected because #503 already owns the Jackson version delta.

## References

FasterXML. (2026, September 21). *Jackson release 2.22.3*.
https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.22.3


## 2026-10-01 โ€” Admin API authorization successor evidence

- PR: [#650](https://github.com/ContextualWisdomLab/clearfolio/pull/650)
- RED exact head: `c6a2a0aa5227c85e52f9eb2c48c7a1839587b802`
- RED CI: [run 36624093074, Maven test job 109596509190](https://github.com/ContextualWisdomLab/clearfolio/actions/runs/36624093074/job/109596509190)
- RED Security: [run 36624093209, Trivy job 109733907158](https://github.com/ContextualWisdomLab/clearfolio/actions/runs/36624093209/job/109733907158)
- Root causes: the new test called nonexistent `TenantContext.fromClaims`, and the consumer head predated canonical Jackson owner #503.
- Repair: construct the released `TenantContext` record directly, preserve the complete AdminController authorization delta, and integrate owner #503 as an ordinary second parent with its Jackson 2.22.3 dependency/SBOM/attribution/contracts.
- Status: **Proposed / Draft / merge HOLD** until the new immutable head has terminal CI, Security, SAST, all fuzz shards, CodeQL, and qualifying independent approval. Predecessor, queued, skipped, cancelled, or pending evidence is not GREEN.
Loading
Loading