
비트코인 보안 취약점: 시간 왜곡 공격
글: BitMEX Research

개요
2025년 3월 26일, 비트코인 개발자 앙투안 포엥소(Antoine Poinsot)는 새로운 비트코인 개선 제안(BIP)을 발표했다. 이는 '대규모 컨센서스 정리(mass consensus cleanup)'라 불리는 소프트포크 제안으로, 비트코인 프로토콜에 수년간 존재해온 여러 취약점과 결함들을 수정하는 업그레이드이다. 그중 하나는 최근 우리가 논의한 중복 트랜잭션 문제이며, 이번 정리 소프트포크로 수정될 또 다른 보다 심각한 취약점은 본문에서 다룰 주제인 '시간 왜곡 공격(time warp attack)'이다.
비트코인 블록 타임스탬프 보호 규칙
시간 왜곡 공격을 논의하기 전에, 현재의 시간 조작 방지 규칙을 되짚어보자.
중간 과거 시간(MPT) 규칙 — 타임스탬프는 마지막 11개 블록의 중간 시간보다 이후여야 한다.
미래 블록 시간 규칙 — MAX_FUTURE_BLOCK_TIME 상수를 기반으로, 타임스탬프는 노드 피어들의 중간 시간보다 2시간 이상 앞설 수 없다. 또한 로컬 시스템 시계와 피어들이 제공하는 시간 사이의 최대 허용 오차는 90분으로, 이 역시 추가적인 안전장치이다.
MPT 규칙은 블록이 과도하게 과거로 돌아가는 것을 방지하고, 미래 블록 규칙은 지나치게 미래로 나아가는 것을 막는다. 그러나 과거 타임스탬프를 사용하는 것을 막기 위해 미래 블록 규칙과 유사한 규칙을 적용할 수는 없다. 이는 초기 블록체인 동기화에 영향을 줄 수 있기 때문이다. 시간 왜곡 공격은 타임스탬프를 위조하여 시간을 훨씬 더 과거로 돌리는 공격이다.
나카모토의 '1차 오타' 오류
비트코인에서 난이도 조정 주기는 2016개의 블록을 포함하며, 10분 블록 간격 기준으로 약 2주간 지속된다. 채굴 난이도 조정을 계산하기 위해 프로토콜은 해당 2016개 블록 윈도우의 첫 번째와 마지막 블록 사이의 타임스탬프 차이를 계산한다. 이 2016개 블록 윈도우에는 사실 2015개의 간격(즉, 2016 - 1)이 존재한다. 따라서 관련 목표 시간은 60초 × 10분 × 2015개 간격, 즉 1,209,000초여야 한다. 그러나 비트코인 프로토콜은 숫자 2016을 사용하여 목표를 계산한다. 즉 60초 × 10분 × 2016 = 1,209,600초이다. 이는 '1차 오타(off-by-one)' 오류이며, 나카모토가 블록 수와 블록 간 간격을 혼동했을 가능성이 있다.
원본 나카모토 코드

출처: https://sourceforge.net/p/bitcoin/code/1/tree//trunk/main.cpp#l687
이 오류로 인해 목표 시간이 실제보다 약 0.05% 길어진다. 따라서 비트코인의 목표 간격은 정확히 10분이 아니라 10분 0.3초이다. 이 결함 자체는 큰 문제가 아니며, 실제로 비트코인이 시작된 이래 평균 간격은 9분 36초로, 10분보다 짧았다. 이는 2009년 이후 평균 해시파워가 꾸준히 증가했기 때문이다. 그래서 마지막 반감기가 2025년 1월이 아니라 2024년 4월에 발생한 것이다. 우리는 일정을 앞당긴 셈이다. 어쨌든 나카모토의 이 0.3초 오류는 전체적으로 보면 사소한 문제이다. 아마 먼 미래에 가격과 해시파워 증가가 멈추면, 이 오류 덕분에 다시 일정을 맞출 수도 있을 것이다.

