4P by GN⁺ | ★ favorite | 댓글 1개
  • 스위스에서 쓰이는 Worldline Yomani XR 결제 단말기를 분해·펌웨어 분석한 결과, 뒷면 해치를 통해 접근 가능한 시리얼 콘솔에서 root만 입력해 root shell에 들어갈 수 있었음
  • 단말기는 하우징 개봉, PCB 접촉 해제, 지그재그 트레이스 절단, 카드 리더 주변 flex PCB 손상을 감지하는 탬퍼 보호를 갖췄지만, 디버그 포트 노출이 별도 공격 경로가 됨
  • 온보드 flash에서 추출한 펌웨어는 암호화되지 않은 파일시스템을 포함했고, Linux 3.6 커널, Buildroot 2010.02, BusyBox, uClibc, 커스텀 부트로더 Booter v1.7 기반으로 동작했음
  • 카드·PIN·화면·키패드 같은 보안 기능은 별도 프로세서 mp1과 암호화·서명된 mp1.img가 맡는 구조로 보이며, Linux mp2에서 직접 접근 가능한 증거는 없었음
  • 취약한 펌웨어 버전은 확정되지 않았고 root login이 비활성화된 기기도 있었지만, 물리적으로 잠시 단말기를 독점할 수 있는 환경에서는 불필요하게 큰 공격 표면이 남아 있음

Worldline Yomani XR 분석 대상

  • 분석 대상은 스위스에서 널리 쓰이는 Worldline Yomani XR 결제 단말기였음
  • 부팅 후 UI 확인과 포트 스캔에서 눈에 띄는 결과가 없어 하드웨어 분해로 이어짐
  • 내부는 여러 PCB로 구성됨
    • 외부 커넥터용 작은 보드
    • 메인 보드
    • 카드 슬롯이 장착된 수직 보드
  • 메인 SoC는 펌웨어에서 “Samoa II”라는 코드명으로 나타나는 dual-core Arm 기반 커스텀 ASIC으로 보임
  • Worldline 문서상 이 칩은 기성 칩 리브랜딩이 아니라 커스텀 ASIC에 해당함
  • SoC 옆에는 작은 외부 flash와 RAM이 있음

하드웨어 탬퍼 보호 구조

  • 일반적인 하우징 개봉 감지 스위치는 발견되지 않았고, 대신 board-to-board interconnect 자체가 개봉 감지 수단으로 쓰였음
  • 보드 사이에는 압력에 민감한 Zebra strip이 있어, 보드를 단단히 나사로 조여야 접촉이 유지됨
    • 일부 나사를 푸는 것만으로도 접촉이 끊겨 탬퍼 이벤트가 발생할 수 있음
    • 전원이 분리된 상태에서도 감지가 필요해 coin cell battery가 사용됨
  • 취약한 PCB 영역은 지그재그 형태의 탬퍼 감지 트레이스로 덮여 있음
    • 물리적 침투로 copper trace 하나만 끊어져도 탬퍼 감지가 발생할 수 있음
  • 카드 슬롯은 별도 내부 하우징 안에 있고, 주변을 감싼 flex PCB가 탬퍼 보호 역할을 함
  • 재조립 후 단말기는 “TAMPER DETECTED”라는 큰 빨간 화면만 표시했고, 이 모드에서는 외부 입력에 반응하지 않는 것으로 보였음

flash 추출과 파일시스템 복구

  • 런타임 탐색이 막히자 온보드 flash chip을 분리하고 wire를 연결해 내용을 덤프함
  • 덤프된 내용은 예상과 달리 전체적으로 암호화되어 있지 않았음
  • flash에는 일반적이지 않은 ECC 배치가 사용됨
    • 표준 2048 byte payload + 64 byte ECC/spare 구성이 아니었음
    • 694 byte 데이터 chunk 3개가 있고, 각 chunk 뒤에 10 ECC byte가 붙는 구조였음
    • spare area 마지막 16 byte는 YAFFS2 파일시스템 metadata로 보였음
  • 일반적인 YAFFS2보다 metadata 영역이 작아, 더 작은 metadata 구조를 처리하도록 파일시스템을 패치해야 했음
  • 호환 파일시스템 reader를 구현한 뒤 파일시스템 내용을 성공적으로 추출함

