CVE-2018-17144: Bitcoin Core DoS, Critical Inflation Vulnerability
Intro
https://medium.com/@awemany/600-microseconds-b70f87b0b2a6
원문은 여기
CVE-2018-17144는 Bitcoin Core에서 발생한 취약점이다. 처음엔 Remote DoS로 알려졌으나 나중에 임의의 비트코인을 찍어낼 수 있다는 것까지 연구가 되어 더욱 파급력이 생겼다.
현실판 돈복사버그..
비트코인 투자를 해봤던 사람으로써 취약점이 궁금해 공개된 내용들과 bitcoin-core 소스 오디팅해서 대략 어떤식으로 발생한 버그인지 정리해보았다.
Root Cause
https://github.com/bitcoin/bitcoin/pull/9049
#9049 PR에 버그가 존재한다. 문제가 생긴 커밋을 보면
1131 Line : Check for duplicate inputs – note that this check is slow so we skip it in CheckBlock
PR request한 사람이 남긴 코멘트인데 뇌피셜이지만 bitcoin-core 취약점을 고의로 만들려는 자객인거같다ㅋㅋㅋ 앞으로 오픈소스 오디팅할때 주석 검색해볼 목록에 this check is slow 이런거 추가해놔야겠다,,
코드를 읽어보면 인자로 받은 같은 transaction의 tx.vin(cOutPoint 구조체)들의 prevout을 vInOutPoints 임시 이터레이터에 넣어보면서 .count로 validate하는데 이 검증로직이 저 PR로 없어졌다 이제 한 트랜잭션에 같은 prevout을 가진 vin을 중복해서 넣을 수 있게되었다.
문제는 이 CheckTransaction() 함수가 mempool에 삽입될 새로운 transaction들을 검증하는 로직에 모두 쓰였다는 것이다.
mempool은 컨펌을 대기중인 transcation들이 저장되어 채굴자들이 블록을 생성할때 포함시키는 용도로 쓰이는데, 신기했던 점은 이 bug를 disclosure한 사람인 @awemany에 따르면 mempool에서 이미 검증과정을 통과했으므로 채굴자가 블록을 마이닝할때는 transaction에 대한 별도 검증을 하지않는다는걸 테스트를 통해 확인했다고한다.
따라서 만약에
트랜잭션이 “블록에 올라가면” tx.vin 구조체의 prevout의 주소의 코인은 사용불가능하도록되면서 거래가 이루어지기때문에 본 취약점을 악용해 duplicate prevout input을 가지고있는 트랜잭션을 mempool에 보내 취약한 검증과정을 통과하고 블록에 accept되면 자기 지갑의 비트코인을 복제해 중복 출금이 가능해진다.
Conclusion
분석이 어렵거나 한 것도 아니였고 비트코인 구조만 머리에 있다면 이해하기 쉬운 버그였다..
웃긴건 원래 소스는 안취약했는데 어떤 유저(troll?)가 0.5~0.7ms를 아낄수있다며 validation을 지우고 request한 PR이 제대로 리뷰를 안거치고 approve되었고 유닛테스트의 code coverage가 불충분해서 그냥 테스트를 통과해 메인 브랜치에 merge되면서 탄생된 취약점이라 재밌었다.
더재밌는건 이 어마어마한 취약점을 responsible disclosure한 @awemany는 bitcoin 재단한테 바운티를 한푼도 못받았다고한다ㅋㅋㅋㅅㅋㄷㅇㅈㅋㅋ
https://github.com/bitcoin/bitcoin/commit/c64128df5882e8dc1f76ae7c1e998ed57b8645fe#diff-bb164712e06aa669cbef899af79e8cdb
이런 케이스를 커버하는 테스트가 추가되었고 무조건 duplicate input인지 체크하도록 패치가 된 것을 확인 할 수 있다.
Recent Comments