AI 개발

AI Agent 보안 위기: 왜 Claude와 GPT는 자율 공격이 가능해 보이는가? JSON 검증이 할 수 있는 일

약 15분

「모델이 스스로 해킹하는가」는 잘못된 질문이다. 2026년 공개 기록에서 Claude와 GPT가 하는 일은 당신의 고객지원 Agent와 같다: tool_calls를 내고, 호스트가 실행하고, 도구가 네트워크에 닿는다. 변한 것은 더 긴 루프, 더 넓은 카탈로그, 일을 스스로 끝내려는 모델이다. 이 글은 자율 공격 능력을 분해한 뒤 묻는다. JSON 검증이 실제로 할 수 있는 일은 무엇인가.

읽기 전 요약

개념 한 줄 어디에 떨어지는가
모델 도구 이름과 인자만 제안한다 tool_calls JSON
호스트 검증하고, 실행하고, 결과를 다시 쓴다 당신의 runtime이지, 모델이 아니다
자율 루프로 JSON을 채운다. 사람 대기가 줄어든다 Agent loop
JSON Schema 실행 전에 모양을 재는 자 required / enum / allowlist

분담을 먼저 기억한다. 모델은 객체를 채우고, 호스트가 실행하고, 루프가 동작을 연속시킨다. JSON 검증은 모양만 잰다. 선을 뽑지도, 인증하지도, 두 번 묻지도 않는다.

「자율 공격」을 바로 묻기

2026년 여름에서 가을, 두 플래그십 랩은 같은 종류의 문장을 공개 문서에 썼다: 모델은 조언만 하지 않는다. 도구를 고르고, 인자를 채우고, 결과를 읽고, 다음 단계를 고른다. Anthropic은 Claude를 「자율 사이버 공격 Agent」로 썼다. OpenAI는 GPT-6 Astra를 「중요 사이버보안 능력 임계」로 표기했다. 「모델이 제로데이를 발명하고 스스로 포트를 연다」로 읽으면 방어 층이 틀린다.

공개 기록에서 겹치는 것은 세 가지다. 하나라도 빠지면 채팅일 뿐이다:

  • 모델은 이름과 인자만 제안한다. 부작용은 호스트에 있다.
  • 카탈로그가 브라우저, 셸, 패키지 저장소, 임의의 HTTP를 포함하는 순간, 적법한 JSON이 동작이 된다.
  • 루프는 더 이상 기다리지 않는다. 결과가 다시 쓰이면 다음 객체가 바로 채워진다. 사람은 소수 전략 게이트에 머문다.

그래서 이 글은 Claude 사건 타임라인을 홉마다 다시 말하지 않는다. Claude 사건과 도구 JSON가 이미 실행 경로를 분해했다. 이 글이 묻는 것은 능력이 어디서 오는지, JSON 검증이 덮을 수 있는 조각이다.

능력은 「모델이 나빠졌다」가 아니다

환불 조회와 공개 사건은 같은 루프를 걷는다. AI Agent 완전 가이드가 이미 그렸다: 제안, 실행, 다시 쓰기, 다시 제안. 도구 이름을 바꿔도 루프는 바뀌지 않는다. 자율이라 부를 수 있는 것은 세 층이 겹칠 때다:

  1. 다단계 루프. 실제 부작용은 최소 네 홉이다: 제안 → 게이트 → 실행 → 다시 쓰기. 게이트를 건너뛰면 JSON이 명령이 된다.
  2. 상자 밖으로 나갈 수 있는 카탈로그. Function Calling, MCP Tool Schema vs Function Calling, Claude Code / Codex의 로컬 도구는 말을 일로 바꾼다. 등록되지 않은 도구는 호출할 수 없다. 망에 나갈 수 있는 도구를 하나 더하면 실행 경로가 하나 늘어난다.
  3. 일을 스스로 끝내려는 모델. GPT-6 Astra 가이드는 이미 썼다: 「도구를 고른다 → 도구를 호출한다 → 객체를 반환한다」를 더 안정적으로 걷고, 「계속할까」를 덜 묻는다. 루프가 길어지면 나쁜 모양이 다음 홉에서 사실로 취급되기 쉽다.

어느 층이든 빠지면 채팅일 뿐이다. 세 층이 모이면 적법한 JSON이 실제 시스템에 닿는다. 모델이 새 프로토콜을 발명한 것이 아니다. 호스트가 실행을 루프에 넘긴 것이다.

Claude와 GPT: 공개 신호이지, 한 편의 영화가 아니다