오래된 Linux 기반 시스템

  • 추출된 파일시스템에서 단말기가 Linux를 실행한다는 점이 확인됨
  • 시스템은 오래된 구성요소를 포함함
    • Linux kernel 3.6
    • Buildroot 2010.02
    • 2023년 2월 빌드
    • 커스텀 부트로더 Booter v1.7
    • init script, BusyBox, uClibc
    • libcrypt 0.9.26
  • 덤프된 펌웨어 버전이 얼마나 최신인지는 확인되지 않았지만, 2023년 2월 이후 릴리스된 펌웨어여야 함

암호 없는 root shell

  • flash chip을 wire로 다시 연결하자 단말기는 탬퍼 메시지를 표시하면서도 다시 부팅함
  • Linux boot log를 보기 위해 debug connector 주변을 logic analyzer로 확인했고, unpopulated debug connector의 한 pad에서 활동을 발견함
  • 시리얼 콘솔에는 Linux boot log와 함께 login prompt가 나타남
    • boot log에는 “Reset reason: Tamper”가 표시됨
    • dropbear is not present, firmware update 확인, application monitoring daemon 시작 같은 로그도 나타남
    • 마지막에는 samoa login: prompt가 표시됨
  • root를 login으로 입력하자 암호 없이 shell prompt ~ #가 표시됨
  • 이 접근에는 exploit chain이나 brute-force password cracking이 필요하지 않았음

외부에서 접근 가능한 디버그 포트

  • root shell 접근은 단말기 내부를 여는 경우로만 제한되지 않았음
  • serial port는 단말기 뒷면의 작은 hatch를 통해 외부에서 접근 가능했음
  • 단말기를 열어 탬퍼 보호를 트리거하지 않고도 debug connector에 연결할 수 있었음
  • 단말기를 잠시 독점할 수 있으면 시리얼 포트에 연결하고 로그인한 뒤 malware를 배치하고 떠나는 시나리오가 가능하다고 판단됨

보안 프로세서와 Linux 역할 분리

  • 노출된 root shell이 곧바로 카드·PIN 데이터 접근을 뜻하지는 않음
  • Linux 시스템은 전체 구조의 일부이며, 디스플레이·키패드·카드 리더를 Linux에서 직접 접근할 수 있다는 증거는 발견되지 않았음
  • 화면 출력도 framebuffer driver가 직접 처리하는 방식이 아니라, 문자열을 display_tool binary에 넘기고 이 binary가 inter-processor message를 보내는 방식으로 보였음
  • 카드, PIN 입력, 화면 표시 같은 보안 관련 기능은 별도 프로세서 mp1 가 처리하는 구조로 보임
  • 두 번째 프로세서 mp2 에서 실행되는 Linux는 networking, update, business logic을 담당함

부팅 흐름과 보안 이미지

  • Linux core는 탬퍼 상태와 무관하게 항상 부팅되는 것으로 보임
  • 이후 Linux가 secure bootloader인 loadercode를 메모리에 로드함
  • loadercode는 탬퍼 보호가 트리거됐는지 확인함
    • 탬퍼가 감지되면 빨간 화면을 표시함
    • 문제가 없으면 실제 secure image인 mp1.img를 부팅함
  • mp1.img는 Linux 파일시스템 안에 있지만, 암호화되고 두 개 entity에 의해 서명된 것으로 보임
  • 카드, 디스플레이, 키패드를 처리하는 secure image는 적절히 암호화·서명되어 있었음

공개 일정과 남은 불확실성

  • 공개 일정은 다음과 같이 기록됨
    • 2024년 11월 14일: root shell 발견
    • 2024년 11월 15일: 제조사에 보고하고 90일 후 공개 예정 알림
    • 2024년 11월 18일: 제조사가 보고 수신을 확인
    • 2025년 6월 1일: 공개
  • 노출된 root shell은 불필요하게 큰 공격 표면이지만, 카드 정보 같은 민감 데이터가 이 경로로 침해될 수 있다는 증거는 발견되지 않았음
  • 어떤 펌웨어 버전이 취약한지는 확정되지 않았음
  • 연구 중 root login이 비활성화된 기기도 발견됨
  • debug feature가 어느 시점에 production firmware에 들어갔는지, 제조사 내부에서 이미 발견·수정됐는지는 확인되지 않았음

댓글과 토론

