같은 결함, 다른 두 결말: Telestai와 Ravencoin, 그리고 포크가 물려받는 것

·7분 읽기·작성자: SSP Editorial Team
SSP Academy 커버: Telestai와 Ravencoin, 포크가 물려받는 것

같은 결함, 다른 두 결말: Telestai와 Ravencoin, 그리고 포크가 물려받는 것

어제 우리는 Ravencoin의 합의 결함에 대해 썼습니다. 블록 헤더의 검증되지 않은 nHeight 필드가 작업증명 위조를 허용했고, 그것을 되돌리는 데 사흘 깊이의 체인 재구성이 필요했다는 이야기였습니다.

그 이야기에는 뒷부분이 있고, 그쪽이 더 쓸모 있습니다. 다른 체인 하나가 완전히 같은 자리에 완전히 같은 결함을 지니고 있었습니다. 그것은 끝내 악용되지 않았습니다.

이 두 결말의 차이는 이해할 값어치가 있습니다. 코드의 차이가 아니기 때문입니다.

Telestai는 결함을 물려받았다, 포크란 원래 그런 것이므로

Telestai는 Ravencoin의 포크입니다. 그 코드베이스는 Meowcoin을 거쳐 Ravencoin에서 내려왔습니다. Telestai Core 3.0.1의 릴리스 노트에는 정리 항목으로 아직도 "Meowcoin 소스 제거"가 올라 있는데, 그 혈통이 얼마나 최근까지 소스 트리에 드러나 있었는지를 말해줍니다.

Ravencoin의 헤더 검증은 선언된 nHeight를 블록의 실제 체인상 위치와 대조하지 않았습니다. Meowcoin도 마찬가지였습니다. Telestai도 마찬가지였습니다. 누가 그 결함을 Telestai에 집어넣은 것이 아닙니다. 나머지 전부와 함께 딸려 온 것입니다. 포크가 누군가 들여다보는 코드와 함께 아무도 들여다보지 않는 코드까지 물려받는, 바로 그 방식으로요.

하나의 결함이 여러 체인의 문제가 되는 화려할 것 없는 작동 원리가 이것입니다. 포크는 독립을 향해 표류하는 사본이 아닙니다. 부모의 전제 이력을 통째로 짊어진 사본입니다 — 이 경우에는, 그 필드는 이미 누군가 검증하고 있으리라는 전제까지 포함해서요.

이틀의 예고를 받고 Telestai가 한 일

Ravencoin의 악용은 2026년 8월 11일에 공개되었습니다. Telestai Core 2.1.8은 8월 13일에, 대놓고 "Security: KAWPOW nHeight bind"라는 제목을 달고 나왔습니다.

릴리스 노트는 에두르지 않습니다.

이 릴리스는 헤더의 nHeight 필드(ethash 에포크를 선택하는 필드)가 체인에 묶여 있지 않던 KAWPOW 합의/DoS 문제를 수정합니다. 같은 부류의 결함이 Ravencoin 메인넷에서 악용되었습니다. 구버전을 돌리는 Telestai 노드는 업그레이드하기 전까지 노출된 상태로 남습니다.

수정 자체는 여러 겹이고, 그 겹침이 흥미로운 대목입니다.

  • 절대적인 에포크 상한이 즉시 강제됩니다. 작업증명 해시 계산이 시작되기도 전에요.
  • 엄격한 height == prev + 1 결속은 블록 1,100,000에서 활성화됩니다 — 소프트 포크 방식으로, 역사를 다시 쓰지 않습니다.
  • 작업증명은 부모 블록을 찾고 높이를 검증한 뒤에야 계산됩니다. 이는 애초에 즉시 거부했어야 할 헤더를 두고 노드가 값비싼 연산을 하도록 유도할 수 있던 메모리 고갈 경로를 막습니다.
  • 같은 검사가 ConnectBlockVerifyDB에도 적용되어, 데이터베이스를 다시 색인하는 노드가 새 규칙이 금지한 것을 조용히 다시 받아들이지 못하게 합니다.

