CSPRNG 시딩 결함 수리 (2026-07-09)
개요
한선씨 전영역 커버리지 감사(/Users/ef/CrownyOS/docs/한선씨-전영역커버리지-20260709/도메인_암호-보안.psv)에서
S급 최우선 갭으로 지목된 "CSPRNG 부재·무시딩 rand → 토큰·nonce 재현 가능" 결함을 수리.
무엇을 했는지
crownyc.c의무작위(min,max)opcode(613, RANDOM)가 표준 Crand()를 호출하지만
srand() 호출이 없어, 매 프로세스 실행마다 libc 기본 시드(=1)로
완전히 동일한 시퀀스(16807, 282475249, 622650073, ...)를 내는 것을 확인(취약 재현).
main()진입부에static void crowny_rand_seed(void)를 추가하고 VM 시작 시 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.c—crowny_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 (변화 없음), RPN3 7 더해=10 정상tests/run_all.sh: 99 통과/8 실패(총 107) — 기준선 그대로, 악화 없음pkg/make test: 11/13 passed — 기준선 그대로
잔여 이슈
libs/*.한선은 동시 작업 중인 다른 에이전트가 있어 이번 작업에서 손대지 않음
무작위()는 여전히 암호학적 CSPRNG(예: ChaCha20 기반)가 아니라 libcrand()기반
/dev/urandom 직접 소비하는 전용 opcode 신설).