1,000개의 오답 노트: CWE가 말해주는 것들 morgan021 2025. 11. 20.
> _
바벨탑을 쌓는 사람들
우리는 모두 무언가를 쌓아 올리는 사람들이다. 태초에 인간이 벽돌을 구워 바벨탑을 쌓으며 하늘에 닿으려 했듯, 오늘날의 우리는 0과 1이라는 디지털 벽돌을 쌓아 가상 세계의 마천루를 건설한다. 개발자라는 이름의 현대판 석공들은 밤을 지새우며 코드를 짜고, 시스템이라는 거대한 성벽을 두른다. 그들의 목표는 단 하나다. 결점 없는 세상, 오류 없는 논리, 그리고 누구도 침범할 수 없는 완벽한 보안이다.
하지만 역설적이게도 탑이 높아질수록 그림자는 길어진다. 우리가 쌓아 올린 이 디지털 문명은 놀라울 만큼 견고해 보이지만, 사실은 모래 위에 세워진 성이다. 완벽하게 통제된 세상이라고 믿었던 공간이 해커의 손짓 한 번에 와르르 무너져 내리는 광경을 우리는 너무나 자주 목격한다. 왜일까. 우리는 분명 최선을 다했다. 수만 줄의 코드를 검수하고, 최신 보안 기술을 도입하고, 밤새워 모니터를 감시했다. 그런데도 왜 구멍은 메워지지 않는가.
이것은 단순한 기술 부족의 문제가 아니다. 이것은 인간이 가진 본질적인 한계, 아니 어쩌면 이 우주를 구성하는 논리 체계 자체가 가진 결함에서 비롯된 비극이다. 우리는 신의 지도를 훔쳐 완벽한 세상을 만들려 했지만, 그 지도에는 애초부터 '완벽'이라는 목적지가 없었다. 오늘 그 불편한 진실을 마주하려 한다. 왜 보안은 영원히 미완성일 수밖에 없는지, 왜 우리는 뚫릴 수밖에 없는 운명을 타고났는지에 대한 철학적인 여정을 떠나보자.
CWE - 인류가 기록한 1,000가지의 실수
보안 업계에는 'CWE(Common Weakness Enumeration)'라는 것이 있다. 쉽게 말해 소프트웨어 약점 목록이다. 이것은 인류가 컴퓨터를 만든 이래 저질러온 모든 실수를 집대성한 거대한 '반성문'이자 '오답 노트'다. 여기에는 우리가 겪은 수모의 역사가 고스란히 담겨 있다. 메모리 관리를 잘못해서 데이터를 흘린 죄(Buffer Overflow), 입력값을 의심하지 않아 시스템을 내어준 죄(Injection), 암호를 허술하게 관리한 죄(Broken Authentication) 등 1,000개가 넘는 항목들이 빽빽하게 적혀 있다.
이 목록을 보고 있으면 기묘한 감정이 든다. 마치 중세 시대의 연금술사들이 실패한 실험 기록을 적어놓은 비전서처럼 보이기도 하고, 죄를 지은 인간들의 목록을 적어놓은 저승의 장부처럼 보이기도 한다. 개발자들은 이 목록을 달달 외우고, 자신의 코드가 이 목록에 있는 죄를 범하지 않았는지 검사한다. "이 1,000가지만 피하면 안전할 거야." 그들은 그렇게 믿고 싶어 한다.
하지만 CWE는 해결책이 아니다. 그것은 단지 과거의 기록일 뿐이다. CWE-1부터 CWE-1000까지의 목록은 우리가 이미 두들겨 맞아본 상처의 흔적이다. 누군가가 뼈아픈 해킹을 당하고 나서야 "아, 이런 식으로도 뚫리는구나"라고 깨닫고 목록에 한 줄을 추가한 결과물이다. 즉, 이 목록은 언제나 사건이 터진 뒤에야 갱신된다. 우리는 백미러를 보며 운전하는 꼴이다. 뒤따라오는 1,000개의 실패는 잘 보이지만, 정작 앞유리를 뚫고 들어오는 새로운 위협은 이 목록에 없다.
이 방대한 리스트가 주는 압박감은 상당하다. 1,000개의 구멍을 다 막아야 한다니. 하나라도 놓치면 그것이 치명타가 된다. 게다가 이 목록은 살아있는 생물처럼 매년 자라난다. 기술이 발전하면 새로운 기능이 생기고, 새로운 기능은 필연적으로 새로운 약점을 잉태한다. 클라우드가 생기니 클라우드 관련 약점이 추가되고, AI가 나오니 AI 관련 약점이 추가된다. 우리는 구멍을 메우는 속도보다 구멍이 생겨나는 속도가 더 빠른 세상에 살고 있다. 이것이 CWE가 보여주는 첫 번째 절망이다.
체크리스트의 역설 - 지도가 넓어질수록 길을 잃다
그렇다면 체크리스트를 더 촘촘하게 만들면 되지 않을까. 실제로 보안 표준은 날이 갈수록 복잡해지고 있다. 수백 페이지에 달하는 가이드라인, 수천 개의 점검 항목. 하지만 여기서 '체크리스트의 역설'이 발생한다. 지도가 너무 상세해지면 오히려 길을 찾을 수 없게 된다는 것이다.
보안을 위해 100개의 자물쇠를 채웠다고 가정해 보자. 겉보기에는 난공불락이다. 하지만 그 100개의 열쇠를 관리하는 것은 누가 하는가. 결국 사람이다. 자물쇠가 많아질수록 열쇠 꾸러미는 무거워지고, 사용자는 불편함을 느낀다. 그래서 그들은 열쇠를 현관문 밑 매트 아래에 숨겨두거나, 모든 자물쇠의 비밀번호를 '1234'로 통일해 버린다. 복잡성은 보안의 친구가 아니라 적이다. 시스템이 복잡해질수록 관리의 사각지대는 늘어나고, 그 틈새에서 곰팡이처럼 취약점이 피어난다.
더 큰 문제는 이 체크리스트가 우리에게 '거짓된 안도감'을 준다는 것이다. 모든 항목에 'YES' 체크를 하고 나면, 우리는 마치 면죄부를 받은 듯한 착각에 빠진다. "규정대로 다 했으니 문제없어." 이 생각이야말로 해커가 가장 좋아하는 먹잇감이다. 해커는 규정집 밖에서 논다. 우리가 성문을 굳게 닫고 성벽을 보수하는 동안, 그들은 땅굴을 파거나 하늘에서 날아온다. 체크리스트는 우리가 아는 길만 보여줄 뿐, 해커가 개척하는 새로운 길은 보여주지 않는다.
지도는 영토 그 자체가 아니다. 아무리 정교한 지도라도 현실의 변화무쌍한 지형을 100% 담아낼 수는 없다. 우리가 체크리스트라는 지도에 코를 박고 있는 동안, 현실 세계의 지형은 끊임없이 융기하고 침강한다. 어제 안전했던 길이 오늘 낭떠러지가 된다. 우리는 완벽한 지도를 그리려 노력하지만, 그 노력 자체가 우리를 현실에서 격리시키는 결과를 낳는다. 이것이 우리가 마주한 두 번째 딜레마다.
괴델의 불완전성 정리 - 수학적으로 증명된 '취약함'
이제 조금 더 깊은 심연을 들여다볼 차례다. 기술적인 실수가 아니라, 논리 그 자체의 한계에 대해서 말이다. 20세기 최고의 천재 수학자 쿠르트 괴델은 '불완전성 정리'를 통해 수학계에 충격을 던졌다. 그는 "모순 없는 수학적 체계 안에는 그 체계 안의 공리만으로는 참인지 거짓인지 증명할 수 없는 명제가 반드시 존재한다"는 것을 증명했다.
이 말이 어렵게 들린다면 컴퓨터 과학의 아버지 앨런 튜링의 '정지 문제(Halting Problem)'를 떠올려보자. 튜링은 "어떤 프로그램이 영원히 돌지 않는 경우, 언젠 멈출지를 판별해 주는 완벽한 프로그램은 만들 수 없다"는 것을 증명했다. 이것을 보안으로 치환하면 끔찍한 결론이 나온다. "어떤 프로그램이 버그 없이 완벽하게 안전할지 판별해 주는 도구는 논리적으로 존재할 수 없다."
이것은 단순히 기술이 덜 발달해서가 아니다. 수학적으로 불가능하다는 선고다. 우리는 코드로 코드를 검증한다. 보안 프로그램도 결국은 코드다. 불완전한 인간이 만든 불완전한 언어로 쓴 코드가 어떻게 자신을 완벽하게 증명할 수 있겠는가. 그것은 마치 자신의 머리카락을 잡아당겨 스스로를 들어 올리려는 시도와 같다.
우리가 사용하는 컴퓨터라는 기계는 태생적으로 '불완전함'을 품고 태어났다. 우리가 아무리 완벽한 논리 구조를 짠다 해도, 그 논리의 바닥에는 증명 불가능한 구멍이 뚫려 있다. 해커들은 본능적으로 그 구멍을 냄새 맡는다. 그들은 시스템이 논리적으로 설명할 수 없는 딜레마 상황을 던져주고, 시스템이 혼란에 빠져 멈추거나 오작동하는 순간을 노린다. 이것은 우리가 피할 수 없는 원죄와도 같다. 우리는 신이 아니기에, 우리가 창조한 세계도 완전할 수 없다.
알려진 위협 vs 미지의 위협(Zero-Day)
보안 전쟁은 '아는 것'과 '모르는 것'의 싸움이다. 우리가 앞서 말한 CWE나 체크리스트는 모두 '알려진 위협(Known Threats)'이다. 이것들을 막는 것은 기본 중의 기본이다. 하지만 진짜 공포는 어둠 속에 숨어 있는 '미지의 위협', 즉 제로 데이(Zero-Day)다.
제로 데이는 마치 흑사병처럼 예고 없이 찾아온다. 개발자도 모르고, 보안 회사도 모르고, 오직 그것을 발견한 해커만이 아는 취약점. 그들이 공격을 개시하는 그날(Day Zero)까지 우리는 무방비 상태다. 막을 방패가 존재하지 않기 때문이다. 제로 데이 공격이 시작되면 전 세계의 보안 담당자들은 패닉에 빠진다. 백신도 없는 바이러스가 퍼지는 꼴이다.
이것은 마치 러시안룰렛과 같다. 우리는 시스템이 안전하다고 믿고 매일 방아쇠를 당기지만, 실린더 어딘가에 총알이 들어있는지 아무도 모른다. 제로 데이는 우리가 통제할 수 없는 영역이다. 그것은 불운의 문제이고, 시간의 문제다. 누군가는 반드시 찾아낸다. 복잡한 코드의 숲 어딘가에 숨겨진 비밀 통로를.
완벽해 보이는 아이폰도, 난공불락이라는 미 국방부 서버도 제로 데이 앞에서는 평등하다. 우리가 할 수 있는 일이라고는 기도하는 것뿐일까. 아니면 공격이 감지되자마자 밤을 새워 패치를 만드는 사후약방문뿐일까. 여기서 우리는 인정해야 한다. 방어자는 언제나 공격자보다 한발 늦을 수밖에 없다는 숙명을. 빛이 닿지 않는 그림자는 항상 존재하고, 그 그림자 속에서 괴물은 자라난다.
무한한 공격 표면과 유한한 방어 자원
마지막으로 우리를 절망케 하는 것은 지극히 현실적인 '경제학'이다. 공격과 방어는 비대칭적인 게임이다. 공격자는 수만 번 실패해도 상관없다. 단 한 번만 성공하면 된다. 그들은 시간과 장소를 가리지 않고, 자동화된 봇을 이용해 무한대로 공격을 퍼붓는다. 그들의 공격 비용은 0에 수렴한다.
반면 방어자는 단 한 번의 실패도 용납되지 않는다. 수만 번을 잘 막아내다가도 딱 한 번 뚫리면 그것으로 끝이다. 방어자는 모든 문, 모든 창문, 심지어 개구멍까지 다 지켜야 한다. 이것을 '공격 표면(Attack Surface)'이라고 부르는데, 현대의 소프트웨어는 이 표면이 무한대로 넓어지고 있다. 스마트폰, IoT, 클라우드, 재택근무... 우리가 편리함을 추구하며 연결하는 모든 접점이 해커에게는 침투 경로다.
하지만 우리의 자원은 유한하다. 보안팀의 인력은 한정되어 있고, 예산은 언제나 부족하다. 24시간 365일 눈을 뜨고 있을 수도 없다. 무한한 공격 표면을 유한한 자원으로 방어한다는 것, 이것은 애초에 성립할 수 없는 부등식이다. 우리는 댐에 난 구멍을 손가락으로 막고 있는 소년과 같다. 손가락은 열 개뿐인데, 구멍은 열한 번째, 열두 번째 계속해서 터져 나온다.
이 불공정한 게임의 법칙을 이해하지 못하면 우리는 지쳐 떨어져 나간다. 완벽한 방어라는 환상을 쫓다 보면 필연적으로 번아웃이 온다. "왜 막지 못했냐"는 비난 앞에서 보안 담당자들은 고개를 숙인다. 하지만 그것은 그들의 잘못이 아니다. 그들은 단지 압도적인 확률과 싸우고 있었을 뿐이다.
완벽함(Perfection)이 아닌 회복력(Resilience)으로
지금까지의 이야기가 너무 비관적으로 들렸는가. 하지만 이것은 패배주의가 아니다. 오히려 현실을 직시함으로써 얻는 해방이다. "완벽한 보안은 없다"는 명제를 받아들이는 순간, 우리는 새로운 전략을 짤 수 있다.
우리는 이제 '방어(Defense)'에서 '회복력(Resilience)'으로 시선을 돌려야 한다. 뚫리지 않는 성을 쌓는 것이 불가능하다면, 뚫려도 무너지지 않는 성을 쌓으면 된다. 해커가 침입하더라도 중요한 데이터를 들고나가지 못하게 암호화하고, 시스템의 일부가 장악되더라도 전체가 마비되지 않도록 격리하고, 공격을 당하더라도 신속하게 복구하여 비즈니스를 지속하는 능력. 그것이 현대 보안이 추구해야 할 진정한 우아함이다.
대나무는 강풍에 맞서지 않는다. 바람이 불면 휘어진다. 휘어지기 때문에 부러지지 않고, 바람이 멈추면 다시 제자리로 돌아온다. 딱딱하고 완벽한 참나무는 태풍에 뿌리째 뽑히지만, 유연한 대나무는 살아남는다. 우리 시스템도 그래야 한다. 완벽함이라는 강박을 버리고, 불완전함을 포용해야 한다. 오류가 발생할 수 있음을, 해킹당할 수 있음을 인정하고 그 상황에서도 생존할 수 있는 설계를 해야 한다.
신의 지도를 훔치려 했던 우리의 시도는 실패했다. 우리는 영원히 미로 속을 헤맬 것이다. 하지만 길을 잃는 것을 두려워할 필요는 없다. 중요한 것은 지도의 완벽함이 아니라, 넘어져도 다시 일어나는 우리의 의지다. 보안은 상태가 아니라 과정이다. 끝없는 창과 방패의 싸움 속에서, 상처 입으면서도 끝내 살아남는 것. 그것이 인간이 보여줄 수 있는 가장 위대한 기술일지도 모른다.
3줄 요약
- 보안 약점 목록(CWE)과 체크리스트가 존재하지만, 이는 과거의 실패 기록일 뿐 미래의 미지 위협(Zero-Day)까지 막아주지는 못한다.
- 괴델의 불완전성 정리와 튜링의 정지 문제에 따르면, 논리적으로 무결점인 소프트웨어를 검증하는 것은 수학적으로 불가능하다.
- 따라서 우리는 불가능한 '완벽 방어'의 환상을 버리고, 공격당해도 시스템이 붕괴하지 않고 복구되는 '회복력(Resilience)'에 집중해야 한다.
'MACHINE: EXPLOIT' 카테고리의 다른 글
| 인터넷에는 국경이 없지만, 검문소는 있다 (0) | 2025.11.21 |
|---|---|
| 회사가 내 키보드를 보고 있다: 감시 소프트웨어(Bossware)의 습격 (0) | 2025.11.21 |
| 투명한 상자 속의 기괴한 기계: 위어드 머신(Weird Machine)의 세계 (0) | 2025.11.21 |
| 도둑은 창문을 깨지 않는다, 초인종을 누를 뿐 (0) | 2025.11.21 |
| 우아함의 귀환: 더하기가 다시 더하기가 되기까지 (0) | 2025.11.21 |
| 검증과 실행 사이 그 아찔한 간극 TOCTOU에 대하여 (0) | 2025.11.15 |
| 보이지 않는 연결고리: 교차 기능 재진입이라는 유령 (0) | 2025.11.14 |
| 레고인가, 조각상인가? 블록체인을 짓는 두 가지 철학 (0) | 2025.11.12 |
| 블록체인의 인터넷은 누가 움직이는가 (0) | 2025.11.12 |
| 이름은 운명이다? 메타마스크는 왜 스냅을 선택했나 (0) | 2025.11.10 |