비록 0.3초 오류 자체는 중요하지 않지만, 관련된 보다 심각한 문제가 존재한다. 난이도 계산은 각 2016블록 윈도우 내의 첫 번째와 마지막 블록을 기반으로 한다는 점이 잘못된 것이다. 우리看来, 관련 주기는 이전 2016블록 윈도우의 마지막 블록과 현재 윈도우의 마지막 블록 사이의 차이여야 한다. 이 방식이 난이도 조정 윈도우 길이를 계산하는 가장 합리적인 방법이며, 서로 다른 조정 윈도우를 아우르는 시간 범위를 다루는 것이 핵심이다. 그렇게 한다면 2016이라는 숫자 역시 목표 계산에 적절한 간격 수가 된다. 아마 나카모토가 이 오류를 범한 이유는 첫 번째 난이도 조정 주기를 고려했기 때문일 수 있으며, 그때는 이전 주기의 마지막 블록이 존재하지 않았기 때문이다.
시간 왜곡 공격
비트코인의 시간 왜곡 공격은 약 2011년 처음 발견되었으며, 나카모토의 난이도 계산 오류를 악용하는 공격이다. 공격을 수행한다고 가정하자. 채굴이 100% 중앙집중화되어 있고, 채굴자가 프로토콜이 허용하는 한도 내에서 임의의 타임스탬프를 설정할 수 있다고 하자. 대부분의 블록에서 채굴자는 이전 블록보다 1초만 앞으로 타임스탬프를 설정하므로, 블록체인이 시간상으로 전진하며 MTP 규칙을 준수한다. 시간을 가능한 느리게 전진시키기 위해, 채굴자는 연속 6개의 블록에 동일한 타임스탬프를 유지한 후 다음 블록에서 1초씩 증가시킬 수 있다. 즉, 블록 타임스탬프는 6개 블록마다 1초씩 앞으로 이동한다.
이 공격은 블록체인이 실제 시간보다 점점 더 뒤처지게 만들고, 난이도는 증가하여 채굴이 점점 더 어려워진다. 그러나 공격 효과를 극대화하기 위해, 각 난이도 조정 주기의 마지막 블록에서는 채굴자가 실제 세계 시간으로 타임스탬프를 설정한다. 그리고 다음 블록, 즉 각 난이도 조정 윈도우의 첫 번째 블록은 이전 난이도 조정 윈도우의 마지막 두 번째 블록보다 1초 앞선 과거 시간으로 설정된다. 이것은 여전히 MTP 규칙을 만족한다. 왜냐하면 이런 경우 이상치가 11개 블록의 중간값에 영향을 주지 않기 때문이다.
이러한 공격을 수행하면 첫 번째 주기 후 난이도는 영향을 받지 않는다. 그러나 공격 시작 후 두 번째 조정 주기 이후, 난이도는 하향 조정된다. 이후 채굴자는 매우 빠른 속도로 블록을 생성하며 많은 비트코인을 창출하고, 이를 매도하여 이익을 얻을 수 있다.
간략한 설명
난이도 주기가 2016개 블록이기 때문에, 도표로 이 공격을 설명하기는 어렵다. 따라서 아래의 시나리오를 만들어 이 공격을 설명하고자 한다.
-
각 난이도 조정 윈도우는 5개의 블록으로 구성됨
-
목표 간격은 10분
-
MTP 규칙은 마지막 3개 블록을 기반으로 함
-
모든 블록의 타임스탬프는 1분씩 증가하되, 각 주기의 마지막 블록은 실제 타임스탬프를 사용함
설명적 시간 왜곡 공격

위 그림에서 두 개의 곡선이 나타난다.
-
각 난이도 조정 윈도우의 마지막 블록의 실제 시간을 나타내는 곡선. 채굴자가 블록을 점점 더 빠르게 찾음에 따라 난이도가 낮아지고, 이 곡선은 점점 완만해진다.
-
다른 블록의 조작된 타임스탬프를 나타내는 직선
비트코인 시간 왜곡 공격 계산
다음 표는 채굴자가 이 공격을 극단적으로 활용하여 난이도를 어떻게 하향 조작할 수 있는지를 보여준다.

