scalalang2

CAPTCHA 튜링 테스트에서 벌어지는 인공지능과 인간의 전쟁

튜링 테스트란 1950년에 앨런 튜링이 제안한 시험으로 인간과 기계의 지능을 구분하는 테스트를 말한다. 과거부터 현재까지 많은 웹사이트에서 자동화된 기계의 공격으로 부터 저항하기 위해 이미지 텍스트 기반의 CAPTCHA[1][그림2]를 이용하고 있다. 하지만, 딥러닝 기술이 발전하면서 이런 방어체계가 큰 위기를 맞고 있다. 딥러닝 모델은 이미지 안에 포함된 텍스트를 읽어내는 방법을 자동으로 학습하기 때문에 웹사이트를 악의적인 공격으로부터 보호하고자 한 인간의 노력이 무색해진다.

많은 미래학자가 무서워하는 인류로 향한 인공지능의 공격은 이렇게 사소한 곳에서부터 전쟁이 시작되고 있다. 그렇다면 우리는 이 전쟁에서 승리하기 위해 어떻게 해야 할까? 가장 쉬운 방법은 망치를 준비해서 아직 육체의 한계를 벗어나지 못한 기계 덩어리의 머리를 깨는 것이고[그림 1] 조금 어려운 방법은 인공지능의 공격을 방어하는 효과적인 시스템을 구축하는 것이다.

[그림 1] 망치 : 인공지능에 대적할 수 있는 가장 저렴한 수단

[그림 2] TEXT CAPTCHA 시스템의 예시

오늘 소개하고자 하는 이야기는 불과 몇 일전에(2020/11/09) 개최된 세계 최고 보안학회 중 하나인 ACM CCS에서 소개된 “Text Captcha Is Dead? A Large Scale Deployment and Empirical Study[2]” 논문을 배경으로 한다. 이 논문에서는 텍스트 CAPTCHA가 인공지능으로부터 공격을 받게 된 배경과 이를 해결하기 위한 시스템의 개발 방법이 서술되어 있다. 비록 무기를 가지고 하는 전쟁은 아니지만, CAPTCHA를 두고 벌어지고 있는 인간과 인공지능의 대결에서 승자는 누구일까?

구성

공격수의 상황

공격자의 상황은 생각보다 간단하다. 이미 많은 연구에서 CNN, GAN등의 이미지 분류/생성 모델을 이용해서 텍스트 기반 CAPTCHA에서 정답을 추출하는 방안이 많이 제시되었기 때문에 최신 연구자료를 그대로 사용하면 된다. 여기서 공격자가 추가적으로 필요한 것은 학습 데이터를 얻는 일이다. 아래 [그림 3]은 CAPTCHA 시스템을 무력화 시키는 연구를 비교한 표이다.

데이터를 얻는 일 또한, 공격자의 입장에서는 비교적 값싼 노동력만으로 쉽게 대규모의 학습 데이터를 얻을 수 있다. 실제로 CAPTCHA 시스템을 무력화해서 얻을 수 있는 경제적 이익이 지불한 노동력 보다 크기 때문에 이 일은 빈번히 이루어지고 있다. 여기서 방어자가 공격상황을 인지해서 CAPTCHA 시스템을 변경한다 해도 공격자에게는 공격을 해야 할 경제적인 동기가 충분하기 때문에 공격 모델을 빠르게 바꾼다.

[그림 3] CAPTCHA를 풀이하는 머신러닝 모델의 종류

결국, 방어자가 웹 사이트를 보호하기 위해 들이는 노력보다 공격자는 훨씬 쉽게 공격을 수행할 수 있기 때문에 방어자 입장에서는 자동으로 공격자를 무력화 시키는 시스템을 구축 할 필요가 있다. 이 논문[2]에서는 공격자의 모델을 추출해서 학습한 대체 모델(Substitute Model)로부터 적대적 이미지를 생성하는 방법을 기본적인 아이디어로 사용하고 공격자가 모델을 변경 할 때마다 이를 감지해서 대체 모델을 주기적으로 변경해서 유동적으로 공격에 대응하는 체계인 advCAPTCHA를 설계하였다. advCAPTCHA는 8억명이 넘는 사용자를 보유한 실제 서비스에서 실험이 진행되었는데 논문의 저자에 알리바바 그룹이 포함된 것으로 보면, 알리바바에서 적용되어 사용했던 것으로 보인다.

