페이퍼 세미나 · 결제 프로토콜 보안
HTTP 402 상태 코드를 부활시켜 API·콘텐츠·AI 에이전트가 온체인으로 마이크로페이먼트를 주고받게 하는 x402 프로토콜. 동기식 HTTP 인가와 비동기식 블록체인 정산이 만나는 지점에서 새로운 교차 계층(cross-layer) 공격면이 열린다. 이를 각각 다른 각도에서 파고든 두 편의 논문을 정리했다.
두 논문 모두 다음 3단계 흐름을 공격 분석의 기준으로 삼는다.
402와 함께 결제 조건(금액·수신 주소·네트워크 등)을 응답.X-PAYMENT 헤더를 붙여 요청을 재전송.Five Attacks on x402 Agentic Payment Protocol · Zelin Li, Qin Wang, Zhipeng Wang
이 논문은 x402를 형식적으로(formally) 분석한 뒤, 설계·구현 양쪽에서 실증한다. 다섯 공격은 인가(authorization)·바인딩(binding)·재전송 방어(replay protection)·웹 계층 처리(web-layer)의 약점을 각각 겨냥하며, 결과적으로 돈은 안 냈는데 서비스는 받거나(unpaid service), 반대로 돈은 냈는데 서비스는 거부당하는(paid-but-denied) 두 가지 결말로 이어진다.
확률적 다항시간(PPT) 공격자를 가정하며, 능력별로 나눈다: 네트워크 계층 공격자(메시지 지연·재정렬), 손상된 클라이언트, 비잔틴 facilitator, 유한성(finality) 범위를 지키는 블록체인 조작자, honest-but-curious 서버. 암호 프리미티브 자체는 안전하다고 전제한다.
서버가 블록체인 확정 전에 낙관적으로(optimistically) 리소스를 먼저 내준다. 이후 체인 재구성(reorg)으로 결제 트랜잭션이 사라지면 — 서비스는 이미 제공됐는데 돈은 없어진다.
5.18%의 의미: 저자들이 통제한 로컬 실험·분석 모델에서 확인 없이 즉시 발급(k=0), 블록 시간 2초, 주입된 reorg 확률 5%, 지연 400ms 조건으로 요청 5,000건을 실행했을 때 약 259건에서 서비스 발급 후 결제가 사라졌다. 이는 실제 Base 메인넷의 자연 발생률이 아니라 인위적으로 reorg와 지연을 주입한 조건부 결과다. Base Sepolia에서는 grant–finality 사이의 시간적 틈만 확인했으며 실제 reorg 확률은 추정하지 않았다.
공격자가 노출된 결제 인가를 복사해 먼저 정산하고 nonce를 소비한다. 피해 지불자는 실제로 결제하지만 정상 facilitator의 후속 정산이 revert되어 서비스를 받지 못한다. 일반적인 외부 공격자는 결제금을 가져가지 못하며, 주된 목적은 서비스 거부·방해다.
nonce 선점이란: X-PAYMENT에 든 서명된 결제 인가가 특정 facilitator 또는 정산 호출자에게 묶여 있지 않으면, 헤더를 본 프록시·미들웨어·악성 서버가 그 인가를 복사해 먼저 제출할 수 있다. nonce는 일회용이므로 공격자가 먼저 소비하면 정상 facilitator의 후속 정산은 “이미 사용된 nonce”로 실패한다.
재현 결과: EIP-3009 실험에서는 노출된 인가를 익명화된 Base Sepolia 엔드포인트의 정상 경로보다 먼저 테스트넷 USDC transferWithAuthorization에 제출했다. 0.0001 testnet USDC가 결제되고 nonce가 소비된 뒤, 엔드포인트의 정상 정산은 실패해 클라이언트가 HTTP 402를 받았다. Permit2에서는 x402ExactPermit2Proxy를 대상으로 관계없는 공격자 EOA가 관찰한 서명으로 settle()을 먼저 호출했고, 이후 정상 호출은 같은 nonce가 이미 사용돼 revert됐다.
누가 손해·이득을 보나:
한 줄 요약: 외부 공격자가 돈을 훔치는 공격이라기보다 “피해자는 결제, 서비스는 0”으로 만드는 paid-but-denied형 griefing이다. 단, 공격자가 악성 수신자·판매자라면 결제금을 갖고 서비스를 주지 않는 직접적 부당이득도 가능하다. 방어하려면 서명에 승인된 facilitator를 포함하고 컨트랙트에서 실제 호출자를 검사해야 한다.
settle(PP)를 프론트런해 선점 → 정당한 정산은 revert되어 지불자만 손해.이 공격은 모든 x402 구현에서 성립하지 않는다. 동일한 X-PAYMENT를 여러 요청으로 보내더라도 서버가 각 요청의 온체인 정산 결과를 끝까지 기다린 뒤 성공한 요청에만 리소스를 반환하면, 첫 요청만 HTTP 200을 받고 나머지는 nonce 중복으로 HTTP 402가 된다.
성립하지 않는 경우 — settle-before-grant: 요청 A가 settle()을 await해 결제에 성공한 뒤 리소스를 받는다. 요청 B부터는 같은 nonce의 정산이 revert되고 서버가 HTTP 402를 반환하므로, 구매자는 추가 리소스를 받지 못한다. 사용자가 지적한 흐름이 바로 이 안전한 pessimistic 경로다.
성립하는 경우 — grant-before-settle: 서버가 서명 검증(verify)만 통과하면 HTTP 200·리소스를 먼저 flush하거나, 정산을 분리된 비동기 작업으로 보내고 응답을 즉시 끝낸다. 여러 동시 요청이 정산 결과가 나오기 전 모두 verify를 통과해 리소스를 받고, 이후 온체인에서는 첫 정산만 성공하고 나머지가 revert된다. 이때는 실패가 확인돼도 이미 보낸 응답을 회수할 수 없다.
논문에서 확인한 구현 차이: 여기서 SDK-A/B/C는 x402 프로토콜의 기능명이 아니라 논문이 비교한 구현체를 가리키는 별칭이다. SDK-A는 Coinbase TypeScript 구현, SDK-B는 서드파티 Python 구현, SDK-C는 서드파티 Rust 구현이다.
왜 문제가 생겼나: SDK-B의 streaming 경로는 온체인 settle_payment이 끝나기 전에 HTTP 응답을 완료했다. SDK-C의 optimistic 모드도 tokio::spawn으로 정산을 백그라운드 작업으로 분리해, “결제 정산이 성공했는지 확인하기 전에” 리소스를 먼저 발급했다. 같은 결제 헤더를 동시에 여러 번 보내면 각 요청이 먼저 verify를 통과하고 유료 리소스를 받아갈 수 있다. 이후 nonce 때문에 온체인 정산은 첫 1건만 성공하고 나머지는 실패하지만, 이미 전송한 리소스는 회수할 수 없다.
안전한 구현: 반대로 SDK-C의 pessimistic 모드는 정산을 동기적으로 완료한 뒤에만 응답했다. 따라서 같은 결제 헤더를 재전송해도 첫 요청만 200 OK와 리소스를 받고, 나머지는 nonce 중복으로 402를 받아 grant가 1개로 제한됐다. 실제 동시성 테스트에서는 같은 결제 헤더를 1,000개 요청에 사용했을 때, 취약한 경로에서 HTTP 200이 248개 발생했지만 온체인 결제는 1건뿐이었다. 즉 결제 1회로 유료 리소스 248개가 발급될 수 있었던 것이다.
누가 손해·이득을 보나:
한 줄 요약: settle() 성공을 await한 뒤 리소스를 반환하면 이 replay로 추가 리소스를 받을 수 없다. 취약점은 정산 완료보다 HTTP grant가 먼저 나가는 구현에서 생기며, 서버는 settle-before-grant를 지키거나 발급 전에 (pay_id, resource_id)를 원자적으로 claim해야 한다.
n번 재전송했을 때, 서버가 정산 완료를 기다리지 않고 verify만으로 먼저 응답하면 Grant(n)이 나간다. 온체인 nonce 검사는 첫 정산만 허용하지만 이미 보낸 리소스는 회수할 수 없다. 반대로 settle 결과를 await한 뒤 응답하는 pessimistic 경로에서는 중복 요청이 402로 끝나 grant는 1개뿐이다.결제 헤더와 유료 응답이 일반 HTTP 프록시·CDN을 지나면서 결제 경계가 무너지는 공격이다. D1은 프록시가 헤더를 merge·truncate·재정규화해 서버가 클라이언트와 다른 결제 객체를 보게 만드는 경로이고, D2는 결제 후 응답을 공유 캐시에 저장해 다음 미지불 사용자가 공짜로 받는 경로다.
Cache-Control이 없는 nginx 캐시 실험의 미지불 요청재현 결과와 경계: 기본 nginx·Caddy는 실험 구성에서 X-PAYMENT를 변조하지 않았지만, 커스텀 MitM이 중복 헤더를 주입하자 Node/Express는 1,000건 모두 마지막 값을 선택했다. 이는 parser ambiguity를 확인한 것이며 단독 결제 우회까지 증명한 결과는 아니다. 반면 캐시 유출은 nginx에서 미지불 요청 1,000건 모두 재현됐고, Cache-Control: no-store, private를 붙이자 0건으로 감소했다. Caddy는 두 조건 모두 캐싱하지 않았다.
누가 손해·이득을 보나:
한 줄 요약: 실증된 핵심 이득은 미지불 사용자가 유료 응답을 공짜로 받는 것이다. 유료 응답에는 no-store 또는 private를 강제하고, 프록시가 결제 헤더를 합치거나 재작성하지 못하게 해야 한다.
PP → PP'로 바뀌어 서버가 402/파싱 불일치를 반환. D2 캐시 유출: no-store가 없으면 유료 응답이 프록시에 캐시돼, 미지불 Client B가 cache hit으로 콘텐츠를 공짜로 받는다.결제 전 디스커버리 단계에서 악성 판매자가 이름·설명·태그·신뢰 신호를 에이전트가 선호하도록 꾸미거나, 여러 Sybil 엔드포인트를 등록해 top-10 후보 목록을 점유한다. 지갑이나 정산 컨트랙트를 해킹하지 않고도 에이전트의 선택을 먼저 장악해 이후 결제 트래픽을 자신에게 보낸다.
재현 결과: 공개 x402 카탈로그를 이용한 통제된 디스커버리 모사에서 12개 카테고리·카테고리당 15개 질의·LLM 3종으로 총 2,160번의 선택을 측정했다. E1 메타데이터 조작은 공격 서버 하나만으로 MiniMax-M2.7 71.8%, GPT-5.3 69.4%, Sonnet 4.5 68.8%의 선택률을 보였다. E2 Sybil 공격은 서버를 1개에서 5개로 늘리자 3-LLM 평균 선택률이 27.5%에서 60.2%로 상승했다. 이는 실제 전체 x402 시장의 상시 공격 성공률이 아니라 top-10 선택 환경을 모사한 조건부 실험 결과다.
누가 손해·이득을 보나:
한 줄 요약: 공격자의 이득은 결제가 시작되기 전에 선택·매출 기회를 선점하는 것이다. 메타데이터 검증, 등록 비용·평판 기반 Sybil 저항성, 동일 사업자 노출 제한과 순위 다양화가 필요하다.
R*에 조작된 메타데이터를 등록해 상위에 올리고, E2는 다수의 Sybil 서버(R1*·R2*·R3*)를 등록해 목록을 도배함으로써 정직한 서버 Rh를 밀어낸다.no-store·private Cache-Control 부여p와 네트워크 지연 δ가 증가할수록, 결제 확정 전에 리소스를 발급하는 revert-grant 확률 RGP가 증가한다. 정상 facilitator에서는 위험이 관찰되지 않지만, 비잔틴 facilitator를 가정하면 100%까지 증가한다. (b) confirmation depth k를 늘리면 RGPk는 감소하지만, 결제 확정 후 리소스를 제공하기까지의 지연 Tgf는 증가한다. 즉 x402 서버의 빠른 응답성과 결제 안전성 사이에는 명확한 트레이드오프가 존재한다.r=1·3·5개 등록한 경우다. 범주의 n은 해당 카테고리에서 경쟁하는 전체 서버 수이며, 쿼리 수가 아니다. 경쟁 밀도와 모델의 선택 편향에 따라 결과가 달라지지만, 메타데이터 조작 하나만으로도 높은 선택률을 얻을 수 있고 Sybil 수를 늘리면 대체로 공격자 점유율이 커진다.When HTTP 402 Meets the Blockchain · Qinying Wang 외 (EPFL · Zhejiang University) · USENIX Security 2026
HexHive/x402scope 저장소·재현 문서와 공개된 발표 메타데이터를 기준으로 보강했다. 공개 저장소에는 핵심 코드와 figure/table 재생성 스크립트가 있지만, 원본 데이터베이스·facilitator별 pass/fail 매트릭스·HTTP 및 온체인 증거 로그는 공개되지 않는다. 따라서 구체적인 발견 건수와 facilitator별 성공률은 공개 자료만으로 독립 검증할 수 없다.
Paper 1이 공격의 원인과 재현 가능한 취약 경로를 분류했다면, Paper 2는 실제 facilitator의 온체인 흔적과 검증·정산 동작을 계측하는 measurement framework를 제시한다. 핵심 질문은 "공격이 가능한가"를 넘어, 어떤 facilitator·체인·계정 모델에서 어떤 규칙 위반 징후가 관찰되는가이다. 도구 x402scope는 두 축으로 구성된다.
verify/settle 동작을 규칙별로 검사하고, 위반 의심 사례를 재검증한다. 공개판은 악용 도구가 아니라 검증·재현용 스크립트이며, 민감한 mutation/PoC와 일부 증거는 sanitize되어 있다.getSignaturesForAddress 기반으로 facilitator 활동 이력을 동기화한다.verify/settle 규칙 검사를 수행한다. 공개 저장소의 코드 구조를 이해하기 위한 요약 도식이며, 논문의 원본 figure를 그대로 복제한 것은 아니다.plot_fig5.py의 집계값(Base 성공 46.542371 ETH, Base revert 1.938250 ETH, Solana 성공 456.298552 SOL, Solana 실패 0.027700 SOL)을 스크립트의 가격 가정인 ETH=$3,000·SOL=$125로 환산했다. 핵심은 실패 트랜잭션도 비용을 남길 수 있다는 점이다. 이는 특정 수집 구간과 가격 가정에 따른 artifact 값이지, x402 전체의 평균 비용은 아니다.재현 범위: 공개 README의 Base measurement workflow는 대략 2025-05-09 시점의 Base block height 30M 이후 구간을 대상으로 설명되어 있다. 전체 이력을 다시 수집하려면 고성능 archival RPC, MariaDB, 약 1TB SSD가 권장된다. 즉 단순히 RPC 한두 번을 호출해 얻은 샘플이 아니라, 블록·receipt·Solana 계정 상태를 별도로 모아 분석하는 파이프라인이다.
verify가 성공하지만 유효기간·정산 조건 때문에 실제 settle이 실패하는 경계와, 그 사이에 서비스가 발급되는지를 검사한다. 이 부분은 Paper 1의 grant-before-settle 문제와 직접 연결된다.공개 코드에는 legacy/v1과 x402 v2를 구분한 EVM·Solana 검증 스크립트가 있고, ERC-1271·ERC-6492 검사와 로컬 merchant/client 흐름도 포함되어 있다. 재현자는 먼저 특정 facilitator와 네트워크를 하나 선택하고, testnet 계정·RPC·필요한 facilitator credential을 설정한 뒤 preflight를 실행한다. 이후 verify_settle_base_v2.py, verify_settle_solanav2.py 같은 규칙별 스크립트를 한 번에 하나씩 실행한다.
중요한 구분: README의 권장 첫 테스트는 Base Sepolia와 Solana Devnet의 Coinbase test target이다. 따라서 "라이브 facilitator를 검사한다"는 표현은 운영 mainnet 전체를 무작위로 공격했다는 뜻이 아니라, 공개·허가된 facilitator endpoint와 testnet/통제된 계정으로 verify–settle 동작을 검증한다는 의미로 읽어야 한다. Free-shopping 경계 실험에서는 valid_before_offset을 짧게 조정해 verify는 통과하지만 settle은 실패하는 지점을 찾도록 안내한다.
따라서 Paper 2의 정확한 포지션은 "취약점 3개를 새로 완전히 증명한 논문"이라기보다, x402를 온체인·웹·서명검증·계정상태의 결합 시스템으로 측정하고, 반복 가능한 규칙 위반 검사 파이프라인을 제공한 실증/도구 논문에 가깝다. Paper 1이 공격 메커니즘 설명에는 더 강하고, Paper 2는 실제 배포·체인 데이터로 범위와 재현성을 보완하는 역할을 한다.
코드·재현 문서: github.com/HexHive/x402scope · 공개 artifact: Zenodo 20328961
| 축 | Paper 1 · Five Attacks (arXiv) | Paper 2 · x402scope (USENIX) |
|---|---|---|
| 주된 방법론 | 형식적 분석 + 재현형 테스트베드 | 라이브 facilitator·온체인 대규모 실측 |
| 구조화 | 공격 5종을 계층별로 분류·명명 | 규칙 위반 탐지 + 통계적 계측 |
| 체인 범위 | EVM 중심 (Hardhat, Base Sepolia) | EVM(Base) + Solana |
| 대표 공격 | revert-grant, 정산 선점, replay, 캐시 유출, server-selection | free-shopping, ERC-1271/6492, Solana 토큰계정 악용 |
| 산출물 | 공격 분류 + 완화책 M1–M6 + SDK 3종 감사 | 오픈소스 측정·규칙검사 도구 + figure/table 재생성 코드 원본 DB·일부 증거 로그는 비공개 |
| 공통점 | HTTP–체인 경계의 타이밍/바인딩 결함이 "무료 서비스" 또는 "지불 후 거부"로 이어진다는 문제의식 공유 | |
요약하면 Paper 1은 "무엇이 왜 깨지는가"를 체계적으로 분류·증명하고, Paper 2는 그 가설을 실제 facilitator·온체인 데이터에 연결하는 측정 및 규칙검사 파이프라인을 제시한다. 다만 Paper 2의 공개 artifact만으로는 모든 수치·facilitator별 판정을 독립 검증할 수 없으므로, "대규모 실측 결과가 완전히 공개된 논문"이라고 과장해서는 안 된다.