회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
AWS 이용 중이라면 최대 700만 원 지원받으세요
대화형 인공지능 서비스 ChatGPT의 활약이 대단하다. 2022년 11월 30일 출시 이후 두 달 만에 월간 사용자 수 1억 명을 돌파했으며, ChatGPT 돌풍으로 마이크로소프트는 OpenAI와 장기적인 파트너십을 강화하고, 구글은 최고 비상사태를 의미하는 '코드 레드(Code Red)’ 발동하며 경쟁 서비스인 바드(Bard) 연구에 총력을 기울이고 있다. ChatGPT는 2016년 11월 딥마인드의 알파고(AlphaGo) 이후 인공지능 생태계에 두 번째 빅웨이브를 일으키고 있다.
회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
회원가입을 하면
성장에 도움이 되는 콘텐츠를
스크랩할 수 있어요!
확인
대화형 인공지능 서비스 ChatGPT의 활약이 대단하다. 2022년 11월 30일 출시 이후 두 달 만에 월간 사용자 수 1억 명을 돌파했으며, ChatGPT 돌풍으로 마이크로소프트는 OpenAI와 장기적인 파트너십을 강화하고, 구글은 최고 비상사태를 의미하는 '코드 레드(Code Red)’ 발동하며 경쟁 서비스인 바드(Bard) 연구에 총력을 기울이고 있다. ChatGPT는 2016년 11월 딥마인드의 알파고(AlphaGo) 이후 인공지능 생태계에 두 번째 빅웨이브를 일으키고 있다.
ChatGPT를 기술적으로 이해하려면 전문지식이 필요하지만, 실무적으로 보면 ChatGPT의 활용 방법이 더 중요하다. 그래서 이번 시리즈를 통해 시큐어 코딩, 침해 사고 분석, 악성코드라는 주제로 ChatGPT를 활용해 보안 이슈를 해결하는 방법을 다룬다. 이 글에서는 ChatGPT에 대해 간단하게 알아보고, 개발자 관점에서 ChatGPT를 활용해 시큐어 코딩을 통한 보안 문제 해결방법에 대해 살펴보고자 한다.
ChatGPT를 활용하기에 앞서 간단하게 ChatGPT 기술적 배경을 이해하는 것이 필요하다. ChatGPT 활용을 바로 보고 싶다면 이 부분은 넘어가도 무방하다.
ChatGPT는 OpenAI 사에서 개발한 대화형 인공지능 서비스로, 채팅을 의미하는 Chat과 대형 언어 모형(Large Language Model)인 GPT의 합성어이다. GPT(Generative Pre-trained Transformer)는 생산적 사전학습 변환기를 의미한다. 따라서 대규모 자연어 데이터를 학습하여 질문에 답변할 수 있다.
ChatGPT가 주목받는 이유는 기존 GPT의 문제점을 많이 해결했기 때문이다. 신뢰하기 힘든 결과를 제공하거나, 해롭고 도움이 되지 않는 결과를 제공했던 이슈를 지도 학습과 강화 학습을 통해 보강했다. ChatGPT는 GPT3의 확장 버전으로, 파인튜닝(Fine-Tuning)을 통해 대화에 특화되어 있으며, 기존에 발표된 GPT-3, GPT-3.5와 함께 GPT-3 모델 군에 속해 있다.
GPT-3.5는 InstructGPT라고 부르며, RLHF(Reinforcement learning from Human Feedback)라는 방법을 통해 학습한다. RLHF란 인간 피드백형 학습을 의미한다. 즉, 실제 사람의 피드백을 활용해서 인공지능 모델을 개선하는 것이다. GPT에서 사용되던 비지도 학습은 혐오, 차별, 선정성 등 인공지능 윤리적 이슈가 있었고, 이를 해결하기 위해 인간이 개입해 방향성을 제시함으로써 윤리적 이슈가 최소화되었다. ChatGPT는 GPT-3.5와 마찬가지로 RLHF를 사용했기 때문에 윤리적 이슈가 어느 정도 해소되었다.
초거대 인공지능 언어 모델에서 매개변수 최적화는 모델의 성능을 좌우한다. 매개변수가 많다고 무조건 성능이 좋은 것은 아니지만 일반적으로 양질의 매개변수가 많을수록 성능이 좋다. 2018년 GPT-1이 1,700만 개의 매개변수를 사용하였고, GPT-2는 15억 개를 사용했다. GPT-3은 1,750억 개의 매개변수를 사용하여 성능을 향상시켰다. GPT-3를 개선한 GPT-3.5기반의 ChatGPT는 기계처럼 어색한 답변을 탈피했고, GPT 본연의 창조(Generative)가 가능하기 때문에 매번 새로운 결과물을 제공한다.
ChatGPT 기술에 대해 간단히 살펴봤으니, 이번엔 시큐어 코딩에 대해 알아보자. 시큐어 코딩(Secure Coding)은 소프트웨어 개발 시, 보안 취약점이 발생하지 않게 하는 기술을 말한다.
한국인터넷진흥원(KISA)은 소프트웨어의 보안 취약점을 최소화하고, 시큐어 코딩을 지원하기 위해 ‘소프트웨어 개발보안 가이드’를 발간했다. 이 가이드에서는 시큐어 코딩을 위한 개발 방법론을 제공한다. 분석·설계 단계의 보안 강화 방법과 구현 단계의 시큐어 코딩 가이드이다. 가이드를 통해서 입력 데이터 검증 및 표현, 보안 기능, 시간 및 상태, 에러 처리, 코드 오류, 캡슐화, API 오용의 7가지 영역에서 49개의 보안 취약점을 통제하고 위협을 최소화하기 위한 방안을 제시한다.
소프트웨어를 구성하는 소스 코드의 보안 취약점을 점검하는 방식은 정적 분석 기술(SAST, Static Application Security Testing)과 동적 분석 기술(DAST, Dynamic Application Security Testing)로 구분된다. 정적 분석 기술은 소스 코드 내에 잠재적인 보안 취약점을 분석하는 것이고, 동적 분석 기술은 구동되고 있는 애플리케이션을 임의로 공격하여 공격의 성공 여부를 확인하는 방식이다.
정적 분석 기술(SAST)
동적 분석 기술(DAST)
시큐어 코딩은 일반적으로 정적 분석 기술을 통해 도출된 결과물을 조치하는 과정이다. 정적 분석 기술로 보안 취약점을 도출하기 위해서는 수동 점검과 자동 점검을 사용한다. 일반적으로 PMD, FindBugs, JLint, CheckStyle, CppCheck, Splint, Flawfinder, SonarQube, SonarLint 등 자동화된 도구를 이용해 진단한다.
정적 분석 기술을 통한 진단 결과에서 많은 취약점이 도출되는 영역은 단연 ‘입력 데이터 검증 및 표현’이다. 사용자가 입력한 값을 소프트웨어가 처리하는 과정에서 의도하지 않은 결과를 도출하는 경우에는, 원하는 결과물이 나올 수 있도록 개발 단계에서 입력 값을 검증해야 한다. ‘입력 데이터 검증 및 표현’중에서 SQL 인젝션, 크로스 사이트 스크립트(XSS), 운영체제 명령어 삽입, 위험한 형식 파일 업로드 등이 자주 발견된다. 이 중에서 SQL 인젝션 취약점을 통해서 ChatGPT의 활용 방법을 설명하고자 한다.
SQL 인젝션은 애플리케이션에서 사용자의 입력값을 이용하거나 조작하여 서버의 데이터베이스를 공격하는 방법이다. 유효성 검증 누락 및 미흡으로 인해 데이터베이스에 질의할 때 의도하지 않은 동적 질의가 생성되고, 이를 통해 데이터베이스를 임의로 열람하거나 조작할 수 있는 보안 취약점을 의미한다.
먼저 ChatGPT에 SQL 인젝션 소스 코드의 예시를 요청하면, 취약한 소스 코드 사례와 간단한 공격 예시를 보여준다. 아래 이미지와 같이 PHP로 구현된 로그인 기능에서 발생하는 SQL 인젝션 사례를 볼 수 있다. 설명과 같이 $username에 ‘admin’--‘이 입력되면 Oracle, MSSQL, MariaDB에서 주석 처리를 의미하는 ‘--’문자열 때문에 $password에 정상적인 패스워드 값이 아니더라도 로그인 될 수 있다.
이제 본격적으로 SQL 인젝션 취약점 대응을 통해 시큐어 코딩을 구현할 수 있는 방법을 ChatGPT에게 요청해 보자. JAVA로 구현된 SQL 인젝션 사례를 요청하고 결과를 살펴보면, SQL 인젝션에 대응하기 위해 Statement보다는 파라미터 바인딩을 지원하는 Prepared Statement 사용을 권장한다.
성능 이슈나 특수문자 자동 파싱 등으로 인해 SQL 인젝션에 대응할 수 있는 Prepared Statement 사용을 권장하지만, 소프트웨어 목적에 따라 부득이하게 Statement를 사용해야 하는 경우의 대응 방안도 필요하다. 동적 SQL을 사용해야 해서 조건절이 매번 달라지는 경우에는 PreparedStatement는 성능적으로도 우수하지 못하고 소스 코드를 개발하는 입장에서도 Statement로 구현하는 것이 훨씬 용이하기 때문이다. 그래서 Statement를 사용한 방법이 없는지 재질문 했지만, 아래와 같이 PreparedStatement를 사용하라는 답변을 다시 해주었다.
그리고 다시 한번 아래와 같은 재질문을 했고, 앞선 결과와 다른 답변을 얻을 수 있었다. PreparedStatement 사용하라는 답변 외에도 입력값 검증, 특수 문자 필터링, 쿼리 로깅, 웹 방화벽 사용과 같이 다른 대응 방안도 제시해 주었다.
이처럼 ChatGPT와의 대화를 통해 SQL 인젝션에 취약한 소스 코드와 대응 방안을 제공받을 수 있다. 다만 다양한 대응 방안을 얻기 위해서는 여러 가지 고려 사항을 함께 제시해야 한다. 즉, “SQL 인젝션은 Prepared Statement로 대응해야 한다.”라는 대답 이외의 다양한 답변을 제공받기 위해선 여러 조건과 함께 재질문하면 원하는 결과를 얻을 수 있다.
앞선 예시에서는 SQL 인젝션의 대응 방안이 PreparedStatement 이외에 다른 방안이 있다는 기반 지식이 있는 상태에서 질의했다. 실제 개발 환경에서 모든 개발자가 보안 기반 지식을 보유하는 것은 어려운 일이다. 따라서 정적 진단 결과를 바탕으로 시큐어 코딩을 적용하기 위해 ChatGPT를 활용할 때는 2가지를 고려해야 한다.
첫 번째는 개발 환경 및 소프트웨어 목적 등 구체적인 상황을 제시하여 환경에 최적화된 대응 방안을 받는 것이다. 두 번째는 앞선 예시와 같이 단순히 다른 대응 방안이 없냐는 추가 질문을 통해 또 다른 결과를 제공받는 것이다.
시큐어 코딩을 위해 ChatGPT에 구체적으로 질문하는 것이 가장 중요하지만, 다른 대안이 있는지 다시 질문하는 것으로 다양한 결과를 얻을 수 있다는 점도 유념해야 한다.
이번에는 실제 SQL 인젝션 취약점 사례를 통해 ChatGPT의 활용법을 살펴보자. 오픈소스 기반의 웹 사이트 제작 플랫폼인 워드프레스에서 발생한 SQL 인젝션 취약점(CVE-2022-21661)의 소스 코드를 분석해 보았다.
아래 이미지를 보면 왼쪽은 SQL 인젝션 취약점이 발생한 소스코드고, 오른쪽은 취약점이 해결된 안전한 소스코드다.
왼쪽 소스코드의 ‘$query['terms'] = array_unique( (array) $query['terms'] );’ 부분을 ChatGPT에 질문해 보았다. ChatGPT는 $query['terms']에서 SQL 인젝션이 발생할 수 있으며, 실제 취약점이 해결된 소스 코드와는 다른 결과지만, Prepared Statement를 통해서 SQL 인젝션을 조치할 수 있다고 답변했다.
다음으로 SQL 인젝션 취약점을 악용하는 공격자가 사용하는 개념증명 코드인 PoC(Proof of Concept) 코드를 통해서도 취약점을 알아낼 수 있는지 확인해 보자. 여기서 PoC 코드란 취약점을 이용해 공격이 가능함을 보여주는 데모 코드다. 아래는 Exploit DB에 공개된 워드프레스 HTTP 요청의 취약점 예시이다.
아래와 같이 보안 취약점을 ChatGPT에게 질문했는데, ChatGPT는 ‘terms’ 배열에 입력된 값이 적절한 필터링 조치가 없어서 SQL 인젝션이 발생할 수 있다고 답했다. 단순한 소스 코드뿐만 아니라, HTTP 요청 정보에서 발생할 수 있는 보안 취약점과 해결 방법까지 알려줬다.
앞선 답변에서 ChatGPT는 해당 SQL 인젝션이 발생하는 환경을 알려주지 않았다. 질문을 통해 어떤 환경에서 발생하는 보안 취약점인지 확인해 보자.
워드프레스에서 /wp-admin/는 관리자 경로를 뜻한다. ChatGPT는 HTTP Request의 Path 정보에 있는 /wp-admin/admin-ajax.php를 통해, 워드프레스에서 발생하는 취약점이라고 답변하고 있다. 덧붙여 해당 페이지가 관리자 페이지이기 때문에 추가적인 공격 가능성에 관해서도 설명하고 있다.
이처럼 ChatGPT를 활용하여 소스 코드에 존재하는 보안 취약점에 대한 해결 방안을 얻을 수 있다. 또한 보안 취약점과 공격자들의 개념증명 코드를 통해 취약점이 존재하는 소스 코드 라인과 취약점이 존재하는 환경도 알아낼 수 있다. 이러한 정보를 통해 보안 전문가가 아닌 개발자도 시큐어 코딩을 구현할 수 있으며, 보안 취약점에 대응할 수 있다.
지금까지 ChatGPT를 활용한 시큐어 코딩 방법에 대해 살펴보았다. 서비스 경량화를 위해 MSA 환경이 늘어나고, 유연한 서비스 확장으로 인한 API 환경 등 소프트웨어 생태계는 변화하고 있다. 이때 소프트웨어 보안의 중요성은 중요한 화두다. 시큐어 코딩은 안전한 소프트웨어 개발을 넘어 IT 생태계 전반의 안전을 위한 일이다. ChatGPT를 활용하여 많은 개발자에게 생소한 보안 영역에 대한 정보를 쉽게 얻을 수 있고, 나아가 적절한 대응 방안도 찾을 수 있을 것으로 기대된다.
다음 글에서는 공격자들의 악의적 접근으로 발생하는 침해 사고를 주제로 ChatGPT 활용 방법에 대해 살펴볼 예정이다.
글 김보안
편집 오신엽 객원 에디터
요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.