블로그에 쓰려했는데 귀찮아서 걍 씀

2023년 기준으로 쓴거라 패치된 부분도 있음

여기 대단한게 나름 10년동안 채팅앱 개발자 했으면 다른 사람 채팅이 보일수 있다는게 무슨 의미인지 알텐데

절대 안고치더라



개인적으로는 보안 취약점보다는 설계부터가 문제라서

이게 취약점이라고 불러도 되는지 모르겠음



버블은 lysn이라는 커뮤니티 앱에서 시작한 유료서비스로 아티스트로부터 유료메시지를 받고 보낼 수 있는 서비스를 말한다.

실제 lysn은 SM 아티스트를 위한 팬클럽, 오픈채팅등 팬 커뮤니티로 시작했지만 버블이라는 유료서비스의 성공으로 커뮤니티 기능들은 사라진 상태이다.

SM아티스트의 경우 lysn앱을 사용하지만 그 외의 아티스트는 회사마다 나누어진 버블이라는 앱을 사용한다.




타겟은 버블 1.2.2 버전으로 이후 버전은 난독화 같은 보안처리로 분석이 까다로워진것으로 보인다




https 통신을 가로채기 위해서 fiddler라는 web 프록시 소프트웨어를 사용할 것이다. 별도의 certificate pinning이 되어있지 않기 때문에

안드로이드 7.0 이하의 경우 유저 CA를 설치하는 것 만으로 https 통신을 mitm방식을 통해 가로챌 수 있다





Fiddler를 통해 https 통신을 살펴보면, 내용이 제대로 보이지 않는데, 78 9c라는 헤더에서 볼 수 있듯이 단순한 zlib이며, (어떠한 이유에서 자동으로 압축해제가 되어 표시되지 않지만,) 간단하게 압축해제가 가능하다. 일부 api에는 Base64를 사용하며 마찬가지로 처리해주면 된다




현재는 패치된 내용이지만, 유저 정보 조회시 과거 이메일주소가 그대로 노출된 적이 있었는데

대부분의 아티스트는 버블을 위해 새로운 이메일을 가입했을 것이기 때문에,

이메일 주소가 보이는 것이 큰 문제가 될 가능성이 낮지만 불필요하게 정보가 유출된다는 것이 유쾌할 일은 없다.




더군다나 채팅 신청을 위한, api/v1/users라는 api를 통해 임의의 useridx를 요청했을시에도 이메일주소와 같은 각종 정보를 보여줄 뿐 아니라

이전버전의 lysn의 경우 가입시 전화번호를 요구했기 때문에, 일부, 전화번호를 포함한 개인정보도 표출되는 경우도 있었다.

다만, 버블/lysn은 실명, 생년월일, 주소와 같은 개인정보 수집은 최소화 되어 있기 떄문에 정보유출의 파급력이 크지는 않을것으로 예상된다. (참고사항: 해당 내용은 패치된 내용임)



Fiddler를 통해서는 실시간 채팅 데이터를 관찰하기는 어려운데, 그 이유는 실시간 채팅을 위해 mtqq라는 별도의 프로토콜을 사용하기 때문이다.

(다만, 이전 채팅기록은 채팅복구를 통해, 얻을 수는 있다.)



따라서, 이전 채팅기록을 위해 앱에 저장된 db를 살펴볼것이다
talk.db와 user.db는 sqlite이지만, 암호화된것을 알 수 있는데,.




놀랍게도 암호화 방식에 대한 정보는 다음 논문에 설명되어 있으며, 최근까지도 바뀌지 않은것으로 보인다.

이러한 암호화 방식은 liborganization.so라는 libray을 통해 처리되어지는것으로 보이며,

talk.db의 암호는 android_id로부터 유도한 키를 통해, user.db를 복호화하고 얻어낸 useridx로부터 키를 유도하는 방식이다




키를 얻어낸후 db를 열게되면 간단하게 채팅내용을 얻을 수 있다. 실시간 채팅은 mtqq를 통해 이루어진다.


lysn.xml에는 aws s3 acess key(!)를 포함한 로그인시 보내지는 각종정보들이 저장되어 있으며, mtqq의 서버주소는 iot_server_list라는 base64로 된 문자열을 복호화하여 얻을 수 있다.
(참고로 이 정보들은 로그인시 사용자들에게 전달됨)



 

mtqq를 위한 인증서와 키는 lysn.bks라는 파일로부터 추출할 수 있다.

 

무언가 이상한 것을 느껴진다면 정상이다. 왜 인증서와 접속을 위한 키는 모두가 공유할 수 밖에 없는 bks파일에 있을까?

정답은 모두가 같은 인증서와 키를 사용하기 때문이다. 일반적인 mtqq는 iot를 위한 가벼운 프로토콜이지, 보안지향 프로토콜이 아니며, 사용자 인증을 위한 매커니즘이 상당히 부족하다



다시 말하자면, 모든 개인간 채팅, 유료로 서비스되는 아티스트의 채팅은 제3자에 의해 모니터링 될 수 있다.

그리고 이러한 채팅은 암호화 되지 않은채 누구나 볼 수 있게 전달된다




그리고 여기에는 민감한 정보를 포함할 수 있는 각종 사진들도 포함된다


mqtt는 와일드카드를 지원하는것을 생각하면 생각보다 심각한데,

카카오톡을 비롯한 채팅앱이 해당 방식으로 설계되었다면, 모든 사용자간의 채팅을 단일스트림으로 대규모 감청이 가능하며


버블의 경우, 유료 구독 방식이라는걸 생각하면, 채팅 구독자체가 수익모델임에도

이에 대한 보안조치는 이뤄지지 않고 있다




다행인지는 모르겠지만 결국 일반채팅 서비스는 종료되었다

참고로 디어유는 해당 기술을 바탕으로 우리은행에도 채팅앱을 납품한바 있으며,


2015년부터, 2020년까지 해당 기술을 바탕으로 우리은행이 직접 해당 금융앱을 운영했었고

버블은 해당 채팅앱을 바탕으로 개발된것으로 알려져있다




사진 업로드 또한 안전하지 않다. 사진 업로드는 s3 저장소를 사용하며, 사진 업로드는 유저에게 aws acess key와 private key를 준 후 사용자가 업로드하는 방식으로 이루어지며,

s3의 특징과, PUT방식으로 이루어지는 업로드 방식에서 예상할 수 있듯이 동일한 파일이름으로 업로드 되었을시 변조될 가능성이 있다.

다시 말하자면, 아티스트의 사진이 NSFW나 혐오사진 같은 악의적인 사진으로 변조될 수 있다. 


PUT 방식은 파일의 존재여부와 상관없이, 같은 이름이면, 덮어쓰기 때문에, 파일 삭제나, 변조등이 가능해진다





이러한 보안성을 고려하지 않은 설계는 live에서도 보이는데 live를 보기 위해 사용하는 api에는 어떠한 검증이 이루어지지 않는다. 다시 말해 구독하지 않은 아티스트의 라이브 또한 보는 것이 가능할 뿐만 아니라, 라이브되는 영상에는 시청자수, 채팅내용 같은 메타데이터가 포함된다.
이러한 시청자수는 아티스트의 버블 구독자수를 유추하는데 간접적으로 사용될 수 있기 떄문에, 이러한 정보의 유출은 나쁠 수 있다.
 
 





재밌는 사실은 디어유는 2022년 ISMS-P인증을 받았을 뿐 아니라, 현재까지도 연장되고 있다는건데,

ISMS-P 인증 당시에도 존재했던 문제라는걸 볼떄, 헬조선식 보안 인증체계가 실효성이 있는지 의심이 되긴 한다