• Mad lad가 DNS 내부에서 Doom을 저장하고 로드하다 — 게임 데이터를 저장하기 위해 TXT 레코드 타입이 오용되다

    이거 읽기 전에 술 한 잔 하세요.

    article image

    청중의 네트워크 관리자분들께는 선반에 놓인 'unsee juice'를 가져가 가시라고 말씀드립니다. 오늘 저희가 준비한 홈 프로젝트가 말 그대로 '이중 충격(double-whammy)'이기 때문입니다. 첫 번째로, 모두가 좋아하는 문제입니다. 바로 DNS입니다. 두 번째로는, 아담 라이스(Adam Rice)라는 개발자가 이 DNS에 '둠(Doom)'이라는 프로그램을 심어버렸기 때문입니다. 제가 이런 글을 쓰게 될 거라고는 상상도 못 했지만, 제 인생 선택들이 늘 영광만을 가져다주지는 않았나 봅니다.

    아직 이 분야를 모르시는 분들을 위해 설명드리자면, tomshardware.com에 접속할 때 여러분의 장치(device)는 가장 먼저 서버에 자신이 실제로 어떤 숫자 주소(numerical address)를 갖고 있는지 묻습니다. 이것이 DNS, 즉 도메인 이름 시스템(Domain Name System)이며, 인터넷의 근간이자 초석입니다. 라이스는 마치 DNS를 4차원 구조로 휘게 만드는 전문가인 듯 보입니다. 예를 들어, TXT 레코드를 악용하여 악성 페이로드(malware payloads)를 전달하는 방식이 그것입니다.

    약어에서 알 수 있듯이, TXT 레코드는 텍스트 문자열을 담고 있습니다. 주로 도메인 검증 및 스팸 제어에 활용되며, 대다수의 도메인은 반 개 이상의 TXT 레코드를 필요로 합니다. 핵심은, 그 정의상 TXT 레코드는 임의의 데이터(arbitrary data)를 담을 수 있다는 점입니다. 라이스가 지적했듯이, 데이터를 저장할 수 있는 공간이라면 파일도 저장할 수 있고, 따라서 둠 같은 프로그램도 저장할 수 있게 됩니다.

    기술 애호가, 40년 된 프린터 컨트롤러에서 둠 구동에 성공하다

    야심 찬 개발자가 작은 64KB 실행 파일에 세련된 쿼크(Quake) 스타일 게임을 담아내다

    TXT 레코드는 최대 2,000자까지의 문자를 포함할 수 있으며, 단일 도메인에서는 수천 개의 레코드가 존재할 수 있습니다. 게다가 DNS 항목은 전체 인터넷의 여러 계층에서 캐싱되기 때문에, 이는 상당한 양의 데이터를 저장하고 비교적 안정적인 속도로 조회(query)할 수 있음을 의미합니다. 여기에 계신 개발자분들은 이미 이 방향으로 프로젝트가 나아가고 있다는 것을 알고 계실 겁니다.

    article image

    라이스는 처음에는 단순히 오리 그림 파일 같은 간단한 파일을 저장하는 방법을 구상했습니다. 바이너리 데이터를 텍스트로 읽을 수 있는 base64 형식으로 인코딩한 후, 텍스트로 변환하는 과정에서 발생하는 상당한 오버헤드(overhead) 때문에 필요한 만큼 여러 조각으로 잘라 저장했습니다. 다음으로는 영화 파일로 시도할까 생각했으나, 1GB의 데이터만 해도 670,000개의 레코드가 필요했기 때문에, 그는 "이것이 얼마나 터무니없는지를 실제로 입증할 수 있는 무언가"를 목표로 삼았고, 그 대상은 바로 둠(Doom)이었습니다.

    라이스에게는 둠을 DNS 레코드에서 메모리 속으로 쉽고 간편하게 분해하고 재조립할 방법이 필요했습니다. 이에 그는 'managed-doom'이라는 게임의 C# 포트를 사용했습니다. C#은 바이트코드 언어이기 때문에, 소스 코드가 먼저 플랫폼에 구애받지 않는 바이너리로 컴파일되고, 이 바이너리를 .NET 엔진에서 실행하면 최종적으로 대상 CPU의 명령어에 맞춰 번역됩니다. 이 과정은 전반적으로 자바(Java)와 유사합니다.

    라이스는 디스크에 파일을 전혀 쓰고 싶지 않았기 때문에, 게임 로딩 과정 일부를 조정하기 위해 클로드(Claude) 챗봇의 도움을 받아 모든 데이터를 메모리에서 읽어오는 방식으로 변경했습니다. 용량이 너무 커서 오디오 파일은 삭제했지만, 몇 가지 압축 작업 끝에 2,000개 DNS 레코드에 걸쳐 약 3.8MB로 게임을 성공적으로 압축했습니다.

    가장 까다로운 작업을 마친 후, 그는 PowerShell을 이용해 로딩 스크립트를 작성했습니다. 이 스크립트는 자신의 도메인을 조회하여 TXT 레코드를 가져오고, 데이터를 재조립하며, 데이터 손상 여부를 검증합니다. 이 단계가 완료되면 게임의 모든 콘텐츠는 메모리 안에 존재하게 되며, 이후에는 다른 일반적인 .NET 프로그램처럼 실행만 하면 됩니다.

    라이스는 자신의 프로젝트를 "저주받았다(cursed)"고 묘사했는데, 저도 이 표현에 동의할 수밖에 없습니다. 클라우드플레어(Cloudflare)의 DNS 서버들은 아마 프로젝트가 끝난 후 트라우마 상담이 필요할 정도일 것입니다. 라이스의 발자취를 따라해 보고 싶다면 GitHub에서 해당 프로젝트를 확인할 수 있습니다.

    Google News에서 Tom's Hardware를 팔로우하거나, 저희를 선호하는 출처로 등록하여 최신 뉴스, 분석 및 리뷰를 피드에서 받아보세요.

    [출처:] https://www.tomshardware.com/networking/mad-lad-stores-and-loads-doom-from-within-dns-txt-record-type-abused-to-store-game-data