2.1.8이 나올 때 메인넷은 높이 1,057,000 언저리였습니다. 강제 시점은 1,100,000으로 잡혔습니다. 약 43,000블록에 해당하는 그 간격은 의도적이었습니다. 거래소와 채굴풀, 탐색기, 노드 운영자가 규칙이 켜지기 전에 업그레이드할 만큼의 활주로이면서, 창이 무기한 열려 있을 만큼 길지는 않은.

Telestai는 출처도 밝혔습니다. 노트는 2miners/Ravencoinrvn-nheight-fix 브랜치 — Ravencoin 사고에서 나온 바로 그 패치 — 를 가리키고, 더 포괄적인 헤더 수용 수정을 문서화한 연구자들에게 감사를 표합니다. 치료약은 결함이 지나온 바로 그 길을 따라왔습니다.

두 결말을 나란히 놓고

두 체인. 하나의 코드 계보. 똑같이 잠들어 있던 결함 하나.

Ravencoin 쪽은 공격자가 먼저 찾아냈습니다. 결과는 공개 전 나흘간의 위조 블록, 입출금을 멈춘 거래소들, 20% 안팎의 가격 하락, 그리고 오염된 가지를 걷어내기 위한 사흘 깊이의 재구성이었습니다.

Telestai 쪽은 남의 사고 보고서를 읽다가 찾아냈습니다. 결과는 이틀 뒤의 패치, 여유를 두고 잡은 활성화 높이, 그리고 — 걷어낼 무효한 역사가 없었으므로 — 재구성 자체가 없었습니다. 아무것도 되돌리지 않았습니다. 되돌릴 것이 없었으니까요.

차이는 그게 전부입니다. 더 나은 코드가 아닙니다. 다른 결함도 아닙니다. 그저 누가 먼저 알아차렸는지, 그리고 그 체인을 건사하는 사람들이 남의 나쁜 한 주를 두고 얼마나 빨리 움직였는지입니다.

그다음 Telestai는 알고리즘을 통째로 갈아치웠다

보안 패치로부터 엿새 뒤, Telestai는 Core 3.0.0을 내놓고 블록 1,150,000에서 — 2026년 10월 16일 무렵 — 자체 작업증명 알고리즘인 Meraki로 포크합니다. Meraki는 여전히 KAWPOW의 친척이고(ProgPoW 풍미의 Ethash 파생이며, 채굴 프로그램은 kawpowminer의 포크로 출발했습니다), 전력을 덜 쓰고 수수한 그래픽카드로도 닿을 수 있는 것으로 내세워집니다.

여기서 인과관계는 조심스럽게 다뤄야 합니다. 직선을 긋고 싶은 유혹이 크지만 그 선은 직선이 아니기 때문입니다. Meraki는 8월 이전부터 이미 진행 중이었습니다. 3.0.0의 테스트넷 안정화 빌드가 공개된 것이 8월 13일과 14일, 보안 릴리스와 같은 날들입니다. 그런 일정은 마흔여덟 시간 만에 짜맞출 수 있는 것이 아닙니다. 알고리즘 교체는 우연히 사고 옆에 착륙한 계획된 작업이었지, 그에 대한 반응이 아니었습니다.

릴리스 목록에는 체인을 건사하는 일의 화려하지 않은 면에 관한 작은 교훈도 있습니다. 보안 수정과 포크 사이에 Telestai는 합의와는 아무 상관 없는 이유로 2.1.9를 냈습니다. 2.1.8이 더 새로운 Berkeley DB로 빌드되었는데, 그것으로 오래된 wallet.dat을 열면 지갑 로그가 다시 쓰여 더 오래된 클라이언트가 그 파일을 못 읽게 될 수 있었던 겁니다. 그래서 Berkeley DB 4.8로 다시 빌드해 또 한 번 배포했습니다. 그것으로 업그레이드하는 일이 사용자의 지갑 파일을 위험에 빠뜨린다면, 보안 릴리스는 별 쓸모가 없습니다.

