크라우니캔버스(:9620) 확증 결함 5건 근본수리
개요
2026-07-24 적대검증에서 확증된 크라우니캔버스(crowny-canvas, :9620) 결함 5건을 서버.한선(+동반
원장.한선·저장소.한선)에서 근본 수리하고 라이브 재현으로 결함 소멸을 실측 확인했다.
무엇을 했는지
1. [P0] 무인증 무제한 CRD 민팅 → 수리
- 근본원인:
/api/커맨드가 blockRef 없이도 처리되고(권한게이트 스킵), wiki.publish 성공 시
조건 없이 100 CRD를 매회 적립.
- 수리: blockRef를 전 커맨드 공통 필수값으로 승격(default-deny) +
저장소_페이지존재하나로
실재 페이지인지 확인 +
권한_확인 무조건 실행 +
원장_기존적립있나(원장.한선 신규 함수)로
동일 사용자/사유/blockRef 조합은 1회만 적립되도록 재실행 방어.
- 원장.한선에
원장_적립상세(사용자,액수,사유,이벤트출처,상대계정) 신설 — 이벤트출처(화이트리스트
게이트용 상수)와 상대계정(실제 blockRef 참조값)을 분리해 원장 행만으로 "어느 자원이 이미
보상됐는지" 식별 가능하게 함(기존 원장_적립은 하위호환 유지, 원장_셀프테스트 PASS 확인).
2. [P1] 커맨드 권한 게이트 우회 → 수리
- 근본원인: blockRef가 있을 때만 권한_확인 수행(생략 시 게이트 자체 스킵).
- 수리: 1번과 동일 조치로 함께 해소(blockRef 필수화 + 권한_확인 무조건 실행).
- 잔여: 부팅시드 권한.psv
*|스페이스|default|edit 전역 와일드카드로 guest가 모든 실재 페이지에
edit을 갖는 상태 자체는 이번 수리 범위 밖(별도 F12 결선 트랙, 데이터 아티팩트 이슈로 별도 보고).
3. [P2] 저장 콘텐츠 HTML 미이스케이프(잠복 XSS) → 수리
- 저장소.한선
저장소_JSON이스케이프(페이지 제목 등 실제 유출 경로)와 서버.한선 _JSON이스케이프
(커맨드 메시지/오류 등) 양쪽에
<→
<,
>→
>,
&→
& 유니코드 이스케이프 추가.
JSON.parse가 원문자로 정확 복원하므로 textContent 렌더는 불변, innerHTML 소비자 방어심층만 확보.
4. [P2] 거부 커맨드 감사 누락 → 수리
_커맨드감사 헬퍼로 분리, 화이트리스트거부/blockRef없음/blockRef무효/권한부족/성공/실패 전 분기에서
감사.psv 기록하도록 재구성(기존엔 조기 반환 경로가 감사 append 이전이라 거부시도가 로그에 안 남음).
5. [P0] 결재선 스키마 불일치 → 수리
_처리결재함의 결재선을 문자열배열["김담당",...]에서 계약대로 객체배열
[{"이름":"김담당","상태":"완료"},...]로 교정. approval.js가 검사하는 "완료"/"현재" 리터럴과
정확히 일치시켜 아바타/하이라이트가 실제로 렌더되도록 함.
검증
CROWNY_STRICT=1 ./hanseonc_high 서버.한선 컴파일 경고 0, 원장.한선 셀프테스트 PASS(잔액=380).
- 라이브(:9620) 재현: blockRef 없는 wiki.publish/erp.approve → 400, 가짜 blockRef → 400, 동일
blockRef 3회 반복 wiki.publish → 잔액 1200 고정(중복적립 없음, 이전엔 매회 +100), XSS 페이로드
응답에
<script>로만 실림(원문
<script> 없음), 거부 시도 3건 모두 감사.psv에 기록됨,
/api/결재함 결재선이 객체배열로 반환.
관련 파일
/Users/ef/crowny-canvas/한선씨/서버.한선 (핵심 수리: _처리커맨드·_커맨드감사·_처리결재함·_JSON이스케이프)
/Users/ef/crowny-canvas/한선씨/원장.한선 (원장_기존적립있나·원장_적립상세 신설)
/Users/ef/crowny-canvas/한선씨/저장소.한선 (저장소_JSON이스케이프 이스케이프 확장)
- 라이브 바이너리
/Users/ef/crowny-canvas/서버.toau 재컴파일+재기동 완료(LaunchAgent org.crowny.canvas)
잔여 이슈
- 권한.psv 부팅시드
*|스페이스|default|edit 전역 와일드카드 — guest 기본권한이 너무 관대(F12
세션인증 결선 시 재검토 필요).
- 서버 단일스레드 구조상 간헐적 OOM 재기동(
[ARRAY] OOM!)은 이번 수리와 무관한 기존 별개 이슈로
검증 중 재관측(재기동은 KeepAlive로 자동 복구, 라이브 재검증은 재기동 후 재시도로 전부 통과).
- 프론트엔드
공용.js의 CC.커맨드는 현재 blockRef를 전송하지 않음 — 이번 서버측 수리로 blockRef
없는 커맨드 호출은 전부 400을 받게 되므로, 위젯/버튼이 실제 커맨드를 트리거하는 UI 결선 시
호출부에 blockRef(대개 현재 페이지 id)를 함께 보내도록 JS 쪽 후속 조치 필요(이 세션 파일소유권
밖 — 서버.한선 전용).