True Delete

LINE에서 애플리케이션 보안을 담당하고 있는 안상환입니다. 이번 포스팅에서는 스마트폰을 잃어버리는 경우에 사용자가 삭제한 대화 기록이 어떻게 유출될 수 있는지, 그리고 이를 보호하기 위한 LINE의 새로운 기능인 ‘True Delete’에 대하여 이야기하고자 합니다.

많은 사람들은 스마트폰을 분실하거나, 때로는 다른 사람이 접근할 수 있는 환경에 스마트폰을 방치하곤 합니다. 만일 다른 사람이 나의 스마트폰을 습득할 경우, 스마트폰에 저장된 데이터에 접근해서 유출하는 것이 가능하기 때문에 상당히 심각한 문제가 발생할 수 있습니다. 스마트폰에는 통화기록, 메시지, 연락처, 캘린더, 인터넷 검색 기록, 이동경로, 사진, 메모 등 많은 개인정보가 저장되어 있기 때문에 개인의 사생활이 유출되는 문제가 발생할 수 있고, 회사 업무상 기밀 자료가 외부로 유출되는 문제도 발생할 수 있습니다. 심지어 이러한 정보를 얻기 위해서 고의로 스마트폰을 훔치는 경우도 있습니다. 편리한 생활 도구인 스마트폰이 관리 부주의나 순간적인 방심으로 인해, 개인의 프라이버시를 침해할 수 있는 위험한 도구가 될 수도 있습니다.

LINE에서는 이러한 위험으로부터 사용자 프라이버시를 보호하기 위해 비밀번호 잠금, 데이터 암호화, 타이머챗과 같은 기능을 추가하는 등 다양한 노력을 하고 있습니다. 하지만 몇 가지 문제때문에 일부 위험은 여전히 존재하고 있습니다. ‘삭제’라는 보편적인 프로그램 기법의 한계때문에 삭제된 데이터를 복구할 수 있는 것도 한 가지 문제입니다. 이번 블로그에서는 일반적인 삭제 방식의 문제점과 이를 보완하기 위해 LINE에서 개발한 ‘True Delete’ 기능을 소개하고자 합니다.

대화 삭제의 한계

다른 사람들과 대화를 하기 위해 LINE과 같은 메신저를 매일 사용하는 사람들이 늘어나고 있습니다. 일상적으로 친구들과 주고 받는 대화들이 대부분이지만 간혹 가족에게 신용카드 정보와 비밀번호를 보내는 경우도 있고, 친구에게 자신의 집 주소를 알려주는 경우도 있습니다. 혹시라도 스마트폰을 잃어버릴 경우를 대비하여 그런 민감한 대화를 일일이 삭제하는 사람도 있을 겁니다. 그렇게 대화를 삭제하면 자신의 스마트폰에서는 깨끗이 지워졌을 거라고 생각하면서 말입니다.

자신의 스마트폰을 잘 소지하고 있는 경우라면 문제가 없겠지만 휘트니스 센터나 외부 화장실 등에서 자신의 스마트폰을 분실했거나 도난 당하는 경우를 생각하면 문제가 달라집니다. 정말 영화 같은 일들이 생길 수도 있습니다. 분명히 민감한 대화들을 삭제했다고 믿고 있었지만 누군가가 삭제된 대화 내용을 볼 수도 있고 나의 카드를 몰래 사용한다거나 나의 비밀들을 인터넷에 올린다고 생각하면 정말 소름끼치는 일이 아닐 수 없습니다.

애플리케이션에서 사용하는 일반적인 삭제방식으로 삭제한 데이터는 충분히 복구할 수 있기 때문에, 이런 일들이 현실에서 일어날 수도 있습니다. 그 예로 작년, Avast에서는 Ebay에서 구매한 중고 스마트폰 20대에서 삭제된 데이터들을 복구하는데 성공했는데, 복구한 4만 장의 사진 중에서 750장 이상의 누드 사진이 포함되어 있었다는 연구 결과를 본다면, 이런 일들이 다소 과장된 이야기만은 아닙니다.

