버그는 뜻하지 않게 찾아온다 – 카카오뱅크 취약점 제보 후기

공인인증서나 보안 프로그램과 같은 발암(?)물질이 전혀 포함되지 않아 엄청난 인기를 얻고 있는
카카오뱅크의 취약점을 찾아 지난 8월에 제보하였다.

사실 기술적으로는 굉장히 별거 없는 (화려한 익스플로잇 따위는 1도 포함 안된) 취약점이긴 하나
그것을 찾기 위한 과정은 꼭 한번 소개를 하고 싶었다. 우리의 일상속에서 쉽게 지나칠 수 있는 것들을
유심히 살펴보는 것 만으로 도 버그를 찾을 수 있다는 것을 말해보고자 한다.

슬램덩크에 보면 송태섭의 도움을 받아 강백호가 엘리우프를 성공시켜  기선을 잡는 장면이 있는데
이후 상대팀의 에이스인 정우성(맞나?)이 매우 평범한 점프슛을 넣은 후 다음과 같은 명언을 남겼더랬다.

“같은 2점이다”

즉 엄청난 시간의 분석과 리버싱, 익스플로잇을 통해 취약점을 찾는것도 하나의 방법이지만,
일상을 소소하게 관찰하거나, 평소 습관처럼 사용하던 것을 조금은 다른 시선으로 바라보는 것으로도
취약점을 찾을 수 있다는 것이 본 포스팅을 통해 전달하고자 하는 핵심이다.

 

카카오 뱅크를 신청하고 기다리다.

카카오뱅크를 개설하면 체크카드를 신청할 수 있는데 5개의 캐릭터 중 직장인에게 가장 인기 있는(?)
라이언 카드를 선택하였다. 첨에는 곰인줄 알았는데 알고보니 사자(Lion) 라 해서 당황;;. 어쨌든.

카드를 신청하고 거의 한달이 다 되도록 발송조차 안되는 걸 보며 새삼 라이언 캐릭터의 인기가
장난이 아님을 알게되었다. 그러던 어느날 회사 뒷자리에 앉은 후배가 지난달 신청한 라이언 카드가
도착했다며 보여주었다. 아 이쁘다… 내 카드는 도대체 언제 오는것인가!!!
다시금 카카오뱅크 앱에서 체크카드 배송상태를 체크해보았다.

[그림 1. 카카오뱅크 앱에서 발급 진행 중인 카드의 번호 10자리는 확인이 가능함]

순간 응 뭐지? 하는 생각이 머리를 스쳐지나갔다. 이 숫자들… 어디서 많이 보던 번호같은데?

다시 한번 확인하기 위해 뒷자리 후배가 수령한 카드를 잠깐 빌렸고,
아니나 다를까 몇자리 숫자를 뺀 나머지 카드번호가 내것과 같거나 비슷하다는 것을 알게 되었다.

흠… 어쩌면 이걸 갖고 뭔가 해볼 수 있을 것 같은 예감이 든다.

 

정면 돌파 할 것인가? 돌아갈 것인가?

우선 카드번호가 왜 같거나 비슷한지에 대해 곰곰히 생각해보자.
신용카드는 Master 혹은 Visa 규격에 맞게 16자리의 카드 번호가 부여된다.
그러나 카카오뱅크와 같이 단시간에 엄청난 사람이 동일한 카드를 신청했을 경우
완전하게 랜덤한 번호가 아니라 어느정도 순서를 가진 번호가 부여되지 않을까 하는 생각이 들었다.

즉, 단시간에 카드 신청자가 몰리면서 비슷한 숫자를 가진 카드가 발급 되었을 것이라는게
나의 추측이었다.

만약 이 추측이 맞다면 어떠한 공격 벡터를 이용해서 다른 사람의 카카오 뱅크 카드 번호를 알아내거나
추가적인 신용 정보를 획득할 수 있을 수 있을 것이다.

문제는 어떻게인데 사실상 카카오뱅크 앱이나 뱅킹 아키텍쳐상의 취약점을 찾는 것은 쉽지 않을것 같았다.
그 때 불연듯 떠오른 아이디어가 바로 삼성페이 앱 이었다.

 

사소한 것을 놓쳐선 안되는 이유

삼성페이 앱에는 신규로 카드를 등록하는 기능이 있다.
등록 프로세스는 아주 간단한데
1) 카드 번호 16자리 2) 카드 유효기간 3) CVV (또는 CVC) 코드 4) 비밀번호 앞 두자리를 입력한 후,
본인 명의의 핸드폰 문자 인증을 받으면 카드를 등록하여 사용할 수 있다.

이 카드를 등록하는 과정에 있어 카카오뱅크의 아주 사소한 실수로 인해
임의의 카드번호와 만료일, 보안코드, 비밀번호를 알아낼 수 있는 취약점을 발견할 수 있었다.

[그림 2. 삼성페이 카드 등록 화면]

일단 카카오뱅크 앱에서 확인할 수 있는 것은 발급 예정중인 내 체크카드 번호인데,
보안 정책상 일부 카드 번호가 마스킹 처리 되어 있어 10자리 숫자만  알 수 있는 상태이다.
(그림 1. 참조)