Hacker News 의견들
  • 2달러짜리 USB 카드 리더로 가짜 직불/신용카드 거래를 만들 수는 있음
    사양은 모두 공개되어 있고 프로토콜도 문서화되어 있음. 기억상으로는 PDF가 5000쪽쯤 돼서 읽기 매우 고통스러움
    하지만 그 거래를 검증하려면 인터넷으로 은행에 보내야 하고, 그러면 연방기관/FBI 같은 곳이 찾아올 수 있음
    카드 리더 자체에는 진짜 보호가 거의 없고, 대부분은 작은 리눅스에 형편없는 비밀번호를 쓰는 식임. 보호는 매장과 은행 사이의 계약과 규제에서 나옴

    • 카드 리더에 보호가 없다는 건 맞지 않음. 서명된 바이너리만 실행되고, 실행 파일 시스템은 읽기 전용이며, 데이터 파일 시스템에는 noexec가 설정되어 있음
      루트 로그인은 비활성화되어 있고, 기능이 많이 빠진 busybox를 쓰며, 키는 부팅 시 보안 영역에서 로드됨. 마스터 키 주입은 공장 로딩 때만 가능하고, 부팅 자체도 어느 정도 안전하며, 변조 감지가 되면 칩을 비움
      물론 아시아에서 들여온 저가의 EMV 미인증 Android 단말기라면 표준 리눅스에 읽기/쓰기 가능한 루트 파일 시스템, 루트 로그인, 앱 실행 사용자에 대한 sudo까지 켜져 있을 가능성이 큼. 변조 감지도 없고, 화면 캐스팅도 잠겨 있지 않으며, 포트도 열 수 있고 busybox도 거의 온전할 수 있음
      몇 년 동안 카드 매입용 EMV 애플리케이션을 개발했고 지금도 가끔 하는 입장에서, 개발 모드조차 벤더가 개발자 ID를 제공해야 하며 꽤 단단히 잠겨 있음
    • 매장과 은행 사이의 계약과 규제가 보호의 핵심이라는 부분은 정확함
      그래서 휴대용 카드 리더를 들고 돌아다니며 비접촉 카드에서 돈을 훔친다는 식의 음모론도 틀렸음. 그런 거래 자체는 만들 수 있지만, 그 뒤에 벌어지는 일과 사전에 필요한 설정이 문제임
      잡히고 차단되기 전에 돈을 빼낼 수 있을지도 확실하지 않음. 요즘은 거래 푸시 알림을 켜둔 사람이 많아서 더 어렵다고 봄
    • 그건 사실이 아님. 가맹점 단말기에는 은행 및 카드망 키를 저장하는 보안 하드웨어가 내장되어 있음
      그 키가 유출되면 누군가 정상 거래를 가장할 수 있음
    • 현장에 있는 카드 리더가 침해되어 캐시되거나 저장된 실제 카드 정보를 읽히거나, 가로채기 악성코드가 설치되는 쪽이 더 걱정됨
      이 특정 사례에서는 어렵거나 불가능해 보이지만, 그래서 이 분야 연구는 의미가 있음
    • “2달러짜리 USB 카드 리더로 가짜 직불/신용카드 거래를 만들 수 있다”는 부분을 조금 더 자세히 설명해 줄 수 있나? “방법을 가르쳐 달라”는 뜻은 아님
  • 뭘 봐야 할지 알지는 못하지만, 가지고 있는 Stripe M2 리더 하나를 열어 내부를 보고 싶은 유혹이 있었음
    문제는 산 리더 36개 중 7개가 “죽었다”는 점임. 2개는 충전이 유지되지 않고, 1개는 NFC를 스캔하지 못하며, 4개는 “tampered”라고 표시함. 겉보기에도 손실률이 나쁘지만, 사용 빈도와 나이를 봐야 전체 그림이 나옴
    그런데 그 답이 더 안 좋음. 기기는 1~3년 됐고, 총 사용일은 최대 9일뿐임. 총 9일 사용에 36개 중 7개가 어떤 식으로든 고장난 셈임. 이동할 때도 모두 폼 인서트가 있는 하드셸 케이스에 리더별 슬롯을 따로 두고 보관함
    그래서 M2 리더를 크게 좋아하진 않지만, 여전히 내게는 최선의 선택지임
    [0] 배경을 덧붙이면, 우리 회사는 축제 결제를 처리함. 행사장으로 이동해 iPad와 M2 리더로 대면 결제를 처리하고, 대부분의 결제는 웹/앱에서 일어남. 그래서 3년 동안 “사용일”이 이렇게 적음

    • 다음 행사 전까지 보관하기 전에 꼭 충전해 두는 편이 좋음. 대부분의 배터리는 낮은 충전 상태로 오래 보관되는 걸 싫어함
      그리고 변조 감지도 정상 동작하는 배터리가 필요할 가능성이 큼
  • 변조 봉인이 발동되면 루트 셸이 열리는 구조일 수도 있음
    즉 시스템이 동작에 필요한 암호화 키를 가진 보안 모드에 있거나, 디버깅과 장애 분석을 위해 루트 셸이 열린 비보안 모드에 있되 그 전환 과정에서 중요한 개인 키가 삭제되는 식일 수 있음

    • 나도 그렇게 추측했음. 어쩌면 새 키를 플래시해서 기기를 다시 쓸 수 있게 만드는 것도 가능할지 모름
      실제로 단말기를 하나 구할 수 있는지 궁금해졌음. 교체되어 사라지는 중이라면 중고를 찾는 게 그렇게 어렵지 않을 수도 있음
  • 흥분하기 쉬운 사람들을 위해 덧붙이면, “노출된 루트 셸은 처음 우려했던 것만큼 큰 위험으로 보이지 않는다. 카드 정보 같은 민감 데이터가 이 방식으로 침해될 수 있다는 증거를 찾지 못했다”는 내용이 있음
    그래도 보안 설계자에게는 좋은 읽을거리임

    • 물리적으로 단말기에 접근해 루트 권한까지 얻었는데도 신용카드 번호를 읽을 수 없다는 건 매우 의심스러움
      보안에서 물리 접근은, 정도는 덜하지만 루트 접근도, 사실상 해킹 성공과 거의 동급임
  • 침해된 Linux가 “침해 모드” 코드와 mp1 보안 시스템 중 무엇을 로드할지 결정하는 구조라면 탐구할 만한 경로로 보임
    부트로더 자체가 안전하다고 되어 있지만, 실제 실행 위치에 따라 침해된 환경 안으로 로드되는 것이라면 큰 의미가 없을 수 있음
    보조 프로세서를 일종의 Secure Enclave로 볼 수도 있겠지만, Linux가 별도 부트로더를 로드하고 실행할 수 있다는 점은 우려됨

    • 별도 부트로더를 로드할 수는 없음. loadercode라는 “보안” 부트로더를 변조해 봤지만 부팅되지 않았음
      그래서 제3자, 아마 부트 ROM이 이를 검증한다고 추측함
      또한 Linux는 변조 상태와 관계없이 항상 loadercodemp1.img를 로드하는 것 같음. 변조 상태에 따른 다른 코드 경로는 무결성 보호를 받는 loadercode 안에서 선택되는 듯함
  • 쉬운 모드를 원한다면 요즘 나오는 Android 기반 카드 단말기를 보면 됨
    특히 PIN을 화면에 직접 누르니 훨씬 보람 있을 가능성이 큼

    • 터치 컨트롤러는 보통 보안 프로세서가 제어하는 멀티플렉서에 연결됨
      PIN이나 PAN 같은 민감 데이터를 입력할 때는 터치 컨트롤러 출력이 GUI를 담당하는 Android 계열 운영체제를 우회해 보안 프로세서로 직접 라우팅됨
    • PIN 데이터는 터치패드에 표시되더라도 여전히 암호화되어 있고, 신뢰 영역에서 실행되는 펌웨어가 제어하는 사용자 인터페이스를 사용함
      그래서 이런 공격에서 접근 가능한 중간 애플리케이션들은 PIN을 볼 수 없음
    • 그렇게 하면 PIN은 꽤 쉽게 얻을 수 있겠지만, 중요한 부분이 보안 보조 프로세서로 넘어가도록 같은 방식으로 설계되어 있다면 여전히 카드로 할 수 있는 건 많지 않음
      현대 카드는 이런 공격을 막기 위해 카드 내부에서 많은 암호 연산을 수행함
      이 공격은 결제 옵션 중 마그네틱 카드 리더만 살아 있는 단말기에서나 통할 텐데, 그런 단말기는 PIN 프롬프트를 보기 전부터 스키머 경고등이 켜져야 함
    • 지역마다 어떤 Android 단말기를 쓰는지는 모르겠지만, 인도에서는 Android Oreo를 돌리는 것처럼 보임. 지원은 2021년 1월에 끝났음
  • 훌륭함. 이런 광범위한 변조 방지 같은 하드웨어 제한을 우회하고 악용하는 방법을 생각하는 걸 좋아하지만, 일단 발동되면 게임 끝이라고 생각해 왔음
    그런데 꼭 그렇지는 않고, 여전히 들여다볼 만한 흥미로운 부분이 많이 남아 있었음. 다만 보안 파트가 제대로 비활성화되는 건 당연함. 그렇지 않다면 설계자에 대한 신뢰를 모두 잃었을 것임

    • 강화된 프로세서에 대해서는 여전히 그 말이 맞을 수 있음. 원문도 여기서 침해된 것은 그 부분이 아니라고 적고 있음
      텍스트 문자열만 display_tool이라는 바이너리로 전달되고, 그 바이너리가 프로세서 간 메시지를 보내는 것처럼 보임. 키패드나 카드 리더도 마찬가지임. 이런 주변장치가 Linux에서 직접 접근 가능하다는 증거는 찾지 못했음
      대신 mp1이라고 불리는 완전히 별도의 프로세서가 카드 처리, PIN 입력, 화면 정보 표시 같은 “보안” 작업을 담당하는 듯함. 두 번째 프로세서 mp2에서 돌아가는 “비보안” Linux는 네트워킹, 업데이트, 비즈니스 로직만 처리함
    • 설명만 보면 Linux 쪽이 변조 이벤트 처리에 어떤 역할을 할 수도 있어 보였음
      그래도 그저 변조가 발생했다는 사실을 볼 수만 있는 구조이길 바람. 그렇지 않다면 먼저 루트 셸을 얻은 뒤 변조 이벤트가 보안 키 삭제를 막을 기회가 생길 수 있음
  • 기기의 모든 변조 감지를 읽다 보니 변조 모드를 가장 쉽게 발동시키는 방법이 뭘지 궁금해짐
    결국 이런 기기 몇 개만 그렇게 만들 수 있어도, 결제의 대부분 또는 전부가 이 단말기를 통해 이뤄지는 매장에는 효율적인 서비스 거부 공격이 될 수 있음

    • 바닥에 떨어뜨리거나 물을 붓는 것
  • 이런 장치를 들여다보는 건 흥미롭지만, 왜 바로 열어서 변조 상태를 발동시켰는지 모르겠음. 대부분의 리더에 그런 장치가 있다는 걸 몰랐던 걸까?
    변조 상태에서 하는 실제 테스트는 의미가 없을 수도 있음. 초기화 용도로 변조 상태가 되면 셸이 열리는 구조일 가능성도 있음
    보기에는 기기를 여는 건 마지막에 시도할 일 같음

    • 먼저 내가 다루는 것이 뭔지 감을 잡아야 한다고 느꼈음. 하드웨어, 어떤 SoC인지, 인터페이스, 플래시 같은 것들 말임
      그렇지 않으면 너무 깜깜한 상태임. 물론 돌이켜보면 그냥 디버그 커넥터에 탭을 대고 끝낼 수도 있었음
      그리고 변조되지 않은 두 번째 기기에서도 셸을 얻었음
  • 이런 기기는 유럽 어디에나 있음. 스위스는 잘 모르겠지만, 내가 아는 유럽 상당 지역에서는 신용카드를 실제로 소유하거나 많이 쓰지 않음
    나는 이를 POS, 즉 판매시점 시스템이라고 부르겠음. 이런 장치는 온갖 종류의 카드를 읽을 수 있음. 어쨌든 좋은 글임

    • 실제로 많이 씀. 지갑 속의 그 많은 카드를 챙기는 게 싫음. 이미 여러 이유로 결제용이 아닌 카드까지 잔뜩 있어서 직불카드 같은 걸 넣을 공간도 없음
      휴대폰이나 스마트워치에 더 많은 걸 넣는 매력도 모르겠음. 기계식 시계를 선호하고, 휴대폰을 잃어버리면 프라이버시 측면에서 이미 충분히 재앙임. 물론 이건 내 경우임