메인 콘텐츠로 건너뛰기

보안 및 안전

Rosetta는 로케일 데이터가 신뢰할 수 없는 출처에서 올 수 있고, 조작된 파일 이름이 디렉터리 경계를 벗어날 수 있으며, LLM 출력이 어떤 내용이든 포함할 수 있는 적대적인 환경에서도 안전하도록 설계되었어요.

위협 모델

위협공격 벡터완화 방법
프로토타입 오염조작된 JSON 키 (__proto__, constructor)파싱 시점에 거부됨
경로 탐색../../etc/passwd과 같은 로케일 코드구성된 디렉터리 내에서만 파일 쓰기가 검증됨
코드 블록 손상LLM이 코드 펜스 내부를 번역함유니코드 센티널 보호
환각된 키LLM이 전송하지 않은 키를 반환함응답 검증 — 허용된 키만 기록됨
토큰 소비 폭주무한 재시도 루프maxRetries을(를) 통한 예산 제한

프로토타입 오염 방지

모든 로케일 키는 처리되기 전에 차단 목록과 대조하여 검증돼요.

  • __proto__
  • constructor
  • prototype

이 패턴과 일치하는 모든 키는 오류와 함께 거부돼요. 이를 통해 공격자가 조작된 로케일 파일을 사용하여 JavaScript 객체 프로토타입을 수정하는 것을 방지해요.

경로 제한

로케일 파일을 작성할 때, rosetta는 출력 경로가 구성된 디렉터리(localesDir, contentDir) 내에 유지되는지 검증해요. 로케일 코드는 무해화(sanitize)되어, ../../secrets와 같은 코드는 예상되는 디렉터리 외부에 파일을 쓸 수 없어요.

블록 보호

Markdown 콘텐츠를 번역하는 동안, 텍스트가 LLM으로 전송되기 전에 구조화된 요소는 유니코드 센티널(sentinel) 자리 표시자로 대체돼요.

  1. 코드 블록 (펜스 및 인라인) → 센티널
  2. Hugo 숏코드 ({{< >}}, {{% %}}) → 센티널
  3. 원시 HTML → 센티널
  4. 보간 변수 ({{ .Count }}) → 센티널

번역이 완료된 후, 센티널은 다시 원본 콘텐츠로 교체돼요. LLM은 코드 블록, 숏코드 또는 HTML을 전혀 볼 수 없으므로 이를 손상시킬 수 없어요.

응답 검증

LLM이 JSON 응답을 반환할 때, rosetta는 다음 사항을 검증해요.

  • 일괄 처리(batch)로 전송된 키만 응답에 포함되었는지
  • 추가 키가 주입되지 않았는지
  • 응답이 유효한 JSON으로 파싱되는지

환각된 키는 조용히 무시돼요. 이를 통해 LLM 출력이 로케일 파일에 예상치 못한 번역을 주입하는 것을 방지해요.

품질 게이트

모든 번역은 디스크에 기록되기 전에 5가지 결정론적 검사를 통해 검증돼요. 자세한 내용은 품질 게이트를 참조하세요.

지수 백오프

API 호출은 429(속도 제한) 및 5xx(서버 오류) 응답에 대해 지터(jitter)가 포함된 지수 백오프를 사용해요. 지연 시간이 증가하는 3번의 재시도를 통해 장애 발생 시 API에 과도한 요청이 가해지는 것을 방지해요.

요청 시간 초과

모든 API 요청에는 AbortController을(를) 통한 30초의 시간 초과가 설정되어 있어요. 이를 통해 끊어진 연결에서 동기화 프로세스가 무한정 멈춰 있는 것을 방지해요.

폴백 모드

API를 사용할 수 없을 때, --fallback은(는) 실제 번역 대신 [EN] 접두사가 붙은 자리 표시자를 기록해요.

npx i18n-rosetta sync --fallback
{
"hero.title": "[EN] Welcome to our platform"
}

이러한 자리 표시자는 유효한 API 키를 사용한 다음 동기화 시 자동으로 감지되어 다시 번역돼요. 이들은 절대 "번역된" 것으로 취급되지 않으며, audit에서 이를 표시할 거예요.

테스트

보안 속성은 적대적 테스트 스위트에 의해 검증돼요.

npm run test:redteam # prototype pollution, path traversal, encoding attacks

참고 항목