들어가며
안녕하세요. Auth & Account Dev 팀의 김은찬, 김종민, 권기범, 정의엽, 허원영입니다. Auth & Account Dev 팀은 LY Corporation 그룹 서비스의 계정 및 인증과 관련된 백엔드 개발을 담 당하고 있습니다.
이번 포스팅에서는 앞서 Security R&D 팀에서 소개한 기기와 앱의 무결성 보장부터 서비스 요청 보호까지: LINE의 기기 증명 서비스 - 1편에 이어 기기 증명(device attestation)을 저희 회사의 서비스에 적용한 경험과 앞으로의 개발 방향을 소개하고자 합니다.
기기 증명 서비스 개발 과정
Auth & Account Dev 팀과 Security R&D 팀은 사용자가 더 안전하게 저희 회사의 서비스를 이용할 수 있도록 지속해서 협업해 왔습니다. 그 결과 LINE 앱에 패스워드 없이 LINE 앱에 로그인할 수 있는 기능이 도입됐으며(참고: FIDO at LINE: 패스워드 없는 세상으로의 첫 발걸음), 이번 글에서 소개할 기기 증명 서비스 역시 Security R&D 팀과의 긴밀한 협업을 통해 도입됐습니다.
기기 증명 서비스는 저희 회사의 서비스를 계정 탈취나 스패밍(spamming), 피싱(phishing), 사기 등을 목적으로 악용하는 사례가 증가하면서 이러한 서비스 남용을 방지할 수 있는 수단을 마련하고자 개발됐습니다. Security R&D 팀에서 기기 증명의 설계를 진행해 PoC(proof of concept) 구현을 완료했고, Auth & Account Dev 팀에서 그 PoC 구현체를 공유 받아 실제 서비스에 적용하기 위한 백엔드를 구현했는데요. 패스워드 없는 인증의 표준인 FIDO2 WebAuthn 객체를 사용하도록 설계된 덕분에 원활하게 구현을 완료할 수 있었습니다.
기기 증명 기능은 2023년 12월부터 LINE Android와 iOS 앱에 적 용되기 시작했습니다. 안정적으로 기능을 적용하기 위해 국가별로 점진적으로 배포해서 2024년 5월에 LINE 앱을 서비스하고 있는 모든 국가를 대상으로 배포 완료했으며, 그 결과 Android와 iOS, 두 플랫폼의 차이에 따른 기기 증명 결과를 관찰할 수 있었습니다. 그 관찰 결과를 공유하겠습니다.
기기 증명 적용 - LINE Android 앱
Android 플랫폼에서 기기 증명 기능을 원활히 구현하기 위해서는 신뢰 실행 환경(trusted execution environment)과 특정 버전 이상의 Android 운영 체제가 필수인데요. Samsung, Xiaomi, vivo, OPPO 등 다양한 제조사에서 출시한 기기들은 모델별로 탑재된 하드웨어 구성 요소와 지원하는 Android 버전이 상이합니다. 이 때문에 동일 제조사 내에서도 기기 증명 기능을 지원하는 모델과 그렇지 않은 모델이 공존합니다.
기기 증명 기능 배포 후 LINE Android 앱에서 크게 다섯 가지의 실패 원인을 확인할 수 있었으며, 이를 발생 빈도순으로 나열하면 다음과 같습니다.
- 인증서 체인 검증에 실패한 경우: 증명 객체(attestation object) 내의 x.509 인증서 체인의 검증이 실패한 경우
attestationSecurityLevel
값이Software
로 설정된 경우: 보안 수준이 낮은 기기(하드웨어 기반의 키 저장소 제공되지 않음) 또는 에뮬레이터에서 실행되고 있는 경우- LINE 앱이 변조된 경우: LINE 앱이 변조돼 패키지 이름과 서명이 공식 LINE 앱과 다른 경우
- 기기가 루팅된 경우: 기기를 루팅해 x.509 인증서 확장의 신뢰 루트(root of trust)가 정상이 아닌 경우
- 취소된 인증서가 사용된 경우: 인증서 체인에 포함된 인증서를 개인 키 유출 등의 이유로 Google이 취소한 경우(참고: 인증서 취소 상태 목록)
각 경우를 하나씩 자세히 살펴보겠습니다.
인증서 체인 검증에 실패한 경우
증명 객체 내의 x.509 인증서 체인을 검증할 때에는 각 인증서의 서명뿐 아니라 인증서 확장에 기록된 여러 정보도 함께 확인합니다. 따라서 인증서 서명이 올바르다고 하더라도 일부 정보가 잘못돼 있다면 검증에 실패합니다.
인증서 체인 검증에 실패하는 경우는 어뷰징으로 추정되는 경우와 정상 사용자로 추정되는 경우로 나눌 수 있으며, 각 경우에서 체인 검증에 실패하는 사례는 다음과 같습니다.
- 어뷰징으로 추정되는 경우
- 인증서 서명 검증에 실패하는 경우: 인증서 체인에 포함된 인증서들의 서명이 올바르지 않은 경우
- 루트 인증서를 신뢰할 수 없는 경우: 루트 인증서가 Google이 발행하지 않은 인증서인 경우
- 정상 사용자로 추정되는 경우
- keyCertSign 비트 혹은 CA 비트가 1로 설정되지 않은 경우(참고: RFC 5280 - Basic Constraints)
- 인증서 유효 기간이 과거로 설정된 경우
- RFC 5280에 따르면 두 자리 숫자 'YY'로 표현된 연도가 50보다 크거나 같을 경우 19YY로 해석되기 때문에 인증서 발급자가 2069년을 의도해서 '69'를 입력했다고 하더라도 1969년으로 해석돼 인증서 검증에 실패
- 인증서 유효기간이 단순히 '0'으로 설정된 경우 1970년 1월 1일로 해석돼 인증서 검증에 실패
- 인증서 의
Issuer
가 잘못된 경우- 인증서의
Issuer
값은 자신을 서명한 상위 인증서의Subject
값과 일치해야 하는데 일부 인증서에서는Issuer
값이 상위 인증서Subject
값의 일부만 포함하고 있는 것으로 확인
- 인증서의
별도 검증 기준의 필요성
저희 팀과 Security R&D 팀에서 인증서 체인 검증에 실패하는 데이터를 검토한 결과 인증서 서명 검증 실패와 루트 인증서를 신뢰할 수 없는 경우를 제외하고는 대부분 정상 사용자로 추정됐습니다. 기기 증명의 거짓 음성을 줄이기 위해서는 정상적인 기기를 사용하는데도 증명에 실패하는 경우를 줄이는 것이 중요하므로, 정상 사용자로 추정되는 경우에는 별도 기준을 적용하기로 결정했습니다.
새로운 검증 기준을 적용하기 위해 Security R&D 팀에서는 Java의 CertPathValidator를 기반으로 별도 구현체를 만들었으며, 저희 팀에서는 정상 사용자로 추정되는데 기기 검증에 실패하는 모델들을 수집해 별도 기준을 적용해도 괜찮을지 검토했습니다. 확인된 기기 모델에는 별도 기준을, 그 외 기기 모델에는 기존 기준을 적용해 인증서 체인을 검증했고, 이를 통해 인증서 체인 검증에 실패하는 Android 기기 수를 10분의 1로 줄일 수 있었습니다.
AttestationSecurityLevel 값이 Software로 설정된 경우
이 경우와 관련해서는 1편의 잠재적으로 신뢰할 수 없는 실행 환경 탐지에 자세히 설명돼 있으니 이쪽을 참고해 주시기 바랍니다.
LINE 앱이 변조된 경우
Android의 경우 APK 파일을 디컴파일해 앱의 기능을 변경한 후 다시 컴파일할 수 있습니다. 이와 같은 방법으로 LINE 앱이 변조된 경우 AttestationApplicationId를 검증해 앱의 위변조 유무를 확인할 수 있습니다. 기기 증명을 통해 실제 서비스에서 확인한 LINE 앱 변조 케이스는 크게 두 가지였습니다.
듀얼 앱을 이용해 한 기기에 같은 앱을 여러 개 설치
Google Play에서 'Dual 앱'으로 검색하면 한 기기에 같은 앱을 여러 개 설치할 수 있게 해주는 기능의 앱들이 많이 나타납니다. 이런 앱들이 사용하는 방법 중 하나가 APK 파일의 패키지 이름을 변경해 다시 컴파일하는 것입니다. 실제로 LINE 앱의 기기 증명 기능을 통해 들어오는 데이터를 분석한 결과 10개 이상의 듀얼 앱들이 시중에서 사용되고 있는 것을 확인할 수 있었습니다.
LINE 앱을 변조해 악의적으로 이용
듀얼 앱을 통해 단순히 LINE 앱을 여러 개 설치하는 것을 넘어 LINE 앱의 작동 자체를 변경하려는 시도가 여기에 해당합니다. 악의적인 목적을 가진 사용자가 본인이 수정한 LINE 앱을 범죄 행위에 사용할 수 있기 때문에 가장 주의해야 할 유형이라고 볼 수 있는데요. 변조된 앱은 다음과 같은 위험을 초래할 수 있습니다.
- 개인 정보 유출
- 변조된 앱은 사용자의 민감한 개인 정보를 무단으로 수집하고 전송할 수 있으며, 이렇게 수집된 개인 정보는 또 다른 범죄에 이용될 수 있습니다.
- 서비스 방해
- 변조된 앱은 LINE 앱 서비스의 정상적인 작동을 방해할 수 있으며, 이는 서버 과부하나 서비스 품질 저하 등의 문제를 일으킬 수 있습니다. 이는 다른 사용자에게 불편을 초래하며, LINE 앱 서비스의 신뢰를 훼손할 수 있습니다.
변조된 앱을 사용하는 것은 LINE 앱의 서비스 약관을 위반하는 행위로 서비스 이용이 제한될 수 있으며, 특히 변조된 앱을 사용해 금융 사기, 신원 도용, 데이터 유출 등의 범죄 행위를 저지르는 경우 무거운 형사 처분을 받을 수 있습니다. 변조된 앱 사용을 방지하기 위해 꼭 Google Play나 Apple App Store와 같은 공식 경로를 통해서 LINE 앱을 설치하시기 바랍니다.
기기가 루팅된 경우
Android에서는 여러 루팅 프레임워크를 사용해 루트 권한을 획득할 수 있습니다. 루트 권한을 이용하면 앱들의 특정 메서드 호출을 가로챈 후 원하는 코드를 실행해 앱을 변조하지 않고도 원하는 작동을 실행할 수 있는데요. 1편의 잠재적으로 신뢰할 수 없는 실행 환경 탐지에서 설명한 아래 항목에 해당합니다.
deviceLocked
값이False
로 설정된 경우verifiedBootState
값이Verified
로 설정되지 않은 경우