AIMED 보안 보강 — 반사형 XSS 출력인코딩 + ERP 인증 게이트
개요
크라우니스피어가 보고한 AIMED 2개 약점을 한선씨로 근본 수정. 기존 동작·시그니처 유지, .bak 백업.
약점 1: 반사형 XSS (9904 분석서버 / 9909 일톡서버)
사용자 답변 텍스트(
<script> 등)와 표시이름이 심화/기본 리포트 HTML에 원형 반사 → report.html XSS.
수정
libs/리포트생성.한선, libs/리포트심화.한선에 _HTML이스케이프(s) 신규 (글자() 순회, &→& 우선, <→<, >→>, "→").
적용 지점 (HTML 컨텍스트만, JSON _이스케이프와 별개):
_카테고리텍스트 / _카테텍스트 반환값 (직무/현황/필요/꿈목표/팀비전/직무방향/인수인계 등 답변텍스트 전부)
표시이름 (_HTML바디시작, _심화바디시작)
심화맵 텍스트 필드: 현황/필요/꿈목표/팀비전/AI바람/인수인계 (각 섹션 HTML 조립 직전 인코딩 — 분석심화.한선의 JSON 출력은 원본 보존)약점 2: ERP 인증우회 (9910 에임드ERP서버)
/api/erp/* 가 토큰 없이 GET 200으로 조직 데이터 노출.
수정 (crowny-enterprise/에임드ERP서버.한선)
- 자립 헬퍼
_에르프_* 추가 (크라우니인증.한선 패턴 복사): _에르프_토큰추출(Authorization: Bearer), _에르프_검증(소켓생성(2,1)→소켓연결 127.0.0.1:9401 GET /api/verify→username), _에르프_본문, _에르프_문자값, _401응답.
- 요청처리 GET 분기에 게이트:
_경로세그먼트(경로,"/api/erp/")!="" → 토큰 검증, username 없으면 401 {"ok":false,"error":"로그인 필요"}.
- GET / 대시보드(로그인 UI)는 인증 불필요 유지.
검증 결과
- 컴파일: 리포트생성/리포트심화/분석서버/일톡서버/에임드ERP서버 모두 exit=0 (경고는 기존 이름충돌, 무해). toau 갱신 + 재기동.
- XSS 런타임:
_카테고리텍스트 → <script>...&...". 분석서버 풀세션 E2E → report HTML에 raw <script>alert=0, <img onerror=0, escaped <script>만 존재. 정상 author <script>(다크토글) 1개만 유지.
- ERP: 토큰없음→401, 잘못된토큰→401, 유효토큰→200(조직데이터), GET /→200(무인증).
관련 파일
- /Users/ef/crowny-aimed/libs/리포트생성.한선 (+.bak)
- /Users/ef/crowny-aimed/libs/리포트심화.한선 (+.bak)
- /Users/ef/crowny-aimed/분석서버.toau, 일톡서버.toau (재컴파일)
- /Users/ef/crowny-enterprise/에임드ERP서버.한선 (+.bak), .toau (재컴파일·재기동)
잔여 이슈
_HTML이스케이프가 리포트생성+리포트심화 양쪽 정의 → 컴파일 경고(이름충돌, 마지막정의 채택, 동일구현이라 무해). 기존 _이스케이프 경고와 동일 패턴.
- 테스트 중 auth.crowny.org에
erptest 계정 1개 생성됨(무해 테스트 멤버).
- 업무진행.한선은 HTML 미생성(JSONL/LLM프롬프트 출력)이라 XSS 싱크 아님 — 수정 불필요.