수비수의 상황

수비수는 일반적으로 공격수보다 불리한 상황에 처해있다. 일단 공격수가 가진 무기(딥러닝 모델)가 무엇인지 알 수 없고, 이것이 일반 사용자의 행동인지 공격수의 공격인지 분류하는 것 또한 쉽지 않다. 그리고 공격자는 학계에서 매년 발표되는 최신 연구를 바로 적용하기 때문에 수비수의 대응책은 금방 무력해진다. 어떤 연구자는 논문 제목으로 “끝이 가까이 있다[3]“며 텍스트 기반 CAPTCHA 시스템의 종말을 선언하기도 했다.

최선의 방어는 공격이다

생각보다 딥러닝 모델은 공격에 취약하다. 2015년 CVPR에서 발표된 “Deep Neural Network are Easily Fooled[4]”에 따르면 이미지에 아주 작은 노이즈만 추가해도 딥러닝 모델을 완벽하게 속일 수 있다고 말한다. 최근 딥러닝 연구를 보면 이미지에 눈치 챌 수 없는 아주 작은 변화(perturbation)를 추가해서 딥러닝 모델을 속이는 적대적 공격 방법론이 많이 연구되고 있다.

아래 [그림 4]는 2017년 CVPR에서 발표된 “Universal Adversarial Perturbations[5]” 논문에 나온 그림으로 모든 이미지에 동일한 노이즈 이미지를 입히기만 해도 모델이 전혀 다른 클래스로 분류하는 것을 보여준다.

[그림 4] Universal Perturbation

이 Perturbation를 이용한 공격 방법에 대해서 조금만 다루어보자. 우선 이 공격 방법은 이미지 데이터에 벡터 v를 추가해서 클래스 k를 완전 다른것으로 분류하게 할 수 있는 아주 작은 벡터 v를 찾는 것을 목표로 한다.

[그림 5] 목적 함수

동시에 벡터 v의 값은 아주 작아야 한다. 여기서 v의 값이 크다면 방어자의 입장에서는 이미지가 크게 변조된 것임을 아주 쉽게 알아차릴 수 있다. 그래서 공격자는 여기서 아주 작은 변화량(Perturbation)을 찾아야 한다.

[그림 6] 벡터 v의 제약 조건

이 원리를 [그림 7]에서 살펴보자면 클래스의 Decision Boundary를 변화시킬 수 있는 아주 작은 벡터 v를 찾는 것으로 볼 수 있다. 그림에서는 R1, R2 영역에 있는 x 값을 R3까지 밀어내기 위한 벡터 v의 최소값을 보여준다.

[그림 7] Perturbation의 원리

이제 최종적으로 알고리즘[그림 8]을 보면 현재 가지고 있는 벡터 v가 분류 모델 kˆ의 값을 변화시킬 수 있을 때 까지 v의 변화량을 계산해서 원본 벡터 v를 업데이트 한다. 이 공격 방법이 특히 효과적인 이유는 계산이 크게 복잡하지 않고 빠르게 수행할 수 있다는 점 덕분이다. 공격자는 간단한 연산만 하고도 복잡한 딥러닝 시스템을 바보로 만들 수 있다.

[그림 8] 적대적 이미지 생성 알고리즘 의사코드

자 이제 여기서 CAPTCHA 시스템을 방어하고자 하는 수비수는 이 원리를 이용해서 텍스트 이미지를 생성한다면 공격자의 딥러닝 모델로부터 시스템을 보호할 수 있다. 오늘 포스팅에서 소개한 논문은 바로 이 아이디어를 이용한다. 원래 최선의 방어는 공격이라고 했던가? 딥러닝 모델로부터 공격을 받는다면 역으로 해당 모델을 공격하면 된다.

