[소고] Collision Hell…

@codemaru · November 25, 2011 · 10 min read

프로그래머로 밥 벌어 먹고 살면서 제일 싫어하는 단어가 생겼다. ‘크래시’, 밥 먹다가도 이 말만 들으면 먹던 내용물이 올라오는 느낌이 든다. 그만큼 듣기 싫은 말이고 짜증나는 말이며, 피하고 싶은 대상이다. 보안이라는 전문 분야를 정하고 나서는 싫어하는 단어가 하나 더 생겼는데 바로 ‘충돌’이다. 좋은 보안 프로그램을 만든다는 것은 달리 말하면 얼마나 많은 충돌을 피했는가로 귀결된다고 할 수 있다. 많은 보안 업체에서 자사 제품의 장점으로 내세우는 게 바로 다름아닌 충돌이 얼마나 없는가라는 사실도 이를 반증해 준다고 할 수 있겠다. 진짜 우습지 않은가? 보안 제품의 성능을 첫 번째 장점으로 말하는 것이 아니라 충돌이 없다는 것을 장점으로 말한다는 것이, 그런데 더 웃긴 건 고객들이 그걸 더 우선시한다는 점이다. 그만큼 실전에서 충돌은 아주 굉장히 중요한 요소다.

5년간 게임 보안 제품을 만들면서 정말 온갖 충돌이란 충돌은 다 겪어 봤다고 생각했다. 유사 게임 보안 제품과의 충돌은 기본 안주고, 각종 타사 보안 제품들과의 충돌들이 있었다. 심지어는 게임 핵툴과의 충돌도 있었다. 커널 모드 게임 핵툴이 있었는데 그놈이 어설프게 작성하는 바람에 게임을 실행한 다음 그 핵툴을 실행하고, 그 상태에서 게임을 종료하면 블루스크린이 발생하는 문제가 있었다. 우습게도 우리는 충돌이 없다는 장점을 부각시키기 위해서 그 핵툴을 위해서 전체 훅 코드를 죄다 변경했다. 물론 지금 생각해보면 굉장한 오버 센스인데, 그 때는 그래야 하는 줄 알았다. 대단한 작업이었다. 훅코드를 죄다 변경했더니 이번에는 중국 방화벽 제품과 충돌이 발생했다. 그래서 해당 방화벽 제품을 위한 특수한 코드를 추가했다. 이런 식이다. 이 곳에는 신호등도 없고, 교통 법규도 없다. 그냥 무법 천지 세상에서 온갖 충돌을 피해야 한다. 그래서 이 세상에서는 경험이 닥치고 갑이며, 충돌을 피한다는 아무것도 아닌 사실이 우리의 가장 든든한 진입 장벽이 되어준다. 참 우스운 사실이다.

이렇게 온갖 충돌을 겪었고, 그 온갖 충돌을 피하는 코드를 추가하다 보니 나름 이 바닥에서는 산전수전 다 겪었다고 생각을 했었다. 그랬는데. 오늘 진짜 핵폭탄 같은 충돌을 목격하고 말았다. 우리가 만드는 제품은 다름아닌 게임 보안 제품이다. 게임 프로그램이 동작하는 동안 부정 행위를 막아주는 그런 제품이다. 그런데 이런 게임 보안 제품이 게임 그 자체와 충돌이 발생하는 것이 아닌가? 좀 더 정확하게 말하자면 게임에 포함된 자체 보안 코드와 충돌이 발생하는 것이었다. 핡~ 게임 내 보안 코드가 게임 보안 제품을 잡는 우스운 상황. 정말 보고 어처구니가 없었다. 이렇게 말하고 보니 그 게임이 아주 큰 잘못을 한 것 같은데 사실은 전혀 그렇지 않다. 요즘은 워낙 해킹 이슈가 부각되다 보니 큰 게임 업체에서는 다들 자체 보안팀을 가지고 있고, 해당 보안팀에서도 게임의 보안을 향상 시키기 위한 모듈을 개발하기도 한다. 매우 바람직한 현상이며, 외부 보안 업체에게도 큰 힘이 되어준다. 왜냐하면 외부 보안 제품의 경우 게임과의 결합도가 일정 수준 이상으로 높아지기 힘들다는 단점이 있고 게임 개발팀과의 이야기를 하는데 한계가 있을 수 밖에 없는데 내부 보안팀은 그런 것들이 가능하기 때문이다. 어쨌든 해당 보안 코드는 자신의 의무를 다했다. 단지 우리는 다른 필요한 기능을 수행하기 위해서 그 코드의 사각 지대를 찾아야 할 뿐이다.

