Skip to content

🛡️ Sentinel: [CRITICAL] Admin API 인증 누락 해결 - #650

Open
seonghobae wants to merge 20 commits into
mainfrom
sentinel/admin-auth-7059052898980609195
Open

seonghobae wants to merge 20 commits into
mainfrom
sentinel/admin-auth-7059052898980609195

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

Current exact-head authority — 2026-10-01

  • State: Ready for review / Proposed / merge HOLD.
  • Exact head: af51b45632c865d5dd0eadb125fc5df4029dc816.
  • fe3c35f2aeea927f1275c0365451df97383d2e8b...af51b45632c865d5dd0eadb125fc5df4029dc816 is one ordinary fast-forward commit with zero changed files. The repaired tree is unchanged.
  • The repair replaces the nonexistent TenantContext.fromClaims test call with construction of the released record, preserves every admin:operate enforcement path, and integrates canonical Jackson 2.22.3 owner repair fix(security): bump Jackson from 2.22.1 to 2.22.3 #503 with SBOM/attribution/dependency contracts, exception removal, CHANGELOG, and product-gap RCA.

Exact-head evidence

Queued and in-progress are not GREEN. Merge remains prohibited until every exact-head Check is terminal-successful and a qualifying independent approval is submitted. No Force Push, destructive rebase, gate weakening, self-approval, bypass, Close, or auto-merge is authorized.

Summary by CodeRabbit

  • 보안
    • 작업 목록 조회, 작업 삭제, 재시도 등 관리자 API 요청에 admin:operate 권한 확인을 적용했습니다. 권한이 없는 요청은 거부됩니다.
    • Jackson 라이브러리를 2.22.3으로 업데이트해 관련 서비스 거부 취약점을 수정했습니다.
  • 문서 및 보안 정보
    • 업데이트된 라이브러리 버전에 맞춰 소프트웨어 구성 목록과 제3자 고지 정보를 갱신했습니다.

dependabot Bot and others added 2 commits August 24, 2026 00:12
Bumps `jackson-bom.version` from 2.22.1 to 2.22.2.

Updates `com.fasterxml.jackson:jackson-bom` from 2.22.1 to 2.22.2
- [Commits](FasterXML/jackson-bom@jackson-bom-2.22.1...jackson-bom-2.22.2)

Updates `com.fasterxml.jackson.core:jackson-databind` from 2.22.1 to 2.22.2
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson:jackson-bom
  dependency-version: 2.22.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.22.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@google-labs-jules

Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: e5ca72c4-8675-4e1a-bd97-30267cc086a4

📥 Commits

Reviewing files that changed from the base of the PR and between c6a2a0a and 6736608.

📒 Files selected for processing (10)
  • CHANGELOG.md
  • docs/legal/2026-07-03-third-party-attribution.md
  • docs/product-technical-gap-baseline.md
  • docs/qa/evidence/2026-07-02-krw2b-sale-readiness/sbom-cyclonedx.json
  • osv-scanner.toml
  • pom.xml
  • scripts/test_render_third_party_attribution.py
  • src/main/java/com/clearfolio/viewer/controller/AdminController.java
  • src/test/java/com/clearfolio/viewer/config/DependencyPolicyTest.java
  • src/test/java/com/clearfolio/viewer/controller/AdminControllerTest.java
💤 Files with no reviewable changes (1)
  • osv-scanner.toml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

AdminController의 작업 조회·삭제·재시도 엔드포인트에 요청 헤더 기반 admin:operate 권한 검사를 추가했습니다. Jackson BOM을 2.22.3으로 갱신하고 관련 테스트와 공급망 자료를 업데이트했습니다.

Changes

Admin API 권한 검사

Layer / File(s) Summary
엔드포인트 권한 검사 및 검증
src/main/java/com/clearfolio/viewer/controller/AdminController.java, src/test/java/com/clearfolio/viewer/controller/AdminControllerTest.java, .jules/sentinel.md, docs/product-technical-gap-baseline.md, CHANGELOG.md
AdminController의 작업 조회·삭제·재시도 전에 요청 헤더를 사용해 admin:operate 권한을 확인합니다. 테스트는 권한 거부 시 403 응답을 검증합니다. 관련 권한 검사 기록과 변경 로그도 갱신합니다.

