피드로 돌아가기
I shipped 35 bugs in my AI chatbot. The scariest one was on the output side.
Dev.toDev.to
Security

35개 취약점 발견을 통해 증명된 LLM Output Untrusted Input 설계 원칙

I shipped 35 bugs in my AI chatbot. The scariest one was on the output side.

Rapls2026년 6월 15일7intermediate

Context

Prompt Injection 등 Input 단의 보안에만 집중하여 LLM Output을 신뢰 가능한 데이터로 간주한 아키텍처 설계. 모델 생성 결과물이 사용자 입력값 및 RAG 외부 데이터를 포함함에 따라 Output 단에서 보안 홀이 발생하는 한계점 노출.

Technical Solution

  • LLM Output을 사용자 입력값과 동일한 Untrusted Input으로 정의하는 보안 모델 전환
  • HTML rendering 시 단순 출력이 아닌 Allowlist 기반의 Markdown Sanitization 및 HTML Escaping 적용을 통한 XSS 방어
  • LLM 결정 기반 URL 호출 시 내부 IP 대역(127.0.0.0/8, 169.254.0.0/16 등) 차단 및 Redirect 비활성화를 통한 SSRF 방지
  • 모델 출력값을 실행 권한과 직접 연결하지 않고, 실행 계층에서 허용 범위를 결정하는 Least Privilege 설계 도입
  • AI 생성 코드의 'Double-trust' 위험 제거를 위해 Input, Output, Permission 로직에 대한 수동 코드 리뷰 프로세스 강제

1. LLM Output을 HTML로 렌더링하기 전 Sanitization 라이브러리를 통한 태그 필터링을 적용했는가?

2. 모델이 제안한 URL을 Fetch 하기 전 내부 네트워크 대역 접근 제한 로직이 포함되었는가?

3. LLM 출력값을 DB 쿼리나 API 파라미터로 사용할 때 Parameterized Query를 적용했는가?

4. AI가 작성한 코드에서 보안 보일러플레이트(권한 체크, 토큰 검증)가 생략되지 않았는지 검토했는가?

원문 읽기