Skip to content

fix: 서버와 규칙 테스트의 npm 의존성을 패치한다 - #228

Merged
OnlyReadOneBook merged 2 commits into
mainfrom
feat/225
Sep 13, 2026
Merged

OnlyReadOneBook merged 2 commits into
mainfrom
feat/225

Conversation

@OnlyReadOneBook

@OnlyReadOneBook OnlyReadOneBook commented Sep 13, 2026 •

Copy link
Copy Markdown
Owner

📌𝘐𝘴𝘴𝘶𝘦𝘴

남은 stream-json 호환 패치는 #230에서 추적합니다.

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

  • 서버와 Firestore 규칙 테스트의 취약한 전이 의존성을 호환 패치로 교체하고, 미사용 테스트 라이브러리를 제거합니다.

functions

  • uuid 를 11.1.1 로 고정했다. 이 트리의 uuid 소비자는 firebase-admin(eventarc-utils), gaxios, google-gax, teeny-request 뿐이고 넷 다 v4 만 부른다. uuid 12.0.0 이 CommonJS 를 없앴으므로(CHANGELOG) CommonJS 로 도는 이 트리에서 올릴 수 있는 마지막 패치 판이 11.1.1 이다. 권고는 GHSA-w5hq-g745-h8pq(CVE-2026-41907, v3/v5/v6 이 외부 버퍼 경계를 검사하지 않는 문제).
  • 기존 qs 6.16.0 고정은 그대로 두었다(fix: 공유 일정 서버 알림의 삭제와 전송 경계를 검증한다 #195).
  • firebase-functions-test 를 devDependencies 에서 뺐다. 저장소 안에서 부르는 코드가 없고(참조는 functions/package.json 한 줄뿐이었다), 남겨 두면 패치 판이 없는 ts-deepmerge(GHSA-87mf-gv2c-c62c)만 딸려 온다. 패치는 8.0.0 뿐인데 v8 의 CommonJS 진입점은 merge 만 내보내고 default export 가 없어서, firebase-functions-test 가 lib/cloudevent/generate.js:51 에서 부르는 default 가 사라진다. 최신 3.5.0 도 여전히 ts-deepmerge ^2.0.1 이다. 함수 코드와 테스트는 그대로다.

firestore-tests

  • overrides 를 새로 두고 네 가지를 고정했다.
    • csv-parse 7.0.2 — GHSA-8cw4-87c7-c6xx. firebase-tools 는 commands/auth-import.js 에서 require("csv-parse") 의 parse() 를 옵션 없이 한 번 부르는 게 전부라, 6.0.0 이 바꾼 옵션 이름(relax → relax_quotes 등)·오류 코드 이름·csv-parse/lib/sync 경로 변경에 걸리지 않는다. 7.0.0 은 저자 표기대로 breaking change 없는 실수 배포다.
    • qs 6.16.0 — GHSA-x5fp-wj9c-mxmx, GHSA-4mjr-xmp4-gh2g. 에뮬레이터 허브가 얹혀 있는 express 4.22.2 경로이고, functions 쪽에서 이미 같은 판으로 돈다.
    • @opentelemetry/core 2.8.0 — GHSA-8988-4f7v-96qf. @google-cloud/pubsub 5.3.1 이 ^1.30.1 을 적지만, firebase-tools 15.29.0 자신의 overrides 가 @opentelemetry/core: ^2.8.0 을 박아 둔다. 같은 조합을 따랐고 모듈 적재를 테스트로 잠갔다.
    • gaxios 밑의 uuid 11.1.1 — functions 와 같은 권고다. 전역이 아니라 gaxios 범위로 좁혀, 이미 패치 판(14.0.2)을 쓰는 universal-analytics 를 끌어내리지 않게 했다.
  • firebase-tools 는 15.29.0 그대로다. 15.30.0 도 csv-parse ^5.0.4, stream-json ^1.7.3, gaxios ^6.7.0 이라 이 권고들과 무관하다.

회귀 가드

  • functions/test/runtime.test.cjs 에 uuid 버퍼 경계와 CommonJS v4 두 건을 더했다.
  • firestore-tests/tooling.test.mjs 를 새로 뒀다(csv-parse 진입점, qs 배열 한도, uuid 버퍼 경계, pubsub 적재). 모듈은 루트가 아니라 소비하는 패키지의 require 문맥에서 고른다(csv-parse·pubsub 은 firebase-tools, uuid 는 gaxios, qs 는 express). 호이스팅된 루트 사본만 보면 소비자 밑에 중첩된 취약 사본이 가려지기 때문이고, node_modules/gaxios/node_modules/uuid 에 9.0.1 을 심어 두면 루트가 11.1.1 이어도 uuid 가드가 실제로 실패하는 것을 확인했다.

남은 권고 하나

stream-json GHSA-528h-pc64-c93x (firestore-tests, dev 전용)는 실행을 깨지 않고 올릴 판이 없다. 패치 3.5.0 은 ESM 전용이고 exports 맵이 "./*": "./src/*" 라 firebase-tools 가 쓰는 깊은 CommonJS 경로(stream-json/filters/Pick, streamers/StreamArray, filters/Filter, streamers/StreamObject)가 풀리지 않는다. 실제로 요구해 보면 MODULE_NOT_FOUND 이고, 1.x·2.x 에는 패치가 없다. 해제 조건은 firebase-tools 가 stream-json 3.5 이상으로 올라오는 것이며 15.30.0 까지는 아직 ^1.7.3 이다.

📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵

UI 변경이 없다.

💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴

functions 는 uuid 를 11.1.1 로 고정한다. 트리의 소비자(firebase-admin·gaxios·
google-gax·teeny-request)가 모두 v4 만 부르고, uuid 12.0.0 이 CommonJS 를 빼서
11.x 가 이 트리에서 쓸 수 있는 마지막 패치 판이다(GHSA-w5hq-g745-h8pq).

firestore-tests 는 qs 6.16.0, csv-parse 7.0.2, @opentelemetry/core 2.8.0 과
gaxios 밑 uuid 11.1.1 을 고정한다. firebase-tools 는 csv-parse 의 parse() 를
옵션 없이 CommonJS 로 부르기만 하므로 6.0.0 이 바꾼 옵션·오류 코드 이름과
무관하다. OpenTelemetry 2.x 강제는 firebase-tools 자신의 overrides 와 같다.

남은 권고 둘은 실행을 깨지 않고 올릴 수 있는 판이 없다.
- ts-deepmerge(GHSA-87mf-gv2c-c62c): 패치는 8.0.0 뿐인데 default export 가
  빠졌고 firebase-functions-test 는 그 default 를 부른다. 최신 3.5.0 도 여전히
  ts-deepmerge ^2.0.1 을 적는다.
- stream-json(GHSA-528h-pc64-c93x): 패치 3.5.0 은 ESM 전용이고 exports 맵이
  firebase-tools 의 깊은 CommonJS 경로(stream-json/filters/Pick 등)를 풀지
  못한다. firebase-tools 15.30.0 도 아직 ^1.7.3 이다.

검증은 두 디렉터리 clean install 후 functions lint·handler 테스트와 로컬
Firestore 에뮬레이터 규칙 테스트를 Node 22·25 양쪽에서 돌렸다. npm audit 는
각각 10건에서 위 2건으로 줄었다.
firebase-functions-test 는 이 저장소에서 부르는 곳이 없다. 남겨 두면 패치 판이
없는 ts-deepmerge(GHSA-87mf-gv2c-c62c)만 딸려 오므로 devDependencies 에서
뺐다. functions 의 npm audit 은 0건이 됐다.

규칙 테스트 쪽 가드는 모듈을 루트가 아니라 소비하는 패키지의 자리에서 고르게
바꿨다. csv-parse·pubsub 은 firebase-tools, uuid 는 gaxios, qs 는 express 의
require 문맥이다. 전에는 호이스팅된 루트 사본만 봐서 소비자 밑에 중첩된 취약
사본이 가려졌다. gaxios/node_modules/uuid 에 9.0.1 을 심어 두면 루트가 11.1.1
이어도 uuid 가드가 실패하는 것을 확인했다.
@OnlyReadOneBook
OnlyReadOneBook merged commit 7103e98 into main Sep 13, 2026
15 of 28 checks passed
@OnlyReadOneBook
OnlyReadOneBook deleted the feat/225 branch September 13, 2026 07:53
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.

fix: 서버와 규칙 테스트의 npm 의존성을 패치한다

1 participant