아마 제목만 보고 어떤 사람은 머신 러닝을 이용해서 해킹하는 방법에 대한 글이라고 짐작했을지 모르겠다. 그러나 여기서 다루고자 하는 주제는 반대로 머신 러닝을 해킹하는 방법에 대한 것이다. 얼마 전 arXiv에서 아주 재미있는 논문을 하나 읽었다(https://arxiv.org/abs/1602.02697). 논문의 제목은 'Practical Black-Box Attacks against Deep Learning Systems using Adversarial Examples.' 말 그대로 (기계 학습 시스템이 학습하고 있는 내용에) 적대적인 사례들을 이용해서 시스템을 공격하는 기법에 대한 논문이다.
아래 그림을 보자.
위 그림에서 윗줄에 있는 이미지들이 원본 이미지이며 아랫줄에 있는 이미지들은 논문에서 제안한 기법으로 변형한 이미지이다. 사람이 보기에는 크게 달라진 것이 없지만, 원본 이미지를 잘 인식하던 시스템이 변형된 이미지에 대해서는 잘못 인식하고 있다. 이것은 시스템에서 학습을 통해 획득한 모델 파라미터들이 변형된 이미지의 입력값에 대해서는 갑자기 전혀 다른 값을 출력하기 때문인데 일종의 과적합(overfitting) 현상이다.
딥러닝처럼 복잡한 비선형 모델은 일반적으로 bias error가 낮은 대신 variance error 가 크다. 따라서 많은 데이터로 학습을 잘 할 경우 매우 정확도가 높은 모델을 만들 수 있지만 한편으로는 모델이 미처 감안하지 못한 특정 조건에 대해서는 전혀 엉뚱한 값을 가질 수 있다.
비록 딥러닝을 실전에 적용할 때는 다양한 튜닝과 많은 데이터를 이용해 이런 overfitting 을 해결하고 있지만 모든 소프트웨어가 그렇듯 기계 학습 역시 완벽한 모델을 만들 수 없기 때문에 이런 과적합 포인트가 낮은 확률이나마 존재할 것이다. 그리고 이 논문은 원본 데이터의 변형을 최소화하면서 이런 모델의 취약점(과적합 포인트)을 찾아 공격하는 기법을 제안하고 있으며 전체 알고리즘은 아래와 같다.
학습 모델의 취약점을 정확히 파악하려면 해당 모델의 구조(함수식과 파라미터값)을 알아야 한다. 그러나 딥 러닝 모델의 경우 대개 많은 단계의 layer와 unit을 갖는 nueral network 구조를 갖기 때문에 실상 모델을 생성한 사람도 그 구조를 파악하는 것이 거의 불가능한 black box 이다. 그렇기 때문에 데이터를 조금씩 변형해 가며 정답과 다른 응답을 주는 데이터를 찾는 소위 '찔러보기'를 할 수 밖에 없다.
그런데 실전에서 이렇게 하게 되면 시간도 오래 걸릴 뿐더러 그 동안 공격 대상자가 가만히 있을리 없기 때문에 실용성이 떨어진다. 그래서 논문에서는 대상 모델과 동일한 값을 응답하는 복제 모델을 생성한 후 이 모델에 대해 취약점 찾기를 한 후 복제 모델이 잘못된 값을 응답하는 데이터를 찾아 이것으로 원본 모델을 공격하는 기법을 제안하고 있다.
이 때 복제 모델을 이용할 때 다음과 같은 두 가지 문제가 있다.
첫 째, 원본 모델의 학습 알고리즘이나 구조를 모르는 상태에서 어떻게 복제 모델을 만들 것인가 하는 문제가 있다. 다시 말하면 딥러닝을 쓰더라도 세부 알고리즘은 어떤 걸 쓰는지, neural network 에서 레이어는 몇 단계이고 unit은 몇 개를 쓰는지, activation function은 어떤 걸 사용하는지, 데이터 전처리는 어떻게 하고 있는지 등의 정보가 없으면 정확한 복제 모델을 만들 수 없다. 그런데 논문에서는 내부 구조가 다른 모델이라 하더라도 동일한 오류를 낼 수 있다는 것을 실험을 통해 검증하였다. 즉, 복제 모델이 원본 모델과 구조가 다르더라도 학습 데이터에 대해서 같은 결과를 보인다면 오류도 동일하게 발생할 가능성이 높다는 것이다.
둘 째, 복제 모델을 학습하기 위한 데이터를 어떻게 확보할 것인가 하는 문제가 있다. 재미있게도 이 논문에서는 원본 시스템에 대한 질의를 통해 학습 데이터를 확보하는 방법을 사용했다. 보통 공격 대상은 일반에 노출된 질의용 API 가 있으니 이를 통해 직접 학습할 데이터를 질의하여 그 응답을 학습 라벨로 사용하는 것이다. 다만 이 때 지나치게 많은 질의를 할 경우 공격 의도가 노출될 수 있기 때문에, 논문에서는 이를 방지하기 위해 질의를 최소화하면서 효과적으로 모델을 복제할 수 있는 기법(위 그림의 마지막 모듈에 있는 Jacobian-based Dataset Augmentation)을 제안하고 있다.
마지막으로 위 기법을 이용해서 실전 서비스에 실험해 보니 오탐률이 최대 84.24% 였다고 한다.
이 논문을 읽고 든 생각인데 머신 러닝 해킹은 크게 두 가지 방식으로 나눌 수 있을 것 같다.
하나는 위 논문처럼 학습 모델이 잘못 응답하는 데이터를 찾아 공격하는 방식이다. 자율 주행 자동차가 대중화된다면 위 예에 나온 것처럼 도로 표지판을 기계가 잘못 인식하도록 (하지만 사람은 눈치채지 못할 만큼만) 살짝 변형하여 사고를 유발하는 공격을 상상해 볼 수 있겠다.
또 하나는 모델의 학습 알고리즘이 갖는 취약점을 이용해 원래의 의도와 다르게 학습시키는 공격이다. 최근에 마이크로소프트에서 공개했던 채팅봇을 생각해 보자. 이 채팅봇은 사람들과의 대화를 통해 계속 학습하는 시스템이었는데 악의적인 사람들에 의해 인종 차별적인 발언을 학습하여 결국 서비스가 중단되었다. 이 사건은 일종의 해프닝으로 끝났지만 우리가 사용하거나 앞으로 사용할 대다수의 기계 학습 시스템은 이처럼 온라인 학습을 통해 진화하는 형태가 될 것이다. 따라서 취약점을 이용해 공격자의 의도대로 학습시키는 해킹을 충분히 상상해 볼 수 있다. 이를 테면, 경쟁 업체의 온라인 쇼핑몰 추천 알고리즘의 취약점을 공격하여 엉뚱한 상품들을 추천하도록 하는 공격을 생각해 볼 수 있겠다.
최근 기계학습이 크게 발전하면서 여러 분야에 폭넓게 적용되고 있다. 인터넷이 발전하면서 피싱, 온라인 계좌 해킹, 악성 코드, 랜섬 웨어 등 다양한 해킹 공격이 사회 문제가 되고 있는 현재 상황을 생각해 보면, 조만간 기계 학습에 대한 보안 문제 역시 심각하게 대두될 가능성이 매우 높다. 그리고 내 생각에는 기계 학습 시스템에 대한 해킹은 기존 해킹보다 그 파급력이나 위험성이 훨씬 클 것이다.
결국 근래 IT 보안이 크게 화두가 되고 있는 것처럼 앞으로 기계 학습 보안 역시 중요한 문제가 될 것이다. 지금은 보안 업계 및 학계가 '머신 러닝을 보안 분야에서 어떻게 활용할 것이가?'에 주로 집중하고 있는데 앞으로는 '머신 러닝의 보안은 어떻게 할 것인가?' 라는 질문에 대해서도 답할 준비를 해야겠다.