대체 모델 만들기

이제 수비수는 딥러닝 모델을 공격할 수 있는 적대적 이미지 생성 방법을 알고 있다. 하지만, 이 공격을 하려면 일단 공격받는 대상의 모델인 kˆ을 관측할 수 있어야 한다. 웹 사이트를 운영하는 입장에서는 공격자의 모델에 직접 접근할 수 없다. 그래서 여기서는 CAPTCHA 이미지와 공격자가 제출하는 정답을 가지고 공격자의 모델을 추론해서 대체 모델(Substitute Model)을 만들어서 해당 모델을 공격하는 간접적인 방법을 사용한다. 공격 대상의 반응을 보고 유사한 모델을 만드는 방법을 모델 추출(Model Extraction)이라고 부른다.

수비수는 공격자의 모델을 추출해서 대체 모델로 만들고 그 모델을 공격함으로써 공격자를 간접적으로 공격하는 방식을 택한다. 여기서 공격을 받는 공격수 입장에서는 모델을 변경해서 수비수의 대응에 반격할 수 있다. 그렇기 때문에 방어하는 입장에서는 주기적으로 대체 모델을 변경해서 공격수의 반격을 다시 맞받아쳐야 한다. 아래 [그림 9]는 advCAPTCHA의 전체적인 운영 흐름을 보여준다.

[그림 9] advCAPTCHA의 운영 방식

대체 모델을 만드려면 공격자의 답안이 필요하다. 여기서부터 논리가 조금씩 어색해 진다는 느낌을 받았는데, 공격자의 답안을 훈련 데이터로 쓰기 위해서 advCAPTCHA에서는 IP 주소, 마우스 움직임, 스크롤 움직임, 페이지 체류 시간 등의 웹 사이트 내에서 수집할 수 있는 데이터를 분석해서 제출 받은 답안의 출처가 공격자인지 일반 유저인지 분류하는 공격/일반 분류 모델을 만들어서 분석한다. 이 과정이 [그림 9]의 Step 3에 해당한다.

공격/일반 분류 모델에서 Confidence Score가 높게 나온(공격자임이 거의 확실한) 유저의 답안과 CAPTCHA 이미지를 훈련 데이터로 사용해서 대체 모델을 Fine-tuning 해서 업데이트 한다. 그리고 Step 2 에서는 새로운 CAPTCHA 적대적 이미지를 생성한다. 이 구조가 계속 순환되서 공격수가 모델을 업데이트 해도 장기적으로 대응할 수 있게 된다. 아래 [그림 10]은 advCAPTCHA를 실제로 애플리케이션에 적용했을 때 성공율을 보여준다.

[그림 11] advCAPTCHA의 성공율

결론

딥러닝 모델의 취약점을 이용한 다양한 공격 방법들이 학회에 계속 보고되고 있다. 이 공격 방법들은 본래 처음에 인공지능의 실생활 적용을 주저하게 만드는 요소로 꼭 해결되어야 하는 것처럼 여겨졌다. 가령 실시간 자율주행 자동차가 보는 세상에 노이즈를 입혀서 신호등의 빨간불을 녹색불로 인식하게 만든다면 큰 사고로 이어질 것이다.

오늘 소개한 advCAPTCHA 논문에서는 이 공격방법을 되려 인공지능에 대항하는 수단으로 쓴다는 점에서 나름 재밌게 읽었다. 이런 논문을 볼 때 마다 생각하는 거지만, 논문이 꼭 어렵고 복잡한 주제가 아니더라도 이렇게 재밌는 이야기로도 만들 수 있구나 하는 생각을 한다.

레퍼런스

[1] CAPTCHA (Completely Automated Public Turing test to tell Computers and Human Apart)
[2] Text Captcha Is Dead? A Large Scale Deployment and Empirical Study
[3] The End is Nigh: Generic Solving of Text-based CAPTCHAs
[4] Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images
[5] Universal adversarial perturbations