삭제된 데이터가 어떻게 복구되는지 대화 삭제의 한계에 대해서 좀 더 자세하게 살펴보겠습니다. 여러분이 사용하는 컴퓨터나 스마트폰의 대부분의 삭제 기능은 성능 문제와 구현의 편리함때문에 실제로는 데이터를 지우지 않고 삭제된 것처럼만 표시하고, 해당 영역을 추후에 다시 사용할 수 있는 공간으로 인식하도록 변경합니다. 따라서 새로운 데이터가 덮어 쓰이기 전에는 이전의 데이터가 그대로 남아 있게 됩니다. 이와 같은 방식때문에 삭제된 데이터라 하더라도 새로운 데이터로 덮어 쓰기 전까지는 복구가 가능하게 됩니다.

일반적인 삭제 구조

일반적인 삭제 방식의 구조는 아래 그림과 같습니다. 실제 데이터가 저장되는 파일시스템에서 데이터의 앞 부분에는 데이터의 속성정보(Meta Data)가 정의되어 있는데, 데이터가 삭제될 경우에 속성정보(Meta Data)가 ‘할당된 데이터(Allocated Data)’에서 ‘비할당된 데이터(Unallocated Data)’로 상태가 변경되고, 실제 데이터는 그대로 남아있게 됩니다. 비할당된 데이터(Unallocated data) 영역이 새로운 데이터로 덮어 쓰여지기 전까지는 복구가 가능한 상태로 남아있게 됩니다.

안드로이드와 아이폰의 운영체제에서는 메시지, 통화기록 등 다양한 종류의 데이터들을 모두 SQLite라는 데이터베이스에 저장합니다. 데이터베이스에서도 위와 같은 방식으로 데이터(Record)를 삭제하게 되는데, 결론적으로 삭제된 데이터(Record)는 복구가 가능한 상태로 남아있게 됩니다. 데이터베이스에서 삭제된 데이터(Record)는 데이터베이스 내부에 데이터 조각이 남기 때문에, 오히려 삭제된 파일보다 더 쉽게 복구할 수 있습니다. SQLite 데이터베이스 자체가 삭제되지 않는 한 삭제된 레코드는 새로운 레코드로 덮어쓰기 전까지는 비할당영역(Unallocated space)에 남아 있습니다.

삭제되지 않은 데이터의 데이터베이스 구조

삭제되지 않은 데이터의 경우 데이터베이스 내에 아래와 같은 구조로 존재합니다. 데이터베이스에서 데이터가 활성 상태일 경우 Cell이라고 표현하는데, 활성 상태의 Cell은 아래 그림과 같은 구조를 가지고 있습니다.

일반적인 Cell

크게 Cell Header와 Data Header, Data Area로 구분되며, Cell Header 내 Record Size와 RowID는 가변길이 정수로 이루어져 있습니다. Data Header에는 Data Area의 데이터가 어떤 Type인지 명시되어 있으며, Data Area에는 실제 데이터가 저장되어 있습니다. 사용자 메시지는 LINE 앱 내 데이터베이스에 아래와 같이 저장됩니다.

위의 데이터베이스의 바이너리를 분석해 보면, Cell Header와 Data Header, Data Area를 확인할 수 있습니다. 현재는 삭제되지 않은 상태이기 때문에 할당된(Allocated) 상태를 의미하는 Cell Header와 실제 데이터를 확인할 수 있습니다.

삭제된 데이터의 데이터베이스 구조

데이터베이스 내 데이터(Record)를 일반적인 방법으로 삭제할 경우는 아래 그림과 같이 실제 데이터는 그대로 남아있되 Cell Header 부분만 변경됩니다. 삭제된 데이터의 경우 Cell Header는 비할당(Unallocated)된 상태를 나타냅니다. 이후 새로운 데이터(Record)를 저장할 때는 비할당(Unallocated)된 영역들을 확인하고 적당한 크기를 가진 비할당(Unallocated)영역에 새로운 데이터(Record)가 덮어씌워지게 됩니다.

삭제된 Cell

사용자 메시지 ‘hi’, ‘h e l l o(UTF-8)’, ‘h i(UTF-8)’를 삭제한 다음, SQLite Browser를 통해 데이터베이스를 확인하면 ‘hi’, ‘h e l l o(UTF-8)’, ‘h i(UTF-8)’ 데이터는 삭제된 것으로 보입니다.

