코드리스 가급적 코드 없는 개발 블로그

포털에서 검색해서 접속하세요: 민방위 교육에서 발견한 보안 취약점

얼마 전 민방위 교육 안내문을 받았습니다. 저는 3년차 이상 대원이라 정해진 장소에 모이는 대신 온라인 교육으로 갈음할 수 있다고 했습니다. 그런데 안내문에 적힌 한 줄이 영 찜찜했습니다.

접속 방법: 포털 사이트에서 〈스마트민방위교육〉 검색

보안 관점에서 위험한 한 줄이었습니다. 과민반응이라고 할 수도 있겠습니다. 하지만, 전국에 민방위 교육 대상자가 얼마나 많을지 생각해 보면 작은 보안 위협도 간과해선 안 됩니다.

안내문은 정확히 어떤 포털 사이트에서 검색하라는 건지 지명하고 있지는 않습니다만, 대개 포털 사이트의 검색 결과 상단에는 광고가 노출됩니다. 광고는 누구나 돈을 내면 살 수 있습니다. 진짜 사이트와 비슷하게 생긴 가짜 사이트를 만들어 <스마트민방위교육>이라는 검색어의 검색 결과 위에 띄우는 게 가능하다는 말입니다. 의심 없이 안내문을 따라 검색한 사람들은 그게 공식 사이트라 믿고 그대로 클릭할 가능성이 높습니다. 안내문이 시키는 대로 했을 뿐인데 해커의 함정에 제발로 들어가게 되는 것입니다.

신뢰의 또 다른 시각적 근거인 도메인도 영 미덥지 않았습니다. 정부 사이트라면 끝이 .go.kr이나 공공기관이 자주 쓰는 .or.kr 정도는 되어야 마음이 놓입니다. 그런데 안내문이 가리키는 사이트의 주소는 그냥 .kr이었습니다. .kr은 일정한 조건만 맞으면 개인도 신청할 수 있는 도메인입니다.

결국 저는 안내문에 적힌 민방위 문의 전화로 직접 전화를 걸어 이 사이트가 정말 정부에서 운영하는 곳이 맞는지를 확인 받았습니다. 담당자 분은 이런 전화를 처음 받아 보셨던 모양입니다. 제 요지가 무엇인지 한참 풀어서 설명해야 했습니다. 그렇게 확인을 받고 들어간 사이트에는 제 이름과 휴대폰 번호를 입력하는 칸이 있었습니다. 만약 누군가가 작정하고 비슷한 도메인을 가진 피싱 사이트를 만들어 광고를 사 두었다면, 그리고 거기에 이름과 휴대폰 번호 뿐 아니라 주민등록번호 등도 요구했다면 어땠을까요? 적지 않은 국민의 개인정보가 그대로 흘러나갔을 수도 있는 상황이었습니다.

.go.kr이 아닌 .kr이었는지 뒤늦게 찾아보니 이유가 있었습니다. 행정안전부의 민방위 사이버교육은 정부가 직접 운영하지 않고, 민간 업체에 위탁해서 운영합니다. 지자체마다 서로 다른 업체와 계약을 맺을 수 있어서, ‘스마트민방위’, ‘디지털민방위’, ‘한국공교육원’ 같은 여러 사이트가 동시에 존재합니다. 제가 안내 받은 〈스마트민방위교육〉은 그중 한 업체가 운영하는 사이트였습니다. 정부가 게을러서 .go.kr을 안 쓴 게 아니라, 애초에 운영 주체가 정부가 아니어서 쓸 수 없는 구조였던 것입니다.

그렇다고 해서 이게 면죄부가 되지는 않습니다. 사용자 입장에서는 그 위탁 구조가 보이지 않습니다. 보이는 건 안내문을 보낸 주체가 〈스마트민방위교육〉이라는, 정부 사이트같이 들리는 이름을 가리키고 있다는 사실 뿐입니다. 사용자가 굳이 위탁 계약 구조까지 따져 가며 ‘이 사이트가 진짜인가’를 검증해야 한다는 건 좀 이상합니다.