참고: 프로토콜상 한 주기 내 난이도 조정의 최대치는 4배이지만, 위 표에서는 이 값을 초과하지 않는다.
각 주기의 난이도는 점근적으로 약 2.8배 이상으로 하향 조정된다. 주기가 시간상으로 짧아질수록 난이도 감소 속도가 느려지기 때문이다.
위 표의 11번째 주기, 즉 공격 개시 후 39일째에는 초당 6개 이상의 블록이 생성되며, 정확히는 초당 10.9개의 블록이 생성된다. 이 시점에서 블록 타임스탬프에 대한 제한이 다르게 작용한다. MTP 규칙에 따라 시간은 6개 블록마다 최소 1초씩 전진해야 한다. 따라서 우리의 이해에 따르면 이 시점부터 타임스탬프가 실제 시간보다 더 빠르게 전진하기 시작하며, 블록체인 시계는 실제 세계 시간을 향해 전진하기 시작하지만 여전히 크게 뒤처진 상태를 유지한다. 그럼에도 불구하고 공격은 계속될 수 있으며, 난이도는 허용되는 최소값에 도달할 때까지 계속 낮아질 수 있다.
공격 가능성
이론상 이러한 공격은 파괴적이지만, 실행에는 몇 가지 장애가 있다. 공격 수행을 위해서는 대부분의 해시파워가 필요할 수 있다. 정직한 채굴자들이 올바른 타임스탬프를 입력한다면 공격은 더욱 어려워진다. MTP 규칙과 정직한 채굴자의 타임스탬프는 악의적인 채굴자의 타임스탬프가 얼마나 과거로 회귀할 수 있는지를 제한할 수 있다. 또한 정직한 채굴자가 난이도 조정 윈도우의 첫 번째 블록을 생성한다면, 그 주기의 공격은 실패한다. 또 다른 완화 요인은 공격이 모두에게 공개적으로 드러난다는 점이다. 누구나 타임스탬프를 볼 수 있으며, 난이도 하향 조정 전에 약 4주간의 조작이 필요하므로, 이를 통해 비상 소프트포크 수정을 위한 시간을 확보할 수 있다.
해결책
이 취약점을 수정하는 것은 비교적 간단하지만, 소프트포크 프로토콜 변경이 필요할 수 있다. 난이도 조정 알고리즘을 변경하여 서로 다른 2016블록 윈도우 사이의 시간 간격을 계산하고 '1차 오타' 오류를 완전히 수정하는 것은 직접적인 해결책이지만 복잡할 수 있으며, 하드포크일 가능성도 있다. 또 다른 수정 방법은 MTP 규칙을 폐지하고 모든 블록에서 시간이 항상 전진하도록 요구하는 것이다. 그러나 이는 시간이 너무 앞서버릴 가능성을 열어두며, 다른 채굴자의 시계가 몇 초 앞서 있을 경우, 정확한 시계를 사용하는 채굴자가 유효하지 않은 타임스탬프를 생성할 위험도 있다.
다행히 더 간단한 해결책이 존재한다. 시간 왜곡 공격을 방지하기 위해, 새로운 난이도 주기의 첫 번째 블록의 타임스탬프가 이전 주기 마지막 블록의 특정 분 이전이 되지 않도록 요구하면 된다. 이 새로운 제한 규칙의 시간(분 단위)은 다양한 의견이 있었으며, 10분에서 2시간까지 제안되었다. 시간 왜곡 공격 완화 측면에서 두 값 모두 효과적일 수 있다.
Poinsot의 대규모 컨센서스 정리 제안에서, 그는 이 값을 2시간으로 확정하였다. 2시간은 난이도 조정 주기의 목표 시간의 약 0.6%에 불과하므로, 난이도를 하향 조작할 수 있는 능력이 엄격히 제한된다. 아래 표는 허용 시간(그레이스 페리어드) 설정에 관한 논의를 요약한 것이다.

TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News














