"챗GPT 작성 코드, 보안 수준 낮아 그냥 쓰면 위험"
대화형 AI 채팅 챗GPT가 프로그래밍 영역에서 활발히 활용되는 가운데, 챗GPT로 생성한 소스코드가 보안 취약성을 다수 포함한다는 지적이 제기됐다. 보안 위험성을 내포한 코드임에도 사용자에게 취약성을 경고하지 않는다는 점도 지적됐다. 최근 캐나다 퀘벡대학교 소속 연구원들은 챗GPT 생성 코드의 보안성을 조사한 논문을 발표했다. '챗GPT로 생성된 코드는 얼마나 안전한가?'란 제목의 이 논문의 저자들은 "챗GPT는 잠재적인 취약점을 인식하고 있지만, 특정 공격에 강하지 않은 소스코드를 생성하는 경우가 많다"고 밝혔다. 저자들은 "챗GPT는 사람과 유사한 텍스트를 소스코드로 번역할 수 있으며, 버그 감지 및 로컬라이제이션, 프로그램 합성, 코드 요약, 코드 완성 등 초기 머신러닝 코딩 앱 대부분을 통합할 잠재력을 가졌다"며 "비용을 최소화하면서 생산성을 높이려는 소프트웨어 개발사에게 매우 매력적이지만, 챗GPT로 생성된 소스코드를 개발하고 배포할 때의 위험은 아직 알려지지 않았다"고 전제했다. 이 조사는 챗GPT에게 C, C++, 파이썬, html, 자바 등 다섯개 프로그래밍 언어로 프로그램을 작성하도록 했다. 연구자는 이렇게 생성한 코드의 보안 취약성을 다시 챗GPT에 물어보고, 특정 취약점을 지적하며 수정을 지시했다. 저자들은 "이 논문은 챗GPT로 생성된 소스코드의 안전성에 대한 질문에 답하기 위한 시도이며, 챗GPT가 더 안전한 소스코드를 평가하고 재생성할 수 있게 안내하는 후속 질문을 제안한다"며 "그 결과는 우려스러웠으며, 여러 경우에서 챗GPT로 생성한 코드는 대부분 상황에서 적용되는 최소한의 보안 표준에 훨씬 미치지 못했다"고 밝혔다. 이어 "실제로 생성된 코드의 안전성 여부를 확인했을 때 쳇GPT는 코드가 안전하지 않다는 것을 인식했다"며 "그러나 챗봇은 명시적으로 요청할 경우 더 안전한 버전의 코드를 제공할 수 있었다"고 덧붙였다. 생성된 프로그램은 특정 취약점의 위험을 강조하기 위해 선택됐다. 데이터베이스와 상호작용하는 프로그램의 경우 SQL 인젝션, C 프로그래밍의 경우 메모리 손상 등을 고려했다. 그밖에 서비스거부, 역직렬화, 부적절하게 구현된 암호화 관련 결함 등 특정 보안 취약점을 설명하는 프로그램이다. 대부분 단일 클래스로 이뤄진 간단한 코드로 최대 97줄 정도의 길이다. 첫 지시에서 저자들은 챗봇에게 해당 코드를 보안에 민감한 맥락에서 사용할 것이라고 지침을 주기도 했다. 따로 보안코드를 생성하도록 지시하거나 특정 보안 기능을 통합하지 않았다. 예를 들어 처음 작성된 프로그램은 공유 디렉토리에서 파일을 공유하기 위한 C++ FTP 서버였다. 작성 결과 챗GPT로 생성된 코드에 입력 삭제가 포함되지 않았다. 이는 소프트웨어를 경로 우회 취약성에 노출시킨다. 악의적 입력에 대한 프로그램 동작을 묻는 메시지를 표시하자 챗GPT는 해당 프로그램의 취약성을 알아차렸고 보안에 필요한 단계를 설득력있게 설명했다고 한다. 그러나 더 안전한 버전의 프로그램을 만들어달라는 요청에 사용자 입력에 영숫자만 포함되는지 확인하는 검사와 공유 파일 경로에 공유폴더 경로를 포함하는지 확인하는 검사만 추가했다. 저자들은 비교적 간단한 검사로 초보 공격자도 쉽게 우회할 수 있다고 지적했다. 21개의 프로그램 중 5개만 첫 지시에서 보안성 있는 프로그램으로 생성됐다. 오류 수정을 추가로 지시받은 뒤 7개의 더 안전한 프로그램을 작성할 수 잇었다. 단, 특정 취약성에 관련된 경우에만 안전하다고 저자들은 설명했다. 최종 코드에 프롬프트로 지적하지 않은 취약성을 포함했을 수도 있다는 것이다. 저자들은 "문제의 일부는 챗GPT가 단순히 적대적 실행 모델을 가정하지 않는다는 점"이라며 "자신이 만든 취약한 프로그램에 잘못된 입력을 제공하지 않는 것만으로도 보안 문제가 발생할 수 있다는 점을 반복해서 보여줬다"고 지적했다. 코드 작성 지시자가 챗GPT로 생성된 코드에서 보안 취약성을 발견하고 그를 지적하지 않으면, 챗GPT는 안전한 프로그램이라고 주장한다. 혹은 챗GPT는 코드의 안전성 여부를 콘텐츠 생성 과정에서 전혀 고려하지 않는다고 볼 수 있다. 저자들은 "챗GPT는 구체적으로 질문하면 사용자에게 해당 코드의 잠재적 악용 가능성에 대해 설득력 있는 설명을 제공한다"며 "올바른 질문을 하는 사용자, 즉 보안에 민감한 사용자만 이런 설명의 이점을 누릴 수 있다"고 강조했다. 챗GPT로 안전한 프로그램을 작성하려면 단위 테스트를 통해 코드를 수정해야 한다. 개발자는 프로그램을 자동화된 분석에 제출해 그 결과를 챗GPT에 제공해 답변을 받는 식을 반복하면서 코드를 개선할 수 있다. 저자들은 "학생들이 이미 숙제에 챗GPT를 사용하기 시작했으며, 이런 학생들은 커리어를 쌓는 동안 계속해서 챗GPT 같은 프로그래밍 보조 도구를 사용할 가능성이 높다"며 "이런 맥락에서 챗GPT가 안전한 코드를 생성하도록 유도하는 방법을 개발하고, 학생들에게 도구 사용의 윤리적 지침을 가르치는 게 현명하다"고 제안했다. 이어 "보안 코드를 작성하려면 프로그래밍 언어에 대한 세부적 지식이 필요하다"며 "챗GPT는 질문에 유익한 답변을 제공하지만 구체적으로 질문하는 사용자에게만 답변하기에 교육용 도구로 사용하기 한계가 있다"고 덧붙였다. 저자들은 챗GPT의 보안에 대한 이중적 태도에 대해서도 지적했다. 오픈AI의 조정 때문에 챗GPT는 취약점 공격 코드를 생성하라는 지시를 거부한다. 그러나 자바 역직렬화 같은 특정 경우 챗GPT는 보안에 취약한 코드를 생성했으며, 더 안전하게 만드는 조언을 받고도 더 안전한 버전을 만들 수 없다고 답했다. 저자들은 "챗GPT는 사실상 공격의 위험을 알지만, 안전한 코드를 만들 수 없는 경우 고의로 취약한 코드를 생성한다"며 "동일한 작업을 수행하는 안전한 프로그램을 만들려면 프로그램의 논리를 완전히 재고하고 사용자 요청과 근본적으로 다른 코드를 생성해야 한다"고 밝혔다. 이어 "이러한 경우 가장 윤리적인 조치는 챗GPT가 사용자의 요청 이행을 거부하거나 생성된 프로그램에 내재된 위험에 대한 논의를 동반하는 것"이라며 "챗GPT는 또한 이 토론을 코드의 주석에 통합하는 것을 고려할 수 있다"고 덧붙였다. 그밖에 챗봇으로 생성된 코드를 사용자가 수정하려 할 경우에 대한 고려, 챗GPT가 기업 기밀 정보를 학습해 재조합에 사용하는 경우에 대한 코드 기밀성 고려, 동일 작업 요청에 언어마다 다른 보안 수준의 결과를 내는 불일치 문제 해소 등이 지적됐다. 저자들은 논문의 결론에서 "자동화된 코드 생성은 새로운 기술이며 보안 공격의 파급력과 함께 안전하지 않은 코드를 생성하는 위험 때문에 이를 윤리적으로 사용하는 방법을 고민해야 한다"며 "챗봇이 아직 숙련되고 보안에 민감한 개발자를 대체하기에 준비되지 않았지만, 학생들에게 올바른 프로그래밍 관행을 가르치는 교육적 도구로서 역할을 할 수 있을 것"이라고 밝혔다. 해당 논문의 실험은 GPT-3.5 기반의 챗GPT를 사용해 진행됐다. 저자들은 GPT-4 기반으로 할 경우 어떤 차이를 보이는지 검증할 필요가 있다고 밝혔다.