이 경험이 특히 씁쓸했던 건, 그동안 정부가 다른 자리에서는 ‘보안’에 무척 엄격한 모습을 보여 왔기 때문입니다. 행정 처리를 하려다 수두룩한 보안 프로그램을 설치해야 했던 경험이 누구에게나 있을 것입니다. 요즘은 나아졌지만 몇 년 전만 하더라도 키보드 보안, 안티 키로거, 백신, 인증서 관리 프로그램 등 잘 알지도 못하겠는 프로그램들을 왕창 설치해야 했습니다.

한쪽에서는 보안의 이름으로 사용자의 컴퓨터에 이것저것을 깔게 하면서, 다른 한쪽에서는 사용자에게 포털에서 검색해서 들어오라고 안내합니다. 가장 기본적인 부분, 그러니까 ‘이 사이트가 진짜 그 사이트가 맞는가’를 확인할 수 있게 해 주는 부분이 빠져 있는 것입니다. 비유하자면 자동차에 잠금장치를 다섯 개 달아 놓고서는, 정작 차 키는 누구나 가져갈 수 있게 길거리에 두는 격입니다.

그렇다면 해결책은 무엇일까요. ‘안내문에 URL을 적어 주면 되는 거 아닌가’ 싶지만, 그 또한 바람직하지 않습니다. 해커가 가짜 링크가 삽입되어 있는 가짜 안내문을 보내면 사용자는 안내문을 따른다고 믿으면서 가짜 사이트에 도착할 수 있습니다. 이른바 스미싱입니다. URL이 적혀 있다는 사실은 사용자가 그 URL을 별다른 의심 없이 누르도록 유도하지만, 정작 사용자가 보고 있는 URL이 진짜 정부가 보낸 안내문에 적힌 URL인지 확인할 방법은 별로 없습니다. 아마 애초에 안내문에 URL이 오지 않고 포털 사이트에 검색하라고 안내한 것도 이런 이유에서였을 것입니다.

그래서 더 나은 방법은, 정부 서비스가 모이는 잘 알려진 진입점 한 군데만 안내하는 것입니다. 예를 들어 정부24(plus.gov.kr) 같은 곳을 출발점으로 정해 두고, ‘정부24에 접속해서 〈스마트민방위교육〉을 찾으세요’라고 안내하는 식입니다. 사용자가 의심 없이 외울 수 있을 만큼 단순한 진입점이 하나 있고, 거기서부터 내부 링크를 따라 위탁 사이트로 이어지는 구조라면, 사용자는 매번 새로운 도메인을 신뢰해도 되는지 고민할 필요가 없습니다. 어렵고 비싼 기술이 필요한 일도 아닙니다. 안내의 첫 발자국을 어디로 잡을지 한 번 정해 두면 되는 일입니다.

개발자로서 일을 하다 보면 비슷한 풍경을 자주 봅니다. 우리는 어떤 데이터를 어떻게 안전하게 전송할 것인가, 무엇으로 암호화할 것인가, 어떤 인증 방식을 쓸 것인가에 대해서는 깊이 고민합니다. 라이브러리를 비교해 보고 알고리즘을 따져 봅니다. 그런데 정작 사용자가 진짜 우리 서비스에 도착했는지, 그 첫 발자국에 대해서는 의외로 신경을 덜 쓸 때가 있습니다. 정작 그 모든 자물쇠를 무력화시킬 수 있는 건 가짜 사이트로 사용자를 데려가는 단 한 줄의 잘못된 안내인데도요.

게다가 모바일 환경이 일반화되면서 사용자는 점점 URL을 들여다보지 않게 되었습니다. 앱 안에서 띄워지는 인앱 브라우저에는 주소창이 잘 보이지 않거나 아예 없는 경우가 흔합니다. 사용자가 도메인을 확인할 수 있게끔 환경이 받쳐 주지 않는데 안내문조차 검색어만 툭 알려 준다면 사용자는 길을 잃기 쉽습니다.

비싸고 복잡한 보안 솔루션 이전에 잘 쓰여진 안내문 한 줄로 많은 걸 지켜낼 수 있습니다.