하지만 데이터베이스의 바이너리를 확인해 보면, Cell Header만 비할당(Unallocated)된 상태로 변경되고 실제 데이터는 그대로 남아 있는 것을 확인할 수 있습니다.

이러한 원리로 삭제된 데이터(Record) 복구가 가능하며, 자동화 프로그램을 작성하여 삭제된 데이터를 추출할 수 있습니다.

데이터 완전 삭제

지금까지 살펴본 일반적인 데이터 삭제 방식으로는 새로운 데이터로 덮어쓰기 전까지의 대부분의 데이터는 복구가 가능합니다. 이러한 데이터 복구가 불가능하게 만드는 방법을 ‘완전 삭제’라고 합니다. 완전 삭제 방법으로는 아래와 같은 방법이 있습니다.

데이터 덮어쓰기(Overwriting)

삭제하고자 하는 데이터에 zero byte 혹은 random byte로 덮어 씁니다. 덮어씌워진 데이터는 복구하기가 매우 어렵습니다.

암호화(Encryption)

안전한 암호화 방식을 사용하여 디스크 혹은 파일을 암호화함으로써 데이터가 복구, 유출되더라도 내용을 알아볼 수 없게 만듭니다.

디가우징(Degaussing)

HDD(Hard Disk Drive)는 자성 물질을 이용하여 데이터를 기록하는데, 강한 자기장에 노출시켜 디스크 표면의 자력 흐름을 완전히 파괴함으로써 데이터를 사용할 수 없도록 삭제합니다. 원자현미경으로 디스크 표면의 형상을 확인할 수 있는데, 아래 그림과 깉이 디가우징 후 디스크 표면의 데이터 형상들이 파괴되는 것을 확인할 수 있습니다.

물리적 파괴, 천공, 파쇄(Physical Destruction)

물리적으로 디스크에 구멍을 내거나 파쇄함으로써 디스크를 완전히 파괴합니다. 보통 디가우징 후 디스크를 완전히 파기하기 위해 사용합니다.

안전한 대화 삭제 ‘True Delete’

LINE 5.3.0 버전부터는 앞서 설명드린 방식으로는 데이터 복구가 불가능하도록 ‘True Delete’라는 기능을 적용하였습니다. 사용자의 프라이버시는 항상 보호되어야 하기 때문에 ‘True Delete’ 기능은 별도 설정없이 사용할 수 있습니다.
일반적인 삭제는 데이터의 속성 정보(Meta Data)만 변경될 뿐 실제 데이터는 남아 있습니다. 이러한 데이터 삭제 방식은 복구가 가능하기 때문에 삭제하고자 하는 데이터를 zero byte로 덮어쓰고 난 후 삭제하여 복구가 불가능하게 만듭니다1. LINE 5.3.0 버전부터는 개별 대화 메시지의 선택 삭제, 해당 대화방 전체 삭제 등 모든 대화 삭제 기능에 대해 복구가 불가능하도록 기능이 개선되었습니다. 임의의 삭제가 아닌 복구가 불가능한 ‘삭제’ 기능을 제대로 구현한 것입니다.

1: ‘True Delete’는 SQLite와 호환이 되도록 구현되었습니다. 따라서, 삭제 직후 아주 짧은 시간 동안은 이전 데이터가 남아 있을 수 있는 한계가 있지만 정상적인 사용 환경에서는 안전하게 삭제된다고 생각하셔도 좋습니다.

마치며

LINE에서는 사용자 프라이버시 보호를 위해 비밀번호 잠금, 타이머챗, 다음에 연재할 Letter Sealing과 같은 다양한 Privacy Mode 개발에 노력하고 있습니다. LINE 5.3.0 버전부터는 한층 더 향상된 암호화 방식인 E2EE(end-to-end encryption)로서, ‘Letter Sealing’ 기능을 사용할 수 있습니다. 다음 포스팅에서는 ‘Letter Sealing’ 대해 자세하게 소개해드릴 예정입니다.

앞으로도 사용자들이 안심하고 LINE을 즐길 수 있도록 보안과 프라이버시 향상에 더욱 노력하겠습니다.

Related Post