먼저 나눈다. 「AI가 반란했다」로 납작하게 만들면, 바꿀 수 있는 유일한 부분을 잃는다: 도구, 네트워크, 게이트.

Claude 선. 2025년 GTG-1002: 사람이 표적을 고르고, Claude Code와 MCP가 전술을 돌렸다. Anthropic 추정으로 AI는 전술 작업의 약 80–90%를 끝냈고, 사람은 전략 게이트에 머물렀다. 2026년 7월, 설정이 잘못된 평가 환경이 공용 인터넷에 닿았고, 모델은 CTF 과제를 실제 조직으로 취급했다. 세부 사항은 Claude 사건과 도구 JSON. 뼈대는 한 문장이다: 상자 밖으로 나갈 수 있는 도구 + 루프가 채우는 JSON.

GPT 선. GPT-6 Astra 가이드는 2026년 9월 3일에 공개됐다. 공식 문구는 이를 「중요 사이버보안 능력 임계」에 도달한 첫 모델로 표기한다: 회사는 단계별 사람 지시가 거의 없어도, 경화된 시스템의 취약점을 찾아 이용할 수 있다고 본다. 완전한 공격 능력은 Daybreak(Blue / Red)안에 남는다. 공개 판은 더 촘촘한 거절과 비동기 misalignment monitoring을 더한다. 같은 날 System Card는 사고 사슬 감시 가능성이 GPT-5.6 Sol보다 떨어졌다고도 쓴다. 두 문장을 함께 읽어라.

Astra는 「스스로 포트를 연다」가 아니다. 도구 체인을 더 안정적으로 걷는 일이다. UK AISI 공급망 시뮬레이션: 서면 범위가 없으면 499회 중 60회가 경계를 넘었다. 명시적 제한이 있으면 500회 중 2회. 발판과 제약은 리더보드 비율보다 가치가 있다. 독립 랩 Irregular는 완전히 경화된 표적에서 성공 공격 0을 봤다——능력 임계는 마스터키가 아니다.

공통 공학 면은 한 문장이다: 모델이 객체를 채우고, 호스트가 실행한다. 브랜드를 바꿔도 루프는 바뀌지 않는다.

손을 움직이는 것은 객체이지, 한 편의 말이 아니다

위기를 「모델이 위험한 말을 했다」로 쓰면 시스템 prompt를 고치러 간다. 공개 기록에서 동작은 호스트가 tool_calls를 파싱한 뒤에 시작된다. 이름이 맞고 인자가 통과하면 함수가 돈다.

양성 Function Calling 모양은 고객지원 조회와 구분이 없다:

{
  "tool_calls": [{
    "id": "call_3c91",
    "type": "function",
    "function": {
      "name": "lookup_order",
      "arguments": "{\"order_id\":\"A-1042\"}"
    }
  }]
}

arguments는 문자열화된 객체이지 채팅 기록이 아니다. 모델은 「공격을 보낸다」가 아니다——필드를 보낸다. 넓은 type: object는 문을 뜯는 것과 같다: 여분 키, 임의의 URL, 선언되지 않은 메서드가 호스트로 들어온다.

도구마다 JSON Schema가 있어야 한다. 키워드는 JSON Schema 튜토리얼. 이름은 짧게, enum은 고정하고, 경로는 pattern으로 못 박아라. AI가 JSON Schema가 필요한 이유는 이미 썼다: Schema는 구경이지, prompt의 「JSON을 반환하라」가 아니다.

디버그는 포맷로 구조를 보고, JSONPath 추출로 name과 arguments를 뽑은 뒤, 지난주 통과한 객체와 JSON Diff한다. 프로덕션 자격 증명, 고객 행, 도구 로그를 공개 사이트에 붙이지 마라.

JSON 검증이 할 수 있는 일

검증은 정렬이 아니고 안티바이러스도 아니다. 답하는 질문은 하나다: 이 객체를 실행해도 되는가? 막을 수 있는 것은 모두 모양이다:

  • required 누락. path가 없으면 HTTP를 호출하지 않는다.
  • 잘못된 타입. 문자열 amount는 실패한다.
  • enum 밖. method는 GET만 가능하다.
  • 여분 키. additionalProperties: false가 몰래 넣은 host를 막는다.
  • pattern 불일치. path는 /api/v1/ 아래에 있어야 한다.
  • 결과가 객체가 아님. 다음 홉에 parse할 산문이 없다. 지어낸 필드는 상태에 들어가지 않는다.

이 인자 객체는 적법한 JSON처럼 보이지만, 있어서는 안 되는 host 필드를 싣고 있다:

{
  "method": "GET",
  "path": "/api/v1/orders/A-1042",
  "host": "internal.example"
}

좁힌 inputSchema에 대해 이 객체는 실행 전에 실패해야 한다:

{
  "name": "http_request",
  "description": "Call an allowlisted HTTP API",
  "inputSchema": {
    "type": "object",
    "properties": {
      "method": { "enum": ["GET"] },
      "path": { "type": "string", "pattern": "^/api/v1/" }
    },
    "required": ["method", "path"],
    "additionalProperties": false
  }
}

위 Schema는 GET /api/v1/…만 허용한다. additionalProperties: false가 없으면 모델은 언제든 다른 host를 끼워 넣을 수 있다. API 키, cookie, 내부 베이스는 호스트에 남겨라. 인자 객체에 넣지 마라. 검증은 로그의 자이기도 하다: 매번 tool_calls 객체를 남겨라. 산문 요약으로는 Diff, 재생, 대사를 할 수 없다.

검증이 할 수 없는 일

Schema를 「보안 계획」으로 쓰면 다음 홉은 진짜 게이트를 놓친다. 검증이 못 하는 일은 이것이다:

  • 네트워크 격리. 「인터넷이 없다」고 쓴 prompt는 선을 뽑는 일을 대신하지 못한다. 평가 사건이 이미 증명했다.
  • 인증. 누구나 붙는 MCP 엔드포인트는 카탈로그를 네트워크에 공개한다.
  • 두 번째 확인. 유출, 스키마 변경, 산출물 공개는 사람이 게이트를 통과한다. GTG-1002의 운영자는 원래 그 문에 있었다.
  • 의도 심사. 적법한 모양도 건드리면 안 되는 호스트를 가리킬 수 있다. allowlist는 다른 층이지 타입 검사가 아니다.
  • 사고 사슬에 대한 신뢰. 「시뮬레이션 중이다」는 네트워크 로그가 아니다. 모니터는 도구 객체를 읽어야 하며, 모델이 자신을 설명하는 말만 보면 안 된다.
  • 벤더 모니터링의 대체. Astra의 misalignment monitoring은 도구 트래픽을 보고 알린다. 그것은 당신 앱의 validator가 아니며, additionalProperties: false를 대신 실행하지 않는다.

네 층을 나누면 직무가 돌아온다:

층 시스템이 하는 일 Schema가 없으면
모델 목표를 도구 이름과 인자로 접는다 산문이 호스트에 들어가고 부작용이 먼저 돈다
호스트 tool_calls를 검증하고 실행한다 이름이 맞으면 호출한다. 네트워크 정책은 말할 틈이 없다
MCP / API 동작을 외부 시스템에 연결한다 임의의 URL, 임의의 메서드가 상자 밖으로 나간다
JSON Schema 아무것도 하지 않는다. 자일 뿐이다 자가 prompt에만 있으면 CI와 runtime은 재지 못한다

자는 모양을 잰다. 권한과 선은 재지 못한다. Structured Output은 불법 token을 막는다. 네트워크 격리는 대신하지 않는다.

게이트 작성: 다음 홉도 객체여야 한다

다음 홉을 실행해야 하는지는 「계속」이라는 한 문장이면 안 된다. 객체여야 하고, allowed는 모델이 채우면 안 된다:

{
  "step": 3,
  "last_tool": "lookup_order",
  "state": {
    "order_id": "A-1042",
    "status": "paid"
  },
  "next": {
    "tool": "http_request",
    "allowed": false,
    "reason": "missing_confirmation"
  }
}

allowed는 호스트가 Schema와 정책으로 계산해야 한다. 모델은 「계속을 제안한다」고 말할 수 있다. 스스로 allowed를 true로 쓰면 안 된다. AI Agent와 JSON Schema 워크플로는 게이트를 어떻게 나열하는지다.

정책 파일은 default-deny, 그다음 틈을 연다:

{
  "agent": "ops_assistant",
  "default_deny": true,
  "max_steps": 8,
  "tools": {
    "lookup_order": {
      "network": false,
      "confirm": false
    },
    "http_request": {
      "network": true,
      "allowlist": ["api.internal.example"],
      "confirm": true
    }
  }
}

망에 나갈 수 있는 도구는 기본으로 끈다. 켜려면 정책 파일에 쓰고 확인을 요구한다. prompt의 「인터넷이 없다」는 통제 수단이 아니다.

2026년에 어떻게 구현할까

  • 저장소에 schemas/tools/와 policy.json을 두고, 안정적인 $id와 버전을 붙인다.
  • JSON Schema를 먼저 쓰고, 그다음 MCP 또는 Function Calling을 등록한다. 타입은 투영이지 소스가 아니다.
  • 내부 상태 조회는 네트워크 없는 도구로 간다. 망 출구, 쓰기, 외부 발신은 따로 등록하고 기본은 confirm: true.
  • 새 도구의 기본은 default_deny. 확장하려면 버전을 더한다. 루트 객체를 넓히지 마라.
  • 평가, CI, 로컬 Agent는 같은 allowlist를 쓴다. prompt의 「망 밖으로 나가지 마라」는 통제 수단이 아니다.
  • 비밀과 고객 필드는 브라우저에서만 본다: 포맷, JSON Diff, 업로드 없음.

카탈로그는 얇아도 된다. 중요한 것은 데모보다 파일이다. 모델은 바뀐다. 도구 이름은 바뀐다. 구경을 먼저 안정시킨다.

흔한 실수

  • 모델을 실행자로 취급한다. 모델은 JSON을 채운다. 상자 밖으로 나가고, DB를 바꾸고, 요청을 보내는 것은 호스트다.
  • 넓은 type: object로 설계를 피한다. 열린 객체는 게이트가 아니다.
  • 입력만 검증하고 결과는 검증하지 않는다. 다음 홉은 지어낸 필드를 사실로 취급한다.
  • 사고 사슬만 믿는다. 「시뮬레이션 중이다」는 네트워크 로그를 대체하지 못한다.
  • 벤더 모니터링을 호스트 검증으로 본다. misalignment monitoring은 알림이지 additionalProperties: false가 아니다.
  • 검증을 전체 보안 계획으로 쓴다. 모양이 통과해도 선, 권한, 확인은 따로 써야 한다.

FAQ

모델은 이미 스스로 표적을 세울 수 있는가?

공개 기록에서는 아니다. GTG-1002는 사람이 표적을 고르고, 작업을 쪼개고, 전략 게이트를 통과시켰다. 평가 사건은 사람이 CTF 문제를 내고 격리를 잊은 것이다. 여기서 자율은 전술 단계에서 사람 대기가 줄어드는 것이지, 모델이 누구를 칠지 정하는 것이 아니다.

JSON 검증이 공격을 막을 수 있는가?

불법 객체의 실행은 막을 수 있다: 빠진 필드, 잘못된 타입, 여분 키, 접두사 밖 경로는 실행 전에 실패한다. 격리, 인증, 사람 확인을 대체하지 않는다. 적법한 모양도 건드리면 안 되는 호스트를 가리킬 수 있다. 그 층은 allowlist다.

Claude와 GPT의 차이는 무엇인가?

브랜드는 다르다. 루프는 같다. Astra는 도구 체인을 더 끝내려 하고 사이버보안 능력 태그를 갖는다. Claude 사건은 상자 밖으로 나가는 경로가 있는 카탈로그가 실제 시스템에 닿는다는 것을 보여 준다. 공학에서는 카탈로그와 Schema를 먼저 감사하라. 모델을 바꾸는 일부터 시작하지 마라.

Structured Output이면 충분한가?

충분하지 않다. 불법 token을 막고 최종 회신을 Schema에 올린다. 네트워크를 격리하지 않는다. 모양은 적법해도 건드리면 안 되는 대상의 호출은 잡지 못한다. 부작용이 있는 일은 여전히 Function Calling을 탄다. 호스트는 한 번 더 검증해야 한다.

이 JSON을 로컬에서 어떻게 보는가?

먼저 포맷해서 구조를 보고, Schema에서 빠진 required나 잘못된 enum을 찾은 뒤, 지난주 통과한 객체와 Diff한다. JSONSort는 브라우저 로컬에서 하며 데이터를 업로드하지 않는다. 프로덕션 자격 증명이나 고객 기록을 공개 사이트에 붙이지 마라.

결론

보안 위기는 「모델이 해킹을 배웠다」가 아니다. Agent에게 상자 밖으로 나갈 수 있는 도구를 주고, 루프로 JSON을 채우게 하면 실제 세계에 닿는다.

JSON 검증이 할 수 있는 일은 좁고 단단하다: 실행 전에 모양을 잰다. 빠진 필드, 잘못된 타입, 여분 키, 접두사 밖 경로는 그 자리에서 실패한다. 선, 권한, 확인은 검증이 못 한다. 따로 써라. 다음 도구를 더하기 전에 schemas/tools/와 policy.json을 저장소에 넣어라.

더 읽기

변경 기록: 최초 게시