Skip to content

fix(build): 빌드 툴체인 보안 하한 9건·해석 정합성 2건 정렬 (closes 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 985) [base: chore/921] - #1003

Merged
OnlyReadOneBook merged 1 commit into
developfrom
fix/973
Aug 24, 2026
Merged

OnlyReadOneBook merged 1 commit into
developfrom
fix/973

Conversation

@OnlyReadOneBook

Copy link
Copy Markdown
Collaborator

변경 요약

dependency-audit 이 올린 감사 이슈 14건(#973~#986) 중 11건을 처리한다. 보안 권고 9건은 전부 buildscript classpath·빌드 도구 경유이고 APK 산출물에는 없다 — releaseRuntimeClasspath 검출 0건을 실측했다.

보안 하한 (#975~#982, #985)

유입 경로를 전수 리졸브로 특정한 뒤 constraint 로 올렸다. 상류(AGP 9.2.1·Firebase App Distribution 5.3.0)가 아직 취약 버전을 물고 있고 상류 최신판도 패치 버전 미만이다.

대상 현재 → 하한 유입 경로 (실측)
io.netty 6종 4.1.110.Final → 4.1.137.Final Firebase App Distribution 5.3.0 → grpc-netty 1.69.1
commons-lang3 3.16.0 → 3.18.0 AGP 9.2.1 → sdk-common → sdklib → repository → commons-compress 1.27.1
jose4j 0.9.5 → 0.9.6 AGP 9.2.1 → bundletool 1.18.3
jdom2 2.0.6 → 2.0.6.1 AGP 9.2.1 → jetifier-processor 1.0.0-beta10
  • chore(build): 빌드·테스트 클래스패스 bouncycastle 1.84 상향 — dependency-review critical(GHSA-574f-3g2m-x479) 해소 #921 이 만든 bouncycastle 전용 구조를 SecurityFloor 목록으로 일반화해 네 품목을 함께 싣는다. 별도 빌드인 build-logic 에도 같은 하한을 선언한다(netty 는 거기 없다).
  • netty 는 개별 constraint 대신 netty-bom 으로 걸었다. grpc-netty 가 끌어오는 모듈이 10개를 넘고 서로 버전이 맞아야 한다.
  • netty BOM 은 루트 buildscript classpath 에만 건다. allprojects 하한에 함께 걸었더니 AGP 의 android-reverse-meta-data usage 가 platform 변형을 못 찾아 :app:processDebugMainManifest 가 깨졌고, 전 프로젝트 실측에서 netty 53건이 전부 루트 buildscript 소속임을 확인해 그쪽 전용으로 좁혔다.

해석 정합성 (#973, #974)

  • material3 (fix(build): androidx-compose-material3 선언 버전과 Gradle 해석 버전을 일치시킨다 #973) — 카탈로그는 Compose BOM 2026.06.01(=material3 1.4.0)을 정본으로 두는데, richeditor-compose 1.0.0 이 딸려 보내는 CMP material3:1.11.0-alpha07 이 conflict resolution 으로 이겨 앱 전체가 1.5.0-alpha17(alpha) 로 렌더되고 있었다. 쓰는 심볼은 BasicRichTextEditor·rememberRichTextState 뿐(foundation 계열)이라 미사용 material3 갈래를 끊어 BOM 을 정본으로 되돌린다. richeditor 1.1.0 도 같은 알파를 물고 있어 업그레이드로는 해소되지 않는다.
  • coroutines (fix(build): coroutines-core 선언 버전과 Gradle 해석 버전을 일치시킨다 #974) — :app 은 원래 1.11.0 이 맞고, 어긋난 곳은 :konsist 의 testRuntimeClasspath 였다(konsist 0.17.3 → kotlin-compiler-embeddable 2.0.21 경유 1.9.0). 아키텍처 테스트 전용 모듈이지만 감사가 보는 configuration 을 카탈로그 선언으로 맞춘다.

검증

  • compileDebugUnitTestKotlin(전 모듈 게이트) + testDebugUnitTest + :app:assembleDebug + :konsist:test + :build-logic:test — BUILD SUCCESSFUL, FAILED 0
  • 시각 검증: 스크린샷 baseline 119개를 CI 동일 docker(ubuntu/amd64) 컨테이너에서 validateDebugScreenshotTest 4모듈(core:ui·app·feature:afternote:presentation·feature:onboarding:presentation) 돌려 BUILD SUCCESSFUL — material3 알파→안정판 전환에도 렌더 변화 0건이라 baseline 재생성은 없다.
  • 리졸브 재실측: 잔존 취약 버전 0건 (netty 53건 전원 4.1.137.Final, konsist coroutines 1.9.0→1.11.0, material3 1.5.0-alpha17 검출 0건, build-logic 3품목 상향)
  • ktlintCheck 위반 0건
  • 에뮬 QA·시안 대조: 해당 없음 — 빌드 스크립트·버전 카탈로그만 변경했고 Compose 본문·디자인 토큰·리소스는 무변경이다. material3 다운그레이드의 시각 영향은 위 스크린샷 119개로 판정했다.

리뷰어에게

Closes #973
Closes #974
Closes #975
Closes #976
Closes #977
Closes #978
Closes #979
Closes #980
Closes #981
Closes #982
Closes #985

Base automatically changed from chore/921 to develop August 24, 2026 09:16
dependency-audit 이 올린 감사 이슈 14건 중 11건을 처리한다. 보안 권고 9건은 전부 buildscript
classpath·빌드 도구 경유이고 APK 산출물에는 없다(releaseRuntimeClasspath 0건 실측).

- netty 6종(#975~#980): Firebase App Distribution 5.3.0 → grpc-netty 1.69.1 이 끌어오는
  4.1.110.Final. 모듈이 10개를 넘고 서로 버전이 맞아야 해 netty-bom 4.1.137.Final 로 정렬한다.
  루트 buildscript classpath 에만 있어(전 프로젝트 실측 53건 전부 여기) 거기서만 건다 —
  allprojects 하한에 BOM 을 함께 걸면 AGP 의 android-reverse-meta-data usage 가 platform 변형을
  못 찾아 :app:processDebugMainManifest 가 깨진다.
- commons-lang3 3.18.0(#981)·jose4j 0.9.6(#982)·jdom2 2.0.6.1(#985): 모두 AGP 9.2.1 전이.
  #921 이 만든 bouncycastle 하한 구조를 SecurityFloor 목록으로 일반화해 함께 싣고, 별도 빌드인
  build-logic 에도 같은 하한을 선언한다.
- material3(#973): richeditor 1.0.0 이 딸려 보내는 CMP material3 1.11.0-alpha07 이 androidx
  material3 를 BOM 판 1.4.0 대신 1.5.0-alpha17(alpha)로 끌어올리고 있었다. 쓰는 건
  BasicRichTextEditor(foundation 계열)뿐이라 미사용 material3 갈래를 끊어 BOM 을 정본으로
  되돌린다. richeditor 1.1.0 도 같은 알파를 물고 있어 업그레이드로는 해소되지 않는다.
- coroutines(#974): :konsist 만 konsist 0.17.3 → kotlin-compiler-embeddable 2.0.21 경유로
  1.9.0 이었다. 아키텍처 테스트 전용 모듈이지만 감사가 보는 testRuntimeClasspath 를 카탈로그
  선언(1.11.0)에 맞춘다.

#983·#984(bouncycastle)는 #921 이 이미 1.84 로 해결해 여기서 다루지 않는다. #986(Kotlin Gradle
Plugin, GHSA-r937-wjx7-w2jp)은 정식 패치판이 없고(2.4.20-Beta1 만) org.gradle.caching=false 로
공격면이 닫혀 있어 채택하지 않는다 — 근거는 이슈 코멘트에 남긴다.

검증: compileDebugUnitTestKotlin 전 모듈 + testDebugUnitTest + :app:assembleDebug + :konsist:test
+ :build-logic:test BUILD SUCCESSFUL(FAILED 0). 스크린샷 119개는 CI 동일 docker(amd64) 컨테이너
validateDebugScreenshotTest 4모듈 BUILD SUCCESSFUL — 렌더 변화 0건으로 baseline 재생성 불필요.
리졸브 재실측 잔존 취약 버전 0건. ktlintCheck 위반 0건.
@OnlyReadOneBook
OnlyReadOneBook merged commit 78ce0be into develop Aug 24, 2026
11 of 13 checks passed
@OnlyReadOneBook
OnlyReadOneBook deleted the fix/973 branch August 24, 2026 09:25
@github-actions

Copy link
Copy Markdown
Contributor

🚀 QA 배포 권장

QA 포인트

이 판단은 배포를 자동 실행하지 않습니다. deploy일 때 Release Distribution을 수동 실행하세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment