신용카드는 브루트포스 유형 공격에 취약함

1 week ago 15
  • PCI DSS는 카드 데이터 저장·표시를 제한하지만, BIN과 마지막 4자리, 만료일 같은 허용 정보만으로도 다른 가맹점에서 추가 결제 시도를 이어갈 수 있음
  • 침해된 계정에서 공격자는 은행의 3D Secure 페이지를 통해 카드 사용 가능 여부, 은행명, 마스킹된 카드 번호, 전체 만료일을 얻었고, 약 6시간 뒤 여러 가맹점에서 인증 시도를 발생시킴
  • 결제 카드 번호(PAN)는 IIN, 계정 식별자, Luhn 체크 디지트 구조를 가지며, 결제 게이트웨이 응답이 어떤 값이 틀렸는지 구분해 주면 PAN·만료일·CVV 추측이 쉬워짐
  • 실제 테스트 속도는 초당 6회, API당 약 초당 2회 수준이었고, 프록시로 IP가 바뀌며 카드번호도 계속 달라져 가맹점 입장에서 브루트포스 탐지가 어려움
  • 공격자는 3D Secure 예외 가맹점을 이용해 낮춰둔 한도 전액을 전자지갑으로 옮겼고, 차지백으로 돈은 반환됐지만 은행의 CVC2 속도 제한은 몇 분 차단 수준에 머무름

PCI DSS가 막아주는 것과 남기는 것

  • PCI DSS는 신용카드 같은 민감한 은행 데이터를 다룰 때 필요한 최소 보안 조치를 정의하는 업계 표준이며, 계정이 침해되거나 카드 데이터가 제3자에게 넘어가도 전체 정보가 노출되지 않도록 저장과 표시를 제한함
  • PCI DSS 4 기준으로 화면이나 영수증에 표시 가능한 정보는 마스킹된 PAN, 카드 소유자 이름, 서비스 코드, 만료일이며, PAN은 BIN과 마지막 4자리까지 표시될 수 있음
  • 표시할 수 없는 정보는 전체 트랙 데이터, 카드 검증 코드, PIN/PIN 블록으로 제한됨
  • 전자상거래 사이트와 물리 영수증 모두 같은 문제의 영향을 받을 수 있으며, 계정 침해뿐 아니라 파기하지 않은 영수증을 통해서도 일부 카드 정보가 노출될 수 있음

사고 흐름

  • 피해자는 한도 제한이 있는 가상 신용카드를 사용했고, 2단계 인증인 3D Secure를 활성화했으며, 잘 알려진 가맹점에서만 카드를 저장해 사용하고 있었음
  • 오래전에 만든 계정이 침해된 뒤, 카드가 저장된 웹사이트에서 구매 시도 SMS가 도착했고, 즉시 로그인해 비밀번호를 바꾸고 구매 여부를 확인한 뒤 가상 카드 한도를 크게 낮춤
  • 카드를 완전히 비활성화하지 않은 이유는 전체 카드 정보가 침해되지 않았다고 판단했기 때문임
  • 최초 침해 약 6시간 뒤 사용하지 않은 여러 가맹점에서 3D Secure SMS 시도가 3~4건 발생했고, 모두 실패했지만 이후 공격 방식 파악에 중요한 단서가 됨
  • 몇 분 뒤 은행에 전화해 카드를 완전히 비활성화하는 동안, 공격자는 3D Secure가 없는 다른 가맹점을 이용해 낮춰둔 한도 전액을 여러 번의 결제로 인출함
  • 돈은 현금 인출이 가능한 마켓의 전자지갑으로 이동했으며, 피해자는 차지백을 요청한 뒤 은행에서 돈을 돌려받음

공격자가 얻은 정보

  • 공격자는 침해한 계정에서 결제를 시도하고 은행의 3D Secure 페이지를 본 뒤 주문을 취소하고 떠남
  • 이 과정에서 카드가 아직 사용 가능하다는 사실, 은행명, 마스킹된 카드 번호, 전체 만료일을 얻음
  • 일반적으로 카드 결제를 정상 완료하려면 전체 PAN 16자리, 만료일, CVC2 번호, 3D Secure에 쓰이는 휴대전화 같은 정보가 필요하다고 볼 수 있음
  • 실제 공격에서는 일부 정보만으로 다른 가맹점에서 추가 시도를 이어갈 수 있었음

PAN 구조와 추측 가능성

  • 결제 카드 번호(PAN)는 신용카드, 직불카드, 저장 가치 카드, 기프트 카드 등에 쓰이는 카드 식별자임
  • PAN은 ISO/IEC 7812에 따른 공통 번호 체계를 가지며, 내부 구조는 다음과 같음
    • 6자리 또는 8자리 Issuer Identification Number(IIN)
    • 최대 12자리의 개별 계정 식별자
    • Luhn 알고리듬으로 계산되는 1자리 체크 디지트
  • 피해자의 은행은 카드번호만으로 결제를 허용하지 않고 PAN, 만료일, CVV를 함께 요구함
  • 일부 은행과 결제 게이트웨이는 카드번호만으로도 결제를 처리할 수 있으며, 이는 피해자가 특히 믿기 어려워한 부분임

결제 게이트웨이 응답이 만든 브루트포스 조건

  • 피해자의 은행은 필요한 값이 없거나 틀린 결제를 거절했지만, 어떤 부분이 잘못됐는지 응답 코드로 알려줌
  • 응답 예시는 다음과 같음
    • “유효한 신용카드가 아님”
    • “카드가 만료됨”
    • “다른 정보는 모두 맞지만 CVV가 틀림”
  • 이런 응답은 공격자가 카드번호, 만료일, CVV 중 어떤 값이 맞거나 틀렸는지 구분하는 데 쓰일 수 있음
  • 실제 공격자는 초당 6회, API당 약 초당 2회 수준으로 테스트함
  • 이 속도는 가맹점 입장에서 탐지하기 어려운데, 프록시로 출발지 IP가 바뀌고, 브루트포스 특성상 카드번호도 같지 않으며, 요청 빈도도 매우 낮기 때문임

3D Secure 예외 가맹점의 역할

  • 은행에는 3D Secure 예외 가맹점 목록이 있으며, 이 가맹점들은 은행이 신뢰하는 대상으로 간주되어 3D Secure 없이 결제와 구독을 받을 수 있음
  • 이런 가맹점은 차지백이 발생하면 책임을 부담함
  • 공격자는 3D Secure가 없는 가맹점을 이용해 카드 한도 내 금액을 전자지갑으로 옮겼음

이후 대응과 남은 문제

  • 차지백으로 돈은 빠르게 반환됨
  • 카드 결제를 현금화하는 시스템이 무단 인출에 사용됐다는 점을 해당 가맹점에 전달했지만, 가맹점은 은행에 문의하라고 답함
  • 전자상거래 사이트에는 만료일과 함께 카드번호 10자리를 노출하면 공격이 쉬워진다고 전달했지만, 해당 사이트는 이를 취약점으로 인정하지 않고 PCI DSS 3과 4 표준에 맞춰 의도적으로 설계했다고 답함
  • 결제 API를 만들거나 결제 업계에서 일하는 사람들은 놀라지 않았고, 일부 가맹점은 만료일 없이도 거래할 수 있다고 답함
  • 사건 이후 신용카드 결제를 현금으로 바꾸던 당사자는 더 이상 3D Secure 없이 이를 처리하지 않음
  • 피해자의 은행은 여전히 CVC2 브루트포스에 대해 비교적 관대한 속도 제한을 두고 있으며, 제한에 걸리면 해당 카드를 몇 분 정도 일시적으로 막는 수준임
Read Entire Article