여기까지만 딱 읽으면 우리가 항상 충돌을 당하는 입장처럼 보인다. 하지만 사실은 우리가 더 많은 충돌을 야기시키는 주범이기도 하다. 그런 불이익을 당하는 대부분의 프로그램은 게임 유틸리티다. 그런 유틸리티 중에 유명한 프로그램으로 반디캠이 있다. 게임 동영상을 촬영하는 유틸리티인데, 나도 한 때 와우 동영상을 찍기 위해서 애용하던 제품이었다. 프랩스보다 훨씬 강력한 유틸리티다. 그런 반디캠도 게임 보안 제품과 충돌이 잦은 편이다. 물론 우리 제품과도 다소 충돌이 있었다. 그래서 허용 처리를 해주었다. 이런 허용 처리를 하다 보면 반디캠의 신묘한 후킹 코드에 놀라곤 한다. 왜 당췌 이런 정상적인 유틸리티가 이리도 복잡한 방식으로 후킹을 하는 것일까, 라는 생각이 들었던 적이 한두 번이 아니었다. 대놓고 나는 반디캠 후킹 코드요, 라고 우리한테 말해 준다면 우리가 한결 허용 처리 하기가 쉬웠을 것이기 때문이다. 하지만 실상은 반디캠 개발자 분도 똑같은 고민이 있었음에 틀림이 없다. 보안 제품과의 충돌을 피하는 것이 그 제품에는 하나의 장점이 될 수도 있었을 것이기 때문이다. 그래서 보안 제품에 탐지되면 그걸 피하기 위한 보다 복잡한 방식을 생각해내다 보니 거기까지 가신 것이 아닐까?

어쨌든 이쯤되면 한 가지 생각이 들 것이다. 사실 이 모든 게 정말 바보 같다는 사실이다. 충돌을 당하는 입장에는 그 충돌을 피하기 위해서 더 복잡한 코드를 작성하고, 충돌을 야기시킨 입장에서는 그 복잡해진 코드를 허용하기 위해서 더 복잡한 코드를 작성한다는 점이다. 즉, 여기엔 기본적으로 엔트로피를 증가시키는 악순환의 피드백 루프가 내장되어 있는 것이다. 이런 맥락에서 오늘밤 내가 작성할 코드도 언젠가는 그 게임에 내장된 자체 보안 코드를 작성한 분에겐 애물단지가 될 것이다. 내가 충돌을 피하기 위해서 작성한 복잡한 코드가 그걸 작성한 사람에게 다시 충돌이 되어 돌아가는 정말 요지경 같은 구조, 보고 있으면 그저 웃음 밖에는 나오질 않는다.

예전에 어떤 TCP/IP 책인지 모르겠는데 CSMA/CD 설명이 나와 있는 책을 읽었던 적이 있었다. CSMA/CD 설명을 읽고는 참 심플하면서 신묘한 방법이라는 생각이 들었다. 오늘 밤, 또다시 충돌을 피하기 위한 코드를 작성하보니 CSMA/CD의 Collision Detect라는 말이 생각난다. 우리에겐 이 악순환의 피드백 루프를 끊고 자동으로 충돌을 탐지할 수 있는 방법이란 없을까?

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중