Skip to content

feat: update manifest ECDSA 서명 검증 도입 (v3.8.0) - #37

Merged
kimdzhekhon merged 1 commit into
mainfrom
security/manifest-signing
Jul 28, 2026
Merged

feat: update manifest ECDSA 서명 검증 도입 (v3.8.0)#37
kimdzhekhon merged 1 commit into
mainfrom
security/manifest-signing

Conversation

@kimdzhekhon

Copy link
Copy Markdown
Member

Summary

  • manifest+payload가 같은 HTTPS 호스트에서 오므로, 체크섬만으로는 그 호스트/레포 침해 시 위조된 조합을 못 걸러냄 — ECDSA(P-256/SHA-256) 서명 검증 추가, 실패 시 하드 실패
  • 서명 개인키는 레포/CI 어디에도 없음(로컬 전용) — CI secret으로 두면 원래 막으려던 계정/레포 탈취 위협모델을 방어 못함
  • 기존 optional UBS_UPDATE_MANIFEST_SHA256 pin 제거(서명이 상위호환)
  • CI가 커밋된 서명·manifest·공개키 정합성 검증
  • 4개 언어 README, install/update 테스트 스위트 동기화

Test plan

  • 전체 테스트 스위트 통과 (test_python_core, test_mcp, test-detection, test-install, test-python-adapters, test-update, test-rust-helper)
  • README 검증 스니펫(코드펜스 균형·필수 용어) 통과
  • CI 서명 검증 스텝 로컬 시뮬레이션 통과
  • 실제 v3.8.0 태그 push 후 curl install.sh | bash로 신규 설치 검증 (태그는 이 PR 머지 후 별도 진행)

🤖 Generated with Claude Code

manifest와 payload가 같은 HTTPS 호스트에서 오기 때문에, SHA-256 체크섬만으로는
그 호스트/레포 자체가 침해됐을 때 위조된 manifest+payload 조합을 걸러낼 수
없었다. install.sh/scripts/lib/update.sh에 공개키를 박아 넣고, 서명
(scripts/update-manifest.txt.sig)이 없거나 다른 키로 만들어졌으면 체크섬이
다 맞아도 설치·업데이트를 하드 실패시킨다.

- 서명 방식: ECDSA P-256/SHA-256 (openssl dgst -sign/-verify) — macOS 기본
  /usr/bin/openssl(LibreSSL)에서도 동작하는 가장 넓게 지원되는 방식으로 선택.
  Ed25519는 최신 OpenSSL의 pkeyutl -rawin이 필요해 LibreSSL에서 안 됨
- 서명 개인키는 이 레포/CI 어디에도 없음 — 릴리스 담당자 로컬에만 존재
  (scripts/sign-update-manifest.sh). CI secret으로 두면 계정/레포 탈취 시
  같이 털려서 원래 막으려던 위협모델을 방어하지 못함
- 기존 optional UBS_UPDATE_MANIFEST_SHA256 pin 제거 — 서명이 항상 켜진
  상위호환이라 두 메커니즘을 유지할 이유가 없음
- validate.yml: 커밋된 서명이 커밋된 manifest·공개키와 실제로 맞는지, 그리고
  install.sh/update.sh에 박힌 공개키 두 벌이 서로 같은지 CI에서 검증
- 4개 언어 README, 테스트 스위트(install/update) 동기화

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@kimdzhekhon
kimdzhekhon merged commit f481a02 into main Jul 28, 2026
4 checks passed
@kimdzhekhon
kimdzhekhon deleted the security/manifest-signing branch July 28, 2026 15:21
kimdzhekhon added a commit that referenced this pull request Jul 29, 2026
manifest와 payload가 같은 HTTPS 호스트에서 오기 때문에, SHA-256 체크섬만으로는
그 호스트/레포 자체가 침해됐을 때 위조된 manifest+payload 조합을 걸러낼 수
없었다. install.sh/scripts/lib/update.sh에 공개키를 박아 넣고, 서명
(scripts/update-manifest.txt.sig)이 없거나 다른 키로 만들어졌으면 체크섬이
다 맞아도 설치·업데이트를 하드 실패시킨다.

- 서명 방식: ECDSA P-256/SHA-256 (openssl dgst -sign/-verify) — macOS 기본
  /usr/bin/openssl(LibreSSL)에서도 동작하는 가장 넓게 지원되는 방식으로 선택.
  Ed25519는 최신 OpenSSL의 pkeyutl -rawin이 필요해 LibreSSL에서 안 됨
- 서명 개인키는 이 레포/CI 어디에도 없음 — 릴리스 담당자 로컬에만 존재
  (scripts/sign-update-manifest.sh). CI secret으로 두면 계정/레포 탈취 시
  같이 털려서 원래 막으려던 위협모델을 방어하지 못함
- 기존 optional UBS_UPDATE_MANIFEST_SHA256 pin 제거 — 서명이 항상 켜진
  상위호환이라 두 메커니즘을 유지할 이유가 없음
- validate.yml: 커밋된 서명이 커밋된 manifest·공개키와 실제로 맞는지, 그리고
  install.sh/update.sh에 박힌 공개키 두 벌이 서로 같은지 CI에서 검증
- 4개 언어 README, 테스트 스위트(install/update) 동기화

Co-authored-by: 김재현 <231584193+kimdzhekhon@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
kimdzhekhon added a commit that referenced this pull request Jul 29, 2026
manifest와 payload가 같은 HTTPS 호스트에서 오기 때문에, SHA-256 체크섬만으로는
그 호스트/레포 자체가 침해됐을 때 위조된 manifest+payload 조합을 걸러낼 수
없었다. install.sh/scripts/lib/update.sh에 공개키를 박아 넣고, 서명
(scripts/update-manifest.txt.sig)이 없거나 다른 키로 만들어졌으면 체크섬이
다 맞아도 설치·업데이트를 하드 실패시킨다.

- 서명 방식: ECDSA P-256/SHA-256 (openssl dgst -sign/-verify) — macOS 기본
  /usr/bin/openssl(LibreSSL)에서도 동작하는 가장 넓게 지원되는 방식으로 선택.
  Ed25519는 최신 OpenSSL의 pkeyutl -rawin이 필요해 LibreSSL에서 안 됨
- 서명 개인키는 이 레포/CI 어디에도 없음 — 릴리스 담당자 로컬에만 존재
  (scripts/sign-update-manifest.sh). CI secret으로 두면 계정/레포 탈취 시
  같이 털려서 원래 막으려던 위협모델을 방어하지 못함
- 기존 optional UBS_UPDATE_MANIFEST_SHA256 pin 제거 — 서명이 항상 켜진
  상위호환이라 두 메커니즘을 유지할 이유가 없음
- validate.yml: 커밋된 서명이 커밋된 manifest·공개키와 실제로 맞는지, 그리고
  install.sh/update.sh에 박힌 공개키 두 벌이 서로 같은지 CI에서 검증
- 4개 언어 README, 테스트 스위트(install/update) 동기화

Co-authored-by: 김재현 <231584193+kimdzhekhon@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
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