Incidents

Payment Processor 익스플로잇 당시 NFT를 구조한 기록

2026년 9월, Limit Break의 Payment Processor에 승인(approval)을 준 지갑에서 NFT와 WETH가 빠져나갔습니다. 무슨 일이 있었는지, 왜 화이트햇으로 나섰는지, 자산을 어떻게 돌려드렸는지 정리합니다.

청구 사이트Revoke.cash

2026년 9월 24~25일, Limit Break의 Payment Processor 컨트랙트에 승인을 준 지갑들에서 NFT와 WETH가 빠져나가기 시작했습니다. 이후 며칠 동안 위험에 노출된 자산을 먼저 옮기고 원래 주인에게 돌려드리는 일을 도왔습니다. 그 과정을 짧게 기록해 둡니다.

피해를 입으셨다면

사용했던 모든 네트워크에서 Payment Processor 컨트랙트에 준 승인을 철회하세요(예: Revoke.cash). 그다음 nftsaresafu.xyz에서 구조된 NFT가 있는지 확인하고 청구할 수 있습니다. 청구하기 전에 반드시 승인을 먼저 철회해야 합니다.

무슨 일이 있었나

공개 보도에 따르면, Payment Processor V2는 승인된 ERC-2771 방식 포워더가 전달한 발신자 주소를 그대로 믿었습니다. 문제는 이 주소를 위조할 수 있었다는 점입니다. 공격자는 이를 이용해 피해자 본인이 만든 것처럼 보이는 0원짜리 주문을 만들었습니다.

~530 WETH911개 지갑에서 유출 (약 143만 달러, 공개 보도 기준)
~11.5만0원에 이뤄진 NFT 전송
29,787화이트햇이 구조해 청구 가능해진 NFT

승인이 남아 있는 지갑은 철회하기 전까지 모두 노출된 상태였습니다. 그래서 이 사건은 속도 싸움이 됐습니다. 승인 뒤에 남아 있는 자산은 먼저 도착한 사람이 가져갈 수 있었으니까요.

왜 나섰나

저는 화이트햇 드레인을 좋아하지 않습니다. 동의 없이 남의 자산을 옮기는 건 최후의 수단입니다. 가만히 있을 때의 결과가 분명히 더 나쁠 때만 정당화됩니다.

이번에는 공격 기법이 이미 알려져 있었습니다. @0xQuit도 공개적으로 자산 구조를 시작한 상태였습니다. 저에게는 아직 다뤄지지 않은 피해 지갑 목록이 따로 있었습니다. Quit에게 연락해 조율하려 했지만 제때 답을 받지 못했습니다. 그래서 악의적인 공격자보다 먼저 최대한 많은 자산을 옮기기 시작했습니다.

공격이 이미 공개됐고 자산이 여전히 노출돼 있다면, 기다리는 1분은 공격자가 쓸 수 있는 1분입니다.

최종적으로 NFT 약 2,000개를 구조했습니다. 구조한 NFT는 누구나 확인할 수 있도록 미리 공개한 주소 하나에 보관했습니다.

text
0x1234248d4b9525f42434e20d46abbff2686f56b3

자산 돌려드리기

자산을 보관하는 건 쉽습니다. 안전하게 돌려드리는 게 어렵습니다. 청구 경로가 여러 개면 피해자는 더 헷갈리고 피싱이 끼어들 틈도 커집니다. 그래서 청구 사이트를 따로 만들지 않았습니다. 대신 Quit과 협의해 제가 구조한 NFT를 기존 청구 사이트인 nftsaresafu.xyz에 추가했습니다(Quit의 공지). 9월 27일부터 청구할 수 있게 됐습니다.

청구하기 전에 반드시 Payment Processor 승인을 철회해야 합니다. 그렇지 않으면 돌려받은 NFT가 곧바로 다시 노출됩니다.

정리

  • 승인은 계속 살아 있는 권한입니다. 더 이상 쓰지 않는 승인, 특히 마켓플레이스와 결제 컨트랙트에 준 승인은 주기적으로 확인하고 철회하세요.
  • 신뢰된 포워더 패턴은 조심해서 다뤄야 합니다. 다른 컨트랙트가 전달한 발신자 주소를 받아들이는 경로는 서명 검증만큼 꼼꼼히 봐야 합니다.
  • 구조는 조율해서 합니다. 보관 주소는 공개하세요. 무엇을 어디서 옮겼는지도 기록해 두세요. 돌려드릴 때는 잘 알려진 경로 하나만 쓰는 게 좋습니다.

계속 읽어보기

모두 보기