어젠가 풀리비님의 글을 보다가 관련 내용을 보게 되었다. 그 내용을 처음 보았을 때만 해도 "그냥 뉴스에 나왔나 보다"라고 생각을 했다. 왜냐면 그만큼 해묵은 방법이었기 때문이다. 그런데 예상외로 여기저기서 이슈가 되고 있는 모습이 눈에 띈다. "그 방법이 통하기 때문에 그런게 아닐까?"란 생각을 조심스럽게 해본다.
메모리 해킹이란 방법은 십 수년 아니 컴퓨터가 생기던 시절부터 있었던 메카니즘이다. 고전적인 수법인만큼 그 방법도 여러 수천 가지에 이른다(실제적으로 여러 수천 가지는 아니다). 따라서 기존에 나와있는 방법에 대해서 대응력을 가지는 것은 가능하겠지만 전혀 새로운 형태로 다른 프로세스의 메모리에 접근하는 것을 원칙적으로 차단하는 것은 매우 힘든 일이다.
그렇다면 메모리 해킹을 막을 방법은 없을까? 물론 방법이 없는 것은 아니다. 과거 컴퓨터의 역사와 같이한 방법인 만큼 그것을 막는 방법도 다양하게 연구되었다. 그 중 최종 결론은 데이터가 메모리에 존재하는 구간을 최소화 시켜야 한다는 것이었다. 궁극적으로 데이터가 메모리에 존재하는 시간이 0이 되면 메모리 해킹은 무용지물이 된다. 메모리에 데이터가 없다면 조작할 것이 없는 것이고, 결국은 메모리 해킹은 무위로 돌아갈 수 밖에 없기 때문이다. 이를 인터넷 뱅킹에 적용해서 생각해 보면 다음과 같이 된다.
인터넷 뱅킹을 하기 위해서 사용자가 입력해야 하는 아주 중요한 자료는 두 가지다. 이체 대상 계좌번호와 이체 금액이다. 이 둘은 사용자가 직접 입력하고 화면에 표시된다. 화면에 표시된다는 말은 이미 메모리 상에 존재한다는 말이다. 그래서 지금 메모리 해킹이 문제가 되고 있다. 이 두 데이터가 메모리 상에 존재하지 않는다면 안전하다는 것은 앞서 설명했다. 이 둘을 표시하지 않고 인터넷 뱅킹을 할 수 있을까? 물론 없다. 사용자가 실수로 잘못된 정보를 입력할 수 있기 때문에 보여주는 과정은 절대적으로 필요하다. 그렇다면 인터넷 뱅킹의 메모리 해킹을 막는것은 불가능 한가? 그것도 아니다.
과거 MMORPG 게임에 처음 메모리 해킹이 적용됐을때 그 파급효과는 정말 컸다. 거의 모든 데이터가 클라이언트에 저장되었기 때문에 고치기만 하면 적용되는 그런 세상이었다. 하지만 지금은 많이 달라졌다. 메모리 해킹 툴을 사용해서 클라이언트를 조작해도 데이터가 변경되진 않는다. 어떻게 그렇게 됐을까? 원리는 간단하다. 클라이언트에서 표시되는 데이터는 단지 보여지는 역할만 하기 때문이다. 모든 데이터 생성은 서버에서 이루어지는 것이다. 주사위를 굴린 값도 서버에서 생성되어 클라이언트로 전송된다. 그래서 요즘의 MMORPG 게임은 메모리 해킹 보다는 봇을 막는것이 좀 더 중심이 되고 있다.
다시 인터넷 뱅킹으로 돌아가보자. 우리는 클라이언트에 데이터가 저장될 수 밖에 없다면 단지 보여주는 기능만을 하도록 그것을 제한하면 메모리 해킹에 효율적으로 대응할 수 있다는 것을 게임에서 배웠다. 어떠한 방법을 통해서 이것을 인터넷 뱅킹에 적용할 수 있을까? 가장 기본적인 원리는 모든 것을 서버가 결정한다는데 있다. 다음과 같은 예를 한번 생각해보자.
사용자가 로그인을 한다. 이제 계좌번호를 입력할 순간이 되면 서버에서 그림을 열 조각 보내 준다. 이 그림은 0부터 9까지에 대응하는 그림이다. 하지만 각 그림에는 고유 키번호가 맵핑되어 있다. 즉 소프트웨어적으로 0번 그림이 0이라는 것을 알아낼 방법은 없다. 사람이 0을보고 누르면 그에 대응하는 키 값이 들어가는 것이다. 사용자가 1,2,3,4를 눌렀고 서버로 c,d,e,x가 전송되었다고 해보자. 서버는 받은 데이터를 자신이 보내준 그림 데이터에 근거해서 원복한다. 그럼 1,2,3,4가 나온다. 그럼 서버에서 그걸 다시 클라이언트로 전송한다. 화면에는 사용자가 입력한 계좌 번호가 나올 것이다. 메모리 해킹을 하는 프로그램이 그것을 조작해본들 그건 단지 뷰일 뿐이다. 서버로 전송되는 값이 아니란 의미다.
물론 이 경우에도 서버에서 발생시킨 그림 조각을 해킹 프로그램이 알아낸다면 해킹을 할 수가 있다. 하지만 이는 자동화하기가 매우 난해하다. 해커라면 리버싱을 통해서 그림과 의미를 매칭시킬 수 있지만 프로그램은 그것을 하기가 무척 어렵다. 결론적으로 0번 그림을 보고 그것이 0이라는 것을 인식하는 문제로 귀결되는데 이는 아직까지는 불가능하기 때문이다. 또한 그 이미지 자체도 동적으로 바뀐다면 더욱 프로그램으로 인식하기 어려워진다.
이때까지 말한 이 솔루션은 사실 새로운 방식도 아니고 몇 해 전에나 제안되던 구식 방법이다. 이 방식이 적용되지 않았던 이유는 단 한가지였다. 사용성이 떨어진다는 점이었다. 유저 입장에서도 골치아프고, 적용하는 업체 입장에서도 고칠 곳이 많아진다. 결과론적으로 비용이 올라간다는 것이었다. 맞는 말이긴 하다. ㅎㅎ
바이러스가 나오면 백신 업체가 돈을 벌고, 해킹 소식이 나오면 보안 업체가 돈을 버는 것은 초등학생도 알 만한 일이다. 이미 솔루션을 구축하고 이 뉴스가 일파만파 퍼지기를 기다리고 있는 보안업체가 있을지도 모른다. 물론 그들이 잘못한건 없다. 이슈가 되지 않으면 적용하지 않는 세태가 더 잘못된게 아닐까?
기사 말미에 나오는 휴대폰 인증도 좋은 방법이다. 그런데 휴대폰 방법을 적용하려면 이런 말을 하는 사람들이 꼭 있다. "그럼 휴대폰없는 사람은 인터넷 뱅킹도 하지 말라는 말이냐?" 그래서 집전화까지 지원하게 된다. ㅋㅋ