소식

Master Karpathy: 대형 모델에 'SQL 주입' 공격을 했는데 전혀 쉽지 않았습니다.

2024-08-16

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina



기계 심장 보고서

편집자: Du Wei, Zenan

대형 모델의 안전성은 “개선 여지가 많다”고 할 수 있다.

AI 전문가 Andrej Karpathy가 다시 과학 지식을 대중화하기 위해 왔습니다.특수 토큰을 사용하여 LLM에 SQL 주입과 유사한 공격 수행」。

이른바 SQL 인젝션 공격은 네트워크 공격 기술이다. 공격자는 애플리케이션의 입력 필드에 악의적인 SQL 문을 삽입하여 백엔드 데이터베이스를 속여 악성 SQL 문을 실행합니다. 이러한 유형의 공격은 일반적으로 입력을 적절하게 필터링하거나 이스케이프하지 않는 등 응용 프로그램이 사용자 입력을 부적절하게 처리하는 방식을 이용하여 공격자가 데이터베이스의 데이터에 액세스하거나 수정하거나 삭제할 수도 있습니다.



사람들의 보안 인식이 높아지면서 현재 대부분의 소프트웨어 제품에서는 SQL 주입이 발생하지 않아야 합니다.

그러나 대형 모델의 세계에서는 모든 것이 아직 초기 단계에 불과합니다. LLM 토크나이저는 입력 문자열에서 특수 토큰(예: <|endoftext|> 등)을 구문 분석하는 일을 담당합니다. 이것이 편리해 보일 수도 있지만, 기껏해야 잘못된 판단으로 이어질 수 있으며 최악의 경우에는 SQL 주입 공격에 해당하는 LLM 보안 취약점으로 이어질 수 있습니다.

여기서 주의할 점은 사용자 입력 문자열은 신뢰할 수 없는 데이터라는 점입니다.

SQL 주입에서는 "DROP TABLE" 공격을 사용하여 잘못된 코드를 깨뜨릴 수 있습니다. LLM에서도 동일한 문제가 발생합니다. 잘못된 코드는 문자열의 특수 토큰 설명자를 실제 특수 토큰으로 구문 분석하여 입력 표현을 혼동하여 LLM이 채팅 템플릿을 배포할 수 없게 만듭니다.

다음은 현재 Huggingface Llama 3 토크나이저 기본값을 사용하는 예입니다.

보시다시피 두 가지 비직관적인 상황이 동시에 발생합니다.

  • <|begin_of_text|> 토큰은 시퀀스 앞에 (128000) 추가됩니다.
  • <|end_of_text|> 토큰(128001)이 문자열에서 구문 분석되고 특수 토큰이 삽입됩니다. 이제 텍스트(아마도 사용자가 보낸 것)가 토큰 프로토콜과 혼동되어 LLM이 배포되지 않아 정의되지 않은 출력이 발생할 수 있습니다.

따라서 Karpathy는 토큰화 작업에 항상 두 개의 추가 플래그를 사용하여 add_special_tokens=False 및 Split_special_tokens=True를 비활성화하고 코드에 특수 토큰을 직접 추가할 것을 권장합니다. 그는 두 옵션의 이름을 지정하는 것이 약간 혼란스러울 것이라고 생각했습니다. 채팅 모델의 경우 채팅 템플릿 apply_chat_template을 사용할 수도 있습니다.

위와 같이 하면 좀 더 정확한 내용을 확인할 수 있습니다. 예를 들어 <|end_of_text|>는 이제 다른 문자열 시퀀스로 처리되며 다른 문자열과 마찬가지로 기본 BPE 토크나이저에 의해 분할됩니다.



Karpathy는 인코딩 및 디코딩 호출이 특수 토큰을 처리하기 위해 문자열을 구문 분석해서는 안 되며 이 기능을 완전히 폐기해야 한다고 믿습니다. 대신 별도의 코드 경로를 통해 명시적으로 프로그래밍 방식으로만 추가해야 합니다. tiktoken에서는 항상 encode_ordinary를 사용하세요. 위에서 언급한 플래그를 사용하는 것이 더 안전합니다. 최소한 이 문제를 인식하고 항상 토큰을 표시하고 코드를 테스트하세요.

Karpathy는 이러한 것들이 매우 미묘하고 문서화가 부족하다고 믿고 있으며 현재 코드의 약 50%가 위 문제로 인해 발생하는 버그가 있다고 추정합니다.

공장을 떠나기 전에 엄격한 테스트를 거친 ChatGPT에도 몇 가지 이상한 문제가 있습니다. 기껏해야 토큰만 삭제하고, 최악의 경우 정의되지 않은 방식으로 LLM을 혼란스럽게 합니다. Karpathy는 뒤에서 무슨 일이 일어나고 있는지 몰랐지만 ChatGPT는 그에게 <|endoftext|> 문자열을 반복해서 보낼 수 없었습니다. 그러니 여기에 특히 주의하세요.



Andrej Karpathy의 기사가 나오자마자 즉시 토론이 일어났습니다. 누군가 질문했습니다. 그렇다면 LLM 개발자는 보안을 개선하기 위해 어떤 조치를 취해야 합니까?

Karpathy는 말하기가 쉽다고 생각합니다. 항상 "일반적인" 방식, 즉 utf8 바이트 시퀀스로 문자열을 표시하면 됩니다. 이는 보안의 "최소 권한" 원칙을 연상시킵니다. 기본적으로 기능을 꼭 필요한 기능으로 제한하면 의도하지 않은 결과가 발생할 가능성이 최소화됩니다.



“우리는 이미 이런 방향으로 나아가고 있다”고 말하는 사람도 있다. VLM 모델 PaliGemma의 저자이자 Google DeepMind 과학자인 Lucas Beyer는 새로운 작업 코드의 보안 메커니즘을 개선했다고 말했습니다. 이는 특히 여러 토크나이저를 지원할 때 다소 번거로울 수 있지만 전반적으로 그만한 가치가 있습니다. 또한 코드를 더욱 간단하게 만듭니다.



일부 네티즌들은 코드가 맞지만 훈련 데이터에 <|endoftext|>를 입력하면 어떻게 되는지 묻는다.

Karpathy는 코드가 정확하면 아무 일도 일어나지 않을 것이라고 말합니다. 하지만 문제는 코드가 정확하지 않은 경우가 많아 대형 모델의 세계관을 조용히 파괴할 수 있다는 점이다.



Karpathy가 발견한 새로운 문제에 대해 어떻게 생각하시나요?

참고 내용:

https://twitter.com/karpathy/status/1823418177197646104