1.3TB의 비밀을 잃는 방법, Novo Nordisk 방식
잊힌 하위 도메인의 JavaScript에 있던 접근 토큰 하나가 1.3TB의 유출된 비밀 정보로 이어졌어요. 엔터프라이즈 금고는 사람을 지켜요. 그런데 침해는 아무도 관리하지 않는 기계 자격 증명 쪽으로 걸어 들어왔어요.
이번 달에 Ozempic과 Wegovy를 만든 덴마크 제약 대기업 Novo Nordisk가 공격자들이 자사 시스템에 침입했음을 확인했어요 [1]. 연구자들은 진입 경로가 잊힌, 외부에 공개된 하위 도메인의 JavaScript에 남아 있던 고권한 접근 토큰이었다고 말해요. 브라우저로 전송되어, 소스 보기(View Source)를 연 사람이라면 누구나 읽을 수 있었던 비밀 정보였죠 [2]. 부주의하긴 했어요. 하지만 이 규모의 회사가 자격 증명 전반을 부주의하게 다루지는 않아요. 이 회사는 진지한 자격 증명 관리, 즉 누가 어디에 로그인할 수 있는지를 관장하는 특권 접근 체계를 거의 확실히 운영하고 있었을 거예요. 그런데도 모두 소용없었어요. 전부 집의 잘못된 쪽을 지키고 있었기 때문이에요.
실제로 무슨 일이 있었나
첫 번째 토큰은 Novo Nordisk의 비공개 저장소를 클론할 수 있을 만큼 권한이 높았어요. 그리고 저장소에는 더 많은 자격 증명이 들어 있었어요. 지구상 거의 모든 회사에서 기계 자격 증명이 바로 거기 사니까요. 소스에 하드코딩되어 있고, 설정 파일에 놓여 있고, CI 파이프라인에 박혀 있고, 한 번 커밋된 뒤 잊혀 있죠. 저장소를 클론한 것은 공격자에게 소스 코드만 넘긴 게 아니었어요. 다음 열쇠 묶음과, 그다음 열쇠 묶음을 넘긴 거예요.
부주의한 토큰 하나가 전면 침해로 이어지는 방식이 바로 이거예요. FulcrumSec이라는 이름의 그룹은 이 방식으로 두 달 반 동안 측면 이동을 하며 70만 개가 넘는 파일, 약 1.3테라바이트를 가지고 나갔다고 주장해요. 여기에는 소源 코드, 시판 중인 약물과 미출시 약물 데이터, 임상시험 기록, 제조 기술, 회사의 내부 AI 모델이 포함돼요 [3]. 2,500만 달러로 알려진 몸값 요구가 거부되자 자료를 공개하기 시작했어요. (Novo Nordisk는 소수의 시스템에 대한 무단 접근을 확인했어요. 전체 규모는 공격자의 주장이며 아직 독립적으로 검증되지 않았어요 [1][3].)
유출된 토큰 하나가 문손잡이였고, 사용 가능한 자격 증명으로 가득한 저장소가 그 뒤에 잠금 해제된 채 서 있던 건물이었어요.
이것은 부주의가 아니에요. 범주의 공백이에요.
엔터프라이즈 자격 증명 관리 — CyberArk급 금고, 모든 대기업이 운영하는 특권 접근 도구 — 는 사람을 위해 만들어졌어요. 인간 계정, 로그인 세션, 누가 무엇에 접근할 수 있는지. 그 목적에는 작동해요. 그런데 이번 침해에서 연쇄적으로 쏟아진 자격 증명은 완전히 반대쪽에 있었어요. JavaScript 속 토큰, 저장소 안의 비밀 정보, CI 파이프라인 속 키는 기계 자격 증명이에요. 앱과 서비스, 그리고 이제는 에이전트가 인간 없이 서로를 인증할 때 쓰는 것들이죠. 그쪽에는 지금까지 금고가 없었어요.
게다가 폭발적으로 늘어나는 쪽이 바로 그쪽이에요. 새로운 연동, 마이크로서비스, 배포하는 AI 에이전트 하나하나가 아무도 관리하지 않는 상시 기계 자격 증명을 곱해요. 위험은 앱·에이전트 쪽으로 옮겨갔는데 도구는 따라 움직이지 않았어요. 그래서 사후 분석은 "JavaScript에 토큰을 넣지 마라"에 닿게 되고, 이건 엉뚱한 싸움이에요. 토큰은 언제든 새어 나가요. 로그로, 스크린샷으로, 잊힌 번들로요. 첫 번째 자격 증명을 절대 노출하지 않는 쪽에서는 이길 수 없어요. 유출 하나를 1.3테라바이트로 만든 건 그 뒤, 코드 속에 클론되기를 기다리며 놓여 있던 상시 기계 자격 증명의 건물이었어요. 하나를 얻으면 나머지 지도를 얻어요.
의도적으로, 이것을 위해 만들었어요
그 공백이 Clavitor가 존재하는 이유 전부예요. CyberArk가 결코 위해 만들어지지 않았던 쪽 — 앱과 에이전트가 쓰는 자격 증명 — 을 위한 금고예요. Clavitor를 쓰면 수집할 자격 증명이 저장소에 없어요. 코드는 커밋할 수 있는 비밀 정보를 들고 있지 않고, 필요한 순간에 금고에게 자격 증명의 사용을 요청해요. 그 값은 소스에도, 설정에도, 빌드에도 남지 않아요. 첫 토큰을 훔치고 가진 모든 저장소를 클론한 공격자가 발견하는 건 있어야 할 것뿐이에요. 코드, 그리고 키 없음. 유출 하나를 모든 것으로 만드는 연결 고리는 첫 번째 고리에서 끊겨요.
진입 토큰도 같은 방식으로 무력화돼요. Clavitor 자격 증명은 하나의 동작으로 범위가 한정되고 만료돼요. 엉뚱한 번들에서 발견된 토큰은 만능 열쇠가 아니에요. 조직을 클론하거나 다음 비밀 정보에 접근할 수 없어요. 원래 이름 붙여진 그 한 가지 용도에만 유효했으니까요. 발급된 기계에 묶여 있어, 다른 곳에서 쓰인 사본은 죽어 있어요. 단일 자격 증명이 조용한 유출 통로가 되지도 않아요. 모든 부여에 속도 제한이 걸리고 비정상적 급증 시 봉쇄가 트리거돼요. 그래서 70만 파일이 10주에 걸쳐 합리적으로 보이는 요청 하나씩으로 빠져나가지 않아요. 그리고 모든 사용은 해당 머신 밖에 기록되고 해시로 연결돼요. 침입자가 소유하지 않은 기계에 기록이 남으니 조용한 잠입을 성사시키기도 훨씬 어려워져요.
이 모든 것이 침해 불가능하게 만들지는 않아요. 그렇게 약속하는 건 판매예요. 장기 마스터 키를 하드코딩하면 그것을 발견한 사람은 그것이 허용하는 한, 한 번, 쓸 수 있어요. 달라지는 건 자격 증명 하나를 발견하는 것이 더 이상 나머지를 넘겨주지 않는다는 점이에요. 그 뒤에 상시 비밀 정보로 가득한 저장소가 없고, 유출에서 1.3테라바이지로 이어지는 연결 고리가 없어요. 유출된 토큰의 파괴 반경이 그 토큰으로 다시 줄어들어요.
남겨둘 가치가 있는 부분
헤드라인은 약물 제조 공식과 다크웹 경매가 될 거고, 찌릿한 건 그 부분이에요. 교훈은 더 조용해요. 진지한 자격 증명 관리를 갖춘 정교한 회사도 1.3테라바이트 깊이까지 뚫렸어요. 금고는 사람을 지켜봤는데 침해는 앱 쪽으로 걸어 들어왔으니까요. 기계 자격 증명이 지금 위험이 있는 곳이고, 그쪽이 여전히 노출된 채 남아 있는 유일한 쪽이에요. 답은 저장소를 깨끗이 닦는 게 아니에요. 처음부터 거기에 상시로 서 있지 않아 닦을 필요가 없는 자격 증명, 도난당해도 하나의 범위 한정 동작에만 유효하고 그 뒤에 열쇠 캐비닛이 없는 자격 증명이에요. 유출은 유출로 남아요. 더 이상 모든 것의 열쇠가 되지 않을 뿐이에요.
우리는 앱·에이전트 쪽에서 자격 증명 도구가 지켜야 할 규칙을 적어 두었어요 — 전체 열 가지는 여기에 있어요.
Clavitor (@clavitorai)는 AI 에이전트를 위해, 그리고 그들에 맞서 만들어진 자격 증명 금고예요. clavitor.ai
출처
[1] Novo Nordisk (@novonordisk) — Incident update. 소수의 내부 IT 시스템에 대한 무단 접근을 확인해요.
[2] CybelAngel (@CybelAngel) — Novo Nordisk Was Breached Through JavaScript: what the coverage got wrong. 최초 접근 경로를, 잊힌 외부 공개 하위 도메인의 축소된 클라이언트 측 JavaScript에 남아 있던 고권한 접근 토큰으로 추적해요.
[3] TechRepublic (@TechRepublic) — Ozempic Maker Novo Nordisk Confirms Security Incident After $25M Hacker Demand. FulcrumSec 그룹은 저장소를 클론하고 추가 자격 증명을 수집한 뒤 약 2.5개월의 체류와 약 70만 파일 / 1.3TB — 소스 코드, 시판 및 미출시 약물 데이터, 임상시험 기록, 내부 AI 모델 — 를 주장하며, 몸값이 거부된 뒤 자료가 유출됐다고 해요.