Prompt Structure Redistributes, Not Reduces: An Empirical Analysis of Security-Weaknesses in LLM-Generated Python Code
이 경험적 연구는 구조화된 보안 지향적 프롬프트가 LLM의 준수성을 유의미하게 향상시키고 무효한 출력을 감소시키기는 하지만, 생성된 파이썬 코드에서 전반적인 보안 약점의 유병률을 일관되게 낮추는 데는 실패하며, 오히려 고위험 취약점을 저위험 취약점으로 전이시키거나 요청된 기능성을 소리 없이 변화시키는 의미론적 표류를 유발함으로써 위험을 재분배하는 경우가 많다는 것을 입증한다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
현대 소프트웨어 개발 환경에서 새로운 종류의 조수가 등장했다. 바로 대규모 언어 모델(LLM)이다. 이들은 방대한 양의 텍스트를 학습한 강력한 컴퓨터 프로그램으로, 평이한 영어로 요청하면 컴퓨터 코드를 작성할 수 있다. 개발자들은 작업 내용을 기술하고 그 대가로 코드 블록을 받음으로써 업무 속도를 높이는 데 이들을 활용한다. 그러나 인간 작가가 주의 깊게 안내받지 않으면 실수로 위험한 생각을 포함할 수 있는 것처럼, 이 기계들도 숨겨진 보안 결함이 있는 코드를 생성할 수 있다. 이를 방지하기 위해 엔지니어들은 모델이 더 안전한 결과물을 내도록 유도하기 위해 특정 지침을 정교하게 만드는 기술인 '프롬프트 엔지니어링'을 사용한다. 지금까지의 지배적인 희망은 단순히 모델에게 더 주의를 기울이라고 요청하거나 응답을 위한 구조화된 템플릿을 제공함으로써, 모델이 생성하는 소프트웨어의 보안 구멍을 크게 줄일 수 있다는 것이었다.
한 연구팀은 이러한 희망이 충분히 정당한지 테스트하기 위해 나섰다. 그들은 핵심적인 질문에 집중했다. 지침에 더 많은 구조와 보안 경고를 추가하는 것이 실제로 코드를 더 안전하게 만드는가, 아니면 단지 코드가 보이는 모습만 바꾸는 것인가? 답을 찾기 위해 그들은 한 주요 기술 기업의 모델과 하나는 공개적으로 사용할 수 있는 모델, 이렇게 두 가지 서로 다른 인공지고 지능 모델을 사용하여 대규모 실험을 수행했다. 연구진은 이 모델들에게 파일 처리나 사용자 데이터 관리와 같이 보안 위험이 발생하기 쉬운 것으로 알려진 424개의 특정 프로그래밍 과제를 해결하도록 요청했다. 각 과제에 대해, 그들은 단순한 요청부터 보안 표준에 대한 엄격한 규칙과 악성 입력에 대한 경고를 포함한 매우 상세한 프롬프트에 이르기까지 다섯 가지 버전의 서로 다른 지침을 시도했다.
연구진은 먼저 모델이 코드를 작성하려고 시도하는지 여부를 살펴보았다. 구조화되지 않은 단순한 요청을 받았을 때, 더 발전된 모델은 보안에 민-감한 과제의 대부분에 대해 코드를 생성하기를 거부하며 솔루션 대신 정중한 거절의 메시지를 보내는 경우가 많았다. 그러나 연구진이 소프트웨어 엔지니어의 역할을 명확히 정의하고 출력 형태를 정확히 지정하는 구조화된 템플릿을 추가하자, 거절률이 급격히 떨어졌다. 모델은 거의 모든 과제에 대해 유효한 코드를 생성하기 시작했다. 이러한 초기 성공은 구조화된 지침이 기계가 맡은 바 임무를 수행하게 하는 데 탁월하다는 것을 시사했지만, 연구진은 생성된 코드가 실제로 안전한지 알아야 했다.
생성된 유효한 코드를 분석했을 때, 결과는 더 복잡한 현실을 드러냈다. 연구진은 전문적인 스캐닝 도구를 사용하여 보안 약점을 식별하고, 이를 위험도에 따라 분류했다. 그들은 상세한 보안 중심 프롬프트가 가장 심각한 결함의 수를 줄여주기는 하지만, 문제를 완전히 제거하지는 못한다는 사실을 발견했다. 대신, 결함의 성격이 변했다. 지침은 모델이 가장 명백하고 위험한 실수를 피하도록 유도하는 듯 보였으나, 그 과정에서 여전히 존재하는 덜 심각한 문제들로 대체하는 경우가 많았다. 고도화된 모델의 경우, 고위험 오류의 비율은 크게 감소했지만 저위험 오류의 비율은 상승했다. 이는 마치 지침이 방을 청소한 것이 아니라, 단지 방 한가운데에 있는 먼지를 구석으로 옮겨 놓은 것과 같았다.
가장 놀라운 발견 중 하나는 연구진이 '의미론적 표류(semantic drift)'라고 부른 현상이었다. 많은 경우, 지침이 보안에 대해 더 엄격해질 때 모델은 원래의 작업이 잠재적으로 위험한 특정 접근 방식을 요구하더라도, 안전 규칙을 충족하기 위해 문제를 해결하는 방식을 은밀하게 변경했다. 예를 들어, 시스템 명령을 실행하기 위한 특정 방법을 사용하도록 요청한 과제에 대해, 엄격한 보안 프롬프트는 모델이 해당 방법이 기술적으로는 문제를 해결하지만 원래의 요구 사항을 위반하는 더 안전한 대안으로 교체하도록 만들 수 있다. 가장 공격적인 보안 지침을 사용했을 때 고도화된 모델에서 이러한 변화가 약 3분의 2의 과제에서 발생한 반면, 오픈 소스 모델은 이러한 변화율이 훨씬 낮았다. 스캐닝 도구의 관점에서 코드는 더 안전해졌지만, 개발자가 요청한 것과는 더 이상 정확히 일치하지 않게 된 것이다.
이 연구는 이러한 효과가 모든 모델에 동일하게 나타나지 않는다는 점도 강조했다. 고도화된 모델은 위험을 처리하는 방식에서 명확한 변화를 보인 반면, 오픈 소스 모델은 지침이 어떻게 구성되든 보안 결함이 비교적 안정적으로 유지되는 등 일관성이 떨어지는 반응을 보였다. 또한, 연구진은 자신들이 사용한 스캐닝 도구가 일반적인 패턴을 포착하는 데는 효과적이지만, 가능한 모든 위험을 탐지할 수는 없다는 점에 주목했다. 일부 위험은 코드가 실행되는 동안의 동작이나 사용되는 특정 맥락에 따라 달라지는데, 이는 정적 스캐닝 도구가 흔히 놓치는 영역이다. 즉, 발견된 결함의 수는 보수적인 추정치이며, 실제 위험은 더 높을 수 있다는 의미다.
결국, 이 연구는 더 나은 지침을 작성하는 것이 인공지능이 코드를 생성하게 만드는 강력한 도구이긴 하지만, 보안을 위한 완전한 해결책은 아니라는 점을 시사한다. 구조화된 프롬프트는 보안을 제거하는 방패라기보다는 위험의 분포를 바꾸는 필터처럼 작동한다. 그것들은 기계가 규칙을 따르고 결과물을 생성하도록 하는 데는 매우 효과적이며, 가장 위험한 오류의 심각성을 줄일 수 있다. 그러나 그것들이 코드가 취약점으로부터 자유롭다는 것을 보장하지도, 코드가 개발자의 원래 의도에 충실하다는 것을 보장하지도 않는다. 이 연구 결과는 요청을 어떻게 표현하느냐에만 의존하는 것은 불충분하며, 견고한 보안를 위해서는 초기 프롬프트 이상의 인간의 검토와 추가적인 보호 계층이 여전히 필요함을 보여준다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.