따라서 나머지 6자리는 후배의 카드 번호를 참고 후, 임의의 카드 번호 16자리를 만들었다.
실제 이 카드 번호가 사용 불가능하거나 유효하지 않은 카드 번호일 경우
삼성페이 앱에서 알려주므로, 유효한 카드 번호가 당첨(?) 될 때까지 여러 숫자를 입력해본다.
(나의 경우 보통 10번 이내에 성공할 수 있었다)

[카드 번호를 잘못 guessing한 경우에는 다음 단계로 진행이 불가하다]

다음으로 카드 유효 기간인데 어차피 후배가 신청한 카드와 내가 신청한 카드 제조 일자가 비슷하므로
후배 카드의 유효기간을 쓰기로 했다 (대부분은 신청월로 부터 5년 후가 카드 유효기간이다)
유효기간은 어차피 월 단위로 입력하므로 1월부터 12월까지 그리고 대략 3~5년후를 잡고
계속해서 입력하다보면 알아낼 수 있는 정보이다.

그다음 카드 보안상 가장 중요한 코드인 CVV는 알 수 없으므로 “000”을, 비밀번호 역시 “00”으로 설정했다.

이렇게 카드 등록에 필요한 네가지 필수 항목을 임의로 만든 후 삼성페이 앱에서 등록해보았다.

그 결과는…?

 

아주아주 친절하게도 입력한 카드 비밀번호가 바르지 않다며 다시 입력할 것을 요구한다.
처음 넣었던 번호가 00이라서 01을 넣고 했더니 결과는 똑같았다.
02, 03, 04… 설마…이렇게 Bruteforcing이 되는건가? 횟수 제한이 걸려 있지 않았는지 계속 비밀번호를 입력해 볼 수 있었고,
수십회의 시도 끝에 결국엔 비밀번호 2자리를 알아낼 수 있었다.

문제는 비밀번호 2자리를 알아낸 후 “다음”버튼을 눌렀을때 다음과 같은 화면이 출력되었다는 점이다.

 

이번에는 입력한 보안 코드가 바르지 않다고 한다. 혹시나 하는 마음에 CVV코드 역시 001, 002 이런식으로
계속해서 입력해보았고 다행스럽게도 500번 이내의 시도 끝에 CVV를 알아낼 수 있었다.

위 과정을 계속해서 반복하게 되면 결론적으로는 카드번호/비밀번호/CVV코드/만료일자 까지
모든 카드 정보를 Bruteforcing을 통해 알아낼 수 있게 된다.

취약점의 원인을 간단하게 정리하자면
1) 카드 정보를 등록시 전체 입력값을 한번에 검증하는 것이 아니라 개별 항목에 대해 검사를 한다는 점
   (페이코 앱의 경우 카드 등록시 한개 항목만 틀려도 등록이 불가함)

2) 카드 입력 정보가 틀렸을 때 어떤 항목이 틀렸는지를 불필요하게 설명한다는 점

3) 등록에 필요한 정보를 무제한으로 입력이 가능한 점

위 세가지가 본 취약점의 주 원인이라고 할 수 있다.

 

카카오뱅크의 빠른 취약점 대응

카카오뱅크 체크카드를 소지한 몇몇 지인의 도움을 받아 위 취약점을 확실하게 검증한 후
카카오뱅크 보안 담당자분께 취약점 보고서를 메일로 전달 드렸다.

먼저 확실히 하고 싶은것은 본 취약점은 삼성페이라는 플랫폼을 이용하긴 하였으나
담당자 확인 결과 결론적으로는 카카오뱅크 측의 취약점으로 확인되었다는 점이다.

실제로 내가 갖고 있던 다른 회사의 신용카드를 이용해서 위 취약점을 검증해본 결과
5회 정도 틀릴 경우 삼성페이에서 등록이 불가능했다.

내부적인 구조를 확실하게 알 수는 없지만 카드를 등록할 때 등록 시도 횟수에 대한
데이터를 검증하고 제한할 것으로 예상되는데 갑작스러운 서비스 인기로 인해
이 부분을 누락한게 아닐까 싶다.

그럼에도 불구하고 감사한 것은 카카오뱅크 보안 담당자분께서 총알같이 답변을 주셨고,
굉장히 빠른 내부 프로세스를 거쳐 조치를 해주셨다는 점이다.

이런 든든한 보안 담당자들이 서포트하는 서비스라면 앞으로도 믿고 사용할 수 있을 것 같다.

 

마무리 하며

이번 취약점은 사실 블로그에 쓸만한 내용인가…굉장히 고민을 많이 했다.
CVE를 받은 것도 아니고 대단한 기술이 쓰여진 것도 아니었기 때문에 괜한 설레발이 아닐까도 생각했다.

하지만 “같은 2점이다” 라는 대사를 다시금 생각해볼 때 취약점의 “멋스러움”도 중요하지만
결국 이러한 노력으로 인해 제품 보안에 기여했다는 점이 중요할 것 같아서 글을 남겨본다.

또한 일상속에서 흘려보내는 정보와 기술과 경험들이
실제 취약점을 발굴하는데 있어서 의외의 아이디어를 줄 수 있다는 것도
내가 느낀 하나의 시사점이다.

오랫만의 포스팅이라 두서가 좀 없었던 것 같다. 이번 해에 또 다른 글을 쓸 수 있을지 걱정되긴 하지만
꾸준히 주변을 돌아보며 내가 잘 할 수 있는 부분을 발전시켜 나갈 것이다.

 

Site Footer

Sliding Sidebar

About Me

About Me

June Park