Jackson 의존성 보안 업데이트

Layer / File(s) Summary
Jackson 버전 및 공급망 자료 갱신
pom.xml, docs/qa/evidence/.../sbom-cyclonedx.json, docs/legal/2026-07-03-third-party-attribution.md, scripts/test_render_third_party_attribution.py, src/test/java/com/clearfolio/viewer/config/DependencyPolicyTest.java
Jackson BOM을 2.22.3으로 올리고 SBOM 및 제3자 고지문의 버전 정보를 갱신합니다. 테스트는 POM, SBOM, 고지문의 버전 일치를 확인합니다.
Jackson 보안 기록 및 예외 제거
CHANGELOG.md, docs/product-technical-gap-baseline.md, osv-scanner.toml
변경 기록과 기술 기준 문서에 Jackson 업데이트 및 보안 상태를 기록하고, 만료된 GHSA 예외 항목을 제거합니다.

Priority: ⬆️ High

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

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant AdminController
  participant TenantAccessService
  participant DocumentConversionService
  AdminController->>TenantAccessService: 요청 헤더로 admin:operate 권한 확인
  TenantAccessService-->>AdminController: 권한 검사 결과 반환
  AdminController->>DocumentConversionService: 권한 확인 후 작업 요청
Loading

Merge Risk: ⚪ Minimal · up to 67366

The change adds admin authorization and aligns Jackson dependency records. No actionable merge-blocking defect is identified; complete the required exact-head checks and approval before merging.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 67366

The new permission checks reduce access to administrative operations before any job is read or changed. No introduced or worsened security issue was established. Remaining uncertainty concerns deployment-level signing enforcement, the intended scope of administrative authority, and existing recovery guarantees.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • observed — The administrative permission protects repository-wide job listing and job-ID-based deletion or retry, not operations limited to the supplied tenant. Authorized administrative authority therefore extends across jobs returned or resolved by the shared repository. This scope is pre-existing; the PR adds a gate rather than broadening it.

Security Findings and Attack Paths

  • inferred — If these endpoints are exposed without a signing secret or an independently enforcing upstream boundary, a caller can supply tenant, subject, and admin:operate headers to pass the new permission gate. That conditional exposure does not exceed the baseline endpoints, which lacked the gate entirely. Actual deployment reachability and upstream enforcement were not established.

Trust Boundaries and Controls

  • observed — Request headers supply identity and permissions. The shared service validates configured signatures before permission membership, and all three admin handlers invoke it before their sensitive sinks. Startup enforcement of a nonblank signing secret is explicitly limited to the production profile; available resource configuration does not establish that every exposed deployment activates that profile.

