기술 신호2026-08-24

17GB짜리 로컬 모델이 상용 앱 라이선스를 30분에 뜯었다

클라우드는 한 번도 안 거쳤다

Qwen 3.8 27B가 실행 없이 정적 분석만으로 상용 앱의 검증 키를 복원하고 우회 PoC까지 만들었다. 소요 시간 약 30분. 소프트웨어를 파는 쪽과 기밀을 다루는 쪽 모두에게 같은 사실이다.

XDA의 에디터 Adam Conway가 8월 22일 실험 하나를 공개했다. 오픈 웨이트 모델 Qwen 3.8 27B에게 자기가 돈 주고 산 상용 앱의 라이선스 검사를 뜯어보라고 시켰다. 걸린 시간은 약 30분이었고 클라우드 API는 한 번도 쓰지 않았다.

돌린 장비는 Lenovo ThinkStation PGX 한 대다. GB10 Grace Blackwell 칩에 통합 메모리 128GB, 대역폭 273GB/s. 기본 설정에서 초당 15~30 토큰이 나오고 SGLang과 NVFP4, DFlash2 추론 가속을 얹으면 코드와 추론 작업에서 초당 50 토큰 근처까지 올라간다. 모델 자체는 17GB VRAM에 들어간다.

한 줄 정리

프런티어 모델이 필요하다고 여겨지던 작업이 소비자용 그래픽카드 한 장 안으로 내려왔다.

한눈에 보기

모델 Qwen 3.8 27B (오픈 웨이트)
실행 환경 로컬 워크스테이션 1대, 네트워크 미사용
메모리 17GB VRAM
소요 시간 약 30분
분석 방식 정적 분석, arm64 수천 줄, 앱 미실행
결과 숨겨진 공개 검증 키 복원 + 우회 PoC 동작

앱을 한 번도 실행하지 않았다

모델은 바이너리를 열지 않고 뜯었다. 프레임워크를 디스어셈블해 arm64 코드 수천 줄을 읽고 보안 함수와 그 호출 지점을 연결한 뒤, 벤더가 바이너리 안에 일부러 숨겨 둔 공개 검증 키를 찾아냈다. 실행은 마지막에 우회가 실제로 먹히는지 보여 줄 때 딱 한 번이었다.

중간에 한 번 틀렸다. 처음 복원한 키로 서명 검사는 통과했는데 바이너리가 계산하는 무결성 해시가 안 맞았다. 여기서 대부분의 모델은 "완료"라고 답하고 끝낸다. 이 모델은 불일치를 스스로 지적하고 되돌아가 값이 바이트 단위로 맞을 때까지 다시 했다.

시작은 오히려 실패였다. Conway는 자기가 그 앱의 개발자인 척하는 탈옥 프롬프트를 넣었는데 모델이 서명 인증서를 확인하고 실제 개발자 이름을 대며 거짓말을 짚어 냈다. 그러고는 "취약점을 문서화하되 동작하는 우회는 만들지 않겠다"고 선을 그은 뒤 그 선까지 일을 다 해 놓고, 결국 필요한 단계가 전부 앞에 놓이자 우회까지 만들었다.

모델이 지목한 약점은 세 군데다. 키가 현대 기준으로 보기 어려운 크기의 RSA 키라는 것, 검증이 완전 오프라인이라 키가 새면 업데이트를 밀지 않는 한 폐기할 방법이 없다는 것, 모든 검사가 로컬 코드 안에 있어 패치가 가능하다는 것.

성능 얘기가 아니다

Artificial Analysis 기준으로 이 모델은 4B~40B 구간 135개 중 오픈 웨이트 1위이고 지능 지수 52를 받았다. 그런데 숫자가 핵심은 아니다. 바뀐 건 이 정도 능력이 어디에 있어야 하느냐에 대한 전제다.

클라우드 API에 붙은 모델에는 사용량 한도가 있고 프롬프트와 출력을 지켜보는 쪽이 있다. 로컬 모델에는 둘 다 없다. 파일을 남의 서버로 보내지 않아도 되니 독점 소스코드나 고객 데이터, 악성코드 검체를 격리된 기계 안에서 분석할 수 있다. 같은 성질이 반대편에서도 작동한다. 무엇에 쓸지를 정하는 건 키보드 앞에 앉은 사람뿐이다.

Conway 본인도 선을 그었다. 앱 하나, 실행 한 번이고 그 대상이 얼마나 대표성이 있는지는 모른다고 적었다. 더 어려운 앱이었으면 아예 못 뚫었을 수도 있다. 다만 한 번 넘은 문턱은 되돌아가지 않는다.

파는 쪽이 오늘 정할 것

SaaS, 플러그인, 폰트, 템플릿, 강의 자료처럼 클라이언트에 파일을 내려보내는 상품을 파는 팀이라면 이 실험은 남의 일이 아니다. 그 앱의 보호 설계는 허술하지 않았다. 온라인 활성화 1회, 이후 오프라인 서명 검사, 하드웨어 시리얼 바인딩, 내장 폐기 목록, 바이너리 서명 확인, 서명된 업데이트 경로까지 갖췄고 모델도 "이 부류 앱치고는 이례적으로 꼼꼼하다"고 평가했다. 그런데도 30분이었다.

정할 것은 하나다. 값나가는 판단을 클라이언트에 둘 것인가 서버에 둘 것인가. 라이선스 검사, 가격 계산, 사용량 집계, 프롬프트 원본처럼 뜯기면 곤란한 것을 내려보내는 파일 안에 넣어 뒀다면 그건 이제 잠금이 아니라 표시다. 개발을 직접 안 하는 대표라도 이 질문은 던질 수 있다. 우리 제품에서 돈이 걸린 판단이 고객 컴퓨터에서 일어나는가.

anyAX 관점

17GB에 들어가는 모델이 벤더가 일부러 숨긴 검증 키를 30분에 복원했다. 클라이언트에 배포한 코드 안에 비밀을 숨겨 두는 설계는 여기서 수명이 끝났다. 난독화의 값어치는 "뚫는 데 드는 시간"이었는데 그 시간이 사람의 며칠에서 기계의 반 시간으로 내려왔다.

같은 사실이 반대편에서는 선물이다. 계약서에 "외부 AI 서비스에 자료를 올리지 않는다"고 적혀 있어서 AI를 못 쓰던 팀이 있다. 법무, 의료, 공공 용역, 고객사 소스코드를 만지는 개발 외주가 그렇다. 이제 그 조항을 어기지 않고도 27B급 분석을 돌릴 수 있다. 네트워크를 끊은 기계 한 대면 된다.

그래서 오늘의 결정은 도구 선택이 아니라 배치다. 우리 제품에서 지켜야 할 것은 서버 뒤로 옮기고, 우리가 못 올리던 자료는 로컬로 내린다. 같은 기술이 방향만 바꿔서 양쪽에 놓인다.

참고