← 목록
기타 2026-07-09 3KB 읽기 3분

CSPRNG 시딩 결함 수리 (2026-07-09)

개요

한선씨 전영역 커버리지 감사(/Users/ef/CrownyOS/docs/한선씨-전영역커버리지-20260709/도메인_암호-보안.psv)에서 S급 최우선 갭으로 지목된 "CSPRNG 부재·무시딩 rand → 토큰·nonce 재현 가능" 결함을 수리.

무엇을 했는지

  • crownyc.c무작위(min,max) opcode(613, RANDOM)가 표준 C rand()를 호출하지만
프로그램 어디에도 srand() 호출이 없어, 매 프로세스 실행마다 libc 기본 시드(=1)로 완전히 동일한 시퀀스(16807, 282475249, 622650073, ...)를 내는 것을 확인(취약 재현).
  • main() 진입부에 static void crowny_rand_seed(void)를 추가하고 VM 시작 시 1회 호출:
1. CROWNY_SEED env 설정 → 그 값으로 srand() 고정(테스트/감사 재현용) 2. 미설정(기본) → /dev/urandom 4바이트 우선 시딩(비결정) 3. urandom 실패 시 time()*2654435761 ^ clock() ^ (getpid()<<16) 혼합 폴백(비결정)
  • 기존 양자 RNG 시드(CROWNY_QSEED, sv_rand64 경로)와는 완전히 별개 — 상호 간섭 없음.
  • 수정 전/후 시퀀스 재현 비교, 회귀(run_all.sh 99/107, pkg make test 11/13) 모두 확인 완료.

관련 파일

  • /Users/ef/CrownyOS/crownyc/crownyc.ccrowny_rand_seed() 추가 (main() 직전, line ~17559)
+ main() 최상단 호출 1줄 (cj_init(); mem_init(); 직후)
  • /Users/ef/CrownyOS/crownyc/pkg/crownyc.c — 동일 소스 동기화(cp)
  • /Users/ef/CrownyOS/crownyc/crownyc, /Users/ef/CrownyOS/crownyc/pkg/crownyc — mv로 재빌드 교체(새 inode)
  • /Users/ef/CrownyOS/crownyc/csprng_seed.한선 — 3단 시드 결정 로직 한선씨 동반 문서화(학습DB 등록 완료)
  • /Users/ef/CrownyOS/docs/한선씨-P1보완-20260709/CSPRNG검증.md — 전/후 시퀀스·회귀 전체 로그

검증 요약

  • 수정 전(백업 바이너리): 2회 실행 시퀀스 완전 동일(취약 재확인)
  • 수정 후 기본(비시딩): 2회 실행 시퀀스 완전 상이
  • 수정 후 CROWNY_SEED=42: 2회 실행 시퀀스 완전 동일(재현 옵션 정상)
  • --version = crownyc 11.0.5 (변화 없음), RPN 3 7 더해=10 정상
  • tests/run_all.sh: 99 통과/8 실패(총 107) — 기준선 그대로, 악화 없음
  • pkg/ make test: 11/13 passed — 기준선 그대로

잔여 이슈

  • libs/*.한선은 동시 작업 중인 다른 에이전트가 있어 이번 작업에서 손대지 않음
(도메인_암호-보안.psv의 다른 갭 항목이 남아있다면 별도 세션에서 처리 필요)
  • 무작위()는 여전히 암호학적 CSPRNG(예: ChaCha20 기반)가 아니라 libc rand() 기반
xorshift류가 아님 — 이번 수리는 "시딩 비결정화"만 해결. 진짜 CSPRNG 알고리즘 교체가 필요하면 별도 P1/P2 과제로 분리 권장(예: /dev/urandom 직접 소비하는 전용 opcode 신설).