코드 생성 LLM의 패키지 환각 문제에 대한 연구 (Slopsquatting)
1. 개요
- LLM 기반 코드 생성 AI의 발전으로 생산성이 높아지는 등 효율성과 편의성이 크게 향상됨
- 그러나 LLM이 실제로 존재하지 않는 패키지에 대한 참조를 포함하거나 추천하는 코드를 생성하는 패키지 환각(Package Hallucination) 문제가 발생
- 공격자는 환각 또는 가상의 패키지와 동일한 이름으로 악성 패키지를 오픈소스 리포지토리에 게시하는 방식으로 공급망 공격을 수행할 수 있음
> 전체 코드베이스 또는 소프트웨어 종속성 체인을 통해 확산되어 해당 패키지에 의존하는 모든 코드를 감염시킬 수 있음
2. 주요내용
2.1 패키지 혼동 공격
- 최신 소프트웨어 개발은 중앙 집중식 패키지 리포지토리(PyPI, npm 등)에 의존
> 누구나 새로운 코드 패키지/라이브러리를 업로드할 수 있어 멀웨어 배포에 매력적
> 종종 합법적인 패키지를 모방하기 위해 악성 패키지의 이름을 의도적으로 변경
> 패키지/라이브러리는 종종 다른 패키지에 의존하여 작동하기 때문에 광범위한 의존성 트리를 생성
> 단일 패키지를 감염시키는 것만으로도 전체 소프트웨어 또는 에코시스템을 감염시킬 수 있음
- LLM이 계속해서 발전된 소스 코드 생성 기능을 입증 (정확도: 21.06 25% -> 24.04 96% 급증)
> 취약성을 유발할 수 있는 안전하지 않거나 잘못된 코드의 생성 가능성에 대한 우려 또한 증가
> LLM이 오해의 소지가 있거나 완전히 허구의 정보를 생성하는 환각은 데이터, 훈련, 추론의 세 가지 주요 근본 원인으로 발생할 수 있음
① 데이터 관련 환각 : 소스 데이터 자체에 잘못된 정보, 편향, 불완전한 기록 등의 결함이 있을 때 발생
② 훈련 관련 환각 : 아키텍처 결함 또는 훈련 중 최적이 아닌 훈련 목표는 다운스트림 환각을 초래할 수 있음
③ 추론 관련 환각 : 불완전한 코딩 전략 및 불완전한 디코딩 표현에 의한 환각
- 공격자는 이러한 환각 패키지와 동일한 이름의 악성 패키지를 빠르게 생성해 간단하고 효과적인 패키지 혼동 공격을 수행할 수 있음
> LLM이 생성한 코드를 면밀히 검토하지 않거나 실수 등으로 악성 패키지를 코드베이스에 포함
> 다른 패키지 및 코드의 종속성 체인에 포함될 가능성이 있어 다수의 코드베이스에 연쇄적으로 영향을 끼칠 수 있음
2.2 가설ㆍ질문 및 실험 설계
- 가설 : 패키지 혼동 공격을 실행하려는 공격자와 LLM이 제공한 코드를 충분한 검증 없이 실행하는 사용자가 있음
- 다섯 가지 연구 질문(RQ)
① RQ1 : LLM을 사용해 Python 및 JavaScript 코드를 생성할 때, 패키지 환각은 얼마나 자주 발생하는가? (패키지 환각 발생률)
② RQ2 : 패키지 환각은 특정 모델 설정(예: 학습 데이터, 디코딩 전략 등)에 따라 어떤 영향을 받는가? (모델 설정의 영향)
③ RQ3 : 패키지 환각과 관련하여 일반적으로 관찰되는 LLM의 동작 특성은 무엇인가? (LLM 동작 특성)
④ RQ4 : 관찰된 패키지 환각에는 어떤 대표적인 특성이나 속성이 있는가? (패키지 환각의 특징)
⑤ RQ5 : 기존 문헌의 모범 사례 및 본 연구 결과를 바탕으로 패키지 환각을 효과적으로 완화할 수 있는가? (완화 전략)
실험 설계 | |
구분 | 설명 |
프롬프트 데이터셋 구성 | - 목표: 일반적인 사용자들이 일반적으로 요청하는 코딩 작업을 정확하고 포괄적으로 표현하는 데이터 세트를 개발하는 것 ① Stack Overflow 데이터 세트 > Python 및 JavaScript의 인기 있는 240개 태그 * 태그 당 20개 질문 * 최신/과거 = 9,600개 프롬프트 ② LLM에서 생성된 데이터 세트 > PyPI와 npm의 인기 패키지 설명을 기반으로 Llama-2 70B 모델에 해당 패키지를 사용하는 코드 생성을 요청 (4,800개 프롬프트 생성) > 4,800 * 최신/과거 = 9,600개 프롬프트 ※ Python, JavaScript 각 19,200개 |
코드 생성 모델 선택 | - 모델 선택 : 24.01.20 EvalPlus 리더보드를 기준으로 높은 순위의 모델 16개 선택 > 상용 모델 : ChatGPT 3.5 Turbo, ChatGPT 4.0, ChatGPT 4.0 Turbo > 무료 모델 : CodeLlama, DeepSeek, Magicoder 등 13개 - 언어 선택 : Python, JavaScript > 대중성 및 중앙 집중식 오픈 소스 리포지토리에 의존하기 때문 - 총 코드 샘플 수 576,000개 |
휴리스틱 | - LLM 출력 또는 생성된 코드에서 환각의 존재 유무를 판별을 위해 패키지 이름 추출 필요 > 단순히 import, require를 파싱 하는 것만으로는 패키지를 정확히 식별하는 것이 불가능하기 때문 > 코드에서 패키지 이름을 추론하기 위한 세 가지 휴리스틱 적용 ① 휴리스틱 1 : 설치 명령어 기반 탐지 - 생성된 Python 및 JavaScript 코드에서 "pip install" 및 "npm install" 명령 파싱 및 패키지 이름 추출 > 해당 명령은 지정된 패키지를 찾고, 의존성을 해결하고 현재 환경에 설치함 > 패키지 이름을 탐지하는 가장 직접적인 방법이며, 환각 탐지에도 유효함(악성코드를 설치하기 때문) > 모델에게 이러한 명령을 직접 요청하지 않고, 자연스럽게 생성된 경우만 포함 ② 휴리스틱 2 : 코드 기반 질의 - 생성된 코드를 실행하는데 필요한 패키지를 모델에 질의 > 사용자가 LLM으로 코드를 생성한 후 실행 과정에서 발생한 오류를 다시 묻는 행동을 모방한 것 > 직관적인 프로세스를 재현하여 생성된 코드에 필요한 패키지 이름을 식별 ③ 휴리스틱 3 : 프롬프트 기반 질의 - 코드를 생성했던 원래 프롬프트를 다시 모델에 입력해 작업을 수행하는데 필요한 패키지 질의 > 필요한 패키지가 명시적으로 언급되지 않은 경우 사용자가 패키지를 다시 묻는 행동을 모방한 것 ※ 휴리스틱 (Heuristic) : 정확한 정답이나 완벽한 규칙이 없을 때, 경험과 직관에 기반해 문제를 실용적으로 해결하는 방법 |
2.3 결과
구분 | 설명 |
RQ1 : 패키지 환각 발생률 | - 16개 모델 모두에서 패키지 환각이 만연한 현상인 것으로 나타남 > 총 223만 개의 패키지 중 440,445(19.7%)가 환각으로 판정 > 205,474개의 고유한 환각 - 평가 > GPT-4 Turbo 환각률 최저(3.59%), DeepSeek 1B 환각률 최고(13.63%) > 상용 모델 평균 환각률 5.2%, 무료 모델 평균 환각률 21.7% > Python 환각률 15.8%, JavaScript 환각률 21.3% |
RQ2 : 모델 설정의 영향 | - 설정된 온도가 높을수록 환각률이 뚜렷하게 증가 - 디코딩 전략은(Top-k, Top-p, Min-p) 뚜렷한 차이 없음 - 최근 주제를 다루는 프롬프트일수록 환각률이 10% 높음 |
RQ3 : LLM 동작 특성 | - 동일 프롬프트를 10번 반복 결과 > 43%는 10번 모두 환각을 재현하였으며, 39%는 10번 모두 환각을 재현하지 않음 > 58%는 최소 한 번 이상 동일 환각 반복 - 반복 가능성을 의미하여 공격자에게 매력적 - 패키지 추천이 많은 모델일수록 높은 환각률 - GPT 4 Turbo, GPT 3.5, DeepSeek는 75% 이상의 정확도로 환각 식별 가능 |
RQ4 : 패키지 환각의 특징 | - 81%의 환각 패키지가 한 모델에서만 생성됨 > 대부분의 환각 패키지는 모델마다 고유하게 생성 - 대부분의 환각이 사소한 오타가 아니라 기존 패키지와 큰 차이를 보임 - 삭제된 패키지는 환각에 영향을 끼치지 않으며, JavaScript가 가장큰 영향 |
RQ5 : 완화 전략 | - RAG(Retrieval-Augmented Generation) > LLM의 출력을 최적화하여 응답을 생성하기 전에 학습 데이터 소스 외부의 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스 > - Self-Refinement > 패키지 이름을 생성한 후 해당 패키지의 유효성을 다시 쿼리하여 유효성 검증을 최대 5회까지 반복할 수 있음 - Fine-tuning > 이미 훈련된 대규모 언어 모델에 특정 데이터셋을 사용하여 추가적인 학습을 수행하는 작업 > 모든 환각을 제외하고 유효한 응답을 사용해 모델 재훈련 ※ 모든 전략을 조합한 경우 - DeepSeek는 2.4%, CodeLlama는 9.3%까지 환각률 감소 - Fine-tuning의 경우 코드 품질 저하 단점 존재 - RAG와 Self-Refinement는 비교적 실용적인 대안 |
3. 참고
[2] https://www.infosecurity-magazine.com/news/ai-hallucinations-slopsquatting/
[3] https://www.boannews.com/media/view.asp?idx=136863&page=2&kind=1