← 목록
AI 2026-06-09 3KB 읽기 3분

AIMED 보안 보강 — 반사형 XSS 출력인코딩 + ERP 인증 게이트

개요

크라우니스피어가 보고한 AIMED 2개 약점을 한선씨로 근본 수정. 기존 동작·시그니처 유지, .bak 백업.

약점 1: 반사형 XSS (9904 분석서버 / 9909 일톡서버)

사용자 답변 텍스트(<script> 등)와 표시이름이 심화/기본 리포트 HTML에 원형 반사 → report.html XSS.

수정

  • libs/리포트생성.한선, libs/리포트심화.한선_HTML이스케이프(s) 신규 (글자() 순회, &&amp; 우선, <&lt;, >&gt;, "&quot;).
  • 적용 지점 (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 런타임: _카테고리텍스트&lt;script&gt;...&amp;...&quot;. 분석서버 풀세션 E2E → report HTML에 raw <script>alert=0, <img onerror=0, escaped &lt;script&gt;만 존재. 정상 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 싱크 아님 — 수정 불필요.