이것이 두 작은 체인을 넘어 중요한 이유

이 글을 읽는 사람 대부분은 RVN도 TLS도 갖고 있지 않습니다. 일반화되는 것은 그 패턴입니다.

포크된 체인들은 결함 표면을 공유하는데, 그것을 추적하는 사람은 거의 없습니다. 라이트코인, 도지코인, 비트코인 캐시, Ravencoin, Zcash를 비롯한 수십 개 체인이 Bitcoin Core에서 내려왔고, 저마다 분기점을 하나씩 안고 있습니다. 그 지점 이후로 상류의 수정은 자동으로 도착하기를 멈춥니다. 한 체인에서 공개된 취약점은 같은 코드의 하류에 있는 모든 체인에게 열린 질문이며, 포크가 멀리 흘러갔을수록 그 수정이 적용되는지 아는 것만도 더 큰 일이 됩니다. Telestai는 그 질문에 이틀 만에 답했습니다. 모든 포크에 그 일을 맡은 사람이 있는 것은 아닙니다.

"아무도 악용하지 않았다"는 "거기 없었다"와 같은 말이 아닙니다. Telestai의 노드 소프트웨어는 존재하는 내내 취약했습니다. 결함은 줄곧 진짜였고, 새로웠던 것은 주의뿐입니다. 형제 체인의 사고 보고서를 한 번도 받지 못하는 체인은 이런 경로로는 알 수가 없습니다.

악용보다 먼저 도착한 수정은 거의 아무 비용도 들지 않습니다. 같은 수정이 나중에 오면 비용은 재구성입니다. Telestai 2.1.8의 기술적 작업과 Ravencoin 하드포크의 그것은 대체로 같은 패치입니다. 달랐던 것은 그 주변 전부입니다. 버려야 할 무효한 역사가 있었는가, 거래소가 멈춰야 했는가, 사용자의 확인이 사흘 동안 무언가를 의미했는가.

이는 재현 가능한 빌드와 의존성 검토 뒤에 있는 것과 같은 논리입니다. 당신을 지키는 것의 대부분은 지갑 안에서 볼 수 있는 그 어떤 것보다도 상류에 있고, 당신을 대신해 주의를 기울이는 사람들이 그것을 건사하고 있습니다.

SSP에서 이것이 갖는 의미

실질적으로: 당신에게 달라지는 것은 없습니다.

SSP는 Ravencoin을 지원하고, 우리 노드는 회복된 체인에서 4.8.0을 돌리고 있습니다 — 어제 글에서 재구성 양쪽의 블록 해시를 기준 체인과 대조해 확인했습니다. SSP는 Telestai를 지원하지 않으므로, 당신 지갑에 걱정할 Telestai 잔액은 없습니다.

지원하지도 않는 체인에 관해 쓰는 이유는, 이 이야기가 우리가 진지하게 여기는 무언가를 깔끔하게 보여주기 때문입니다. 노드 인프라를 운영한다는 것은 우리가 싣고 다니는 모든 체인에 대해 상류의 보안 작업을 추적한다는 뜻이고, 여기에는 코드베이스가 조상을 공유하는 체인들도 포함됩니다. 그 가치는 잘 굴러가는 동안에는 전혀 보이지 않습니다. 패치된 노드는 패치되지 않은 노드와 똑같아 보입니다 — 더는 똑같아 보이지 않는 그날까지는요.

Telestai의 8월은 그것을 안에서 본 모습입니다. 프로젝트를 건사하는 누군가가 남의 악용에 관해 읽고, 자기 코드 트리에서 같은 모양을 알아보고, 배포합니다. 사고도 없고, 재구성도 없고, 바깥의 누구도 기억할 만한 공지도 없습니다. 그저 버전 번호 하나가 올라갈 뿐입니다.

이 글 공유하기

관련 글