신용카드는 브루트포스 유형 공격에 취약함
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 브루트포스에 대해 비교적 관대한 속도 제한을 두고 있으며, 제한에 걸리면 해당 카드를 몇 분 정도 일시적으로 막는 수준임
-
Homepage
-
Tech blog
- 신용카드는 브루트포스 유형 공격에 취약함