Back to Blog

Claude Code, 23년 동안 숨겨져 있던 Linux 취약점 발견

April 4, 2026by Ichiban Team
aisecuritylinuxclaude-codezero-day

Hero

#Introduction

"보는 눈이 충분히 많으면 모든 버그는 찾기 쉽다(given enough eyeballs, all bugs are shallow)"라는 리누스의 법칙(Linus's Law)은 아주 유명합니다. 수십 년 동안 오픈소스 커뮤니티는 Linux 커널과 같은 기반 인프라를 보호하기 위해 이 원칙에 의존해 왔습니다. 하지만 그 '눈'이 더 이상 사람이 아니라면 어떨까요? 그리고 이전에는 불가능하다고 여겨졌던 규모와 깊이로 코드를 처리할 수 있다면 어떻게 될까요?

최근 열린 [un]prompted AI 보안 컨퍼런스에서 Anthropic의 Frontier Red Team 소속 Nicholas Carlini는 레거시 코드 보안에 대해 우리가 오랫동안 가져왔던 가정을 완전히 깨뜨렸습니다. 그는 고도로 진보된 Claude Opus 4.6 모델로 구동되는 Claude Code가 정확히 23년 동안 아주 눈에 띄는 곳에 숨겨져 있던 원격 실행 가능한 치명적인 Linux 커널 취약점을 어떻게 자율적으로 발견하고 익스플로잇(exploit)했는지 시연했습니다.

이것은 단순히 정적 분석 도구의 점진적인 발전이 아닙니다. 코드베이스 감사(auditing), 방어적 패치, 그리고 사이버 보안의 전반적인 경제학에 접근하는 방식을 재정의하는 분수령이 되는 사건입니다.

#What Happened

Anthropic의 Frontier Red Team이 배포한 방법론은 놀라울 정도로 직관적이면서도 파괴적인 효과를 보여주었습니다. Carlini와 그의 팀은 본질적으로 기존의 인간 팀이 따라갈 수 없는 규모로 작동하는 멀티 패스(multi-pass) "무차별 대입(brute-force)" AI 감사 파이프라인을 구축했습니다.

AI 기반 보안 감사 프로세스는 세 가지 뚜렷한 단계로 나뉩니다.

  • 1단계: 심층 시맨틱 파싱(Deep Semantic Parsing): Claude Code는 Linux 커널 저장소에 있는 모든 단일 소스 파일을 체계적으로 수집했습니다. 미리 정의된 정규 표현식 패턴이나 추상 구문 트리(AST) 매칭에 의존하는 대신, Claude는 C 코드의 의미론적(semantic) 의미를 파싱하여 복잡한 상태 머신과 포인터의 수명 주기(lifecycle)를 추적했습니다.
  • 2단계: 자동화된 검증(Automated Verification): 보조 Claude 에이전트 풀이 플래그가 지정된 코드 경로를 가져와 작동 가능한 PoC(Proof-of-Concept) 익스플로잇 작성을 시도했습니다. 이를 통해 거의 100%에 가까운 검증률을 달성했으며, 기존의 SAST(정적 애플리케이션 보안 테스트) 도구를 괴롭히는 오탐(false-positive)으로 인한 피로감을 완전히 제거했습니다.
  • 3단계: 문제 해결 방법 생성(Remediation Generation): 검증이 완료되면 에이전트는 공격 벡터를 차단하기 위해 구조적으로 견고한 커널 패치를 제안했습니다.

이 과정의 가장 큰 성과는 NFSv4(Network File System version 4) 데몬에서 복잡한 스택 버퍼 오버플로우를 발견한 것입니다. 이 취약한 코드는 2003년에 도입되었으며, 20년 동안 수천 번의 인간 감사, 리팩토링 및 자동화된 퍼징(fuzzing) 캠페인 속에서도 살아남았습니다.

이것이 우연이 아님을 증명하듯, Carlini는 5만 개 이상의 GitHub 별을 보유한 대규모 인기 플랫폼인 Ghost CMS에도 Claude Opus 4.6을 투입했다고 밝혔습니다. AI는 90분도 채 되지 않아 제로데이 블라인드 SQL 인젝션(blind SQL injection)을 발견하고 관리자 API 키를 성공적으로 추출했습니다.

#Why It Matters

지구상에서 가장 철저하게 검토되는 코드베이스 중 하나에서 23년 된 취약점이 발견되었다는 사실은 불편한 진실을 마주하게 합니다. 바로 현재의 보안 도구로는 복잡하고 상태를 가지는(stateful) 버그를 처리하기에 근본적으로 부족하다는 것입니다.

금융 시장은 이 시연의 심각성을 즉각적으로 인지했습니다. 발표 직후, CrowdStrike 및 Palo Alto Networks와 같은 업계 거물을 포함한 주요 사이버 보안 주식이 급락했습니다. 투자자들은 "제로데이" 익스플로잇을 찾는 데 필요한 재정적, 기술적 장벽이 0에 가깝게 떨어지는 미래에 대비하고 있습니다.

역사적으로 NFSv4 스택 오버플로우와 같은 취약점을 찾으려면 커널 내부 및 네트워크 프로토콜에 대한 깊은 도메인 전문 지식을 갖춘 고도로 전문화된 인간 엔지니어들이 수개월에 걸쳐 집중적으로 연구해야 했습니다. Claude Code는 이 프로세스를 자동화함으로써 공격자와 방어자 사이의 비대칭성을 극적으로 변화시켰습니다. AI가 주말 동안 23년 된 버그를 포괄적으로 매핑하고 익스플로잇할 수 있다면, "실전 테스트를 거친(battle-tested)" 소프트웨어라는 개념은 근본적인 재평가가 필요합니다.

#Technical Implications

이것이 왜 거대한 기술적 도약인지 이해하려면, 기존 도구들이 23년 동안 이 버그를 찾지 못한 이유를 살펴봐야 합니다.

기존의 퍼저(syzkaller 등)는 메모리 손상(memory corruption)을 찾는 데 탁월하지만, 커버리지 기반의 변이(coverage-guided mutation)에 크게 의존합니다. 따라서 복잡하고 여러 단계로 이루어진 상태 머신 상호 작용이 필요한 코드 경로에 도달하는 데 어려움을 겪는 것으로 악명이 높습니다. NFSv4 버그를 트리거하려면, 클라이언트는 버퍼 오버플로우에 도달하기 전에 엄격한 전제 조건 세트를 충족하는 매우 구체적인 형태의 잘못된 복합 요청(malformed compound requests) 시퀀스를 보내야 했습니다. 표준 퍼저는 유효한 체크섬을 생성하거나 프로토콜의 엄격한 상태 요구 사항을 준수하는 과정에서 거의 확실하게 막혔을 것입니다.

그러나 Claude Code는 상태 머신을 추측할 필요가 없었습니다. 그냥 코드를 읽고 이해했을 뿐입니다.

다음은 Claude가 파고들 수 있었던 시맨틱 사각지대 유형을 단순화한 개념적 예시입니다.

/* Conceptual example of the semantic bug pattern */
int process_nfs4_compound(struct nfsd4_compoundargs *argp, void *buf) {
    int op_count = argp->opcnt;
    char local_buffer[256];
    
    // Traditional SAST sees a bounds check here and marks it safe
    if (op_count > MAX_OPS) {
        return -EINVAL;
    }

    // However, an obscure protocol downgrade state allows 
    // op_count to be manipulated AFTER the initial check
    trigger_legacy_fallback(argp); 

    // Semantic understanding reveals that argp->opcnt is now unbound,
    // leading to a stack overflow during the memory copy
    memcpy(local_buffer, buf, argp->opcnt * sizeof(struct nfsd4_op));
    
    return 0;
}

정적 분석 도구는 초기의 경계 확인(bounds check)을 보고 변수가 안전하다고 가정합니다. 반면 Claude Opus 4.6은 여러 함수 호출에 걸쳐 변수의 수명 주기를 추적할 수 있었습니다. trigger_legacy_fallback()이 상태를 변경하여 이전의 안전 확인을 무효화한다는 것을 인식한 것입니다. 이는 이전까지 인간 시니어 보안 연구원만의 전유물이었던 높은 수준의 문맥적 추론 능력을 요구합니다.

#What's Next

우리는 AI 보안의 이중 용도(dual-use) 시대에 접어들고 있습니다.

방어적인 측면에서 이 기술은 매우 매력적인 약속을 제공합니다. 바로 수십 년간 쌓인 기술 부채를 체계적으로 근절할 수 있는 능력입니다. 조직은 내부 AI 에이전트 클러스터를 배포하여 소프트웨어 공급망 전체를 감사하고, 취약점이 야생(in the wild)에서 무기화되기 전에 식별하여 패치할 수 있습니다. "기본적으로 안전한(secure by default)" 소프트웨어라는 꿈이 갑자기 손에 닿을 듯 가까워졌습니다.

그러나 공격적인 측면의 파급력 또한 부인할 수 없습니다. Carlini는 최근 Anthropic에서 16개의 Opus 에이전트로 구성된 팀이 완전히 처음부터 Rust로 기능적인 C 컴파일러를 성공적으로 작성했다고 언급했습니다. 이러한 수준의 아키텍처 및 코딩 숙련도가 공격적인 보안에 맞춰지면, 위협 환경은 기하급수적으로 변화합니다. 위협 행위자(Threat actors)는 곧 연중무휴 24시간 작동하는 고도로 유능하고 자동화된 취약점 연구 파이프라인에 접근하게 될 것입니다.

이에 적응하기 위해 업계는 사후 대응적인 패치를 넘어서야 합니다. 우리는 아마도 Linux 커널에 Rust를 통합하려는 지속적인 노력을 검증하면서 메모리 안전(memory-safe) 언어를 향한 대규모 추진을 보게 될 것입니다. 또한 AI 공격자와 동일한 속도 및 규모로 작동하는 AI 기반의 자율 방어 시스템 배포를 목격하게 될 것입니다.

#Conclusion

Claude Code가 Linux 커널에서 23년 된 버그를 발견한 것은 소프트웨어 엔지니어링 커뮤니티에 보내는 명확한 경고(wake-up call)입니다. 우리의 레거시 코드베이스는 여전히 치명적인 취약점들로 가득 차 있으며, 충분한 시간과 추론 능력을 갖춘 누군가—혹은 무언가—가 그것들을 찾기를 기다리고 있다는 것을 증명합니다.

문제가 된 특정 커널 버그는 이제 패치되었지만, 이를 찾는 데 사용된 방법론은 세상에 공개되었습니다. AI 모델이 컨텍스트 길이와 추론 능력 면에서 계속 확장됨에 따라 사이버 보안 산업은 빠르게 진화해야 합니다. 자동화된 방어자와 자동화된 공격자 간의 경주는 공식적으로 시작되었으며, 이제 돌이킬 수 없는 흐름이 되었습니다.