Resilience and Maintainability Implications

  • observed — Deletion attempts artifact cleanup before removing the job, but suppresses cleanup exceptions and continues repository deletion. This unchanged behavior can leave an artifact after its job is removed. A durable reconciliation guarantee was not established, and the new authorization gate does not change this cleanup sequence.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 15 functions across 4 files. (5 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 Admin API의 누락된 인증 및 admin:operate 권한 검사를 해결하는 주요 변경 사항을 명확하게 요약합니다.
Full details: Docstring Coverage

Explanation

Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 15 functions across 4 files. (5 skipped: 5 unsupported.)

✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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

Exact-head admission correction — c6a2a0aa5227c85e52f9eb2c48c7a1839587b802

Ready is review admission only. Fresh audit against base 06633a25109c62e24a7015ae04fb9f6e0a246f7e found:

  • latest terminal workflow blockers: CodeQL PR 36624092911=failure, CI 36624093074=failure, fuzz 36624092806=failure

This PR is moved to Draft/Proposed until the causal owner repair is present on a successor exact head and re-audited. Queued/pending work is neither an additional blocker nor passing evidence. No Close, force push, destructive rebase, manual rerun, synthetic status/approval, merge, auto-merge, or bypass was performed.

@seonghobae
seonghobae marked this pull request as draft September 30, 2026 05:32

@opencode-agent opencode-agent 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.

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for c6a2a0aa5227c85e52f9eb2c48c7a1839587b802.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: sentinel.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: sentinel.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Repository file: AdminController.java"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Repository file: AdminController.java"]
  R2 --> V2["required checks"]
  Evidence --> S3["Test: AdminControllerTest.java"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: AdminControllerTest.java"]
  R3 --> V3["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

@seonghobae
seonghobae marked this pull request as ready for review October 1, 2026 08:10

Copy link
Copy Markdown
Collaborator Author

Exact-head RCA update (027474b1649decb82ceedae5592cb25b55a22676)

  • Prior CI/fuzz failure: AdminControllerTest called nonexistent TenantContext.fromClaims; the fixture now constructs the released record directly while preserving the authorization delta.
  • Prior Security failure: the consumer still selected Jackson 2.22.1; canonical owner fix(security): bump Jackson from 2.22.1 to 2.22.3 #503 was integrated as an ordinary second parent, including 2.22.3, SBOM/attribution/contracts, and expired-exception removal.
  • Current-head evidence: CI, fuzz (all shards), Security, and SAST are SUCCESS.
  • CodeQL is SKIPPED from the Draft-time run, not passing evidence. The only review is CHANGES_REQUESTED against predecessor c6a2a0aa5227c85e52f9eb2c48c7a1839587b802.

Merge remains HOLD pending terminal current-head CodeQL and qualifying independent approval. No force push, destructive rebase, bypass, close, or self-approval was used.

AdminController 내 admin 권한 보호 로직 추가
불필요 파일 삭제 및 포맷팅 처리
빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.

Copy link
Copy Markdown
Collaborator Author

Exact-head revalidation complete for fd020bdba3b69a4f40bd6e3547722d479da77bb1. The one commit after repaired head 027474… is formatting/constructor-parameter naming only and preserves all three admin:operate enforcement points. CI 36837071284, fuzz 36837071532, Security 36837071330, SAST 36837071322, and CodeQL 36837071287 are SUCCESS. CodeQL’s first attempt failed closed while central scanning ran; the failed jobs were rerun only after the authenticated dispatch verdict was available, and all four language shards then passed. Merge remains HOLD because no qualifying independent current-head approval exists; the predecessor CHANGES_REQUESTED review is not approval for this head.

@google-labs-jules

Copy link
Copy Markdown

Exact-head RCA update (027474b1649decb82ceedae5592cb25b55a22676)

  • Prior CI/fuzz failure: AdminControllerTest called nonexistent TenantContext.fromClaims; the fixture now constructs the released record directly while preserving the authorization delta.
  • Prior Security failure: the consumer still selected Jackson 2.22.1; canonical owner fix(security): bump Jackson from 2.22.1 to 2.22.3 #503 was integrated as an ordinary second parent, including 2.22.3, SBOM/attribution/contracts, and expired-exception removal.
  • Current-head evidence: CI, fuzz (all shards), Security, and SAST are SUCCESS.
  • CodeQL is SKIPPED from the Draft-time run, not passing evidence. The only review is CHANGES_REQUESTED against predecessor c6a2a0aa5227c85e52f9eb2c48c7a1839587b802.

Merge remains HOLD pending terminal current-head CodeQL and qualifying independent approval. No force push, destructive rebase, bypass, close, or self-approval was used.

Acknowledged.

@google-labs-jules

Copy link
Copy Markdown

Exact-head revalidation complete for fd020bdba3b69a4f40bd6e3547722d479da77bb1. The one commit after repaired head 027474… is formatting/constructor-parameter naming only and preserves all three admin:operate enforcement points. CI 36837071284, fuzz 36837071532, Security 36837071330, SAST 36837071322, and CodeQL 36837071287 are SUCCESS. CodeQL’s first attempt failed closed while central scanning ran; the failed jobs were rerun only after the authenticated dispatch verdict was available, and all four language shards then passed. Merge remains HOLD because no qualifying independent current-head approval exists; the predecessor CHANGES_REQUESTED review is not approval for this head.

Acknowledged.

빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.
빈 커밋을 통해 CI를 재트리거합니다.
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